ವಿಕಿಪೀಡಿಯ
tcywiki
https://tcy.wikipedia.org/wiki/%E0%B2%AE%E0%B3%81%E0%B2%96%E0%B3%8D%E0%B2%AF_%E0%B2%AA%E0%B3%81%E0%B2%9F
MediaWiki 1.47.0-wmf.24
first-letter
ಮಾದ್ಯಮೊ
ವಿಸೇಸೊ
ಪಾತೆರ
ಬಳಕೆದಾರೆ
ಬಳಕೆದಾರೆ ಪಾತೆರ
ವಿಕಿಪೀಡಿಯ
ವಿಕಿಪೀಡಿಯ ಪಾತೆರ
ಫೈಲ್
ಫೈಲ್ ಪಾತೆರ
ಮಾದ್ಯಮೊವಿಕಿ
ಮಾದ್ಯಮೊವಿಕಿ ಪಾತೆರ
ಟೆಂಪ್ಲೇಟ್
ಟೆಂಪ್ಲೇಟ್ ಪಾತೆರ
ಸಕಾಯೊ
ಸಕಾಯೊ ಪಾತೆರ
ವರ್ಗೊ
ವರ್ಗೊ ಪಾತೆರ
ತಡ್ಯ
ತಡ್ಯ ಪಾತೆರ
ಕರಡು
ಕರಡು ಪಾತೆರ
TimedText
TimedText talk
ಮೋಡ್ಯೂಲ್
ಮೋಡ್ಯೂಲ್ ಪಾತೆರ
Event
Event talk
ಟೆಂಪ್ಲೇಟ್:UF-hcard-geo
10
6362
373879
372955
2026-10-26T16:32:00Z
en>Danny 1994
0
Removed double space.
373879
wikitext
text/x-wiki
The HTML markup produced by this template includes an [[HCard|hCard microformat]], which makes the place-name and location [[Parsing|parsable]] by computers, either acting automatically to catalogue articles across Wikipedia, or via a browser tool operated by a person, to (for example) add the subject to an address book. Within the hCard is a [[Geo (microformat)|Geo microformat]], which additionally makes the [[Geographic coordinate system|coordinates]] (latitude & longitude) parsable, so that they can be, say, looked up on a map, or downloaded to a [[Global Positioning System|GPS]] unit. For more information about the use of [[microformat]]s on Wikipedia, please see [[Wikipedia:WikiProject Microformats|the microformat project]].
=== Sub-templates ===
If the place or venue has "established", "founded", "opened" or similar dates, use {{template link|start date}} for the earliest of those dates [[Wikipedia:WikiProject Microformats/dates|unless the date is before 1583 CE]].
If it has a URL, use {{template link|URL}}.
'''Please do not remove instances of these sub-templates.'''
=== Classes ===
hCard uses HTML classes including:
{{Flat list|
*adr
*agent
*category
*county-name
*extended-address
*fn
*label
*locality
*nickname
*note
*org
*region
*street-address
*uid
*url
*vcard
}}
Geo is produced by calling {{template link|coord}}, and uses HTML classes:
{{Flat list|
*geo
*latitude
*longitude
}}
'''Please do not rename or remove these classes nor collapse nested elements which use them.'''
=== Precision ===
When giving coordinates, '''please use an [[Wikipedia:WikiProject Geographical coordinates#Precision|appropriate level of precision]]'''. Do '''not''' use {{template link|coord}}'s {{parameter|name}} parameter.<includeonly>{{Sandbox other||
[[Category:Templates with coordinates fields]]
[[Category:Templates generating hCards and Geo]]
}}</includeonly><noinclude>__NOTOC__{{documentation}}</noinclude>
0b6r82calse3p6ryeke27uubcubj2yy
373880
373879
2026-10-28T05:55:29Z
ChiK
1136
1 revision imported from [[:en:Template:UF-hcard-geo]]
373879
wikitext
text/x-wiki
The HTML markup produced by this template includes an [[HCard|hCard microformat]], which makes the place-name and location [[Parsing|parsable]] by computers, either acting automatically to catalogue articles across Wikipedia, or via a browser tool operated by a person, to (for example) add the subject to an address book. Within the hCard is a [[Geo (microformat)|Geo microformat]], which additionally makes the [[Geographic coordinate system|coordinates]] (latitude & longitude) parsable, so that they can be, say, looked up on a map, or downloaded to a [[Global Positioning System|GPS]] unit. For more information about the use of [[microformat]]s on Wikipedia, please see [[Wikipedia:WikiProject Microformats|the microformat project]].
=== Sub-templates ===
If the place or venue has "established", "founded", "opened" or similar dates, use {{template link|start date}} for the earliest of those dates [[Wikipedia:WikiProject Microformats/dates|unless the date is before 1583 CE]].
If it has a URL, use {{template link|URL}}.
'''Please do not remove instances of these sub-templates.'''
=== Classes ===
hCard uses HTML classes including:
{{Flat list|
*adr
*agent
*category
*county-name
*extended-address
*fn
*label
*locality
*nickname
*note
*org
*region
*street-address
*uid
*url
*vcard
}}
Geo is produced by calling {{template link|coord}}, and uses HTML classes:
{{Flat list|
*geo
*latitude
*longitude
}}
'''Please do not rename or remove these classes nor collapse nested elements which use them.'''
=== Precision ===
When giving coordinates, '''please use an [[Wikipedia:WikiProject Geographical coordinates#Precision|appropriate level of precision]]'''. Do '''not''' use {{template link|coord}}'s {{parameter|name}} parameter.<includeonly>{{Sandbox other||
[[Category:Templates with coordinates fields]]
[[Category:Templates generating hCards and Geo]]
}}</includeonly><noinclude>__NOTOC__{{documentation}}</noinclude>
0b6r82calse3p6ryeke27uubcubj2yy
ಮೋಡ್ಯೂಲ್:Lang
828
7281
373853
370552
2026-10-23T20:48:59Z
en>Theknightwho
0
Comments re class="error". No changes to code.
373853
Scribunto
text/plain
--[=[
Lua support for the {{lang}}, {{langx}}, {{lang-??}}, and {{transliteration}} templates and replacement of various supporting templates.
]=]
require('strict');
local getArgs = require ('Module:Arguments').getArgs;
local unicode = require ("Module:Unicode data"); -- for is_Latin() and is_rtl()
local yesno = require ('Module:Yesno');
local sandbox = (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- when called from a sandbox template or module load sandbox data and sandbox configuration
local lang_data = mw.loadData ('Module:Lang/data' .. sandbox); -- language name override and transliteration tool-tip tables
local lang_name_table = lang_data.lang_name_table; -- language codes, names, regions, scripts, suppressed scripts
local lang_table = lang_data.lang_name_table.lang;
local lang_dep_table = lang_data.lang_name_table.lang_dep;
local script_table = lang_data.lang_name_table.script;
local region_table = lang_data.lang_name_table.region;
local variant_table = lang_data.lang_name_table.variant;
local suppressed_table = lang_data.lang_name_table.suppressed;
local override_table = lang_data.override;
local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code
local cfg = mw.loadData ('Module:Lang/configuration' .. sandbox); -- for internationalization
local is_latn_data = mw.loadData ('Module:Lang/data/is latn data');
local sizeof_ranges_t = is_latn_data.sizeof_ranges_t;
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization
local content_lang = mw.language.getContentLanguage();
local this_wiki_lang_tag = content_lang.code; -- get this wiki's language tag
local this_wiki_lang_dir = content_lang:getDir(); -- get this wiki's language direction
local initial_style_state; -- set by lang_xx_normal() and lang_xx_italic()
local maint_cats = {}; -- maintenance categories go here
local maint_msgs = {}; -- and their messages go here
--[[--------------------------< M A K E _ E R R O R _ S P A N >--------------------------------------------------
]]
local function make_error_span (template, msg)
--[[ WARNING: must have the class "error" to be detected as an error by {{#iferror:}}.
Please do not remove, to avoid breaking any downstream templates relying on this. ]]
return table.concat ({'<span class="error" style="font-size: inherit;">', cfg.misc_text_t.error, ': ', template, msg, '</span>'})
end
--[[--------------------------< S U B S T I T U T E >----------------------------------------------------------
Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when
<data_t> not nil; returns <message> else.
]]
local function substitute (message, data_t)
return data_t and mw.message.newRawMessage (message, data_t):plain() or message;
end
--[[--------------------------< M A K E _ E R R O R _ M S G >--------------------------------------------------
Assembles an error message from template name, message text, help link, and error category.
]]
local function make_error_msg (msg, args_t, template)
local category;
local text; -- handle the oddity that is {{langx}}
if cfg.templates_t.langxx == template then
text = args_t.text or args_t[1]; -- for {{lang-xx}}
else
text = args_t.text or args_t[2]; -- for {{lang}}, {{langx}}, and {{transliteration}}
end
if cfg.templates_t.transliteration == template then
category = cfg.make_error_msg_t.xlit_err_cat;
else
category = cfg.make_error_msg_t.lang_err_cat;
end
local category_link = ((0 == namespace or 10 == namespace) and not args_t.nocat) and substitute ('[[Category:$1]]', {category}) or '';
--[[ WARNING: must have the class "error" to be detected as an error by {{#iferror:}}.
Please do not remove, to avoid breaking any downstream templates relying on this. ]]
return substitute ('[$1] <span class="error" style="font-size: inherit;">$2: {{$3}}: $4 ([[:Category:$5|$6]])</span>$7', -- { prevents the template name from being treated as a template call in certain situations
{
text or cfg.make_error_msg_t.undefined,
cfg.misc_text_t.error,
template,
msg,
category,
cfg.misc_text_t.help,
category_link
})
end
--[[--------------------------< P A R A M E T E R _ V A L I D A T E >------------------------------------------
]]
local function parameter_validate (args_t, template)
local err_msg = cfg.parameter_validate_t.invalid_param;
if cfg.templates_t.lang == template then -- for {{lang}}
for param, _ in pairs (args_t) do
if not cfg.known_params_t.params_lang_t[param] and -- unique {{lang}} parameters
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
end
end
elseif cfg.templates_t.langx == template then -- for {{langx}}
for param, _ in pairs (args_t) do
if not cfg.known_params_t.params_langx_t[param] and -- unique {{langx}} parameters
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
end
end
elseif cfg.templates_t.langxx == template then -- for {{lang-xx}}
for param, _ in pairs (args_t) do
if not cfg.known_params_t.params_lang_xx_t[param] and -- unique {{lang-xx}} parameters
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
end
end
end
end
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not
an empty string.
]]
local function is_set (var)
return not (var == nil or var == '');
end
--[[--------------------------< I N V E R T _ I T A L I C S >-------------------------------------------------
This function attempts to invert the italic markup a args.text by adding/removing leading/trailing italic markup
in args.text. Like |italic=unset, |italic=invert disables automatic italic markup. Individual leading/trailing
apostrophes are converted to their HTML numeric entity equivalent so that the new italic markup doesn't become
bold markup inadvertently.
Leading and trailing wiki markup is extracted from args.text into separate table elements. Addition, removal,
replacement of wiki markup is handled by a string.gsub() replacement table operating only on these separate elements.
In the string.gsub() matching pattern, '.*' matches empty string as well as the three expected wiki markup patterns.
This function expects that markup in args.text is complete and correct; if it is not, oddness may result.
]]
local function invert_italics (source)
local invert_pattern_table = { -- leading/trailing markup add/remove/replace patterns
[""]="\'\'", -- empty string becomes italic markup
["\'\'"]="", -- italic markup becomes empty string
["\'\'\'"]="\'\'\'\'\'", -- bold becomes bold italic
["\'\'\'\'\'"]="\'\'\'", -- bold italic become bold
};
local seg = {};
source = source:gsub ("%f[\']\'%f[^\']", '''); -- protect single quote marks from being interpreted as bold markup
seg[1] = source:match ('^(\'\'+%f[^\']).+') or ''; -- get leading markup, if any; ignore single quote
seg[3] = source:match ('.+(%f[\']\'\'+)$') or ''; -- get trailing markup, if any; ignore single quote
if '' ~= seg[1] and '' ~= seg[3] then -- extract the 'text'
seg[2] = source:match ('^\'\'+%f[^\'](.+)%f[\']\'\'+$') -- from between leading and trailing markup
elseif '' ~= seg[1] then
seg[2] = source:match ('^\'\'+%f[^\'](.+)') -- following leading markup
elseif '' ~= seg[3] then
seg[2] = source:match ('(.+)%f[\']\'\'+$') -- preceding trailing markup
else
seg[2] = source -- when there is no markup
end
seg[1] = invert_pattern_table[seg[1]] or seg[1]; -- replace leading markup according to pattern table
seg[3] = invert_pattern_table[seg[3]] or seg[3]; -- replace leading markup according to pattern table
return table.concat (seg); -- put it all back together and done
end
--[[--------------------------< V A L I D A T E _ I T A L I C >------------------------------------------------
Validates |italic= or |italics= assigned values.
When |italic= is set and has an acceptable assigned value, return the matching CSS font-style property value or,
for the special case 'default', return nil.
When |italic= is not set, or has an unacceptable assigned value, return nil and a nil error message.
When both |italic= and |italics= are set, returns nil and a 'conflicting' error message.
The return value nil causes the calling lang, lang_xx, or xlit function to set args.italic according to the template's
defined default ('inherit' for {{lang}}, 'inherit' or 'italic' for {{lang-??}} depending on
the individual template's requirements, 'italic' for {{transliteration}}) or to the value appropriate to |script=, if set ({{lang}}
and {{lang-??}} only).
Accepted values and the values that this function returns are are:
nil - when |italic= absent or not set; returns nil
default - for completeness, should rarely if ever be used; returns nil
yes - force args.text to be rendered in italic font; returns 'italic'
no - force args.text to be rendered in normal font; returns 'normal'
unset - disables font control so that font-style applied to text is dictated by markup inside or outside the template; returns 'inherit'
invert - disables font control so that font-style applied to text is dictated by markup outside or inverted inside the template; returns 'invert'
]]
local function validate_italic (args)
local properties = {[cfg.keywords_t.affirmative] = 'italic', [cfg.keywords_t.negative] = 'normal', [cfg.keywords_t.unset] = 'inherit', [cfg.keywords_t.invert] = 'invert', [cfg.keywords_t.default] = nil};
local italic, count = nil, 0
for _, param in pairs {'italic', 'italics', 'i'} do
local arg = args[param]
if nil ~= arg then
if nil == italic then
italic = arg
end
count = count + 1
end
end
if count > 1 then -- return an error message if more than one is set
return cfg.validate_italic_t.multi_italic;
end
args.style = properties[italic] -- set args.style to an appropriate value
args.italic = italic; -- use args.italic as the canonical parameter
return nil; -- return a nil error message
end
--[=[--------------------------< V A L I D A T E _ C A T _ A R G S >----------------------------------------------------------
Default behavior of the {{lang}} and {{lang-??}} templates is to add categorization when the templates are used in main space.
This default functionality may be suppressed by setting |nocat=yes or |cat=no. This function selects one of these two parameters
to control categorization.
Because having two parameters with 'opposite' names and 'opposite' values is confusing, this function accepts only affirmative
values for |nocat= and only negative values for |cat=; in both cases the 'other' sense (and non-sense) is not accepted and the
parameter is treated as if it were not set in the template.
Sets args.nocat to true if categorization is to be turned off; to nil if the default behavior should apply.
Accepted values for |nocat= are the text strings:
'yes', 'y', 'true', 't', on, '1' -- [[Module:Yesno]] returns logical true for all of these; false or nil else
for |cat=
'no', 'n', 'false', 'f', 'off', '0' -- [[Module:Yesno]] returns logical false for all of these; true or nil else
]=]
local function validate_cat_args (args)
if not (args.nocat or args.cat) then -- both are nil, so categorize
return;
end
if false == yesno (args.cat) or true == yesno (args.nocat) then
args.nocat = true; -- set to true when args.nocat is affirmative; nil else (as if the parameter were not set in the template)
else -- args.nocat is the parameter actually used.
args.nocat = nil;
end
end
--[[--------------------------< I N _ A R R A Y >--------------------------------------------------------------
Whether needle is in haystack.
]]
local function in_array (needle, haystack)
if needle == nil then
return false;
end
for n,v in ipairs (haystack) do
if v == needle then
return n;
end
end
return false;
end
--[[--------------------------< F O R M A T _ I E T F _ T A G >------------------------------------------------
Prettify IETF tags to use recommended subtag formats:
code: lower case
script: sentence case
region: upper case
variant: lower case
private: lower case prefixed with -x-
]]
local function format_ietf_tag (code, script, region, variant, private)
local out = {};
if is_set (private) then
return table.concat ({code:lower(), 'x', private:lower()}, '-'); -- if private, all other tags ignored
end
table.insert (out, code:lower());
if is_set (script) then
script = script:lower():gsub ('^%a', string.upper);
table.insert (out, script);
end
if is_set (region) then
table.insert (out, region:upper());
end
if is_set (variant) then
table.insert (out, variant:lower());
end
return table.concat (out, '-');
end
--[[--------------------------< G E T _ I E T F _ P A R T S >--------------------------------------------------
Extracts and returns IETF language tag parts:
primary language subtag (required) - 2 or 3 character IANA language code
script subtag - four character IANA script code
region subtag - two-letter or three digit IANA region code
variant subtag - four digit or 5-8 alnum variant code; only one variant subtag supported
private subtag - x- followed by 1-8 alnum private code; only supported with the primary language tag
in any one of these forms
lang lang-variant
lang-script lang-script-variant
lang-region lang-region-variant
lang-script-region lang-script-region-variant
lang-x-private
each of lang, script, region, variant, and private, when used, must be valid.
Languages with both two- and three-character code synonyms are promoted to the two-character synonym because
the IANA registry file omits the synonymous three-character code; we cannot depend on browsers understanding
the synonymous three-character codes in the lang= attribute.
For {{lang-??}} templates, the parameters |script=, |region=, and |variant= are supported (not supported in {{lang}}
because those parameters are superfluous to the IETF subtags in |code=).
Returns six values; all lower case. Valid parts are returned as themselves; omitted parts are returned as empty strings, invalid
parts are returned as nil; the sixth returned item is an error message (if an error detected) or nil.
See http://www.rfc-editor.org/rfc/bcp/bcp47.txt section 2.1.
]]
local function get_ietf_parts (source, args_script, args_region, args_variant)
local code, script, region, variant, private; -- IETF tag parts
if not is_set (source) then
return nil, nil, nil, nil, nil, cfg.get_ietf_parts_t.missing_lang_tag;
end
local pattern = { -- table of tables holding acceptable IETF tag patterns and short names of the IETF part captured by the pattern
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 1 - ll-Ssss-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 2 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 3 - ll-Ssss-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 4 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$', 's', 'v'}, -- 5 - ll-Ssss-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'v'}, -- 6 - ll-Ssss-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$', 'r', 'v'}, -- 7 - ll-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%d%d%d)%-(%d%d%d%d)$', 'r', 'v'}, -- 8 - ll-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 9 - ll-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 10 - ll-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%d%d%d%d)$', 'v'}, -- 11 - ll-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%w%w%w%w%w%w?%w?%w?)$', 'v'}, -- 12 - ll-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)$', 's', 'r'}, -- 13 - ll-Ssss-RR
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)$', 's', 'r'}, -- 14 - ll-Ssss-DDD (region is 3 digits)
{'^(%a%a%a?)%-(%a%a%a%a)$', 's'}, -- 15 - ll-Ssss
{'^(%a%a%a?)%-(%a%a)$', 'r'}, -- 16 - ll-RR
{'^(%a%a%a?)%-(%d%d%d)$', 'r'}, -- 17 - ll-DDD (region is 3 digits)
{'^(%a%a%a?)$'}, -- 18 - ll
{'^(%a%a%a?)%-x%-(%w%w?%w?%w?%w?%w?%w?%w?)$', 'p'}, -- 19 - ll-x-pppppppp (private is 1-8 alnum characters)
}
local t = {}; -- table of captures; serves as a translator between captured IETF tag parts and named variables
for i, v in ipairs (pattern) do -- spin through the pattern table looking for a match
local c1, c2, c3, c4; -- captures in the 'pattern' from the pattern table go here
c1, c2, c3, c4 = source:match (pattern[i][1]); -- one or more captures set if source matches pattern[i])
if c1 then -- c1 always set on match
code = c1; -- first capture is always code
t = {
[pattern[i][2] or 'x'] = c2, -- fill the table of captures with the rest of the captures
[pattern[i][3] or 'x'] = c3, -- take index names from pattern table and assign sequential captures
[pattern[i][4] or 'x'] = c4, -- index name may be nil in pattern[i] table so "or 'x'" spoofs a name for this index in this table
};
script = t.s or ''; -- translate table contents to named variables;
region = t.r or ''; -- absent table entries are nil so set named IETF parts to empty string for concatenation
variant= t.v or '';
private = t.p or '';
break; -- and done
end
end
if not code then
return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_tag, {source}); -- don't know what we got but it is malformed
end
code = code:lower(); -- ensure that we use and return lower case version of this
if not (override_table[code] or lang_table[code] or synonym_table[code] or lang_dep_table[code]) then
return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_code, {code}); -- invalid language code, don't know about the others (don't care?)
end
if synonym_table[code] then -- if 639-2/639-2T code has a 639-1 synonym
table.insert (maint_cats, substitute (cfg.get_ietf_parts_t.maint_promo_cat, {code}));
table.insert (maint_msgs, substitute (cfg.get_ietf_parts_t.maint_promo_msg, {code, synonym_table[code]}));
code = synonym_table[code]; -- use the synonym
end
if is_set (script) then
if is_set (args_script) then
return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_scr; -- both code with script and |script= not allowed
end
else
script = args_script or ''; -- use args.script if provided
end
if is_set (script) then
script = script:lower(); -- ensure that we use and return lower case version of this
if not script_table[script] then
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_scr_code, {script, code}); -- language code OK, invalid script, don't know about the others (don't care?)
end
end
if suppressed_table[script] then -- ensure that code-script does not use a suppressed script
if in_array (code, suppressed_table[script]) then
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.script_code, {script, code}); -- language code OK, script is suppressed for this code
end
end
if is_set (region) then
if is_set (args_region) then
return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_reg; -- both code with region and |region= not allowed
end
else
region = args_region or ''; -- use args.region if provided
end
if is_set (region) then
region = region:lower(); -- ensure that we use and return lower case version of this
if not region_table[region] then
return code, script, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_reg_code, {region, code});
end
end
if is_set (variant) then
if is_set (args_variant) then
return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_var; -- both code with variant and |variant= not allowed
end
else
variant = args_variant or ''; -- use args.variant if provided
end
if is_set (variant) then
variant = variant:lower(); -- ensure that we use and return lower case version of this
if not variant_table[variant] then -- make sure variant is valid
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var, {variant});
end -- does this duplicate/replace tests in lang() and lang_xx()?
if is_set (script) then -- if script set it must be part of the 'prefix'
if not in_array (table.concat ({code, '-', script}), variant_table[variant]['prefixes']) then
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_scr, {variant, code, script});
end
elseif is_set (region) then -- if region set, there are some prefixes that require lang code and region (en-CA-newfound)
if not in_array (code, variant_table[variant]['prefixes']) then -- first see if lang code is all that's required (en-oxendict though en-GB-oxendict is preferred)
if not in_array (table.concat ({code, '-', region}), variant_table[variant]['prefixes']) then -- now try for lang code and region (en-CA-newfound)
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_reg, {variant, code, region});
end
end
else -- cheap way to determine if there are prefixes; fonipa and others don't have prefixes; # operator always returns 0
if variant_table[variant]['prefixes'][1] and not in_array (code, variant_table[variant]['prefixes']) then
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code, {variant, code});
end
end
end
if is_set (private) then
private = private:lower(); -- ensure that we use and return lower case version of this
if not override_table[table.concat ({code, '-x-', private})] then -- make sure private tag is valid; note that index
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_pri, {private});
end
end
return code, script, region, variant, private, nil; -- return the good bits; make sure that msg is nil
end
--[=[-------------------------< M A K E _ W I K I L I N K >----------------------------------------------------
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an
empty string.
]=]
local function make_wikilink (link, display)
if is_set (link) then
if is_set (display) then
return table.concat ({'[[', link, '|', display, ']]'});
else
return table.concat ({'[[', link, ']]'});
end
else
return '';
end
end
--[[--------------------------< D I V _ M A R K U P _ A D D >--------------------------------------------------
Adds <i> and </i> tags to list-item text or to implied <p>..</p> text. Mixed not supported.
]]
local function div_markup_add (text, style)
if text:find ('^\n[%*:;#]') then -- look for list markup; list markup must begin at start of text
if 'italic' == style then
return text:gsub ('(\n[%*:;#]+)([^\n]+)', '%1<i>%2</i>'); -- insert italic markup at each list item
else
return text;
end
end
if text:find ('\n+') then -- look for any number of \n characters in text
text = text:gsub ('([^\n])\n([^\n])', '%1 %2'); -- replace single newline characters with a space character which mimics MediaWiki
if 'italic' == style then
text = text:gsub('[^\n]+', '<p><i>%1</i></p>'); -- insert p and italic markup tags at each implied p (two or more consecutive '\n\n' sequences)
else
text = text:gsub ('[^\n]+', '<p>%1</p>'); -- insert p markup at each implied p
text = text:gsub ('\n', ''); -- strip newline characters
end
end
return text;
end
--[[--------------------------< T I T L E _ W R A P P E R _ M A K E >------------------------------------------
Makes a <span title="<title text>"><content_text></span> or <div title="<title text>"><content_text></div> where
<title text> is in the tool-tip in the wiki's local language and <content_text> is non-local-language text in
HTML markup. This because the lang= attribute applies to the content of its enclosing tag.
<tag> holds a string 'div' or 'span' used to choose the correct wrapping tag.
]]
local function title_wrapper_make (title_text, content_text, tag)
local wrapper_t = {};
table.insert (wrapper_t, table.concat ({'<', tag})); -- open opening wrapper tag
table.insert (wrapper_t, ' title=\"'); -- begin title attribute
table.insert (wrapper_t, title_text); -- add <title_text>
table.insert (wrapper_t, '\">'); -- end title attribute and close opening wrapper tag
table.insert (wrapper_t, content_text); -- add <content_text>
table.insert (wrapper_t, table.concat ({'</', tag, '>'})); -- add closing wrapper tag
return table.concat (wrapper_t); -- make a big string and done
end
--[[--------------------------< M A K E _ T E X T _ H T M L >--------------------------------------------------
Add the HTML markup to text according to the type of content that it is: <span> or <i> tags for inline content or
<div> tags for block content
The lang= attribute also applies to the content of the tag where it is placed so this is wrong because 'Spanish
language text' is English:
<i lang="es" title="Spanish language text">casa</i>
should be:
<span title="Spanish language text"><i lang="es">casa</i></span>
or for <div>...</div>:
<div title="Spanish language text"><div lang="es"><spanish-language-text></div></div>
]]
local function make_text_html (code, text, tag, rtl, style, size, language)
local html_t = {};
local style_added = '';
local wrapper_tag = tag; -- <tag> gets modified so save a copy for use when/if we create a wrapper span or div
if text:match ('^%*') then
table.insert (html_t, '*'); -- move proto language text prefix outside of italic markup if any; use numeric entity because plain splat confuses MediaWiki
text = text:gsub ('^%*', ''); -- remove the splat from the text
end
if 'span' == tag then -- default HTML tag for inline content
if 'italic' == style then -- but if italic
tag = 'i'; -- change to <i> tags
end
else -- must be div so go
text = div_markup_add (text, style); -- handle implied <p>, implied <p> with <i>, and list markup (*;:#) with <i>
end
table.insert (html_t, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> HTML tag
code = code:gsub ('%-x%-.*', ''); -- strip private use subtag from code tag because meaningless outside of Wikipedia
table.insert (html_t, table.concat ({' lang="', code, '\"'})); -- add language attribute
if (rtl or unicode.is_rtl(text)) and ('ltr' == this_wiki_lang_dir) then -- text is right-to-left on a left-to-right wiki
table.insert (html_t, ' dir="rtl"'); -- add direction attribute for right-to-left languages
elseif not (rtl or unicode.is_rtl(text)) and ('rtl' == this_wiki_lang_dir) then -- text is left-to-right on a right-to-left wiki
table.insert (html_t, ' dir="ltr"'); -- add direction attribute for left-to-right languages
end
if 'normal' == style then -- when |italic=no
table.insert (html_t, ' style=\"font-style: normal;'); -- override external markup, if any
style_added = '\"'; -- remember that style attribute added and is not yet closed
end
if is_set (size) then -- when |size=<something>
if is_set (style_added) then
table.insert (html_t, table.concat ({' font-size: ', size, ';'})); -- add when style attribute already inserted
else
table.insert (html_t, table.concat ({' style=\"font-size: ', size, ';'})); -- create style attribute
style_added = '\"'; -- remember that style attribute added and is not yet closed
end
end
table.insert (html_t, table.concat ({style_added, '>'})); -- close the opening HTML tag
table.insert (html_t, text); -- insert the text
table.insert (html_t, table.concat ({'</', tag, '>'})); -- close the 'text' <i>, <span>, or <div> HTML tag
if is_set (language) then -- create a <title_text> string for the title= attribute in a wrapper span or div
local title_text;
if 'zxx' == code then -- special case for this tag 'no linguistic content'
title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.zxx}); -- not a language so don't use 'language' in title text
elseif mw.ustring.find (language, 'languages', 1, true) then
title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.collective}); -- for collective languages
else
title_text = substitute ('$1-$2', {language, cfg.make_text_html_t.individual}); -- for individual languages
end
return title_wrapper_make (title_text, table.concat (html_t), wrapper_tag);
else
return table.concat (html_t);
end
end
--[=[-------------------------< M A K E _ C A T E G O R Y >----------------------------------------------------
For individual language, <language>, returns:
[[Category:Articles containing <language>-language text]]
For English:
[[Category:Articles containing explicitly cited English-language text]]
For ISO 639-2 collective languages (and for 639-1 bh):
[[Category:Articles with text in <language> languages]]
]=]
local function make_category (code, language_name, nocat, name_get)
if ((0 ~= namespace) or nocat) and not name_get then -- only categorize in article space
return ''; -- return empty string for concatenation
end
if mw.ustring.find (language_name, 'languages', 1, true) then
return substitute ('[[$1 $2]]', {cfg.make_category_t.collective_cat, language_name});
end
if this_wiki_lang_tag == code then
return substitute ('[[$1 $2 $3-$4]]', { -- unique category name for the local language
cfg.make_category_t.cat_prefix,
cfg.make_category_t.explicit_cat,
language_name,
cfg.make_category_t.cat_postfix,
});
else
return substitute ('[[$1 $2-$3]]', { -- category for individual languages
cfg.make_category_t.cat_prefix,
language_name,
cfg.make_category_t.cat_postfix,
});
end
end
--[[--------------------------< M A K E _ T R A N S L I T >----------------------------------------------------
Return translit <i lang=xx-Latn>...</i> where xx is the language code; else return empty string.
The value |script= is not used in {{transliteration}} for this purpose; instead it uses |code. Because language scripts
are listed in the {{transliteration}} switches they are included in the data tables. The script parameter is introduced
at {{Language with name and transliteration}}. If |script= is set, this function uses it in preference to code.
To avoid confusion, in this module and the templates that use it, the transliteration script parameter is renamed
to be |translit-script= (in this function, tscript).
This function is used by both lang_xx() and xlit()
lang_xx() always provides code, language_name, and translit; may provide tscript; never provides style
xlit() always provides language_name, translit, and one of code or tscript, never both; always provides style
For {{transliteration}}, style only applies when a language code is provided.
]]
local function make_translit (code, language_name, translit, std, tscript, style, engvar)
local title_t = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards
local title_text = ''; -- tool tip text for title= attribute
std = std and std:lower(); -- lower case for table indexing
if not is_set (std) and not is_set (tscript) then -- when neither standard nor script specified
title_text = language_name; -- write a generic tool tip
if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
title_text = substitute ('$1-$2', {title_text, cfg.misc_text_t.language}); -- skip this text (individual and macro languages only)
end
title_text = substitute ('$1 $2', {title_text, mw.ustring.lower (cfg.engvar_t[engvar]['romanisz_lc'])}); -- finish the tool tip; use romanization when neither script nor standard supplied
elseif is_set (std) and is_set (tscript) then -- when both are specified
if title_t[std] then -- and if standard is legitimate
if title_t[std][tscript] then -- and if script for that standard is legitimate
if script_table[tscript] then
title_text = substitute ('$1$2 ($3 $4) $5', { -- add the appropriate text to the tool tip
title_text,
title_t[std][tscript:lower()],
script_table[tscript],
cfg.make_translit_t.script,
cfg.make_translit_t.transliteration,
});
else
title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
end
else
title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
end
else
return ''; -- invalid standard, setup for error message
end
elseif is_set (std) then -- translit-script not set, use language code
if not title_t[std] then return ''; end -- invalid standard, setup for error message
if title_t[std][code] then -- if language code is in the table (xlit may not provide a language code)
local fmt_str = '$1$2 ($3 $4) $5'; -- generic format string for tool tip
if language_name:match ('languages') then
fmt_str = '$1$2 ($3) $5'; -- format string for collective languages tool tip
end
title_text = substitute (fmt_str, { -- add the appropriate text to the tool tip
title_text,
title_t[std][code:lower()],
language_name,
cfg.misc_text_t.language,
cfg.make_translit_t.transliteration,
});
else -- code doesn't match
title_text = title_text .. title_t[std]['default']; -- so use the standard's default
end
else -- here if translit-script set but translit-std not set
if title_t['no_std'][tscript] then
title_text = title_text .. title_t['no_std'][tscript]; -- use translit-script if set
elseif title_t['no_std'][code] then
title_text = title_text .. title_t['no_std'][code]; -- use language code
else
if is_set (tscript) then
title_text = substitute ('$1$2-$3 $4', { -- write a script tool tip
title_text,
language_name,
cfg.make_translit_t.script,
cfg.make_translit_t.transliteration,
});
elseif is_set (code) then
if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
title_text = substitute ('$1-$2', { -- skip this text (individual and macro languages only)
title_text,
cfg.misc_text_t.language,
});
end
title_text = substitute ('$1 $2', { -- finish the tool tip
title_text,
cfg.make_translit_t.transliteration,
});
else
title_text = substitute ('$1 $2', { -- generic tool tip (can we ever get here?)
title_text,
cfg.make_translit_t.transliteration,
});
end
end
end
local tag
if is_set (code) then -- when a language code is provided (always with {{lang-??}} templates, not always with {{transliteration}})
code = code:match ('^(%a%a%a?)'); -- strip all subtags leaving only the language subtag
if not style then -- nil for the default italic style
tag = '<i lang="%s-Latn">%s</i>'
else
tag = '<span style="font-style: %s" lang="%s-Latn">%s</span>' -- non-standard style, construct a span tag for it
tag = string.format(tag, style, "%s", "%s")
end
tag = string.format(tag, code, "%s")
else
tag = '<span>%s</span>' -- when no language code: no lang= attribute, not italic ({{transliteration}} only)
end
tag = string.format(tag, translit) -- add the translit text
if '' == title_text then -- when there is no need for a tool-tip
return tag; -- done
else
title_text = cfg.engvar_sel_t.gb == engvar and title_text:gsub ('([Rr]omani)z', '%1s') or title_text; -- gb eng when engvar specifies gb eng; us eng else
return title_wrapper_make (title_text, tag, 'span'); -- wrap with a tool-tip span and done
end
end
--[[--------------------------< V A L I D A T E _ T E X T >----------------------------------------------------
This function checks the content of args.text and returns empty string if nothing is amiss else it returns an
error message. The tests are for empty or missing text and for improper or disallowed use of apostrophe markup.
Italic rendering is controlled by the |italic= template parameter so italic markup should never appear in args.text
either as ''itself'' or as '''''bold italic''''' unless |italic=unset or |italic=invert.
]]
local function validate_text (template, args)
if not is_set (args.text) then
return make_error_msg (cfg.validate_text_t.no_text, args, template);
end
if args.text:find ("%f[\']\'\'\'\'%f[^\']") or args.text:find ("\'\'\'\'\'[\']+") then -- because we're looking, look for 4 appostrophes or 6+ appostrophes
return make_error_msg (cfg.validate_text_t.malformed_markup, args, template);
end
local italic = args.italic;
if (cfg.keywords_t.unset ~= italic) and (cfg.keywords_t.invert ~= italic) then
if args.text:find ("%f[\']\'\'%f[^\']") or args.text:find ("%f[\']\'\'\'\'\'%f[^\']") then -- italic but not bold, or bold italic
return make_error_msg (cfg.validate_text_t.italic_markup, args, template);
end
end
end
--[[--------------------------< R E N D E R _ M A I N T >------------------------------------------------------
Render mainenance messages and categories.
]]
local function render_maint (nocat)
local maint = {};
if 0 < #maint_msgs then -- when there are maintenance messages
table.insert (maint, table.concat ({'<span class="lang-comment" style="font-style: normal; display: none; color: #33aa33; margin-left: 0.3em;">'})); -- opening <span> tag
for _, msg in ipairs (maint_msgs) do
table.insert (maint, table.concat ({msg, ' '})); -- add message strings
end
table.insert (maint, '</span>'); -- close the span
end
if (0 < #maint_cats) and (0 == namespace) and not nocat then -- when there are maintenance categories; article namespace only
for _, cat in ipairs (maint_cats) do
table.insert (maint, table.concat ({'[[Category:', cat, ']]'})); -- format and add the categories
end
end
return table.concat (maint);
end
--[[--------------------------< P R O T O _ P R E F I X >------------------------------------------------------
For proto languages, text is prefixed with a splat. We do that here as a flag for make_text_html() so that a splat
will be rendered outside of italic markup (if used). If the first character in text here is already a splat, we
do nothing.
proto_param is boolean or nil; true adds splat prefix regardless of language name; false removes and inhibits
regardless of language name; nil does nothing; presumes that the value in text is correct but removes extra splac.
]]
local function proto_prefix (text, language_name, proto_param)
if false == proto_param then -- when forced by |proto=no
return text:gsub ('^%**', ''); -- return text without splat prefix regardless of language name or existing splat prefix in text
elseif (language_name:find ('^Proto%-') or (true == proto_param)) then -- language is a proto or forced by |proto=yes
return text:gsub ('^%**', '*'); -- prefix proto-language text with a splat; also removes duplicate prefixing splats
end
return text:gsub ('^%*+', '*'); -- return text unmolested except multiple splats reduced to one splat
end
--[[--------------------------< H A S _ P O E M _ T A G >------------------------------------------------------
Looks for a poem strip marker in text; returns true when found; false else.
Auto-italic detection disabled when text has poem stripmarker because it is not possible for this code to know
the content that will replace the stripmarker.
]]
local function has_poem_tag (text)
return text:find ('\127[^\127]*UNIQ%-%-poem%-[%a%d]+%-QINU[^\127]*\127') and true or false;
end
--[[--------------------------< H T M L _ T A G _ S E L E C T >------------------------------------------------
Inspects content of and selectively trims text. Returns text and the name of an appropriate HTML tag for text.
If text contains:
\n\n text has implied <p>..</p> tags - trim leading and trailing whitespace and return
If text begins with list markup:
\n* unordered
\n; definition
\n: definition
\n# ordered
trim all leading whitespace except \n and trim all trailing whitespace
If text contains <poem>...</poem> stripmarker, return text unmodified and choose <div>..</div> tags because
the stripmarker is replaced with text wrapped in <div>..</div> tags.
If the text contains any actual <div>...</div> tags, then it's again returned unmodified and <div>...</div>
tags are used to wrap it, to prevent div/span inversion.
]]
local function html_tag_select (text)
local tag;
if has_poem_tag (text) then -- contains poem stripmarker (we can't know the content of that)
tag = 'div'; -- poem replacement is in div tags so lang must use div tags
elseif text:find ('<div') then -- reductive; if the text contains a div tag, we must use div tags
tag = 'div';
elseif mw.text.trim (text):find ('\n\n+') then -- contains implied p tags
text = mw.text.trim (text); -- trim leading and trailing whitespace characters
tag = 'div'; -- must be div because span may not contain p tags (added later by MediaWiki); poem replacement is in div tags
elseif text:find ('\n[%*:;%#]') then -- if text has list markup
text = text:gsub ('^[\t\r\f ]*', ''):gsub ('%s*$', ''); -- trim all whitespace except leading newline character '\n'
tag = 'div'; -- must be div because span may not contain ul, dd, dl, ol tags (added later by MediaWiki)
else
text = mw.text.trim (text); -- plain text
tag = 'span'; -- so span is fine
end
return text, tag;
end
--[[--------------------------< V A L I D A T E _ P R O T O >--------------------------------------------------
Validates value assigned to |proto=; permitted values are yes and no; yes returns as true, no returns as false,
empty string (or parameter omitted) returns as nil; any other value returns nil with <proto_param> as second
return value for use in error message.
]]
local function validate_proto (proto_param)
if cfg.keywords_t.affirmative == proto_param then
return true;
elseif cfg.keywords_t.negative == proto_param then
return false;
elseif is_set (proto_param) then
return nil, proto_param; -- |proto= something other than 'yes' or 'no'
else
return nil; -- missing or empty
end
end
--[[--------------------------< L A N G U A G E _ N A M E _ G E T >--------------------------------------------
Common function to return language name from the data set according to IETF tag.
Returns language name if found in data tables; nil else.
]]
local function language_name_get (ietf, code, cat)
ietf = ietf:lower(); -- ietf:lower() because format_ietf_tag() returns mixed case
local name; -- remains nil if not found
if override_table[ietf] then -- look for whole IETF tag in override table
name = override_table[ietf];
elseif override_table[code] then -- not there so try basic language tag
name = override_table[code];
elseif lang_table[code] then -- shift to IANA active tag/name table
name = lang_table[code];
elseif lang_dep_table[code] then -- try the IANA deprecated tag/name table
name = lang_dep_table[code];
end
if lang_dep_table[code] and cat then -- because deprecated code may have been overridden to en.wiki preferred name
table.insert (maint_cats, substitute (cfg.language_name_get_t.deprecated_cat, {code}));
table.insert (maint_msgs, substitute (cfg.language_name_get_t.deprecated_msg, {code}));
end
return name; -- name from data tables or nil
end
--[[--------------------------< T E X T _ S C R I P T _ M A T C H _ T E S T >----------------------------------
IETF script subtag should match the script of the <text>. This module does not attempt to know all scripts and
what they look like. It does know what Latn script looks like so when <text> is written using other than the Latn
script, the IETF script subtag, if present, should not be Latn.
Conversely, when <text> is written using the Latn script, the IETF script subtag, if present, should be Latn.
For the purposes of this test, Latf (Fraktur) and Latg (Gaelic) are considered to be equivalent to Latn because
unicode treats these two scripts as font-specific variants of Latn.
Returns an error message when mismatch detected; nil else.
]]
local function text_script_match_test (script, is_latn_text, pos, char)
local scripts_t = {['latf'] = true, ['latg'] = true, ['latn'] = true}; -- unicode 'latn' scripts; 'latf' and 'latg' are font variants so there are no Fraktur or Gaelic codepoints
if is_set (script) then -- don't bother with the rest of this if <script> is nil or empty string
script = script:lower(); -- lower case to index into <scripts_t>
if is_latn_text then -- when text is wholly Latn script
if not scripts_t[script] then -- but a non-Latn script is specified
return cfg.text_script_match_test_t.latn_txt_mismatch; -- emit an error message
end
else -- when text is not wholly Latn script
if scripts_t[script] then -- but a Latn script is specified
return substitute (cfg.text_script_match_test_t.latn_scr_mismatch, {pos, char}); -- emit an error message with position of first offending character
end
end
end
end
--[[--------------------------< B I N A R Y _ S E A R C H >---------------------------------------------------
conducts a binary search of <ranges_t> for a sub-range that holds <target>.
returns boolean true if a sub-range holding <target> is found; boolean false else.
]]
local function binary_search (target, ranges_t)
local idx_bot = 1; -- initialize to index of first key
local idx_top = sizeof_ranges_t; -- initialize to index of last key (number of keys)
if (target < ranges_t[idx_bot][1]) or (target > ranges_t[idx_top][2]) then -- invalid; target out of range
return; -- abandon
end
local idx_mid; -- calculated index of range midway between top index and bottom index
local flag = false; -- flag to tell us when we've evaluated last (highest) range in <ranges_t>
while 1 do
idx_mid = math.ceil ((idx_bot + idx_top) / 2); -- get the mid-point in the <ranges_t> sequence
if (target >= ranges_t[idx_mid][1]) and (target <= ranges_t[idx_mid][2]) then -- indexed range low value <= target <= indexed range high value
return true; -- we found the range that holds the <target> character; return true
elseif (target > ranges_t[idx_mid][2]) then -- is <target> > indexed range high value?
idx_bot = idx_mid; -- adjust <idx_bot> up
else -- here when <target> less than indexed range low value
idx_top = idx_mid - 1; -- adjust <idx_top> down
end
if flag then
break; -- here when we just evaluated the last range and <target> not found
end
if not flag and (idx_bot == idx_top) then -- set true just before we evaluate the last (highest) range in <ranges_t>
flag = true;
end
end
end
--[[--------------------------< I S _ L A T I N >--------------------------------------------------------------
compare <text> as codepoints to lists of known codepoints accepted as Latn script
returns boolean true and modified <text> when <text> is wrapped in accept-as-written markup
returns boolean true and <text> when codepoint is known
returns boolean false, <text>, non-Latn codepoint position in <text> (left to right), and the codepoint character
when codepoint is not known
TODO: when text has accept-as-written markup, return a non-boolean value to indicate that <text> is not wholly
latn script? Use that return value to create non-Latn HTML lang= attribute because <text> isn't really
latn so lang=und (undetermined)? or instead, omit the -Latn subtag? (without -Latn need to force |italic=yes)
]]
local function is_latin (text, tag)
local count;
text, count = text:gsub ('^%(%((.+)%)%)$', '%1'); -- remove accept-as-written markup if present
if 0 ~= count then
return true, text; -- markup present so assume that <text> is Latn-script
end
local pos = 0; -- position counter for error messaging
for codepoint in mw.ustring.gcodepoint (text) do -- fetch each code point
pos = pos + 1; -- bump the position counter
if not is_latn_data.singles_t[codepoint] and -- codepoint not found in the singles list?
not binary_search (codepoint, is_latn_data.ranges_t) and -- codepoint not a member of a listed range?
not (tag and is_latn_data.specials_t[codepoint] and is_latn_data.specials_t[codepoint][tag]) then -- not a language-specific codepoint?
return false, text, pos, mw.ustring.char (codepoint); -- codepoint not known; return false with codepoint position and character representation
end
end
return true, text; -- is known; return <text>
end
--[[--------------------------< _ L A N G >--------------------------------------------------------------------
Entry point for {{lang}}.
There should be no reason to set parameters in the {{lang}} {{#invoke:}}
<includeonly>{{#invoke:lang|lang}}</includeonly>
Parameters are received from the template's frame (parent frame).
]]
local function _lang (args)
local out = {};
local language_name; -- used to make category names
local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set
local subtags = {}; -- IETF subtags script, region, variant, and private
local code; -- the language code
local msg; -- for error messages
local tag = 'span'; -- initial value for make_text_html()
local template = args.template or cfg.templates_t.lang;
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
validate_cat_args (args); -- determine if categorization should be suppressed
if args[1] and args.code then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'1', cfg.lang_t.conflict_n_param_types.code}), args, template);
else
args.code = args[1] or args.code; -- prefer args.code
end
if args[2] and args.text then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'2', cfg.lang_t.conflict_n_param_types.text}), args, template);
else
args.text = args[2] or args.text; -- prefer args.text
end
msg = validate_italic (args);
if msg then
return make_error_msg (msg, args, template);
end
msg = validate_text (template, args); -- ensure that |text= is set
if is_set (msg) then -- msg is an already-formatted error message
return msg;
end
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly
args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false
args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag
if msg then
return make_error_msg (substitute (cfg.lang_t.invalid_proto, {msg}), args, template);
end
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code); -- |script=, |region=, |variant= not supported because they should be part of args.code ({{{1}}} in {{lang}})
if msg then
return make_error_msg (msg, args, template);
end
local is_latn_text, pos, char;
is_latn_text, args.text, pos, char= is_latin (args.text, code); -- make a boolean
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
end
if nil == args.style then -- nil when |italic= absent or not set or |italic=default; args.style controls
if ('latn' == subtags.script) or -- script is latn
(this_wiki_lang_tag ~= code and not is_set (subtags.script) and not has_poem_tag (args.text) and is_latn_text) then -- text not this wiki's language, no script specified and not in poem markup but is wholly latn script (auto-italics)
args.style = 'italic'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic
else
args.style = 'inherit'; -- italic not set; script not latn; inherit current style
end
end
if is_set (subtags.script) then -- if script set, override rtl setting
if in_array (subtags.script, lang_data.rtl_scripts) then
args.rtl = true; -- script is an rtl script
else
args.rtl = false; -- script is not an rtl script
end
end
args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
if cfg.keywords_t.invert == args.style and 'span' == tag then -- invert only supported for in-line content
args.text = invert_italics (args.text)
end
args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.style, args.size, language_name));
table.insert (out, make_category (code, language_name, args.nocat));
table.insert (out, render_maint (args.nocat)); -- maintenance messages and categories
return table.concat (out); -- put it all together and done
end
--[[--------------------------< L A N G >----------------------------------------------------------------------
Entry point for {{lang}}.
There should be no reason to set parameters in the {{lang}} {{#invoke:}}
<includeonly>{{#invoke:lang|lang}}</includeonly>
Parameters are received from the template's frame (parent frame).
]]
local function lang (frame)
local args_t = getArgs (frame, { -- this code so that we can detect and handle wiki list markup in text
valueFunc = function (key, value)
if 2 == key or 'text' == key then -- the 'text' parameter; do not trim wite space
return value; -- return untrimmed 'text'
elseif value then -- all other values: if the value is not nil
value = mw.text.trim (value); -- trim whitespace
if '' ~= value then -- empty string when value was only whitespace
return value;
end
end
return nil; -- value was empty or contained only whitespace
end -- end of valueFunc
});
args_t.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang|...}}
local msg = parameter_validate (args_t, cfg.templates_t.lang); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
return make_error_msg (msg, args_t, cfg.templates_t.lang); -- when template has unsupported params, abandon with error message
end
return _lang (args_t);
end
--[[--------------------------< T R A N S L A T I O N _ M A K E >----------------------------------------------
Stand-alone function to create literal translation of main text.
Also used by {{lang-x2}}.
]]
local function translation_make (args_t)
local translation_t = {', '}; -- initialize output
if 'none' ~= args_t.label then -- if we want a label
table.insert (translation_t, '<small>'); -- open the <small> HTML tag
if cfg.keywords_t.negative == args_t.link then
table.insert (translation_t, substitute ('<abbr title="$1">$2</abbr>', {cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr})); -- unlinked form
else
table.insert (translation_t, make_wikilink (cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr)); -- linked form
end
table.insert (translation_t, " </small>"); -- close the <small> HTML tag
end
table.insert (translation_t, table.concat ({ -- user styling spans match spand from {{gloss}}
'<span class="gloss-quot">\'</span>', -- user styling span for quote marks; use HTML entities to avoid wiki markup confusion
'<span class="gloss-text">', -- open user styling span for the translation
args_t.translation, -- the translation
'</span>', -- close user styling span for the translation
'<span class="gloss-quot">\'</span>' -- user styling span for quote marks
}));
return table.concat (translation_t); -- make a big string and done
end
--[[--------------------------< _ L A N G _ X X >--------------------------------------------------------------
For the {{lang-??}} templates, the only parameter required to be set in the template is the language code. All
other parameters can, usually should, be written in the template call. For {{lang-??}} templates for languages
that can have multiple writing systems, it may be appropriate to set |script= as well.
For each {{lang-??}} template choose the appropriate entry-point function so that this function knows the default
styling that should be applied to text.
For normal, upright style:
<includeonly>{{#invoke:lang|lang_xx_inherit|code=xx}}</includeonly>
For italic style:
<includeonly>{{#invoke:lang|lang_xx_italic|code=xx}}</includeonly>
All other parameters should be received from the template's frame (parent frame)
Supported parameters are:
|code = (required) the IANA language code
|script = IANA script code; especially for use with languages that use multiple writing systems
|region = IANA region code
|variant = IANA variant code
|text = (required) the displayed text in language specified by code
|link = boolean false ('no') does not link code-spcified language name to associated language article
|rtl = boolean true ('yes') identifies the language specified by code as a right-to-left language
|nocat = boolean true ('yes') inhibits normal categorization; error categories are not affected
|cat = boolian false ('no') opposite form of |nocat=
|italic = boolean true ('yes') renders displayed text in italic font; boolean false ('no') renders displayed text in normal font; not set renders according to initial_style_state
|lit = text that is a literal translation of text
|label = 'none' to suppress all labeling (language name, 'translit.', 'lit.')
any other text replaces language-name label - automatic wikilinking disabled
for those {{lang-??}} templates that support transliteration (those templates where |text= is not entirely latn script):
|translit = text that is a transliteration of text
|translit-std = the standard that applies to the transliteration
|translit-script = ISO 15924 script name; falls back to code
For {{lang-??}}, the positional parameters are:
{{{1}}} text
{{{2}}} transliterated text
{{{3}}} literal translation text
no other positional parameters are allowed
]]
local function _lang_xx (args, base_template) -- base_template will be either of 'langx' or 'lang-xx'
local out = {};
local language_name; -- used to make display text, article links
local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set
local subtags = {}; -- IETF subtags script, region, and variant
local code; -- the language code
local translit_script_name; -- name associated with IANA (ISO 15924) script code
local translit;
local msg; -- for error messages
local tag = 'span'; -- initial value for make_text_html()
local template = args.template or base_template;
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
local text_idx = (cfg.templates_t.langx == base_template) and 2 or 1; -- for {{langx}} 'text' positional parameter is '2'
local translit_idx = (cfg.templates_t.langx == base_template) and 3 or 2;
local xlate_idx = (cfg.templates_t.langx == base_template) and 4 or 3;
if args[text_idx] and args.text then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {text_idx, cfg.lang_t.conflict_n_param_types.text}), args, template);
else
args.text = args[text_idx] or args.text; -- prefer positional 'text' parameter
end
msg = validate_italic (args);
if msg then
return make_error_msg (msg, args, template);
end
msg = validate_text (template, args); -- ensure that |text= is set, does not contain italic markup and is protected from improper bolding
if is_set (msg) then
return msg;
end
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly
if args[translit_idx] and args.translit then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.translit}), args, template);
else
args.translit = args[translit_idx] or args.translit -- prefer positional 'translit' parameter
end
args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else
if args[xlate_idx] and (args.translation or args.lit) then
return make_error_msg (substitute (cfg.lang_xx_t.conflict_n_lit, {xlate_idx}), args, template);
elseif args.translation and args.lit then
return make_error_msg (cfg.lang_xx_t.conflict_lit, args, template);
else
args.translation = args[xlate_idx] or args.translation or args.lit; -- prefer positional 'translation' parameter
end
if args.links and args.link then
return make_error_msg (cfg.lang_xx_t.conflict_link, args, template);
else
args.link = args.link or args.links; -- prefer args.link
end
validate_cat_args (args); -- determine if categorization should be suppressed
args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code, args.script, args.region, args.variant); -- private omitted because private
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
end
if args.translit then
local latn, pos, char;
latn, args.translit, pos, char = is_latin (args.translit, (('' ~= subtags.private) and (code .. '-x-' .. subtags.private)) or code);
if not latn then
return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template);
end
end
local is_latn_text, text, pos, char = is_latin (args.text, code); -- make a boolean
args.text = text; -- may have been modified (accept-as-written markup removed)
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
end
if cfg.templates_t.langx == base_template then -- auto-italics for {{langx}} templates; adapted from {{lang}} (no support for poem tag)
if nil == args.style then -- nil when |italic= absent or not set or |italic=default; args.style controls
if ('latn' == subtags.script) or -- script is latn
(this_wiki_lang_tag ~= code and not is_set (subtags.script) and is_latn_text) then -- text is not this wiki's language, no script specified and is wholly latn script (auto-italics)
args.style = 'italic'; -- set font-style:italic
else
args.style = 'inherit'; -- italic not set; script not latn; inherit current style
end
end
else -- {{lang-xx}} does not do auto italics; retained for those wikis that don't support {{langx}}
if nil == args.style then -- args.style controls
if is_set (subtags.script) then
if 'latn' == subtags.script then
args.style = 'italic'; -- |script=Latn; set for font-style:italic
else
args.style = initial_style_state; -- italic not set; script is not latn; set for font-style:<initial_style_state>
end
else
args.style = initial_style_state; -- here when |italic= and |script= not set; set for font-style:<initial_style_state>
end
end
end
if is_set (subtags.script) then -- if script set override rtl setting
if in_array (subtags.script, lang_data.rtl_scripts) then
args.rtl = true; -- script is an rtl script
else
args.rtl = false; -- script is not an rtl script
end
end
args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag
if msg then
return make_error_msg (substitute (cfg.lang_t.invalid_proto, {args.proto}), args, template);
end
args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
category_name = language_name; -- category names retain IANA parenthetical diambiguators (if any)
language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them
if args.label then
if 'none' ~= args.label then
table.insert (out, table.concat ({args.label, ': '})); -- custom label
end
else
if cfg.keywords_t.negative == args.link then
table.insert (out, language_name); -- language name without wikilink
else
if mw.ustring.find (language_name, 'languages', 1, true) then
table.insert (out, make_wikilink (language_name)); -- collective language name uses simple wikilink
elseif lang_data.article_name[args.code:lower()] then -- is IETF tag in article name over ride?
table.insert (out, make_wikilink (lang_data.article_name[args.code:lower()], language_name)); -- language name with wikilink from override data
elseif lang_data.article_name[code] then -- is language tag in article override
table.insert (out, make_wikilink (lang_data.article_name[code], language_name)); -- language name with wikilink from override data
else
table.insert (out, make_wikilink (substitute ('$1 $2', {language_name, cfg.misc_text_t.language}), language_name)); -- language name with wikilink
end
end
table.insert (out, ': '); -- separator
end
if cfg.keywords_t.invert == args.italic then
args.text = invert_italics (args.text)
end
args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.style, args.size, ('none' == args.label) and language_name or nil))
if is_set (args.translit) and not is_latn_text then -- transliteration; not supported when args.text is wholly latn text (this is an imperfect test)
table.insert (out, ', '); -- comma to separate text from translit
if 'none' ~= args.label then
table.insert (out, '<small>');
if script_table[args['translit-script']] then -- when |translit-script= is set, try to use the script's name
translit_script_name = script_table[args['translit-script']];
else
translit_script_name = language_name; -- fall back on language name
end
local translit_title_obj = mw.title.makeTitle (0, substitute ('$1 $2',{cfg.lang_xx_t.romanization, translit_script_name})); -- make a title object; no engvar, article titles use US spelling
if translit_title_obj.exists and (cfg.keywords_t.negative ~= args.link) then
table.insert (out, make_wikilink (substitute ('$1 $2', {cfg.lang_xx_t.romanization, translit_script_name or language_name}),
substitute ('$1', {cfg.engvar_t[args.engvar]['romanisz_pt']})) .. ':'); -- make a wikilink if there is an article to link to; engvar the display text
else
table.insert (out, substitute ('$1:', {cfg.engvar_t[args.engvar]['romanisz_pt']})); -- else plain text per engvar
end
table.insert (out, ' </small>'); -- close the small tag
end
translit = make_translit (args.code, language_name, args.translit, args['translit-std'], args['translit-script'], nil, args.engvar)
if is_set (translit) then
table.insert (out, translit);
else
return make_error_msg (substitute ('$1: $2', {cfg.lang_xx_t.invalid_xlit_std, args['translit-std'] or '[missing]'}), args, template);
end
elseif is_set (args.translit) and is_latn_text then -- when creating a transliteration of Latn script <text>
return make_error_msg (cfg.lang_xx_t.xlit_of_latn, args, template); -- emit error message and abandon
end
if is_set (args.translation) then -- translation (not supported in {{lang}})
table.insert (out, translation_make (args));
end
table.insert (out, make_category (code, category_name, args.nocat));
table.insert (out, render_maint(args.nocat)); -- maintenance messages and categories
return table.concat (out); -- put it all together and done
end
--[[--------------------------< L A N G _ X X _ A R G S _ G E T >----------------------------------------------
Common function to get args table from {{lang-??}} templates.
Returns table of args.
Text positional parameters are not trimmed here but are selectively trimmed at html_tag_select().
]]
local function lang_xx_args_get (frame, base_template)
local args_t = getArgs(frame,
{
parentFirst= true, -- parameters in the template override parameters set in the {{#invoke:}}
valueFunc = function (key, value)
if ((cfg.templates_t.langx == base_template) and 2 or 1) == key then -- the 'text' positional parameter; 1 for {{lang-??}}, 2 for {{langx}}; do not trim wite space
return value; -- return untrimmed 'text' positional parameter
elseif value then -- all other values: if the value is not nil
value = mw.text.trim (value); -- trim whitespace
if '' ~= value then -- empty string when value was only whitespace
return value;
end
end
return nil; -- value was empty or contained only whitespace
end -- end of valueFunc
});
return args_t;
end
--[[--------------------------< L A N G _ X X _ I T A L I C >--------------------------------------------------
Entry point for those {{lang-??}} templates that call lang_xx_italic(). Sets the initial style state to italic.
]]
local function lang_xx_italic (frame)
local args = lang_xx_args_get (frame, cfg.templates_t.langxx);
args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_italic|...}}
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message
end
initial_style_state = 'italic';
return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category
end
--[[--------------------------< _ L A N G _ X X _ I T A L I C >------------------------------------------------
Entry point from another module. Sets the initial style state to italic.
]]
local function _lang_xx_italic (args)
initial_style_state = 'italic';
return _lang_xx (args, cfg.templates_t.langxx);
end
--[[--------------------------< L A N G _ X X _ I N H E R I T >------------------------------------------------
Entry point for those {{lang-??}} templates that call lang_xx_inherit(). Sets the initial style state to inherit.
]]
local function lang_xx_inherit (frame)
local args = lang_xx_args_get (frame, cfg.templates_t.langxx);
args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_inherit|...}}
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message
end
initial_style_state = 'inherit';
return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category
end
--[[--------------------------< _ L A N G _ X X _ I N H E R I T >----------------------------------------------
Entry point from another module. Sets the initial style state to inherit.
]]
local function _lang_xx_inherit (args)
initial_style_state = 'inherit';
return _lang_xx (args, cfg.templates_t.langxx);
end
--[[--------------------------< _ L A N G X >------------------------------------------------------------------
Entry point from another module.
]]
local function _langx (args_t)
local langx_data = mw.loadData ('Module:Lang/langx'); -- get necessary data
local rtl_t = langx_data.rtl_t; -- get list of language tags for languages that are rendered right-to-left
local link_t = langx_data.link_t; -- get list of language tags for {{lang-??}} templates that set |link=<something>
local size_t = langx_data.size_t; -- get list of language tags for {{lang-??}} templates that set |size=<something>
local msg = parameter_validate (args_t, cfg.templates_t.langx);
if msg then
return make_error_msg (msg, args_t, cfg.templates_t.langx);
end
args_t.code = args_t[1] or args_t.code; -- get the language tag; must be {{{1}}} or |code=
if not args_t.code then
return make_error_msg (cfg.get_ietf_parts_t.missing_lang_tag, args_t, cfg.templates_t.langx);
end
args_t.rtl = args_t.rtl or (rtl_t[args_t.code] and cfg.keywords_t.affirmative); -- prefer |rtl= in template call, use rtl_t else
args_t.link = args_t.link or link_t[args_t.code]; -- prefer |link= in template call, use link_t felse
args_t.size = args_t.size or size_t[args_t.code]; -- prefer |size= in template call, use size_t else
args_t[1] = nil; -- unset to mimic {{lang-??}} templates which set |code=xx
local lang_subtag = args_t.code; -- use only the base language subtag for unsupported tag test; some args_t.code are modified by |script= etc
return _lang_xx (args_t, cfg.templates_t.langx);
end
--[[--------------------------< L A N G X >--------------------------------------------------------------------
Entry point for {{langx}}.
this function calls _lang_xx() to render non-English text. The {{lang-??}} templates have three positional paramters
but {{langx}} has four:
| 1 | 2 | 3 | 4
{{lang-xx |<text> |<xlit> |<xlat> }}
{{langx |<tag> |<text> |<xlit> |<xlat> }}
The calls to lang_xx_args_get() and _lang_xx() use 'langx' as a flag for those functions to select the proper
positional parameters.
{{lang-??}} depends on the calling template to select 'inherit' or 'italic' to establish the default rendering.
{{langx}} can't do that. The initial version of {{langx}} relied on a list of language tags (inherit_t in ~/langx)
scraped from those {{lang-??}} templates that call lang_xx_inherit() to render text in upright font. langx() now
uses auto-italics code adapted from {{lang}} (doesn't support poem tags).
]]
local function langx (frame)
local args_t = lang_xx_args_get (frame, cfg.templates_t.langx); -- get the arguments; 'langx' is the <base_template> used to decide which positional param is 'text', 'translit', 'lit'
return _langx (args_t);
end
--[[--------------------------< _ I S _ I E T F _ T A G >------------------------------------------------------
Returns true when a language name associated with IETF language tag exists; nil else. IETF language tag must be valid.
All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function.
Module entry point from another module.
]]
local function _is_ietf_tag (tag) -- entry point when this module is require()d into another
local c, s, r, v, p, err; -- code, script, region, variant, private, error message
c, s, r, v, p, err = get_ietf_parts (tag); -- disassemble tag into constituent part and validate
return ((c and not err) and true) or nil; -- return true when code portion has a value without error message; nil else
end
--[[--------------------------< I S _ I E T F _ T A G >--------------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function is_ietf_tag (frame)
return _is_ietf_tag (getArgs (frame)[1]); -- args[1] is the IETF language tag to be tested; also get parent frame
end
--[[--------------------------< I S _ I E T F _ T A G _ F R A M E >--------------------------------------------
Module entry point from an {{#invoke:}}; same as is_ietf_tag() except does not get parameters from the parent
(template) frame. This function not useful when called by {{lang|fn=is_ietf_tag_frame|<tag>}} because <tag>
is in the parent frame.
]]
local function is_ietf_tag_frame (frame)
return _is_ietf_tag (getArgs (frame, {frameOnly = true,})[1]); -- args[1] is the IETF language tag to be tested; do not get parent frame
end
--[[--------------------------< _ N A M E _ F R O M _ T A G >--------------------------------------------------
Returns language name associated with IETF language tag if valid; error message else.
All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function.
Set invoke's |link= parameter to yes to get wikilinked version of the language name.
Module entry point from another module.
]]
local function _name_from_tag (args)
local subtags = {}; -- IETF subtags script, region, variant, and private
local raw_code = args[1]; -- save a copy of the input IETF subtag
local link = cfg.keywords_t.affirmative == args['link']; -- make a boolean
local label = args.label;
local code; -- the language code
local msg; -- gets an error message if IETF language tag is malformed or invalid
local language_name = '';
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code);
if msg then
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
return make_error_span (template, msg);
end
raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
language_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
if 'yes' ~= args.raw then
language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them
end
if link then -- when |link=yes, wikilink the language name
if mw.ustring.find (language_name, 'languages', 1, true) then
language_name = make_wikilink (language_name, label); -- collective language name uses simple wikilink
elseif lang_data.article_name[raw_code:lower()] then -- is IETF tag in article name override?
language_name = make_wikilink (lang_data.article_name[raw_code:lower()], label or language_name); -- language name with wikilink from override data
elseif lang_data.article_name[code] then -- is language tag in article name override?
language_name = make_wikilink (lang_data.article_name[code], label or language_name); -- language name with wikilink from override data
else
language_name = make_wikilink (substitute ('$1 $2', {language_name, cfg.misc_text_t.language}), label or language_name); -- language name with wikilink
end
end
return language_name;
end
--[[--------------------------< N A M E _ F R O M _ T A G >----------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function name_from_tag (frame) -- entry point from an {{#invoke:lang|name_from_tag|<IETF tag>|link=<yes>|template=<template name>}}
return _name_from_tag (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame
end
--[[--------------------------< _ T A G _ F R O M _ N A M E >--------------------------------------------------
Returns the IETF language tag associated with the language name. Spelling of language name must be correct
according to the spelling in the source tables. When a standard language name has a parenthetical disambiguator,
that disambiguator must be omitted (they are not present in the data name-to-tag tables).
Module entry point from another module.
]]
local function _tag_from_name (args) -- entry point from another module
local msg;
if args[1] and '' ~= args[1] then
local data = mw.loadData ('Module:Lang/tag from name'); -- get the reversed data tables TODO: change when going live
local lang = args[1]:lower(); -- allow any-case for the language name (speeling must till be correct)
local tag = data.rev_override_table[lang] or data.rev_lang_table[lang] or data.rev_lang_dep_table[lang]; -- get the code; look first in the override then in the standard
if tag then
return tag, true; -- language name found so return tag and done; second return used by is_lang_name()
else
msg = substitute (cfg.tag_from_name_t.lang_not_found, {args[1]}); -- language name not found, error message
end
else
msg = cfg.tag_from_name_t.missing_lang_name; -- language name not found, error message
end
local template = '';
if args.template and '' ~= args.template then
template = table.concat ({'{{', args['template'], '}}: '}); -- make template name (if provided by the template)
end
return make_error_span (template, msg);
end
--[[--------------------------< T A G _ F R O M _ N A M E >----------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function tag_from_name (frame) -- entry point from an {{#invoke:lang|tag_from_name|<language name>|link=<yes>|template=<template name>}}
local result, _ = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by is_lang_name()
return result;
end
--[[--------------------------< I S _ L A N G _ N A M E >------------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function is_lang_name (frame)
local _, result = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by tag_from_name()
return result and true or nil;
end
--[[--------------------------< _ X L I T >--------------------------------------------------------------------
Module entry point from another module.
]]
local function _xlit (args)
local title_table = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards
local language_name; -- language name that matches language code; used for tool tip
local translit; -- transliterated text to display
local script; -- IANA script
local msg; -- for when called functions return an error message
local template = args.template or cfg.templates_t.transliteration;
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
if is_set (args[3]) then -- [3] set when {{transliteration|code|standard|text}}
args.text = args[3]; -- get the transliterated text
args.translit_std = args[2] and args[2]:lower(); -- get the standard; lower case for table indexing
if not title_table[args.translit_std] then
return make_error_msg (substitute (cfg.transl_t.unrecog_xlit_std, {args.translit_std}), args, template);
end
else
if is_set (args[2]) then -- [2] set when {{transliteration|code|text}}
args.text = args[2]; -- get the transliterated text
else
if args[1] and (args[1]:match ('^%a%a%a?%a?$') or -- args[2] missing; is args[1] a language or script tag or is it the transliterated text?
args[1]:match ('^%a%a%a?%-x%-')) then -- or is args[1] a private-use tag
return make_error_msg (cfg.transl_t.no_text, args, template); -- args[1] is a code so we're missing text
else
args.text = args[1]; -- args[1] is not a code so we're missing that; assign args.text for error message
return make_error_msg (cfg.transl_t.missing_lang_scr, args, template);
end
end
end
if is_set (args[1]) then -- IANA language code used for HTML lang= attribute; or ISO 15924 script code
if args[1]:match ('^%a%a%a?%a?$') or args[1]:match ('^%a%a%a?%-x%-') then -- args[1] has correct form?
args.code = args[1]:lower(); -- use the language/script code; only (2, 3, or 4 alpha characters) or private-use; lower case because table indexes are lower case
else
return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args[1]}), args, template); -- invalid language / script code
end
else
return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); -- missing language / script code so quit
end
local is_latn_text, pos, char;
is_latn_text, args.text, pos, char= is_latin (args.text, args.code); -- is latn text? strip accept-as-written markup
if not is_latn_text then -- when text is not latn
return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); -- abandon with error message
end
msg = validate_italic (args);
if msg then
return make_error_msg (msg, args, template);
end
if 'italic' == args.style then -- 'italic' when |italic=yes; because that is same as absent or not set and |italic=default
args.style = nil; -- set to nil;
end
args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else
if override_table[args.code] then -- is code a language code defined in the override table?
language_name = override_table[args.code];
args.code = args.code:match ('^%a%a%a?'); -- if private use, strip all but language subtag
elseif lang_table[args.code] then -- is code a language code defined in the standard language code tables?
language_name = lang_table[args.code];
elseif lang_dep_table[args.code] then -- is code a language code defined in the deprecated language code tables?
language_name = lang_dep_table[args.code];
elseif script_table[args.code] then -- if here, code is not a language code; is it a script code?
language_name = script_table[args.code];
script = args.code; -- code was an ISO 15924 script so use that instead
args.code = ''; -- unset because not a language code
else
return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args.code}), args, template); -- invalid language / script code
end
-- here only when all parameters passed to make_translit() are valid
return make_translit (args.code, language_name, args.text, args.translit_std, script, args.style, args.engvar);
end
--[[--------------------------< X L I T >----------------------------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function xlit (frame)
return _xlit (getArgs(frame));
end
--[[--------------------------< C A T E G O R Y _ F R O M _ T A G >--------------------------------------------
Returns category name associated with IETF language tag if valid; error message else.
All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function.
Module entry point from another module.
]]
local function _category_from_tag (args_t)
local subtags = {}; -- IETF subtags script, region, variant, and private
local raw_code = args_t[1]; -- save a copy of the input IETF subtag
local link = cfg.keywords_t.affirmative == args_t.link; -- make a boolean
local label = args_t.label;
local code; -- the language code
local msg; -- gets an error message if IETF language tag is malformed or invalid
local category_name = '';
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code);
if msg then
local template = (args_t.template and table.concat ({'{{', args_t.template, '}}: '})) or ''; -- make template name (if provided by the template)
return make_error_span (template, msg);
end
raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
category_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', '');
if link then
return table.concat ({'[[:', category_name, ']]'});
else
return category_name;
end
end
--[[--------------------------< C A T E G O R Y _ F R O M _ T A G >--------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function category_from_tag (frame) -- entry point from an {{#invoke:lang|category_from_tag|<IETF tag>|template=<template name>}}
return _category_from_tag (getArgs (frame)); -- pass-on the args table, nothing else; getArgs() so we also get parent frame
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
category_from_tag = category_from_tag, -- frame entry points when this module is #invoke:ed into templates/wikitext
lang = lang, -- entry point for {{lang}}
langx = langx, -- entry point for {{langx}}
lang_xx_inherit = lang_xx_inherit, -- entry points for {{lang-??}}
lang_xx_italic = lang_xx_italic,
is_ietf_tag = is_ietf_tag,
is_ietf_tag_frame = is_ietf_tag_frame,
is_lang_name = is_lang_name,
tag_from_name = tag_from_name, -- returns IETF tag associated with language name
name_from_tag = name_from_tag, -- used for template documentation; possible use in ISO 639 name from code templates
xlit = xlit, -- entry point for {{transliteration}}
_category_from_tag = _category_from_tag, -- API entry points when this module is require()d into other modules
_lang = _lang,
_langx = _langx,
_lang_xx_inherit = _lang_xx_inherit,
_lang_xx_italic = _lang_xx_italic,
_is_ietf_tag = _is_ietf_tag,
get_ietf_parts = get_ietf_parts,
_tag_from_name = _tag_from_name,
_name_from_tag = _name_from_tag,
_xlit = _xlit,
_translation_make = translation_make,
};
pjs0klhaiwweelyd7pjfmp0uzocrd5t
373854
373853
2026-10-28T05:55:25Z
ChiK
1136
1 revision imported from [[:en:Module:Lang]]
373853
Scribunto
text/plain
--[=[
Lua support for the {{lang}}, {{langx}}, {{lang-??}}, and {{transliteration}} templates and replacement of various supporting templates.
]=]
require('strict');
local getArgs = require ('Module:Arguments').getArgs;
local unicode = require ("Module:Unicode data"); -- for is_Latin() and is_rtl()
local yesno = require ('Module:Yesno');
local sandbox = (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- when called from a sandbox template or module load sandbox data and sandbox configuration
local lang_data = mw.loadData ('Module:Lang/data' .. sandbox); -- language name override and transliteration tool-tip tables
local lang_name_table = lang_data.lang_name_table; -- language codes, names, regions, scripts, suppressed scripts
local lang_table = lang_data.lang_name_table.lang;
local lang_dep_table = lang_data.lang_name_table.lang_dep;
local script_table = lang_data.lang_name_table.script;
local region_table = lang_data.lang_name_table.region;
local variant_table = lang_data.lang_name_table.variant;
local suppressed_table = lang_data.lang_name_table.suppressed;
local override_table = lang_data.override;
local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code
local cfg = mw.loadData ('Module:Lang/configuration' .. sandbox); -- for internationalization
local is_latn_data = mw.loadData ('Module:Lang/data/is latn data');
local sizeof_ranges_t = is_latn_data.sizeof_ranges_t;
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization
local content_lang = mw.language.getContentLanguage();
local this_wiki_lang_tag = content_lang.code; -- get this wiki's language tag
local this_wiki_lang_dir = content_lang:getDir(); -- get this wiki's language direction
local initial_style_state; -- set by lang_xx_normal() and lang_xx_italic()
local maint_cats = {}; -- maintenance categories go here
local maint_msgs = {}; -- and their messages go here
--[[--------------------------< M A K E _ E R R O R _ S P A N >--------------------------------------------------
]]
local function make_error_span (template, msg)
--[[ WARNING: must have the class "error" to be detected as an error by {{#iferror:}}.
Please do not remove, to avoid breaking any downstream templates relying on this. ]]
return table.concat ({'<span class="error" style="font-size: inherit;">', cfg.misc_text_t.error, ': ', template, msg, '</span>'})
end
--[[--------------------------< S U B S T I T U T E >----------------------------------------------------------
Substitutes $1, $2, etc in <message> with data from <data_t>. Returns plain-text substituted string when
<data_t> not nil; returns <message> else.
]]
local function substitute (message, data_t)
return data_t and mw.message.newRawMessage (message, data_t):plain() or message;
end
--[[--------------------------< M A K E _ E R R O R _ M S G >--------------------------------------------------
Assembles an error message from template name, message text, help link, and error category.
]]
local function make_error_msg (msg, args_t, template)
local category;
local text; -- handle the oddity that is {{langx}}
if cfg.templates_t.langxx == template then
text = args_t.text or args_t[1]; -- for {{lang-xx}}
else
text = args_t.text or args_t[2]; -- for {{lang}}, {{langx}}, and {{transliteration}}
end
if cfg.templates_t.transliteration == template then
category = cfg.make_error_msg_t.xlit_err_cat;
else
category = cfg.make_error_msg_t.lang_err_cat;
end
local category_link = ((0 == namespace or 10 == namespace) and not args_t.nocat) and substitute ('[[Category:$1]]', {category}) or '';
--[[ WARNING: must have the class "error" to be detected as an error by {{#iferror:}}.
Please do not remove, to avoid breaking any downstream templates relying on this. ]]
return substitute ('[$1] <span class="error" style="font-size: inherit;">$2: {{$3}}: $4 ([[:Category:$5|$6]])</span>$7', -- { prevents the template name from being treated as a template call in certain situations
{
text or cfg.make_error_msg_t.undefined,
cfg.misc_text_t.error,
template,
msg,
category,
cfg.misc_text_t.help,
category_link
})
end
--[[--------------------------< P A R A M E T E R _ V A L I D A T E >------------------------------------------
]]
local function parameter_validate (args_t, template)
local err_msg = cfg.parameter_validate_t.invalid_param;
if cfg.templates_t.lang == template then -- for {{lang}}
for param, _ in pairs (args_t) do
if not cfg.known_params_t.params_lang_t[param] and -- unique {{lang}} parameters
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
end
end
elseif cfg.templates_t.langx == template then -- for {{langx}}
for param, _ in pairs (args_t) do
if not cfg.known_params_t.params_langx_t[param] and -- unique {{langx}} parameters
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
end
end
elseif cfg.templates_t.langxx == template then -- for {{lang-xx}}
for param, _ in pairs (args_t) do
if not cfg.known_params_t.params_lang_xx_t[param] and -- unique {{lang-xx}} parameters
not cfg.known_params_t.params_x_t[param] and -- common to {{langx}} and {{lang-xx}}
not cfg.known_params_t.common_params_all_t[param] then -- common to all
return substitute (err_msg, {param}); -- <param> not found so abandon
end
end
end
end
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not
an empty string.
]]
local function is_set (var)
return not (var == nil or var == '');
end
--[[--------------------------< I N V E R T _ I T A L I C S >-------------------------------------------------
This function attempts to invert the italic markup a args.text by adding/removing leading/trailing italic markup
in args.text. Like |italic=unset, |italic=invert disables automatic italic markup. Individual leading/trailing
apostrophes are converted to their HTML numeric entity equivalent so that the new italic markup doesn't become
bold markup inadvertently.
Leading and trailing wiki markup is extracted from args.text into separate table elements. Addition, removal,
replacement of wiki markup is handled by a string.gsub() replacement table operating only on these separate elements.
In the string.gsub() matching pattern, '.*' matches empty string as well as the three expected wiki markup patterns.
This function expects that markup in args.text is complete and correct; if it is not, oddness may result.
]]
local function invert_italics (source)
local invert_pattern_table = { -- leading/trailing markup add/remove/replace patterns
[""]="\'\'", -- empty string becomes italic markup
["\'\'"]="", -- italic markup becomes empty string
["\'\'\'"]="\'\'\'\'\'", -- bold becomes bold italic
["\'\'\'\'\'"]="\'\'\'", -- bold italic become bold
};
local seg = {};
source = source:gsub ("%f[\']\'%f[^\']", '''); -- protect single quote marks from being interpreted as bold markup
seg[1] = source:match ('^(\'\'+%f[^\']).+') or ''; -- get leading markup, if any; ignore single quote
seg[3] = source:match ('.+(%f[\']\'\'+)$') or ''; -- get trailing markup, if any; ignore single quote
if '' ~= seg[1] and '' ~= seg[3] then -- extract the 'text'
seg[2] = source:match ('^\'\'+%f[^\'](.+)%f[\']\'\'+$') -- from between leading and trailing markup
elseif '' ~= seg[1] then
seg[2] = source:match ('^\'\'+%f[^\'](.+)') -- following leading markup
elseif '' ~= seg[3] then
seg[2] = source:match ('(.+)%f[\']\'\'+$') -- preceding trailing markup
else
seg[2] = source -- when there is no markup
end
seg[1] = invert_pattern_table[seg[1]] or seg[1]; -- replace leading markup according to pattern table
seg[3] = invert_pattern_table[seg[3]] or seg[3]; -- replace leading markup according to pattern table
return table.concat (seg); -- put it all back together and done
end
--[[--------------------------< V A L I D A T E _ I T A L I C >------------------------------------------------
Validates |italic= or |italics= assigned values.
When |italic= is set and has an acceptable assigned value, return the matching CSS font-style property value or,
for the special case 'default', return nil.
When |italic= is not set, or has an unacceptable assigned value, return nil and a nil error message.
When both |italic= and |italics= are set, returns nil and a 'conflicting' error message.
The return value nil causes the calling lang, lang_xx, or xlit function to set args.italic according to the template's
defined default ('inherit' for {{lang}}, 'inherit' or 'italic' for {{lang-??}} depending on
the individual template's requirements, 'italic' for {{transliteration}}) or to the value appropriate to |script=, if set ({{lang}}
and {{lang-??}} only).
Accepted values and the values that this function returns are are:
nil - when |italic= absent or not set; returns nil
default - for completeness, should rarely if ever be used; returns nil
yes - force args.text to be rendered in italic font; returns 'italic'
no - force args.text to be rendered in normal font; returns 'normal'
unset - disables font control so that font-style applied to text is dictated by markup inside or outside the template; returns 'inherit'
invert - disables font control so that font-style applied to text is dictated by markup outside or inverted inside the template; returns 'invert'
]]
local function validate_italic (args)
local properties = {[cfg.keywords_t.affirmative] = 'italic', [cfg.keywords_t.negative] = 'normal', [cfg.keywords_t.unset] = 'inherit', [cfg.keywords_t.invert] = 'invert', [cfg.keywords_t.default] = nil};
local italic, count = nil, 0
for _, param in pairs {'italic', 'italics', 'i'} do
local arg = args[param]
if nil ~= arg then
if nil == italic then
italic = arg
end
count = count + 1
end
end
if count > 1 then -- return an error message if more than one is set
return cfg.validate_italic_t.multi_italic;
end
args.style = properties[italic] -- set args.style to an appropriate value
args.italic = italic; -- use args.italic as the canonical parameter
return nil; -- return a nil error message
end
--[=[--------------------------< V A L I D A T E _ C A T _ A R G S >----------------------------------------------------------
Default behavior of the {{lang}} and {{lang-??}} templates is to add categorization when the templates are used in main space.
This default functionality may be suppressed by setting |nocat=yes or |cat=no. This function selects one of these two parameters
to control categorization.
Because having two parameters with 'opposite' names and 'opposite' values is confusing, this function accepts only affirmative
values for |nocat= and only negative values for |cat=; in both cases the 'other' sense (and non-sense) is not accepted and the
parameter is treated as if it were not set in the template.
Sets args.nocat to true if categorization is to be turned off; to nil if the default behavior should apply.
Accepted values for |nocat= are the text strings:
'yes', 'y', 'true', 't', on, '1' -- [[Module:Yesno]] returns logical true for all of these; false or nil else
for |cat=
'no', 'n', 'false', 'f', 'off', '0' -- [[Module:Yesno]] returns logical false for all of these; true or nil else
]=]
local function validate_cat_args (args)
if not (args.nocat or args.cat) then -- both are nil, so categorize
return;
end
if false == yesno (args.cat) or true == yesno (args.nocat) then
args.nocat = true; -- set to true when args.nocat is affirmative; nil else (as if the parameter were not set in the template)
else -- args.nocat is the parameter actually used.
args.nocat = nil;
end
end
--[[--------------------------< I N _ A R R A Y >--------------------------------------------------------------
Whether needle is in haystack.
]]
local function in_array (needle, haystack)
if needle == nil then
return false;
end
for n,v in ipairs (haystack) do
if v == needle then
return n;
end
end
return false;
end
--[[--------------------------< F O R M A T _ I E T F _ T A G >------------------------------------------------
Prettify IETF tags to use recommended subtag formats:
code: lower case
script: sentence case
region: upper case
variant: lower case
private: lower case prefixed with -x-
]]
local function format_ietf_tag (code, script, region, variant, private)
local out = {};
if is_set (private) then
return table.concat ({code:lower(), 'x', private:lower()}, '-'); -- if private, all other tags ignored
end
table.insert (out, code:lower());
if is_set (script) then
script = script:lower():gsub ('^%a', string.upper);
table.insert (out, script);
end
if is_set (region) then
table.insert (out, region:upper());
end
if is_set (variant) then
table.insert (out, variant:lower());
end
return table.concat (out, '-');
end
--[[--------------------------< G E T _ I E T F _ P A R T S >--------------------------------------------------
Extracts and returns IETF language tag parts:
primary language subtag (required) - 2 or 3 character IANA language code
script subtag - four character IANA script code
region subtag - two-letter or three digit IANA region code
variant subtag - four digit or 5-8 alnum variant code; only one variant subtag supported
private subtag - x- followed by 1-8 alnum private code; only supported with the primary language tag
in any one of these forms
lang lang-variant
lang-script lang-script-variant
lang-region lang-region-variant
lang-script-region lang-script-region-variant
lang-x-private
each of lang, script, region, variant, and private, when used, must be valid.
Languages with both two- and three-character code synonyms are promoted to the two-character synonym because
the IANA registry file omits the synonymous three-character code; we cannot depend on browsers understanding
the synonymous three-character codes in the lang= attribute.
For {{lang-??}} templates, the parameters |script=, |region=, and |variant= are supported (not supported in {{lang}}
because those parameters are superfluous to the IETF subtags in |code=).
Returns six values; all lower case. Valid parts are returned as themselves; omitted parts are returned as empty strings, invalid
parts are returned as nil; the sixth returned item is an error message (if an error detected) or nil.
See http://www.rfc-editor.org/rfc/bcp/bcp47.txt section 2.1.
]]
local function get_ietf_parts (source, args_script, args_region, args_variant)
local code, script, region, variant, private; -- IETF tag parts
if not is_set (source) then
return nil, nil, nil, nil, nil, cfg.get_ietf_parts_t.missing_lang_tag;
end
local pattern = { -- table of tables holding acceptable IETF tag patterns and short names of the IETF part captured by the pattern
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 1 - ll-Ssss-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%d%d%d%d)$', 's', 'r', 'v'}, -- 2 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 3 - ll-Ssss-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'r', 'v'}, -- 4 - ll-Ssss-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d%d)$', 's', 'v'}, -- 5 - ll-Ssss-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 's', 'v'}, -- 6 - ll-Ssss-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a)%-(%d%d%d%d)$', 'r', 'v'}, -- 7 - ll-RR-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%d%d%d)%-(%d%d%d%d)$', 'r', 'v'}, -- 8 - ll-DDD-variant (where region is 3 digits; variant is 4 digits)
{'^(%a%a%a?)%-(%a%a)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 9 - ll-RR-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%d%d%d)%-(%w%w%w%w%w%w?%w?%w?)$', 'r', 'v'}, -- 10 - ll-DDD-variant (where region is 3 digits; variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%d%d%d%d)$', 'v'}, -- 11 - ll-variant (where variant is 4 digits)
{'^(%a%a%a?)%-(%w%w%w%w%w%w?%w?%w?)$', 'v'}, -- 12 - ll-variant (where variant is 5-8 alnum characters)
{'^(%a%a%a?)%-(%a%a%a%a)%-(%a%a)$', 's', 'r'}, -- 13 - ll-Ssss-RR
{'^(%a%a%a?)%-(%a%a%a%a)%-(%d%d%d)$', 's', 'r'}, -- 14 - ll-Ssss-DDD (region is 3 digits)
{'^(%a%a%a?)%-(%a%a%a%a)$', 's'}, -- 15 - ll-Ssss
{'^(%a%a%a?)%-(%a%a)$', 'r'}, -- 16 - ll-RR
{'^(%a%a%a?)%-(%d%d%d)$', 'r'}, -- 17 - ll-DDD (region is 3 digits)
{'^(%a%a%a?)$'}, -- 18 - ll
{'^(%a%a%a?)%-x%-(%w%w?%w?%w?%w?%w?%w?%w?)$', 'p'}, -- 19 - ll-x-pppppppp (private is 1-8 alnum characters)
}
local t = {}; -- table of captures; serves as a translator between captured IETF tag parts and named variables
for i, v in ipairs (pattern) do -- spin through the pattern table looking for a match
local c1, c2, c3, c4; -- captures in the 'pattern' from the pattern table go here
c1, c2, c3, c4 = source:match (pattern[i][1]); -- one or more captures set if source matches pattern[i])
if c1 then -- c1 always set on match
code = c1; -- first capture is always code
t = {
[pattern[i][2] or 'x'] = c2, -- fill the table of captures with the rest of the captures
[pattern[i][3] or 'x'] = c3, -- take index names from pattern table and assign sequential captures
[pattern[i][4] or 'x'] = c4, -- index name may be nil in pattern[i] table so "or 'x'" spoofs a name for this index in this table
};
script = t.s or ''; -- translate table contents to named variables;
region = t.r or ''; -- absent table entries are nil so set named IETF parts to empty string for concatenation
variant= t.v or '';
private = t.p or '';
break; -- and done
end
end
if not code then
return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_tag, {source}); -- don't know what we got but it is malformed
end
code = code:lower(); -- ensure that we use and return lower case version of this
if not (override_table[code] or lang_table[code] or synonym_table[code] or lang_dep_table[code]) then
return nil, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_code, {code}); -- invalid language code, don't know about the others (don't care?)
end
if synonym_table[code] then -- if 639-2/639-2T code has a 639-1 synonym
table.insert (maint_cats, substitute (cfg.get_ietf_parts_t.maint_promo_cat, {code}));
table.insert (maint_msgs, substitute (cfg.get_ietf_parts_t.maint_promo_msg, {code, synonym_table[code]}));
code = synonym_table[code]; -- use the synonym
end
if is_set (script) then
if is_set (args_script) then
return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_scr; -- both code with script and |script= not allowed
end
else
script = args_script or ''; -- use args.script if provided
end
if is_set (script) then
script = script:lower(); -- ensure that we use and return lower case version of this
if not script_table[script] then
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_scr_code, {script, code}); -- language code OK, invalid script, don't know about the others (don't care?)
end
end
if suppressed_table[script] then -- ensure that code-script does not use a suppressed script
if in_array (code, suppressed_table[script]) then
return code, nil, nil, nil, nil, substitute (cfg.get_ietf_parts_t.script_code, {script, code}); -- language code OK, script is suppressed for this code
end
end
if is_set (region) then
if is_set (args_region) then
return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_reg; -- both code with region and |region= not allowed
end
else
region = args_region or ''; -- use args.region if provided
end
if is_set (region) then
region = region:lower(); -- ensure that we use and return lower case version of this
if not region_table[region] then
return code, script, nil, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_reg_code, {region, code});
end
end
if is_set (variant) then
if is_set (args_variant) then
return code, nil, nil, nil, nil, cfg.get_ietf_parts_t.redundant_var; -- both code with variant and |variant= not allowed
end
else
variant = args_variant or ''; -- use args.variant if provided
end
if is_set (variant) then
variant = variant:lower(); -- ensure that we use and return lower case version of this
if not variant_table[variant] then -- make sure variant is valid
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var, {variant});
end -- does this duplicate/replace tests in lang() and lang_xx()?
if is_set (script) then -- if script set it must be part of the 'prefix'
if not in_array (table.concat ({code, '-', script}), variant_table[variant]['prefixes']) then
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_scr, {variant, code, script});
end
elseif is_set (region) then -- if region set, there are some prefixes that require lang code and region (en-CA-newfound)
if not in_array (code, variant_table[variant]['prefixes']) then -- first see if lang code is all that's required (en-oxendict though en-GB-oxendict is preferred)
if not in_array (table.concat ({code, '-', region}), variant_table[variant]['prefixes']) then -- now try for lang code and region (en-CA-newfound)
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code_reg, {variant, code, region});
end
end
else -- cheap way to determine if there are prefixes; fonipa and others don't have prefixes; # operator always returns 0
if variant_table[variant]['prefixes'][1] and not in_array (code, variant_table[variant]['prefixes']) then
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_var_code, {variant, code});
end
end
end
if is_set (private) then
private = private:lower(); -- ensure that we use and return lower case version of this
if not override_table[table.concat ({code, '-x-', private})] then -- make sure private tag is valid; note that index
return code, script, region, nil, nil, substitute (cfg.get_ietf_parts_t.unrecog_pri, {private});
end
end
return code, script, region, variant, private, nil; -- return the good bits; make sure that msg is nil
end
--[=[-------------------------< M A K E _ W I K I L I N K >----------------------------------------------------
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an
empty string.
]=]
local function make_wikilink (link, display)
if is_set (link) then
if is_set (display) then
return table.concat ({'[[', link, '|', display, ']]'});
else
return table.concat ({'[[', link, ']]'});
end
else
return '';
end
end
--[[--------------------------< D I V _ M A R K U P _ A D D >--------------------------------------------------
Adds <i> and </i> tags to list-item text or to implied <p>..</p> text. Mixed not supported.
]]
local function div_markup_add (text, style)
if text:find ('^\n[%*:;#]') then -- look for list markup; list markup must begin at start of text
if 'italic' == style then
return text:gsub ('(\n[%*:;#]+)([^\n]+)', '%1<i>%2</i>'); -- insert italic markup at each list item
else
return text;
end
end
if text:find ('\n+') then -- look for any number of \n characters in text
text = text:gsub ('([^\n])\n([^\n])', '%1 %2'); -- replace single newline characters with a space character which mimics MediaWiki
if 'italic' == style then
text = text:gsub('[^\n]+', '<p><i>%1</i></p>'); -- insert p and italic markup tags at each implied p (two or more consecutive '\n\n' sequences)
else
text = text:gsub ('[^\n]+', '<p>%1</p>'); -- insert p markup at each implied p
text = text:gsub ('\n', ''); -- strip newline characters
end
end
return text;
end
--[[--------------------------< T I T L E _ W R A P P E R _ M A K E >------------------------------------------
Makes a <span title="<title text>"><content_text></span> or <div title="<title text>"><content_text></div> where
<title text> is in the tool-tip in the wiki's local language and <content_text> is non-local-language text in
HTML markup. This because the lang= attribute applies to the content of its enclosing tag.
<tag> holds a string 'div' or 'span' used to choose the correct wrapping tag.
]]
local function title_wrapper_make (title_text, content_text, tag)
local wrapper_t = {};
table.insert (wrapper_t, table.concat ({'<', tag})); -- open opening wrapper tag
table.insert (wrapper_t, ' title=\"'); -- begin title attribute
table.insert (wrapper_t, title_text); -- add <title_text>
table.insert (wrapper_t, '\">'); -- end title attribute and close opening wrapper tag
table.insert (wrapper_t, content_text); -- add <content_text>
table.insert (wrapper_t, table.concat ({'</', tag, '>'})); -- add closing wrapper tag
return table.concat (wrapper_t); -- make a big string and done
end
--[[--------------------------< M A K E _ T E X T _ H T M L >--------------------------------------------------
Add the HTML markup to text according to the type of content that it is: <span> or <i> tags for inline content or
<div> tags for block content
The lang= attribute also applies to the content of the tag where it is placed so this is wrong because 'Spanish
language text' is English:
<i lang="es" title="Spanish language text">casa</i>
should be:
<span title="Spanish language text"><i lang="es">casa</i></span>
or for <div>...</div>:
<div title="Spanish language text"><div lang="es"><spanish-language-text></div></div>
]]
local function make_text_html (code, text, tag, rtl, style, size, language)
local html_t = {};
local style_added = '';
local wrapper_tag = tag; -- <tag> gets modified so save a copy for use when/if we create a wrapper span or div
if text:match ('^%*') then
table.insert (html_t, '*'); -- move proto language text prefix outside of italic markup if any; use numeric entity because plain splat confuses MediaWiki
text = text:gsub ('^%*', ''); -- remove the splat from the text
end
if 'span' == tag then -- default HTML tag for inline content
if 'italic' == style then -- but if italic
tag = 'i'; -- change to <i> tags
end
else -- must be div so go
text = div_markup_add (text, style); -- handle implied <p>, implied <p> with <i>, and list markup (*;:#) with <i>
end
table.insert (html_t, table.concat ({'<', tag})); -- open the <i>, <span>, or <div> HTML tag
code = code:gsub ('%-x%-.*', ''); -- strip private use subtag from code tag because meaningless outside of Wikipedia
table.insert (html_t, table.concat ({' lang="', code, '\"'})); -- add language attribute
if (rtl or unicode.is_rtl(text)) and ('ltr' == this_wiki_lang_dir) then -- text is right-to-left on a left-to-right wiki
table.insert (html_t, ' dir="rtl"'); -- add direction attribute for right-to-left languages
elseif not (rtl or unicode.is_rtl(text)) and ('rtl' == this_wiki_lang_dir) then -- text is left-to-right on a right-to-left wiki
table.insert (html_t, ' dir="ltr"'); -- add direction attribute for left-to-right languages
end
if 'normal' == style then -- when |italic=no
table.insert (html_t, ' style=\"font-style: normal;'); -- override external markup, if any
style_added = '\"'; -- remember that style attribute added and is not yet closed
end
if is_set (size) then -- when |size=<something>
if is_set (style_added) then
table.insert (html_t, table.concat ({' font-size: ', size, ';'})); -- add when style attribute already inserted
else
table.insert (html_t, table.concat ({' style=\"font-size: ', size, ';'})); -- create style attribute
style_added = '\"'; -- remember that style attribute added and is not yet closed
end
end
table.insert (html_t, table.concat ({style_added, '>'})); -- close the opening HTML tag
table.insert (html_t, text); -- insert the text
table.insert (html_t, table.concat ({'</', tag, '>'})); -- close the 'text' <i>, <span>, or <div> HTML tag
if is_set (language) then -- create a <title_text> string for the title= attribute in a wrapper span or div
local title_text;
if 'zxx' == code then -- special case for this tag 'no linguistic content'
title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.zxx}); -- not a language so don't use 'language' in title text
elseif mw.ustring.find (language, 'languages', 1, true) then
title_text = substitute ('$1 $2', {language, cfg.make_text_html_t.collective}); -- for collective languages
else
title_text = substitute ('$1-$2', {language, cfg.make_text_html_t.individual}); -- for individual languages
end
return title_wrapper_make (title_text, table.concat (html_t), wrapper_tag);
else
return table.concat (html_t);
end
end
--[=[-------------------------< M A K E _ C A T E G O R Y >----------------------------------------------------
For individual language, <language>, returns:
[[Category:Articles containing <language>-language text]]
For English:
[[Category:Articles containing explicitly cited English-language text]]
For ISO 639-2 collective languages (and for 639-1 bh):
[[Category:Articles with text in <language> languages]]
]=]
local function make_category (code, language_name, nocat, name_get)
if ((0 ~= namespace) or nocat) and not name_get then -- only categorize in article space
return ''; -- return empty string for concatenation
end
if mw.ustring.find (language_name, 'languages', 1, true) then
return substitute ('[[$1 $2]]', {cfg.make_category_t.collective_cat, language_name});
end
if this_wiki_lang_tag == code then
return substitute ('[[$1 $2 $3-$4]]', { -- unique category name for the local language
cfg.make_category_t.cat_prefix,
cfg.make_category_t.explicit_cat,
language_name,
cfg.make_category_t.cat_postfix,
});
else
return substitute ('[[$1 $2-$3]]', { -- category for individual languages
cfg.make_category_t.cat_prefix,
language_name,
cfg.make_category_t.cat_postfix,
});
end
end
--[[--------------------------< M A K E _ T R A N S L I T >----------------------------------------------------
Return translit <i lang=xx-Latn>...</i> where xx is the language code; else return empty string.
The value |script= is not used in {{transliteration}} for this purpose; instead it uses |code. Because language scripts
are listed in the {{transliteration}} switches they are included in the data tables. The script parameter is introduced
at {{Language with name and transliteration}}. If |script= is set, this function uses it in preference to code.
To avoid confusion, in this module and the templates that use it, the transliteration script parameter is renamed
to be |translit-script= (in this function, tscript).
This function is used by both lang_xx() and xlit()
lang_xx() always provides code, language_name, and translit; may provide tscript; never provides style
xlit() always provides language_name, translit, and one of code or tscript, never both; always provides style
For {{transliteration}}, style only applies when a language code is provided.
]]
local function make_translit (code, language_name, translit, std, tscript, style, engvar)
local title_t = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards
local title_text = ''; -- tool tip text for title= attribute
std = std and std:lower(); -- lower case for table indexing
if not is_set (std) and not is_set (tscript) then -- when neither standard nor script specified
title_text = language_name; -- write a generic tool tip
if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
title_text = substitute ('$1-$2', {title_text, cfg.misc_text_t.language}); -- skip this text (individual and macro languages only)
end
title_text = substitute ('$1 $2', {title_text, mw.ustring.lower (cfg.engvar_t[engvar]['romanisz_lc'])}); -- finish the tool tip; use romanization when neither script nor standard supplied
elseif is_set (std) and is_set (tscript) then -- when both are specified
if title_t[std] then -- and if standard is legitimate
if title_t[std][tscript] then -- and if script for that standard is legitimate
if script_table[tscript] then
title_text = substitute ('$1$2 ($3 $4) $5', { -- add the appropriate text to the tool tip
title_text,
title_t[std][tscript:lower()],
script_table[tscript],
cfg.make_translit_t.script,
cfg.make_translit_t.transliteration,
});
else
title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
end
else
title_text = title_text .. title_t[std]['default']; -- use the default if script not in std table; TODO: maint cat? error message because script not found for this standard?
end
else
return ''; -- invalid standard, setup for error message
end
elseif is_set (std) then -- translit-script not set, use language code
if not title_t[std] then return ''; end -- invalid standard, setup for error message
if title_t[std][code] then -- if language code is in the table (xlit may not provide a language code)
local fmt_str = '$1$2 ($3 $4) $5'; -- generic format string for tool tip
if language_name:match ('languages') then
fmt_str = '$1$2 ($3) $5'; -- format string for collective languages tool tip
end
title_text = substitute (fmt_str, { -- add the appropriate text to the tool tip
title_text,
title_t[std][code:lower()],
language_name,
cfg.misc_text_t.language,
cfg.make_translit_t.transliteration,
});
else -- code doesn't match
title_text = title_text .. title_t[std]['default']; -- so use the standard's default
end
else -- here if translit-script set but translit-std not set
if title_t['no_std'][tscript] then
title_text = title_text .. title_t['no_std'][tscript]; -- use translit-script if set
elseif title_t['no_std'][code] then
title_text = title_text .. title_t['no_std'][code]; -- use language code
else
if is_set (tscript) then
title_text = substitute ('$1$2-$3 $4', { -- write a script tool tip
title_text,
language_name,
cfg.make_translit_t.script,
cfg.make_translit_t.transliteration,
});
elseif is_set (code) then
if not mw.ustring.find (language_name, 'languages', 1, true) then -- collective language names (plural 'languages' is part of the name)
title_text = substitute ('$1-$2', { -- skip this text (individual and macro languages only)
title_text,
cfg.misc_text_t.language,
});
end
title_text = substitute ('$1 $2', { -- finish the tool tip
title_text,
cfg.make_translit_t.transliteration,
});
else
title_text = substitute ('$1 $2', { -- generic tool tip (can we ever get here?)
title_text,
cfg.make_translit_t.transliteration,
});
end
end
end
local tag
if is_set (code) then -- when a language code is provided (always with {{lang-??}} templates, not always with {{transliteration}})
code = code:match ('^(%a%a%a?)'); -- strip all subtags leaving only the language subtag
if not style then -- nil for the default italic style
tag = '<i lang="%s-Latn">%s</i>'
else
tag = '<span style="font-style: %s" lang="%s-Latn">%s</span>' -- non-standard style, construct a span tag for it
tag = string.format(tag, style, "%s", "%s")
end
tag = string.format(tag, code, "%s")
else
tag = '<span>%s</span>' -- when no language code: no lang= attribute, not italic ({{transliteration}} only)
end
tag = string.format(tag, translit) -- add the translit text
if '' == title_text then -- when there is no need for a tool-tip
return tag; -- done
else
title_text = cfg.engvar_sel_t.gb == engvar and title_text:gsub ('([Rr]omani)z', '%1s') or title_text; -- gb eng when engvar specifies gb eng; us eng else
return title_wrapper_make (title_text, tag, 'span'); -- wrap with a tool-tip span and done
end
end
--[[--------------------------< V A L I D A T E _ T E X T >----------------------------------------------------
This function checks the content of args.text and returns empty string if nothing is amiss else it returns an
error message. The tests are for empty or missing text and for improper or disallowed use of apostrophe markup.
Italic rendering is controlled by the |italic= template parameter so italic markup should never appear in args.text
either as ''itself'' or as '''''bold italic''''' unless |italic=unset or |italic=invert.
]]
local function validate_text (template, args)
if not is_set (args.text) then
return make_error_msg (cfg.validate_text_t.no_text, args, template);
end
if args.text:find ("%f[\']\'\'\'\'%f[^\']") or args.text:find ("\'\'\'\'\'[\']+") then -- because we're looking, look for 4 appostrophes or 6+ appostrophes
return make_error_msg (cfg.validate_text_t.malformed_markup, args, template);
end
local italic = args.italic;
if (cfg.keywords_t.unset ~= italic) and (cfg.keywords_t.invert ~= italic) then
if args.text:find ("%f[\']\'\'%f[^\']") or args.text:find ("%f[\']\'\'\'\'\'%f[^\']") then -- italic but not bold, or bold italic
return make_error_msg (cfg.validate_text_t.italic_markup, args, template);
end
end
end
--[[--------------------------< R E N D E R _ M A I N T >------------------------------------------------------
Render mainenance messages and categories.
]]
local function render_maint (nocat)
local maint = {};
if 0 < #maint_msgs then -- when there are maintenance messages
table.insert (maint, table.concat ({'<span class="lang-comment" style="font-style: normal; display: none; color: #33aa33; margin-left: 0.3em;">'})); -- opening <span> tag
for _, msg in ipairs (maint_msgs) do
table.insert (maint, table.concat ({msg, ' '})); -- add message strings
end
table.insert (maint, '</span>'); -- close the span
end
if (0 < #maint_cats) and (0 == namespace) and not nocat then -- when there are maintenance categories; article namespace only
for _, cat in ipairs (maint_cats) do
table.insert (maint, table.concat ({'[[Category:', cat, ']]'})); -- format and add the categories
end
end
return table.concat (maint);
end
--[[--------------------------< P R O T O _ P R E F I X >------------------------------------------------------
For proto languages, text is prefixed with a splat. We do that here as a flag for make_text_html() so that a splat
will be rendered outside of italic markup (if used). If the first character in text here is already a splat, we
do nothing.
proto_param is boolean or nil; true adds splat prefix regardless of language name; false removes and inhibits
regardless of language name; nil does nothing; presumes that the value in text is correct but removes extra splac.
]]
local function proto_prefix (text, language_name, proto_param)
if false == proto_param then -- when forced by |proto=no
return text:gsub ('^%**', ''); -- return text without splat prefix regardless of language name or existing splat prefix in text
elseif (language_name:find ('^Proto%-') or (true == proto_param)) then -- language is a proto or forced by |proto=yes
return text:gsub ('^%**', '*'); -- prefix proto-language text with a splat; also removes duplicate prefixing splats
end
return text:gsub ('^%*+', '*'); -- return text unmolested except multiple splats reduced to one splat
end
--[[--------------------------< H A S _ P O E M _ T A G >------------------------------------------------------
Looks for a poem strip marker in text; returns true when found; false else.
Auto-italic detection disabled when text has poem stripmarker because it is not possible for this code to know
the content that will replace the stripmarker.
]]
local function has_poem_tag (text)
return text:find ('\127[^\127]*UNIQ%-%-poem%-[%a%d]+%-QINU[^\127]*\127') and true or false;
end
--[[--------------------------< H T M L _ T A G _ S E L E C T >------------------------------------------------
Inspects content of and selectively trims text. Returns text and the name of an appropriate HTML tag for text.
If text contains:
\n\n text has implied <p>..</p> tags - trim leading and trailing whitespace and return
If text begins with list markup:
\n* unordered
\n; definition
\n: definition
\n# ordered
trim all leading whitespace except \n and trim all trailing whitespace
If text contains <poem>...</poem> stripmarker, return text unmodified and choose <div>..</div> tags because
the stripmarker is replaced with text wrapped in <div>..</div> tags.
If the text contains any actual <div>...</div> tags, then it's again returned unmodified and <div>...</div>
tags are used to wrap it, to prevent div/span inversion.
]]
local function html_tag_select (text)
local tag;
if has_poem_tag (text) then -- contains poem stripmarker (we can't know the content of that)
tag = 'div'; -- poem replacement is in div tags so lang must use div tags
elseif text:find ('<div') then -- reductive; if the text contains a div tag, we must use div tags
tag = 'div';
elseif mw.text.trim (text):find ('\n\n+') then -- contains implied p tags
text = mw.text.trim (text); -- trim leading and trailing whitespace characters
tag = 'div'; -- must be div because span may not contain p tags (added later by MediaWiki); poem replacement is in div tags
elseif text:find ('\n[%*:;%#]') then -- if text has list markup
text = text:gsub ('^[\t\r\f ]*', ''):gsub ('%s*$', ''); -- trim all whitespace except leading newline character '\n'
tag = 'div'; -- must be div because span may not contain ul, dd, dl, ol tags (added later by MediaWiki)
else
text = mw.text.trim (text); -- plain text
tag = 'span'; -- so span is fine
end
return text, tag;
end
--[[--------------------------< V A L I D A T E _ P R O T O >--------------------------------------------------
Validates value assigned to |proto=; permitted values are yes and no; yes returns as true, no returns as false,
empty string (or parameter omitted) returns as nil; any other value returns nil with <proto_param> as second
return value for use in error message.
]]
local function validate_proto (proto_param)
if cfg.keywords_t.affirmative == proto_param then
return true;
elseif cfg.keywords_t.negative == proto_param then
return false;
elseif is_set (proto_param) then
return nil, proto_param; -- |proto= something other than 'yes' or 'no'
else
return nil; -- missing or empty
end
end
--[[--------------------------< L A N G U A G E _ N A M E _ G E T >--------------------------------------------
Common function to return language name from the data set according to IETF tag.
Returns language name if found in data tables; nil else.
]]
local function language_name_get (ietf, code, cat)
ietf = ietf:lower(); -- ietf:lower() because format_ietf_tag() returns mixed case
local name; -- remains nil if not found
if override_table[ietf] then -- look for whole IETF tag in override table
name = override_table[ietf];
elseif override_table[code] then -- not there so try basic language tag
name = override_table[code];
elseif lang_table[code] then -- shift to IANA active tag/name table
name = lang_table[code];
elseif lang_dep_table[code] then -- try the IANA deprecated tag/name table
name = lang_dep_table[code];
end
if lang_dep_table[code] and cat then -- because deprecated code may have been overridden to en.wiki preferred name
table.insert (maint_cats, substitute (cfg.language_name_get_t.deprecated_cat, {code}));
table.insert (maint_msgs, substitute (cfg.language_name_get_t.deprecated_msg, {code}));
end
return name; -- name from data tables or nil
end
--[[--------------------------< T E X T _ S C R I P T _ M A T C H _ T E S T >----------------------------------
IETF script subtag should match the script of the <text>. This module does not attempt to know all scripts and
what they look like. It does know what Latn script looks like so when <text> is written using other than the Latn
script, the IETF script subtag, if present, should not be Latn.
Conversely, when <text> is written using the Latn script, the IETF script subtag, if present, should be Latn.
For the purposes of this test, Latf (Fraktur) and Latg (Gaelic) are considered to be equivalent to Latn because
unicode treats these two scripts as font-specific variants of Latn.
Returns an error message when mismatch detected; nil else.
]]
local function text_script_match_test (script, is_latn_text, pos, char)
local scripts_t = {['latf'] = true, ['latg'] = true, ['latn'] = true}; -- unicode 'latn' scripts; 'latf' and 'latg' are font variants so there are no Fraktur or Gaelic codepoints
if is_set (script) then -- don't bother with the rest of this if <script> is nil or empty string
script = script:lower(); -- lower case to index into <scripts_t>
if is_latn_text then -- when text is wholly Latn script
if not scripts_t[script] then -- but a non-Latn script is specified
return cfg.text_script_match_test_t.latn_txt_mismatch; -- emit an error message
end
else -- when text is not wholly Latn script
if scripts_t[script] then -- but a Latn script is specified
return substitute (cfg.text_script_match_test_t.latn_scr_mismatch, {pos, char}); -- emit an error message with position of first offending character
end
end
end
end
--[[--------------------------< B I N A R Y _ S E A R C H >---------------------------------------------------
conducts a binary search of <ranges_t> for a sub-range that holds <target>.
returns boolean true if a sub-range holding <target> is found; boolean false else.
]]
local function binary_search (target, ranges_t)
local idx_bot = 1; -- initialize to index of first key
local idx_top = sizeof_ranges_t; -- initialize to index of last key (number of keys)
if (target < ranges_t[idx_bot][1]) or (target > ranges_t[idx_top][2]) then -- invalid; target out of range
return; -- abandon
end
local idx_mid; -- calculated index of range midway between top index and bottom index
local flag = false; -- flag to tell us when we've evaluated last (highest) range in <ranges_t>
while 1 do
idx_mid = math.ceil ((idx_bot + idx_top) / 2); -- get the mid-point in the <ranges_t> sequence
if (target >= ranges_t[idx_mid][1]) and (target <= ranges_t[idx_mid][2]) then -- indexed range low value <= target <= indexed range high value
return true; -- we found the range that holds the <target> character; return true
elseif (target > ranges_t[idx_mid][2]) then -- is <target> > indexed range high value?
idx_bot = idx_mid; -- adjust <idx_bot> up
else -- here when <target> less than indexed range low value
idx_top = idx_mid - 1; -- adjust <idx_top> down
end
if flag then
break; -- here when we just evaluated the last range and <target> not found
end
if not flag and (idx_bot == idx_top) then -- set true just before we evaluate the last (highest) range in <ranges_t>
flag = true;
end
end
end
--[[--------------------------< I S _ L A T I N >--------------------------------------------------------------
compare <text> as codepoints to lists of known codepoints accepted as Latn script
returns boolean true and modified <text> when <text> is wrapped in accept-as-written markup
returns boolean true and <text> when codepoint is known
returns boolean false, <text>, non-Latn codepoint position in <text> (left to right), and the codepoint character
when codepoint is not known
TODO: when text has accept-as-written markup, return a non-boolean value to indicate that <text> is not wholly
latn script? Use that return value to create non-Latn HTML lang= attribute because <text> isn't really
latn so lang=und (undetermined)? or instead, omit the -Latn subtag? (without -Latn need to force |italic=yes)
]]
local function is_latin (text, tag)
local count;
text, count = text:gsub ('^%(%((.+)%)%)$', '%1'); -- remove accept-as-written markup if present
if 0 ~= count then
return true, text; -- markup present so assume that <text> is Latn-script
end
local pos = 0; -- position counter for error messaging
for codepoint in mw.ustring.gcodepoint (text) do -- fetch each code point
pos = pos + 1; -- bump the position counter
if not is_latn_data.singles_t[codepoint] and -- codepoint not found in the singles list?
not binary_search (codepoint, is_latn_data.ranges_t) and -- codepoint not a member of a listed range?
not (tag and is_latn_data.specials_t[codepoint] and is_latn_data.specials_t[codepoint][tag]) then -- not a language-specific codepoint?
return false, text, pos, mw.ustring.char (codepoint); -- codepoint not known; return false with codepoint position and character representation
end
end
return true, text; -- is known; return <text>
end
--[[--------------------------< _ L A N G >--------------------------------------------------------------------
Entry point for {{lang}}.
There should be no reason to set parameters in the {{lang}} {{#invoke:}}
<includeonly>{{#invoke:lang|lang}}</includeonly>
Parameters are received from the template's frame (parent frame).
]]
local function _lang (args)
local out = {};
local language_name; -- used to make category names
local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set
local subtags = {}; -- IETF subtags script, region, variant, and private
local code; -- the language code
local msg; -- for error messages
local tag = 'span'; -- initial value for make_text_html()
local template = args.template or cfg.templates_t.lang;
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
validate_cat_args (args); -- determine if categorization should be suppressed
if args[1] and args.code then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'1', cfg.lang_t.conflict_n_param_types.code}), args, template);
else
args.code = args[1] or args.code; -- prefer args.code
end
if args[2] and args.text then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {'2', cfg.lang_t.conflict_n_param_types.text}), args, template);
else
args.text = args[2] or args.text; -- prefer args.text
end
msg = validate_italic (args);
if msg then
return make_error_msg (msg, args, template);
end
msg = validate_text (template, args); -- ensure that |text= is set
if is_set (msg) then -- msg is an already-formatted error message
return msg;
end
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly
args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false
args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag
if msg then
return make_error_msg (substitute (cfg.lang_t.invalid_proto, {msg}), args, template);
end
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code); -- |script=, |region=, |variant= not supported because they should be part of args.code ({{{1}}} in {{lang}})
if msg then
return make_error_msg (msg, args, template);
end
local is_latn_text, pos, char;
is_latn_text, args.text, pos, char= is_latin (args.text, code); -- make a boolean
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
end
if nil == args.style then -- nil when |italic= absent or not set or |italic=default; args.style controls
if ('latn' == subtags.script) or -- script is latn
(this_wiki_lang_tag ~= code and not is_set (subtags.script) and not has_poem_tag (args.text) and is_latn_text) then -- text not this wiki's language, no script specified and not in poem markup but is wholly latn script (auto-italics)
args.style = 'italic'; -- DEFAULT for {{lang}} templates is upright; but if latn script set for font-style:italic
else
args.style = 'inherit'; -- italic not set; script not latn; inherit current style
end
end
if is_set (subtags.script) then -- if script set, override rtl setting
if in_array (subtags.script, lang_data.rtl_scripts) then
args.rtl = true; -- script is an rtl script
else
args.rtl = false; -- script is not an rtl script
end
end
args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
if cfg.keywords_t.invert == args.style and 'span' == tag then -- invert only supported for in-line content
args.text = invert_italics (args.text)
end
args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.style, args.size, language_name));
table.insert (out, make_category (code, language_name, args.nocat));
table.insert (out, render_maint (args.nocat)); -- maintenance messages and categories
return table.concat (out); -- put it all together and done
end
--[[--------------------------< L A N G >----------------------------------------------------------------------
Entry point for {{lang}}.
There should be no reason to set parameters in the {{lang}} {{#invoke:}}
<includeonly>{{#invoke:lang|lang}}</includeonly>
Parameters are received from the template's frame (parent frame).
]]
local function lang (frame)
local args_t = getArgs (frame, { -- this code so that we can detect and handle wiki list markup in text
valueFunc = function (key, value)
if 2 == key or 'text' == key then -- the 'text' parameter; do not trim wite space
return value; -- return untrimmed 'text'
elseif value then -- all other values: if the value is not nil
value = mw.text.trim (value); -- trim whitespace
if '' ~= value then -- empty string when value was only whitespace
return value;
end
end
return nil; -- value was empty or contained only whitespace
end -- end of valueFunc
});
args_t.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang|...}}
local msg = parameter_validate (args_t, cfg.templates_t.lang); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
return make_error_msg (msg, args_t, cfg.templates_t.lang); -- when template has unsupported params, abandon with error message
end
return _lang (args_t);
end
--[[--------------------------< T R A N S L A T I O N _ M A K E >----------------------------------------------
Stand-alone function to create literal translation of main text.
Also used by {{lang-x2}}.
]]
local function translation_make (args_t)
local translation_t = {', '}; -- initialize output
if 'none' ~= args_t.label then -- if we want a label
table.insert (translation_t, '<small>'); -- open the <small> HTML tag
if cfg.keywords_t.negative == args_t.link then
table.insert (translation_t, substitute ('<abbr title="$1">$2</abbr>', {cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr})); -- unlinked form
else
table.insert (translation_t, make_wikilink (cfg.translation_make_t.lit_xlation, cfg.translation_make_t.lit_abbr)); -- linked form
end
table.insert (translation_t, " </small>"); -- close the <small> HTML tag
end
table.insert (translation_t, table.concat ({ -- user styling spans match spand from {{gloss}}
'<span class="gloss-quot">\'</span>', -- user styling span for quote marks; use HTML entities to avoid wiki markup confusion
'<span class="gloss-text">', -- open user styling span for the translation
args_t.translation, -- the translation
'</span>', -- close user styling span for the translation
'<span class="gloss-quot">\'</span>' -- user styling span for quote marks
}));
return table.concat (translation_t); -- make a big string and done
end
--[[--------------------------< _ L A N G _ X X >--------------------------------------------------------------
For the {{lang-??}} templates, the only parameter required to be set in the template is the language code. All
other parameters can, usually should, be written in the template call. For {{lang-??}} templates for languages
that can have multiple writing systems, it may be appropriate to set |script= as well.
For each {{lang-??}} template choose the appropriate entry-point function so that this function knows the default
styling that should be applied to text.
For normal, upright style:
<includeonly>{{#invoke:lang|lang_xx_inherit|code=xx}}</includeonly>
For italic style:
<includeonly>{{#invoke:lang|lang_xx_italic|code=xx}}</includeonly>
All other parameters should be received from the template's frame (parent frame)
Supported parameters are:
|code = (required) the IANA language code
|script = IANA script code; especially for use with languages that use multiple writing systems
|region = IANA region code
|variant = IANA variant code
|text = (required) the displayed text in language specified by code
|link = boolean false ('no') does not link code-spcified language name to associated language article
|rtl = boolean true ('yes') identifies the language specified by code as a right-to-left language
|nocat = boolean true ('yes') inhibits normal categorization; error categories are not affected
|cat = boolian false ('no') opposite form of |nocat=
|italic = boolean true ('yes') renders displayed text in italic font; boolean false ('no') renders displayed text in normal font; not set renders according to initial_style_state
|lit = text that is a literal translation of text
|label = 'none' to suppress all labeling (language name, 'translit.', 'lit.')
any other text replaces language-name label - automatic wikilinking disabled
for those {{lang-??}} templates that support transliteration (those templates where |text= is not entirely latn script):
|translit = text that is a transliteration of text
|translit-std = the standard that applies to the transliteration
|translit-script = ISO 15924 script name; falls back to code
For {{lang-??}}, the positional parameters are:
{{{1}}} text
{{{2}}} transliterated text
{{{3}}} literal translation text
no other positional parameters are allowed
]]
local function _lang_xx (args, base_template) -- base_template will be either of 'langx' or 'lang-xx'
local out = {};
local language_name; -- used to make display text, article links
local category_name; -- same as language_name except that it retains any parenthetical disambiguators (if any) from the data set
local subtags = {}; -- IETF subtags script, region, and variant
local code; -- the language code
local translit_script_name; -- name associated with IANA (ISO 15924) script code
local translit;
local msg; -- for error messages
local tag = 'span'; -- initial value for make_text_html()
local template = args.template or base_template;
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
local text_idx = (cfg.templates_t.langx == base_template) and 2 or 1; -- for {{langx}} 'text' positional parameter is '2'
local translit_idx = (cfg.templates_t.langx == base_template) and 3 or 2;
local xlate_idx = (cfg.templates_t.langx == base_template) and 4 or 3;
if args[text_idx] and args.text then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {text_idx, cfg.lang_t.conflict_n_param_types.text}), args, template);
else
args.text = args[text_idx] or args.text; -- prefer positional 'text' parameter
end
msg = validate_italic (args);
if msg then
return make_error_msg (msg, args, template);
end
msg = validate_text (template, args); -- ensure that |text= is set, does not contain italic markup and is protected from improper bolding
if is_set (msg) then
return msg;
end
args.text, tag = html_tag_select (args.text); -- inspects text; returns appropriate HTML tag with text trimmed accordingly
if args[translit_idx] and args.translit then
return make_error_msg (substitute (cfg.lang_t.conflict_n_param, {translit_idx, cfg.lang_t.conflict_n_param_types.translit}), args, template);
else
args.translit = args[translit_idx] or args.translit -- prefer positional 'translit' parameter
end
args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else
if args[xlate_idx] and (args.translation or args.lit) then
return make_error_msg (substitute (cfg.lang_xx_t.conflict_n_lit, {xlate_idx}), args, template);
elseif args.translation and args.lit then
return make_error_msg (cfg.lang_xx_t.conflict_lit, args, template);
else
args.translation = args[xlate_idx] or args.translation or args.lit; -- prefer positional 'translation' parameter
end
if args.links and args.link then
return make_error_msg (cfg.lang_xx_t.conflict_link, args, template);
else
args.link = args.link or args.links; -- prefer args.link
end
validate_cat_args (args); -- determine if categorization should be suppressed
args.rtl = args.rtl == cfg.keywords_t.affirmative; -- convert to boolean: 'yes' -> true, other values -> false
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (args.code, args.script, args.region, args.variant); -- private omitted because private
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
end
if args.translit then
local latn, pos, char;
latn, args.translit, pos, char = is_latin (args.translit, (('' ~= subtags.private) and (code .. '-x-' .. subtags.private)) or code);
if not latn then
return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template);
end
end
local is_latn_text, text, pos, char = is_latin (args.text, code); -- make a boolean
args.text = text; -- may have been modified (accept-as-written markup removed)
msg = text_script_match_test (subtags.script, is_latn_text, pos, char)
if msg then -- if an error detected then there is an error message
return make_error_msg (msg, args, template);
end
if cfg.templates_t.langx == base_template then -- auto-italics for {{langx}} templates; adapted from {{lang}} (no support for poem tag)
if nil == args.style then -- nil when |italic= absent or not set or |italic=default; args.style controls
if ('latn' == subtags.script) or -- script is latn
(this_wiki_lang_tag ~= code and not is_set (subtags.script) and is_latn_text) then -- text is not this wiki's language, no script specified and is wholly latn script (auto-italics)
args.style = 'italic'; -- set font-style:italic
else
args.style = 'inherit'; -- italic not set; script not latn; inherit current style
end
end
else -- {{lang-xx}} does not do auto italics; retained for those wikis that don't support {{langx}}
if nil == args.style then -- args.style controls
if is_set (subtags.script) then
if 'latn' == subtags.script then
args.style = 'italic'; -- |script=Latn; set for font-style:italic
else
args.style = initial_style_state; -- italic not set; script is not latn; set for font-style:<initial_style_state>
end
else
args.style = initial_style_state; -- here when |italic= and |script= not set; set for font-style:<initial_style_state>
end
end
end
if is_set (subtags.script) then -- if script set override rtl setting
if in_array (subtags.script, lang_data.rtl_scripts) then
args.rtl = true; -- script is an rtl script
else
args.rtl = false; -- script is not an rtl script
end
end
args.proto, msg = validate_proto (args.proto); -- return boolean, or nil, or nil and error message flag
if msg then
return make_error_msg (substitute (cfg.lang_t.invalid_proto, {args.proto}), args, template);
end
args.code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles
language_name = language_name_get (args.code, code, true); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
category_name = language_name; -- category names retain IANA parenthetical diambiguators (if any)
language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them
if args.label then
if 'none' ~= args.label then
table.insert (out, table.concat ({args.label, ': '})); -- custom label
end
else
if cfg.keywords_t.negative == args.link then
table.insert (out, language_name); -- language name without wikilink
else
if mw.ustring.find (language_name, 'languages', 1, true) then
table.insert (out, make_wikilink (language_name)); -- collective language name uses simple wikilink
elseif lang_data.article_name[args.code:lower()] then -- is IETF tag in article name over ride?
table.insert (out, make_wikilink (lang_data.article_name[args.code:lower()], language_name)); -- language name with wikilink from override data
elseif lang_data.article_name[code] then -- is language tag in article override
table.insert (out, make_wikilink (lang_data.article_name[code], language_name)); -- language name with wikilink from override data
else
table.insert (out, make_wikilink (substitute ('$1 $2', {language_name, cfg.misc_text_t.language}), language_name)); -- language name with wikilink
end
end
table.insert (out, ': '); -- separator
end
if cfg.keywords_t.invert == args.italic then
args.text = invert_italics (args.text)
end
args.text = proto_prefix (args.text, language_name, args.proto); -- prefix proto-language text with a splat
table.insert (out, make_text_html (args.code, args.text, tag, args.rtl, args.style, args.size, ('none' == args.label) and language_name or nil))
if is_set (args.translit) and not is_latn_text then -- transliteration; not supported when args.text is wholly latn text (this is an imperfect test)
table.insert (out, ', '); -- comma to separate text from translit
if 'none' ~= args.label then
table.insert (out, '<small>');
if script_table[args['translit-script']] then -- when |translit-script= is set, try to use the script's name
translit_script_name = script_table[args['translit-script']];
else
translit_script_name = language_name; -- fall back on language name
end
local translit_title_obj = mw.title.makeTitle (0, substitute ('$1 $2',{cfg.lang_xx_t.romanization, translit_script_name})); -- make a title object; no engvar, article titles use US spelling
if translit_title_obj.exists and (cfg.keywords_t.negative ~= args.link) then
table.insert (out, make_wikilink (substitute ('$1 $2', {cfg.lang_xx_t.romanization, translit_script_name or language_name}),
substitute ('$1', {cfg.engvar_t[args.engvar]['romanisz_pt']})) .. ':'); -- make a wikilink if there is an article to link to; engvar the display text
else
table.insert (out, substitute ('$1:', {cfg.engvar_t[args.engvar]['romanisz_pt']})); -- else plain text per engvar
end
table.insert (out, ' </small>'); -- close the small tag
end
translit = make_translit (args.code, language_name, args.translit, args['translit-std'], args['translit-script'], nil, args.engvar)
if is_set (translit) then
table.insert (out, translit);
else
return make_error_msg (substitute ('$1: $2', {cfg.lang_xx_t.invalid_xlit_std, args['translit-std'] or '[missing]'}), args, template);
end
elseif is_set (args.translit) and is_latn_text then -- when creating a transliteration of Latn script <text>
return make_error_msg (cfg.lang_xx_t.xlit_of_latn, args, template); -- emit error message and abandon
end
if is_set (args.translation) then -- translation (not supported in {{lang}})
table.insert (out, translation_make (args));
end
table.insert (out, make_category (code, category_name, args.nocat));
table.insert (out, render_maint(args.nocat)); -- maintenance messages and categories
return table.concat (out); -- put it all together and done
end
--[[--------------------------< L A N G _ X X _ A R G S _ G E T >----------------------------------------------
Common function to get args table from {{lang-??}} templates.
Returns table of args.
Text positional parameters are not trimmed here but are selectively trimmed at html_tag_select().
]]
local function lang_xx_args_get (frame, base_template)
local args_t = getArgs(frame,
{
parentFirst= true, -- parameters in the template override parameters set in the {{#invoke:}}
valueFunc = function (key, value)
if ((cfg.templates_t.langx == base_template) and 2 or 1) == key then -- the 'text' positional parameter; 1 for {{lang-??}}, 2 for {{langx}}; do not trim wite space
return value; -- return untrimmed 'text' positional parameter
elseif value then -- all other values: if the value is not nil
value = mw.text.trim (value); -- trim whitespace
if '' ~= value then -- empty string when value was only whitespace
return value;
end
end
return nil; -- value was empty or contained only whitespace
end -- end of valueFunc
});
return args_t;
end
--[[--------------------------< L A N G _ X X _ I T A L I C >--------------------------------------------------
Entry point for those {{lang-??}} templates that call lang_xx_italic(). Sets the initial style state to italic.
]]
local function lang_xx_italic (frame)
local args = lang_xx_args_get (frame, cfg.templates_t.langxx);
args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_italic|...}}
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message
end
initial_style_state = 'italic';
return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category
end
--[[--------------------------< _ L A N G _ X X _ I T A L I C >------------------------------------------------
Entry point from another module. Sets the initial style state to italic.
]]
local function _lang_xx_italic (args)
initial_style_state = 'italic';
return _lang_xx (args, cfg.templates_t.langxx);
end
--[[--------------------------< L A N G _ X X _ I N H E R I T >------------------------------------------------
Entry point for those {{lang-??}} templates that call lang_xx_inherit(). Sets the initial style state to inherit.
]]
local function lang_xx_inherit (frame)
local args = lang_xx_args_get (frame, cfg.templates_t.langxx);
args.fn = nil; -- unset because not supported but this function might have been called by {{lang|fn=lang_xx_inherit|...}}
local msg = parameter_validate (args, cfg.templates_t.langxx); -- verify that all supplied parameters are supported by {{lang-??}}
if msg then
return make_error_msg (msg, args, cfg.templates_t.langxx); -- when template has unsupported params, abandon with error message
end
initial_style_state = 'inherit';
return _lang_xx (args, cfg.templates_t.langxx) .. '[[Category:Pages using Lang-xx templates]]'; -- temporary category
end
--[[--------------------------< _ L A N G _ X X _ I N H E R I T >----------------------------------------------
Entry point from another module. Sets the initial style state to inherit.
]]
local function _lang_xx_inherit (args)
initial_style_state = 'inherit';
return _lang_xx (args, cfg.templates_t.langxx);
end
--[[--------------------------< _ L A N G X >------------------------------------------------------------------
Entry point from another module.
]]
local function _langx (args_t)
local langx_data = mw.loadData ('Module:Lang/langx'); -- get necessary data
local rtl_t = langx_data.rtl_t; -- get list of language tags for languages that are rendered right-to-left
local link_t = langx_data.link_t; -- get list of language tags for {{lang-??}} templates that set |link=<something>
local size_t = langx_data.size_t; -- get list of language tags for {{lang-??}} templates that set |size=<something>
local msg = parameter_validate (args_t, cfg.templates_t.langx);
if msg then
return make_error_msg (msg, args_t, cfg.templates_t.langx);
end
args_t.code = args_t[1] or args_t.code; -- get the language tag; must be {{{1}}} or |code=
if not args_t.code then
return make_error_msg (cfg.get_ietf_parts_t.missing_lang_tag, args_t, cfg.templates_t.langx);
end
args_t.rtl = args_t.rtl or (rtl_t[args_t.code] and cfg.keywords_t.affirmative); -- prefer |rtl= in template call, use rtl_t else
args_t.link = args_t.link or link_t[args_t.code]; -- prefer |link= in template call, use link_t felse
args_t.size = args_t.size or size_t[args_t.code]; -- prefer |size= in template call, use size_t else
args_t[1] = nil; -- unset to mimic {{lang-??}} templates which set |code=xx
local lang_subtag = args_t.code; -- use only the base language subtag for unsupported tag test; some args_t.code are modified by |script= etc
return _lang_xx (args_t, cfg.templates_t.langx);
end
--[[--------------------------< L A N G X >--------------------------------------------------------------------
Entry point for {{langx}}.
this function calls _lang_xx() to render non-English text. The {{lang-??}} templates have three positional paramters
but {{langx}} has four:
| 1 | 2 | 3 | 4
{{lang-xx |<text> |<xlit> |<xlat> }}
{{langx |<tag> |<text> |<xlit> |<xlat> }}
The calls to lang_xx_args_get() and _lang_xx() use 'langx' as a flag for those functions to select the proper
positional parameters.
{{lang-??}} depends on the calling template to select 'inherit' or 'italic' to establish the default rendering.
{{langx}} can't do that. The initial version of {{langx}} relied on a list of language tags (inherit_t in ~/langx)
scraped from those {{lang-??}} templates that call lang_xx_inherit() to render text in upright font. langx() now
uses auto-italics code adapted from {{lang}} (doesn't support poem tags).
]]
local function langx (frame)
local args_t = lang_xx_args_get (frame, cfg.templates_t.langx); -- get the arguments; 'langx' is the <base_template> used to decide which positional param is 'text', 'translit', 'lit'
return _langx (args_t);
end
--[[--------------------------< _ I S _ I E T F _ T A G >------------------------------------------------------
Returns true when a language name associated with IETF language tag exists; nil else. IETF language tag must be valid.
All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function.
Module entry point from another module.
]]
local function _is_ietf_tag (tag) -- entry point when this module is require()d into another
local c, s, r, v, p, err; -- code, script, region, variant, private, error message
c, s, r, v, p, err = get_ietf_parts (tag); -- disassemble tag into constituent part and validate
return ((c and not err) and true) or nil; -- return true when code portion has a value without error message; nil else
end
--[[--------------------------< I S _ I E T F _ T A G >--------------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function is_ietf_tag (frame)
return _is_ietf_tag (getArgs (frame)[1]); -- args[1] is the IETF language tag to be tested; also get parent frame
end
--[[--------------------------< I S _ I E T F _ T A G _ F R A M E >--------------------------------------------
Module entry point from an {{#invoke:}}; same as is_ietf_tag() except does not get parameters from the parent
(template) frame. This function not useful when called by {{lang|fn=is_ietf_tag_frame|<tag>}} because <tag>
is in the parent frame.
]]
local function is_ietf_tag_frame (frame)
return _is_ietf_tag (getArgs (frame, {frameOnly = true,})[1]); -- args[1] is the IETF language tag to be tested; do not get parent frame
end
--[[--------------------------< _ N A M E _ F R O M _ T A G >--------------------------------------------------
Returns language name associated with IETF language tag if valid; error message else.
All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function.
Set invoke's |link= parameter to yes to get wikilinked version of the language name.
Module entry point from another module.
]]
local function _name_from_tag (args)
local subtags = {}; -- IETF subtags script, region, variant, and private
local raw_code = args[1]; -- save a copy of the input IETF subtag
local link = cfg.keywords_t.affirmative == args['link']; -- make a boolean
local label = args.label;
local code; -- the language code
local msg; -- gets an error message if IETF language tag is malformed or invalid
local language_name = '';
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code);
if msg then
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
return make_error_span (template, msg);
end
raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
language_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
if 'yes' ~= args.raw then
language_name = language_name:gsub ('%s+%b()', ''); -- remove IANA parenthetical disambiguators or qualifiers from names that have them
end
if link then -- when |link=yes, wikilink the language name
if mw.ustring.find (language_name, 'languages', 1, true) then
language_name = make_wikilink (language_name, label); -- collective language name uses simple wikilink
elseif lang_data.article_name[raw_code:lower()] then -- is IETF tag in article name override?
language_name = make_wikilink (lang_data.article_name[raw_code:lower()], label or language_name); -- language name with wikilink from override data
elseif lang_data.article_name[code] then -- is language tag in article name override?
language_name = make_wikilink (lang_data.article_name[code], label or language_name); -- language name with wikilink from override data
else
language_name = make_wikilink (substitute ('$1 $2', {language_name, cfg.misc_text_t.language}), label or language_name); -- language name with wikilink
end
end
return language_name;
end
--[[--------------------------< N A M E _ F R O M _ T A G >----------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function name_from_tag (frame) -- entry point from an {{#invoke:lang|name_from_tag|<IETF tag>|link=<yes>|template=<template name>}}
return _name_from_tag (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame
end
--[[--------------------------< _ T A G _ F R O M _ N A M E >--------------------------------------------------
Returns the IETF language tag associated with the language name. Spelling of language name must be correct
according to the spelling in the source tables. When a standard language name has a parenthetical disambiguator,
that disambiguator must be omitted (they are not present in the data name-to-tag tables).
Module entry point from another module.
]]
local function _tag_from_name (args) -- entry point from another module
local msg;
if args[1] and '' ~= args[1] then
local data = mw.loadData ('Module:Lang/tag from name'); -- get the reversed data tables TODO: change when going live
local lang = args[1]:lower(); -- allow any-case for the language name (speeling must till be correct)
local tag = data.rev_override_table[lang] or data.rev_lang_table[lang] or data.rev_lang_dep_table[lang]; -- get the code; look first in the override then in the standard
if tag then
return tag, true; -- language name found so return tag and done; second return used by is_lang_name()
else
msg = substitute (cfg.tag_from_name_t.lang_not_found, {args[1]}); -- language name not found, error message
end
else
msg = cfg.tag_from_name_t.missing_lang_name; -- language name not found, error message
end
local template = '';
if args.template and '' ~= args.template then
template = table.concat ({'{{', args['template'], '}}: '}); -- make template name (if provided by the template)
end
return make_error_span (template, msg);
end
--[[--------------------------< T A G _ F R O M _ N A M E >----------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function tag_from_name (frame) -- entry point from an {{#invoke:lang|tag_from_name|<language name>|link=<yes>|template=<template name>}}
local result, _ = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by is_lang_name()
return result;
end
--[[--------------------------< I S _ L A N G _ N A M E >------------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function is_lang_name (frame)
local _, result = _tag_from_name (getArgs(frame)) -- pass-on the args table, nothing else; getArgs() so we also get parent frame; supress second return used by tag_from_name()
return result and true or nil;
end
--[[--------------------------< _ X L I T >--------------------------------------------------------------------
Module entry point from another module.
]]
local function _xlit (args)
local title_table = lang_data.translit_title_table; -- table of transliteration standards and the language codes and scripts that apply to those standards
local language_name; -- language name that matches language code; used for tool tip
local translit; -- transliterated text to display
local script; -- IANA script
local msg; -- for when called functions return an error message
local template = args.template or cfg.templates_t.transliteration;
maint_cats = {}; -- initialize because when this module required into another module, these only declared once so only initialzed once
maint_msgs = {};
if is_set (args[3]) then -- [3] set when {{transliteration|code|standard|text}}
args.text = args[3]; -- get the transliterated text
args.translit_std = args[2] and args[2]:lower(); -- get the standard; lower case for table indexing
if not title_table[args.translit_std] then
return make_error_msg (substitute (cfg.transl_t.unrecog_xlit_std, {args.translit_std}), args, template);
end
else
if is_set (args[2]) then -- [2] set when {{transliteration|code|text}}
args.text = args[2]; -- get the transliterated text
else
if args[1] and (args[1]:match ('^%a%a%a?%a?$') or -- args[2] missing; is args[1] a language or script tag or is it the transliterated text?
args[1]:match ('^%a%a%a?%-x%-')) then -- or is args[1] a private-use tag
return make_error_msg (cfg.transl_t.no_text, args, template); -- args[1] is a code so we're missing text
else
args.text = args[1]; -- args[1] is not a code so we're missing that; assign args.text for error message
return make_error_msg (cfg.transl_t.missing_lang_scr, args, template);
end
end
end
if is_set (args[1]) then -- IANA language code used for HTML lang= attribute; or ISO 15924 script code
if args[1]:match ('^%a%a%a?%a?$') or args[1]:match ('^%a%a%a?%-x%-') then -- args[1] has correct form?
args.code = args[1]:lower(); -- use the language/script code; only (2, 3, or 4 alpha characters) or private-use; lower case because table indexes are lower case
else
return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args[1]}), args, template); -- invalid language / script code
end
else
return make_error_msg (cfg.transl_t.missing_lang_scr, args, template); -- missing language / script code so quit
end
local is_latn_text, pos, char;
is_latn_text, args.text, pos, char= is_latin (args.text, args.code); -- is latn text? strip accept-as-written markup
if not is_latn_text then -- when text is not latn
return make_error_msg (substitute (cfg.lang_xx_t.translit_nonlatn, {pos, char}), args, template); -- abandon with error message
end
msg = validate_italic (args);
if msg then
return make_error_msg (msg, args, template);
end
if 'italic' == args.style then -- 'italic' when |italic=yes; because that is same as absent or not set and |italic=default
args.style = nil; -- set to nil;
end
args.engvar = cfg.engvar_sel_t[args.engvar] or cfg.default_engvar; -- |engvar= when valid; cfg.default_engvar else
if override_table[args.code] then -- is code a language code defined in the override table?
language_name = override_table[args.code];
args.code = args.code:match ('^%a%a%a?'); -- if private use, strip all but language subtag
elseif lang_table[args.code] then -- is code a language code defined in the standard language code tables?
language_name = lang_table[args.code];
elseif lang_dep_table[args.code] then -- is code a language code defined in the deprecated language code tables?
language_name = lang_dep_table[args.code];
elseif script_table[args.code] then -- if here, code is not a language code; is it a script code?
language_name = script_table[args.code];
script = args.code; -- code was an ISO 15924 script so use that instead
args.code = ''; -- unset because not a language code
else
return make_error_msg (substitute (cfg.transl_t.unrecog_lang_scr, {args.code}), args, template); -- invalid language / script code
end
-- here only when all parameters passed to make_translit() are valid
return make_translit (args.code, language_name, args.text, args.translit_std, script, args.style, args.engvar);
end
--[[--------------------------< X L I T >----------------------------------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function xlit (frame)
return _xlit (getArgs(frame));
end
--[[--------------------------< C A T E G O R Y _ F R O M _ T A G >--------------------------------------------
Returns category name associated with IETF language tag if valid; error message else.
All code combinations supported by {{lang}} and the {{lang-??}} templates are supported by this function.
Module entry point from another module.
]]
local function _category_from_tag (args_t)
local subtags = {}; -- IETF subtags script, region, variant, and private
local raw_code = args_t[1]; -- save a copy of the input IETF subtag
local link = cfg.keywords_t.affirmative == args_t.link; -- make a boolean
local label = args_t.label;
local code; -- the language code
local msg; -- gets an error message if IETF language tag is malformed or invalid
local category_name = '';
code, subtags.script, subtags.region, subtags.variant, subtags.private, msg = get_ietf_parts (raw_code);
if msg then
local template = (args_t.template and table.concat ({'{{', args_t.template, '}}: '})) or ''; -- make template name (if provided by the template)
return make_error_span (template, msg);
end
raw_code = format_ietf_tag (code, subtags.script, subtags.region, subtags.variant, subtags.private); -- format to recommended subtag styles; private omitted because private
category_name = language_name_get (raw_code, code); -- get language name; try IETF tag first, then code w/o variant then code w/ variant
category_name = make_category (code, category_name, nil, true):gsub ('[%[%]]', '');
if link then
return table.concat ({'[[:', category_name, ']]'});
else
return category_name;
end
end
--[[--------------------------< C A T E G O R Y _ F R O M _ T A G >--------------------------------------------
Module entry point from an {{#invoke:}}.
]]
local function category_from_tag (frame) -- entry point from an {{#invoke:lang|category_from_tag|<IETF tag>|template=<template name>}}
return _category_from_tag (getArgs (frame)); -- pass-on the args table, nothing else; getArgs() so we also get parent frame
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
category_from_tag = category_from_tag, -- frame entry points when this module is #invoke:ed into templates/wikitext
lang = lang, -- entry point for {{lang}}
langx = langx, -- entry point for {{langx}}
lang_xx_inherit = lang_xx_inherit, -- entry points for {{lang-??}}
lang_xx_italic = lang_xx_italic,
is_ietf_tag = is_ietf_tag,
is_ietf_tag_frame = is_ietf_tag_frame,
is_lang_name = is_lang_name,
tag_from_name = tag_from_name, -- returns IETF tag associated with language name
name_from_tag = name_from_tag, -- used for template documentation; possible use in ISO 639 name from code templates
xlit = xlit, -- entry point for {{transliteration}}
_category_from_tag = _category_from_tag, -- API entry points when this module is require()d into other modules
_lang = _lang,
_langx = _langx,
_lang_xx_inherit = _lang_xx_inherit,
_lang_xx_italic = _lang_xx_italic,
_is_ietf_tag = _is_ietf_tag,
get_ietf_parts = get_ietf_parts,
_tag_from_name = _tag_from_name,
_name_from_tag = _name_from_tag,
_xlit = _xlit,
_translation_make = translation_make,
};
pjs0klhaiwweelyd7pjfmp0uzocrd5t
ಮೋಡ್ಯೂಲ್:Mapframe
828
7579
373855
371476
2026-10-18T22:35:06Z
en>Jonesey95
0
"coordinates" is the canonical form of this parameter. "coord" is not supported by all templates that call this module, so the Lua error message should not suggest putting coordinates in "|coord=".
373855
Scribunto
text/plain
-- Note: Originally written on English Wikipedia at https://en.wikipedia.org/wiki/Module:Mapframe
--[[----------------------------------------------------------------------------
##### Localisation (L10n) settings #####
Replace values in quotes ("") with localised values
----------------------------------------------------------------------------]]--
local L10n = {}
local wb = mw.wikibase
-- Modue dependencies
local parser -- local copy of https://www.mediawiki.org/wiki/Module:WikitextParser loaded lazily
-- "strict" should not be used, at least until all other modules which require this module are not using globals.
-- Template parameter names (unnumbered versions only)
-- Specify each as either a single string, or a table of strings (aliases)
-- Aliases are checked left-to-right, i.e. `{ "one", "two" }` is equivalent to using `{{{one| {{{two|}}} }}}` in a template
L10n.para = {
display = "display",
type = "type",
id = { "id", "ids" },
from = "from",
raw = "raw",
title = "title",
description = "description",
strokeColor = { "stroke-color", "stroke-colour" },
strokeWidth = "stroke-width",
strokeOpacity = "stroke-opacity",
fill = "fill",
fillOpacity = "fill-opacity",
coord = { "coordinates", "coord" },
marker = "marker",
markerColor = { "marker-color", "marker-colour" },
markerSize = "marker-size",
radius = { "radius", "radius_m" },
radiusKm = "radius_km",
radiusFt = "radius_ft",
radiusMi = "radius_mi",
edges = "edges",
text = "text",
icon = "icon",
zoom = "zoom",
frame = "frame",
plain = "plain",
frameWidth = "frame-width",
frameHeight = "frame-height",
frameCoordinates= { "frame-coordinates", "frame-coord" },
frameLatitude = { "frame-lat", "frame-latitude" },
frameLongitude = { "frame-long", "frame-longitude" },
frameAlign = "frame-align",
switch = "switch",
overlay = "overlay",
overlayBorder = "overlay-border",
overlayHorizontalAlignment = "overlay-horizontal-alignment",
overlayVerticalAlignment = "overlay-vertical-alignment",
overlayHorizontalOffset = "overlay-horizontal-offset",
overlayVerticalOffset = "overlay-vertical-offset"
}
-- Names of other templates this module can extract coordinates from
L10n.template = {
templates = { -- The coord template, as well as templates with output that contains {{coord}}
"Coord", "Coord/sandbox",
"NRHP row", "NRHP row/sandbox",
"WikidataCoord", "WikidataCoord/sandbox", "Wikidatacoord", "Wikidata coord"
},
modules = { -- The coordinates module, as well as modules with output that contains {{coord}}
"Coordinates", "Coordinates/sandbox",
"WikidataCoord", "WikidataCoord/sandbox"
}
}
-- Error messages
L10n.error = {
badDisplayPara = "Invalid display parameter",
noCoords = "Coordinates must be specified on Wikidata or in |" .. ( type(L10n.para.coord)== 'table' and L10n.para.coord[1] or L10n.para.coord ) .. "=",
wikidataCoords = "Coordinates not found on Wikidata",
noCircleCoords = "Circle centre coordinates must be specified, or available via Wikidata",
negativeRadius = "Circle radius must be a positive number",
noRadius = "Circle radius must be specified",
negativeEdges = "Circle edges must be a positive number",
noSwitchPara = "Found only one switch value in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
oneSwitchLabel = "Found only one label in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noSwitchLists = "At least one parameter must have a SWITCH: list",
switchMismatches = "All SWITCH: lists must have the same number of values",
-- "%s" and "%d" tokens will be replaced with strings and numbers when used
oneSwitchValue = "Found only one switch value in |%s=",
fewerSwitchLabels = "Found %d switch values but only %d labels in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noNamedCoords = "No named coordinates found in %s"
}
-- Other strings
L10n.str = {
-- valid values for display parameter, e.g. (|display=inline) or (|display=title) or (|display=inline,title) or (|display=title,inline)
inline = "inline",
title = "title",
dsep = ",", -- separator between inline and title (comma in the example above)
-- valid values for type parameter
line = "line", -- geoline feature (e.g. a road)
shape = "shape", -- geoshape feature (e.g. a state or province)
shapeInverse = "shape-inverse", -- geomask feature (the inverse of a geoshape)
data = "data", -- geoJSON data page on Commons
point = "point", -- single point feature (coordinates)
circle = "circle", -- circular area around a point
named = "named", -- all named coordinates in an article or section
-- Keyword to indicate a switch list. Must NOT use the special characters ^$()%.[]*+-?
switch = "SWITCH",
-- valid values for icon, frame, and plain parameters
affirmedWords = ' '..table.concat({
"add",
"added",
"affirm",
"affirmed",
"include",
"included",
"on",
"true",
"yes",
"y"
}, ' ')..' ',
declinedWords = ' '..table.concat({
"decline",
"declined",
"exclude",
"excluded",
"false",
"none",
"not",
"no",
"n",
"off",
"omit",
"omitted",
"remove",
"removed"
}, ' ')..' '
}
-- Default values for parameters
L10n.defaults = {
display = L10n.str.inline,
text = "Map",
frameWidth = "300",
frameHeight = "200",
frameAlign = "right",
markerColor = "5E74F3",
markerSize = nil,
strokeColor = "#ff0000",
strokeWidth = 6,
edges = 32, -- number of edges used to approximate a circle
overlayBorder = "1px solid white",
overlayHorizontalAlignment = "right",
overlayHorizontalOffset = "0",
overlayVerticalAlignment = "bottom",
overlayVerticalOffset = "0"
}
-- #### End of L10n settings ####
--[[----------------------------------------------------------------------------
Utility methods
----------------------------------------------------------------------------]]--
local util = {}
--[[
Looks up a parameter value based on the id (a key from the L10n.para table) and
optionally a suffix, for parameters that can be suffixed (e.g. type2 is type
with suffix 2).
@param {table} args key-value pairs of parameter names and their values
@param {string} param_id id for parameter name (key from the L10n.para table)
@param {string} [suffix] suffix for parameter name
@returns {string|nil} parameter value if found, or nil if not found
]]--
function util.getParameterValue(args, param_id, suffix)
suffix = suffix or ''
if type( L10n.para[param_id] ) ~= 'table' then
return args[L10n.para[param_id]..suffix]
end
for _i, paramAlias in ipairs(L10n.para[param_id]) do
if args[paramAlias..suffix] then
return args[paramAlias..suffix]
end
end
return nil
end
--[[
Trim whitespace from args, and remove empty args. Also fix control characters.
@param {table} argsTable
@returns {table} trimmed args table
]]--
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(key) == 'string' and type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
-- control characters inside json need to be escaped, but stripping them is simpler
-- See also T214984
-- However, *don't* strip control characters from wikitext (text or description parameters) or you'll break strip markers
-- Alternatively it might be better to only strip control char from raw parameter content
if util.matchesParam('text', key) or util.matchesParam('description', key, key:gsub('^%D+(%d+)$', '%1') ) then
cleanArgs[key] = val
else
cleanArgs[key] = val:gsub('%c',' ')
end
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
--[[
Check if a parameter name matches an unlocalized parameter key
@param {string} key - the unlocalized parameter name to search through
@param {string} name - the localized parameter name to check
@param {string|nil} - an optional suffix to apply to the value(s) from the localization key
@returns {boolean} true if the name matches the parameter, false otherwise
]]--
function util.matchesParam(key, name, suffix)
local param = L10n.para[key]
suffix = suffix or ''
if type(param) == 'table' then
for _, v in pairs(param) do
if (v .. suffix) == name then return true end
end
return false
end
return ((param .. suffix) == name)
end
--[[
Check if a value is affirmed (one of the values in L10n.str.affirmedWords)
@param {string} val Value to be checked
@returns {boolean} true if affirmed, false otherwise
]]--
function util.isAffirmed(val)
if not(val) then return false end
return string.find(L10n.str.affirmedWords, ' '..val..' ', 1, true ) and true or false
end
--[[
Check if a value is declined (one of the values in L10n.str.declinedWords)
@param {string} val Value to be checked
@returns {boolean} true if declined, false otherwise
]]--
function util.isDeclined(val)
if not(val) then return false end
return string.find(L10n.str.declinedWords , ' '..val..' ', 1, true ) and true or false
end
--[[
Check if the name of a template matches the known coord templates or wrappers
(in L10n.template.templates and L10n.template.modules). The name is normalised
when checked, so e.g. the names "Coord", "coord", and " Coord" all return true.
@param {string} name
@returns {boolean} true if it is a coord template or wrapper, false otherwise
]]--
function util.isCoordTemplateOrWrapper(name)
name = mw.text.trim(name)
local modName = mw.ustring.gsub(name, '#invoke:', '')
local inputTitle = mw.title.new(modName, (name ~= modName) and 'Module' or 'Template')
if not inputTitle then
return false
end
-- Create (or reuse) mw.title objects for each known coord template/wrapper.
-- Stored in L10n.template.title so that they don't need to be recreated
-- each time this function is called
if not L10n.template.titles then
L10n.template.titles = {}
for _, v in pairs(L10n.template.templates) do
table.insert(L10n.template.titles, mw.title.new(v, 'Template'))
end
for _, v in pairs(L10n.template.modules) do
table.insert(L10n.template.titles, mw.title.new(v, 'Module'))
end
end
for _, templateTitle in pairs(L10n.template.titles) do
if mw.title.equals(inputTitle, templateTitle) then
return true
end
end
return false
end
--[[
Recursively extract coord templates which have a name parameter.
@param {string} wikitext
@returns {table} table sequence of coord templates
]]--
function util.extractCoordTemplates(wikitext)
local output = {}
local templates = mw.ustring.gmatch(wikitext, '{%b{}}')
for template in templates do
local templateName = mw.ustring.match(template, '{{([^}|]+)')
local nameParam = mw.ustring.match(template, "|%s*name%s*=%s*[^}|]+")
if util.isCoordTemplateOrWrapper(templateName) then
if nameParam then table.insert(output, template) end
elseif mw.ustring.find(mw.ustring.sub(template, 2), "{{") then
local subOutput = util.extractCoordTemplates(mw.ustring.sub(template, 2))
for _, t in pairs(subOutput) do
table.insert(output, t)
end
end
end
-- ensure coords are not using title display
for k, v in pairs(output) do
output[k] = mw.ustring.gsub(v, "|%s*display%s*=[^|}]+", "|display=inline")
end
return output
end
--[[
Gets all named coordinates from a page or a section of a page.
@param {string|nil} page Page name, or name#section, to get named coordinates
from. If the name is omitted, i.e. #section or nil or empty string, then
the current page will be used.
@returns {table} sequence of {coord, name, description} tables where coord is
the coordinates in a format suitable for #util.parseCoords, name is a string,
and description is a string (coordinates in a format suitable for displaying
to the reader). If for some reason the name can't be found, the description
is nil and the name contains display-format coordinates.
@throws {L10n.error.noNamedCoords} if no named coordinates are found.
]]--
function util.getNamedCoords(page)
local parts = mw.text.split(page or "", "#", true)
local name = parts[1] == "" and mw.title.getCurrentTitle().prefixedText or parts[1]
local section = parts[2]
local title = mw.title.new(name)
if title.isRedirect then
title = title.redirectTarget
end
local pageWikitext = title:getContent()
if section then
if parser == nil then
-- load [[Module:WikitextParser]] lazily so it is only transcluded on pages that use it
parser = require("Module:WikitextParser")
end
pageWikitext = parser.getSection(pageWikitext, section) or ''
end
local coordTemplates = util.extractCoordTemplates(pageWikitext)
if #coordTemplates == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
local frame = mw.getCurrentFrame()
local sep = "________"
local expandedContent = frame:preprocess(table.concat(coordTemplates, sep))
local expandedTemplates = mw.text.split(expandedContent, sep)
local namedCoords = {}
for _, expandedTemplate in pairs(expandedTemplates) do
local coord = mw.ustring.match(expandedTemplate, "<span class=\"geo%-dec\".->(.-)</span>")
if coord then
local coordname = (
-- name specified by a wrapper template, e.g [[Article|Name]]
mw.ustring.match(expandedTemplate, "<span class=\"mapframe%-coord%-name\">(.-)</span>") or
-- name passed into coord template
mw.ustring.match(expandedTemplate, "<span class=\"fn org\">(.-)</span>") or
-- default to the coordinates if the name can't be retrieved
coord
)
local description = coordname ~= coord and coord
table.insert(namedCoords, {
coord=mw.ustring.gsub(coord, "[° ]", "_"),
name=coordname, description=description
})
end
end
if #namedCoords == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
return namedCoords
end
--[[
Parse coordinate values from the params passed in a GeoHack url (such as
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1_2_N_3_4_W_ or
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1.23_S_4.56_E_ )
or non-url string in the same format (such as `1_2_N_3_4_W_` or `1.23_S_4.56_E_`)
@param {string} coords string containing coordinates
@returns {number, number} latitude, longitude
]]--
function util.parseCoords(coords)
local coordsPatt
if mw.ustring.find(coords, "params=", 1, true) then
-- prevent false matches from page name, e.g. ?pagename=Lorem_S._Ipsum
coordsPatt = 'params=([_%.%d]+[NS][_%.%d]+[EW])'
else
-- not actually a geohack url, just the same format
coordsPatt = '[_%.%d]+[NS][_%.%d]+[EW]'
end
local parts = mw.text.split((mw.ustring.match(coords, coordsPatt) or ''), '_')
local lat_d = tonumber(parts[1])
assert(lat_d, "Unable to get latitude from input '"..coords.."'.")
local lat_m = tonumber(parts[2]) -- nil if coords are in decimal format
local lat_s = lat_m and tonumber(parts[3]) -- nil if coords are either in decimal format or degrees and minutes only
local lat = lat_d + (lat_m or 0)/60 + (lat_s or 0)/3600
if parts[#parts/2] == 'S' then
lat = lat * -1
end
local long_d = tonumber(parts[1+#parts/2])
assert(long_d, "Unable to get longitude from input '"..coords.."'.")
local long_m = tonumber(parts[2+#parts/2]) -- nil if coords are in decimal format
local long_s = long_m and tonumber(parts[3+#parts/2]) -- nil if coords are either in decimal format or degrees and minutes only
local long = long_d + (long_m or 0)/60 + (long_s or 0)/3600
if parts[#parts] == 'W' then
long = long * -1
end
return lat, long
end
--[[
Get coordinates from a Wikidata item
@param {string} item_id Wikidata item id (Q number)
@returns {number, number} latitude, longitude
@throws {L10n.error.noCoords} if item_id is invalid or the item does not exist
@throws {L10n.error.wikidataCoords} if the the item does not have a P625
statement (coordinates), or it is set to "no value"
]]--
function util.wikidataCoords(item_id)
if not (item_id and wb.isValidEntityId(item_id) and wb.entityExists(item_id)) then
error(L10n.error.noCoords, 0)
end
local coordStatements = wb.getBestStatements(item_id, 'P625')
if not coordStatements or #coordStatements == 0 then
error(L10n.error.wikidataCoords, 0)
end
local hasNoValue = ( coordStatements[1].mainsnak and (coordStatements[1].mainsnak.snaktype == 'novalue' or coordStatements[1].mainsnak.snaktype == 'somevalue') )
if hasNoValue then
error(L10n.error.wikidataCoords, 0)
end
local wdCoords = coordStatements[1]['mainsnak']['datavalue']['value']
return tonumber(wdCoords['latitude']), tonumber(wdCoords['longitude'])
end
--[[
Creates a polygon that approximates a circle
@param {number} lat Latitude
@param {number} long Longitude
@param {number} radius Radius in metres
@param {number} n Number of edges for the polygon
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
]]--
function util.circleToPolygon(lat, long, radius, n) -- n is number of edges
-- Based on https://github.com/gabzim/circle-to-polygon, ISC licence
local function offset(cLat, cLon, distance, bearing)
local lat1 = math.rad(cLat)
local lon1 = math.rad(cLon)
local dByR = distance / 6378137 -- distance divided by 6378137 (radius of the earth) wgs84
local offet_lat = math.asin(
math.sin(lat1) * math.cos(dByR) +
math.cos(lat1) * math.sin(dByR) * math.cos(bearing)
)
local offet_lon = lon1 + math.atan2(
math.sin(bearing) * math.sin(dByR) * math.cos(lat1),
math.cos(dByR) - math.sin(lat1) * math.sin(offet_lat)
)
return {math.deg(offet_lon), math.deg(offet_lat)}
end
local coordinates = {};
local i = 0;
while i < n do
table.insert(coordinates,
offset(lat, long, radius, (2*math.pi*i*-1)/n)
)
i = i + 1
end
table.insert(coordinates, offset(lat, long, radius, 0))
return coordinates
end
--[[
Get the number of key-value pairs in a table, which might not be a sequence.
@param {table} t
@returns {number} count of key-value pairs
]]--
function util.tableCount(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
--[[
For a table where the values are all tables, returns either the util.tableCount
of the subtables if they are all the same, or nil if they are not all the same.
@param {table} t
@returns {number|nil} count of key-value pairs of subtable, or nil if subtables
have different counts
]]--
function util.subTablesCount(t)
local count = nil
for k, v in pairs(t) do
if count == nil then
count = util.tableCount(v)
elseif count ~= util.tableCount(v) then
return nil
end
end
return count
end
--[[
Splits a list into a table sequence. The items in the list may be separated by
commas, or by semicolons (if items may contain commas), or by "###" (if items
may contain semicolons).
@param {string} listString
@returns {table} sequence of list items
]]--
function util.tableFromList(listString)
if type(listString) ~= "string" or listString == "" then return nil end
local separator = (mw.ustring.find(listString, "###", 0, true ) and "###") or
(mw.ustring.find(listString, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
return mw.text.split(listString, pattern)
end
-- Boolean in outer scope indicating if Kartographer should be able to
-- automatically calculate coordinates (see phab:T227402)
local coordsDerivedFromFeatures = false;
--[[----------------------------------------------------------------------------
Make methods: These take in a table of arguments, and return either a string
or a table to be used in the eventual output.
----------------------------------------------------------------------------]]--
local make = {}
--[[
Makes content to go inside the maplink or mapframe tag.
@param {table} args
@returns {string} tag content
]]--
function make.content(args)
if util.getParameterValue(args, 'raw') then
coordsDerivedFromFeatures = true -- Kartographer should be able to automatically calculate coords from raw geoJSON
return util.getParameterValue(args, 'raw')
end
local content = {}
local argsExpanded = {}
for k, v in pairs(args) do
local index = string.match( k, '^[^0-9]+([0-9]*)$' )
if index ~= nil then
local indexNumber
if index ~= '' then
indexNumber = tonumber(index)
else
indexNumber = 1
end
if argsExpanded[indexNumber] == nil then
argsExpanded[indexNumber] = {}
end
argsExpanded[indexNumber][ string.gsub(k, index, '') ] = v
end
end
for contentIndex, contentArgs in pairs(argsExpanded) do
local argType = util.getParameterValue(contentArgs, "type")
-- Kartographer automatically calculates coords if geolines/shapes are used (T227402)
if not coordsDerivedFromFeatures then
coordsDerivedFromFeatures = ( argType == L10n.str.line or argType == L10n.str.shape ) and true or false
end
if argType == L10n.str.named then
local namedCoords = util.getNamedCoords(util.getParameterValue(contentArgs, "from"))
local typeKey = type(L10n.para.type) == "table" and L10n.para.type[1] or L10n.para.type
local coordKey = type(L10n.para.coord) == "table" and L10n.para.coord[1] or L10n.para.coord
local titleKey = type(L10n.para.title) == "table" and L10n.para.title[1] or L10n.para.title
local descKey = type(L10n.para.description) == "table" and L10n.para.description[1] or L10n.para.description
for _, namedCoord in pairs(namedCoords) do
contentArgs[typeKey] = "point"
contentArgs[coordKey] = namedCoord.coord
contentArgs[titleKey] = namedCoord.name
contentArgs[descKey] = namedCoord.description
content[#content+1] = make.contentJson(contentArgs)
end
else
content[#content + 1] = make.contentJson(contentArgs)
end
end
--Single item, no array needed
if #content==1 then return content[1] end
--Multiple items get placed in a FeatureCollection
local contentArray = '[\n' .. table.concat( content, ',\n') .. '\n]'
return contentArray
end
--[[
Make coordinates from the coord arg, or the id arg, or the current page's
Wikidata item.
@param {table} args
@param {boolean} [plainOutput]
@returns {Mixed} Either:
{number, number} latitude, longitude if plainOutput is true; or
{table} table sequence of longitude, then latitude (gives the required format
for GeoJSON when encoded)
]]--
function make.coords(args, plainOutput)
local coords, lat, long
local frame = mw.getCurrentFrame()
if util.getParameterValue(args, 'coord') then
coords = frame:preprocess( util.getParameterValue(args, 'coord') )
lat, long = util.parseCoords(coords)
else
lat, long = util.wikidataCoords(util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
end
if plainOutput then
return lat, long
end
return {[0] = long, [1] = lat}
end
--[[
Makes a table of coordinates that approximate a circle.
@param {table} args
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
@throws {L10n.error.noCircleCoords} if centre coordinates are not specified
@throws {L10n.error.noRadius} if radius is not specified
@throws {L10n.error.negativeRadius} if radius is negative or zero
@throws {L10n.error.negativeEdges} if edges is negative or zero
]]--
function make.circleCoords(args)
local lat, long = make.coords(args, true)
local radius = util.getParameterValue(args, 'radius')
if not radius then
radius = util.getParameterValue(args, 'radiusKm') and tonumber(util.getParameterValue(args, 'radiusKm'))*1000
if not radius then
radius = util.getParameterValue(args, 'radiusMi') and tonumber(util.getParameterValue(args, 'radiusMi'))*1609.344
if not radius then
radius = util.getParameterValue(args, 'radiusFt') and tonumber(util.getParameterValue(args, 'radiusFt'))*0.3048
end
end
end
local edges = util.getParameterValue(args, 'edges') or L10n.defaults.edges
if not lat or not long then
error(L10n.error.noCircleCoords, 0)
elseif not radius then
error(L10n.error.noRadius, 0)
elseif tonumber(radius) <= 0 then
error(L10n.error.negativeRadius, 0)
elseif tonumber(edges) <= 0 then
error(L10n.error.negativeEdges, 0)
end
return util.circleToPolygon(lat, long, radius, tonumber(edges))
end
--[[
Makes JSON data for a feature
@param contentArgs args for this feature. Keys must be the non-suffixed version
of the parameter names, i.e. use type, stroke, fill,... rather than type3,
stroke3, fill3,...
@returns {string} JSON encoded data
]]--
function make.contentJson(contentArgs)
local data = {}
if util.getParameterValue(contentArgs, 'type') == L10n.str.point or util.getParameterValue(contentArgs, 'type') == L10n.str.circle then
local isCircle = util.getParameterValue(contentArgs, 'type') == L10n.str.circle
data.type = "Feature"
data.geometry = {
type = isCircle and "LineString" or "Point",
coordinates = isCircle and make.circleCoords(contentArgs) or make.coords(contentArgs)
}
data.properties = {
title = util.getParameterValue(contentArgs, 'title') or mw.getCurrentFrame():getParent():getTitle()
}
if isCircle then
-- TODO: This is very similar to below, should be extracted into a function
data.properties.stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor
data.properties["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
data.properties['fill-opacity'] = fillOpacity and tonumber(fillOpacity) or 0.6
end
else -- is a point
local markerSymbol = util.getParameterValue(contentArgs, 'marker') or L10n.defaults.marker
-- allow blank to be explicitly specified, for overriding infoboxes or other templates with a default value
if markerSymbol ~= "blank" then
data.properties["marker-symbol"] = markerSymbol
end
data.properties["marker-color"] = util.getParameterValue(contentArgs, 'markerColor') or L10n.defaults.markerColor
data.properties["marker-size"] = util.getParameterValue(contentArgs, 'markerSize') or L10n.defaults.markerSize
end
else
data.type = "ExternalData"
if util.getParameterValue(contentArgs, 'type') == L10n.str.data or util.getParameterValue(contentArgs, 'from') then
data.service = "page"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.line then
data.service = "geoline"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shape then
data.service = "geoshape"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shapeInverse then
data.service = "geomask"
end
if util.getParameterValue(contentArgs, 'id') or (not (util.getParameterValue(contentArgs, 'from')) and wb.getEntityIdForCurrentPage()) then
data.ids = util.getParameterValue(contentArgs, 'id') or wb.getEntityIdForCurrentPage()
else
data.title = util.getParameterValue(contentArgs, 'from')
end
data.properties = {
stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor,
["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
}
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill and (data.service == "geoshape" or data.service == "geomask") then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
if fillOpacity then
data.properties['fill-opacity'] = tonumber(fillOpacity)
end
end
end
data.properties.title = util.getParameterValue(contentArgs, 'title') or mw.title.getCurrentTitle().text
if util.getParameterValue(contentArgs, 'description') then
data.properties.description = util.getParameterValue(contentArgs, 'description')
end
return mw.text.jsonEncode(data)
end
--[[
Makes attributes for the maplink or mapframe tag.
@param {table} args
@param {boolean} [isTitle] Tag is to be displayed in the title of page rather
than inline
@returns {table<string,string>} key-value pairs of attribute names and values
]]--
function make.tagAttribs(args, isTitle)
local attribs = {}
if util.getParameterValue(args, 'zoom') then
attribs.zoom = util.getParameterValue(args, 'zoom')
end
if util.isDeclined(util.getParameterValue(args, 'icon')) then
attribs.class = "no-icon"
end
if util.getParameterValue(args, 'type') == L10n.str.point and not coordsDerivedFromFeatures then
local lat, long = make.coords(args, 'plainOutput')
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
if util.isAffirmed(util.getParameterValue(args, 'frame')) and not(isTitle) then
attribs.width = util.getParameterValue(args, 'frameWidth') or L10n.defaults.frameWidth
attribs.height = util.getParameterValue(args, 'frameHeight') or L10n.defaults.frameHeight
if util.getParameterValue(args, 'frameCoordinates') then
local frameLat, frameLong = util.parseCoords(util.getParameterValue(args, 'frameCoordinates'))
attribs.latitude = frameLat
attribs.longitude = frameLong
else
if util.getParameterValue(args, 'frameLatitude') then
attribs.latitude = util.getParameterValue(args, 'frameLatitude')
end
if util.getParameterValue(args, 'frameLongitude') then
attribs.longitude = util.getParameterValue(args, 'frameLongitude')
end
end
if not attribs.latitude and not attribs.longitude and not coordsDerivedFromFeatures then
local success, lat, long = pcall(util.wikidataCoords, util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
if success then
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
end
if util.getParameterValue(args, 'frameAlign') then
attribs.align = util.getParameterValue(args, 'frameAlign')
end
if util.isAffirmed(util.getParameterValue(args, 'plain')) then
attribs.frameless = "1"
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
return attribs
end
--[[
Makes maplink wikitext that will be located in the top-right of the title of the
page (the same place where coords with |display=title are positioned).
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.titleOutput(args, tagContent)
local titleTag = mw.text.tag('maplink', make.tagAttribs(args, true), tagContent)
local spanAttribs = {
style = "font-size: small;",
id = "mapframe-coordinates"
}
local indicatorContent = mw.text.tag('span', spanAttribs, titleTag)
return mw.getCurrentFrame():extensionTag {
name = "indicator",
content = indicatorContent,
args = {
name = "zzz-mapframe" --zzz: show as last indicator
}
}
end
--[[
Makes maplink or mapframe wikitext that will be located inline.
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.inlineOutput(args, tagContent)
local tagName = 'maplink'
if util.getParameterValue(args, 'frame') then
tagName = 'mapframe'
end
return mw.text.tag(tagName, make.tagAttribs(args), tagContent)
end
--[[
Makes the HTML required for the swicther to work, including the templatestyles
tag.
@param {table} params table sequence of {map, label} tables
@param {string} params{}.map Wikitext for mapframe map
@param {string} params{}.label Label text for swicther option
@param {table} options
@param {string} options.alignment "left" or "center" or "right"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} options.width Width of frame, e.g. "200"
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} swicther HTML
]]--
function make.switcherHtml(params, options)
options = options or {}
local frame = mw.getCurrentFrame()
local styles = frame:extensionTag{
name = "templatestyles",
args = {src = "Template:Maplink/styles-multi.css"}
}
local container = mw.html.create("div")
:addClass("switcher-container")
:addClass("mapframe-multi-container")
if options.alignment == "left" or options.alignment == "right" then
container:addClass("float"..options.alignment)
else -- alignment is "center"
container:addClass("center")
end
for i = 1, #params do
container
:tag("div")
:wikitext(params[i].map)
:tag("span")
:addClass("switcher-label")
:css("display", "none")
:wikitext(mw.text.trim(params[i].label))
end
if not options.isThumbnail then
return styles .. tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.alignment, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-multi-outer-container")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.alignment == "left" or options.alignment == "right" then
outerCountainer:addClass("float"..options.alignment)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return styles .. tostring(outerCountainer)
end
--[[
Makes the HTML required for an overlay map to work
tag.
@param {string} overlayMap wikitext for the overlay map
@param {string} baseMap wikitext for the base map
@param {table} options various styling/display options
@param {string} options.align "left" or "center" or "right"
@param {string|number} options.width Width of the base map, e.g. "300"
@param {string|number} options.width Height of the base map, e.g. "200"
@param {string} options.border Border style for the overlayed map, e.g. "1px solid white"
@param {string} options.horizontalAlignment Horizontal alignment for overlay map, "left" or "right"
@param {string|number} options.horizontalOffset Horizontal offset in pixels from the alignment edge, e.g "10"
@param {string} options.verticalAlignment Vertical alignment for overlay map, "top" or "bottom"
@param {string|number} options.verticalOffset Vertical offset in pixels from the alignment edge, e.g. is "10"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} HTML for basemap with overlay
]]--
function make.overlayHtml(overlayMap, baseMap, options)
options = options or {}
local containerFloatClass = "float"..(options.align or "none")
if options.align == "center" then
containerFloatClass = "center"
end
local containerStyle = {
position = "relative",
width = options.width .. "px",
height = options.height .. "px",
overflow = "hidden" -- mobile/minerva tends to add scrollbars for a couple of pixels
}
if options.align == "center" then
containerStyle["margin-left"] = "auto"
containerStyle["margin-right"] = "auto"
end
local container = mw.html.create("div")
:addClass("mapframe-withOverlay-container")
:addClass(containerFloatClass)
:addClass("noresize")
:css(containerStyle)
local overlayStyle = {
position = "absolute",
["z-index"] = "1",
border = options.border or "1px solid white"
}
if options.horizontalAlignment == "right" then
overlayStyle.right = options.horizontalOffset .. "px"
else
overlayStyle.left = options.horizontalOffset .. "px"
end
if options.verticalAlignment == "bottom" then
overlayStyle.bottom = options.verticalOffset .. "px"
else
overlayStyle.top = options.verticalOffset .. "px"
end
local overlayDiv = mw.html.create("div")
:css(overlayStyle)
:wikitext(overlayMap)
container
:node(overlayDiv)
:wikitext(baseMap)
if not options.isThumbnail then
return tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.align, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-withOverlay-outerContainer")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.align == "left" or options.align == "right" then
outerCountainer:addClass("t"..options.align)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return tostring(outerCountainer)
end
--[[----------------------------------------------------------------------------
Package to be exported, i.e. methods which will available to templates and
other modules.
----------------------------------------------------------------------------]]--
local p = {}
-- Entry point for templates
function p.main(frame)
local parent = frame.getParent(frame)
-- Check for overlay option
local overlay = util.getParameterValue(parent.args, 'overlay')
local hasOverlay = overlay and mw.text.trim(overlay) ~= ""
-- Check for switch option
local switch = util.getParameterValue(parent.args, 'switch')
local isMulti = switch and mw.text.trim(switch) ~= ""
-- Create output by choosing method to suit options
local output
if hasOverlay then
output = p.withOverlay(parent.args)
elseif isMulti then
output = p.multi(parent.args)
else
output = p._main(parent.args)
end
-- Preprocess output before returning it
return frame:preprocess(output)
end
-- Entry points for modules
function p._main(_args)
local args = util.trimArgs(_args)
local tagContent = make.content(args)
local display = mw.text.split(util.getParameterValue(args, 'display') or L10n.defaults.display, '%s*' .. L10n.str.dsep .. '%s*')
local displayInTitle = display[1] == L10n.str.title or display[2] == L10n.str.title
local displayInline = display[1] == L10n.str.inline or display[2] == L10n.str.inline
local output
if displayInTitle and displayInline then
output = make.titleOutput(args, tagContent) .. make.inlineOutput(args, tagContent)
elseif displayInTitle then
output = make.titleOutput(args, tagContent)
elseif displayInline then
output = make.inlineOutput(args, tagContent)
else
error(L10n.error.badDisplayPara)
end
return output
end
function p.multi(_args)
local args = util.trimArgs(_args)
if not args[L10n.para.switch] then error(L10n.error.noSwitchPara, 0) end
local switchParamValue = util.getParameterValue(args, 'switch')
local switchLabels = util.tableFromList(switchParamValue)
if #switchLabels == 1 then error(L10n.error.oneSwitchLabel, 0) end
local mapframeArgs = {}
local switchParams = {}
for name, val in pairs(args) do
-- Copy to mapframeArgs, if not the switch labels or a switch parameter
if val ~= switchParamValue and not string.match(val, "^"..L10n.str.switch..":") then
mapframeArgs[name] = val
end
-- Check if this is a param to switch. If so, store the name and switch
-- values in switchParams table.
local switchList = string.match(val, "^"..L10n.str.switch..":(.+)")
if switchList ~= nil then
local values = util.tableFromList(switchList)
if #values == 1 then
error(string.format(L10n.error.oneSwitchValue, name), 0)
end
switchParams[name] = values
end
end
if util.tableCount(switchParams) == 0 then
error(L10n.error.noSwitchLists, 0)
end
local switchCount = util.subTablesCount(switchParams)
if not switchCount then
error(L10n.error.switchMismatches, 0)
elseif switchCount > #switchLabels then
error(string.format(L10n.error.fewerSwitchLabels, switchCount, #switchLabels), 0)
end
-- Ensure a plain frame will be used (thumbnail will be built by the
-- make.switcherHtml function if required, so that switcher options are
-- inside the thumnail)
mapframeArgs.plain = "yes"
local switcher = {}
for i = 1, switchCount do
local label = switchLabels[i]
for name, values in pairs(switchParams) do
mapframeArgs[name] = values[i]
end
table.insert(switcher, {
map = p._main(mapframeArgs),
label = "Show "..label
})
end
return make.switcherHtml(switcher, {
alignment = args["frame-align"] or "right",
isThumbnail = (args.frame and not args.plain) and true or false,
width = args["frame-width"] or L10n.defaults.frameWidth,
caption = args.text
})
end
function p.withOverlay(_args)
-- Get and trim wikitext for overlay map
local overlayMap = _args.overlay
if type(overlayMap) == 'string' then
overlayMap = overlayMap:match('^%s*(.-)%s*$')
end
local isThumbnail = (util.getParameterValue(_args, "frame") and not util.getParameterValue(_args, "plain")) and true or false
-- Get base map using the _main function, as a plain map
local args = util.trimArgs(_args)
args.plain = "yes"
local basemap = p._main(args)
-- Extract overlay options from args
local overlayOptions = {
width = util.getParameterValue(args, "frameWidth") or L10n.defaults.frameWidth,
height = util.getParameterValue(args, "frameHeight") or L10n.defaults.frameHeight,
align = util.getParameterValue(args, "frameAlign") or L10n.defaults.frameAlign,
border = util.getParameterValue(args, "overlayBorder") or L10n.defaults.overlayBorder,
horizontalAlignment = util.getParameterValue(args, "overlayHorizontalAlignment") or L10n.defaults.overlayHorizontalAlignment,
horizontalOffset = util.getParameterValue(args, "overlayHorizontalOffset") or L10n.defaults.overlayHorizontalOffset,
verticalAlignment = util.getParameterValue(args, "overlayVerticalAlignment") or L10n.defaults.overlayVerticalAlignment,
verticalOffset = util.getParameterValue(args, "overlayVerticalOffset") or L10n.defaults.overlayVerticalOffset,
isThumbnail = isThumbnail,
caption = util.getParameterValue(args, "text") or L10n.defaults.text
}
-- Make the HTML for the overlaying maps
return make.overlayHtml(overlayMap, basemap, overlayOptions)
end
-- Entry point for testcase tests
p.test = util
return p
cbg20zhedgvi7tds8motk323r37gona
373856
373855
2026-10-28T05:55:26Z
ChiK
1136
1 revision imported from [[:en:Module:Mapframe]]
373855
Scribunto
text/plain
-- Note: Originally written on English Wikipedia at https://en.wikipedia.org/wiki/Module:Mapframe
--[[----------------------------------------------------------------------------
##### Localisation (L10n) settings #####
Replace values in quotes ("") with localised values
----------------------------------------------------------------------------]]--
local L10n = {}
local wb = mw.wikibase
-- Modue dependencies
local parser -- local copy of https://www.mediawiki.org/wiki/Module:WikitextParser loaded lazily
-- "strict" should not be used, at least until all other modules which require this module are not using globals.
-- Template parameter names (unnumbered versions only)
-- Specify each as either a single string, or a table of strings (aliases)
-- Aliases are checked left-to-right, i.e. `{ "one", "two" }` is equivalent to using `{{{one| {{{two|}}} }}}` in a template
L10n.para = {
display = "display",
type = "type",
id = { "id", "ids" },
from = "from",
raw = "raw",
title = "title",
description = "description",
strokeColor = { "stroke-color", "stroke-colour" },
strokeWidth = "stroke-width",
strokeOpacity = "stroke-opacity",
fill = "fill",
fillOpacity = "fill-opacity",
coord = { "coordinates", "coord" },
marker = "marker",
markerColor = { "marker-color", "marker-colour" },
markerSize = "marker-size",
radius = { "radius", "radius_m" },
radiusKm = "radius_km",
radiusFt = "radius_ft",
radiusMi = "radius_mi",
edges = "edges",
text = "text",
icon = "icon",
zoom = "zoom",
frame = "frame",
plain = "plain",
frameWidth = "frame-width",
frameHeight = "frame-height",
frameCoordinates= { "frame-coordinates", "frame-coord" },
frameLatitude = { "frame-lat", "frame-latitude" },
frameLongitude = { "frame-long", "frame-longitude" },
frameAlign = "frame-align",
switch = "switch",
overlay = "overlay",
overlayBorder = "overlay-border",
overlayHorizontalAlignment = "overlay-horizontal-alignment",
overlayVerticalAlignment = "overlay-vertical-alignment",
overlayHorizontalOffset = "overlay-horizontal-offset",
overlayVerticalOffset = "overlay-vertical-offset"
}
-- Names of other templates this module can extract coordinates from
L10n.template = {
templates = { -- The coord template, as well as templates with output that contains {{coord}}
"Coord", "Coord/sandbox",
"NRHP row", "NRHP row/sandbox",
"WikidataCoord", "WikidataCoord/sandbox", "Wikidatacoord", "Wikidata coord"
},
modules = { -- The coordinates module, as well as modules with output that contains {{coord}}
"Coordinates", "Coordinates/sandbox",
"WikidataCoord", "WikidataCoord/sandbox"
}
}
-- Error messages
L10n.error = {
badDisplayPara = "Invalid display parameter",
noCoords = "Coordinates must be specified on Wikidata or in |" .. ( type(L10n.para.coord)== 'table' and L10n.para.coord[1] or L10n.para.coord ) .. "=",
wikidataCoords = "Coordinates not found on Wikidata",
noCircleCoords = "Circle centre coordinates must be specified, or available via Wikidata",
negativeRadius = "Circle radius must be a positive number",
noRadius = "Circle radius must be specified",
negativeEdges = "Circle edges must be a positive number",
noSwitchPara = "Found only one switch value in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
oneSwitchLabel = "Found only one label in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noSwitchLists = "At least one parameter must have a SWITCH: list",
switchMismatches = "All SWITCH: lists must have the same number of values",
-- "%s" and "%d" tokens will be replaced with strings and numbers when used
oneSwitchValue = "Found only one switch value in |%s=",
fewerSwitchLabels = "Found %d switch values but only %d labels in |" .. ( type(L10n.para.switch)== 'table' and L10n.para.switch[1] or L10n.para.switch ) .. "=",
noNamedCoords = "No named coordinates found in %s"
}
-- Other strings
L10n.str = {
-- valid values for display parameter, e.g. (|display=inline) or (|display=title) or (|display=inline,title) or (|display=title,inline)
inline = "inline",
title = "title",
dsep = ",", -- separator between inline and title (comma in the example above)
-- valid values for type parameter
line = "line", -- geoline feature (e.g. a road)
shape = "shape", -- geoshape feature (e.g. a state or province)
shapeInverse = "shape-inverse", -- geomask feature (the inverse of a geoshape)
data = "data", -- geoJSON data page on Commons
point = "point", -- single point feature (coordinates)
circle = "circle", -- circular area around a point
named = "named", -- all named coordinates in an article or section
-- Keyword to indicate a switch list. Must NOT use the special characters ^$()%.[]*+-?
switch = "SWITCH",
-- valid values for icon, frame, and plain parameters
affirmedWords = ' '..table.concat({
"add",
"added",
"affirm",
"affirmed",
"include",
"included",
"on",
"true",
"yes",
"y"
}, ' ')..' ',
declinedWords = ' '..table.concat({
"decline",
"declined",
"exclude",
"excluded",
"false",
"none",
"not",
"no",
"n",
"off",
"omit",
"omitted",
"remove",
"removed"
}, ' ')..' '
}
-- Default values for parameters
L10n.defaults = {
display = L10n.str.inline,
text = "Map",
frameWidth = "300",
frameHeight = "200",
frameAlign = "right",
markerColor = "5E74F3",
markerSize = nil,
strokeColor = "#ff0000",
strokeWidth = 6,
edges = 32, -- number of edges used to approximate a circle
overlayBorder = "1px solid white",
overlayHorizontalAlignment = "right",
overlayHorizontalOffset = "0",
overlayVerticalAlignment = "bottom",
overlayVerticalOffset = "0"
}
-- #### End of L10n settings ####
--[[----------------------------------------------------------------------------
Utility methods
----------------------------------------------------------------------------]]--
local util = {}
--[[
Looks up a parameter value based on the id (a key from the L10n.para table) and
optionally a suffix, for parameters that can be suffixed (e.g. type2 is type
with suffix 2).
@param {table} args key-value pairs of parameter names and their values
@param {string} param_id id for parameter name (key from the L10n.para table)
@param {string} [suffix] suffix for parameter name
@returns {string|nil} parameter value if found, or nil if not found
]]--
function util.getParameterValue(args, param_id, suffix)
suffix = suffix or ''
if type( L10n.para[param_id] ) ~= 'table' then
return args[L10n.para[param_id]..suffix]
end
for _i, paramAlias in ipairs(L10n.para[param_id]) do
if args[paramAlias..suffix] then
return args[paramAlias..suffix]
end
end
return nil
end
--[[
Trim whitespace from args, and remove empty args. Also fix control characters.
@param {table} argsTable
@returns {table} trimmed args table
]]--
function util.trimArgs(argsTable)
local cleanArgs = {}
for key, val in pairs(argsTable) do
if type(key) == 'string' and type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val ~= '' then
-- control characters inside json need to be escaped, but stripping them is simpler
-- See also T214984
-- However, *don't* strip control characters from wikitext (text or description parameters) or you'll break strip markers
-- Alternatively it might be better to only strip control char from raw parameter content
if util.matchesParam('text', key) or util.matchesParam('description', key, key:gsub('^%D+(%d+)$', '%1') ) then
cleanArgs[key] = val
else
cleanArgs[key] = val:gsub('%c',' ')
end
end
else
cleanArgs[key] = val
end
end
return cleanArgs
end
--[[
Check if a parameter name matches an unlocalized parameter key
@param {string} key - the unlocalized parameter name to search through
@param {string} name - the localized parameter name to check
@param {string|nil} - an optional suffix to apply to the value(s) from the localization key
@returns {boolean} true if the name matches the parameter, false otherwise
]]--
function util.matchesParam(key, name, suffix)
local param = L10n.para[key]
suffix = suffix or ''
if type(param) == 'table' then
for _, v in pairs(param) do
if (v .. suffix) == name then return true end
end
return false
end
return ((param .. suffix) == name)
end
--[[
Check if a value is affirmed (one of the values in L10n.str.affirmedWords)
@param {string} val Value to be checked
@returns {boolean} true if affirmed, false otherwise
]]--
function util.isAffirmed(val)
if not(val) then return false end
return string.find(L10n.str.affirmedWords, ' '..val..' ', 1, true ) and true or false
end
--[[
Check if a value is declined (one of the values in L10n.str.declinedWords)
@param {string} val Value to be checked
@returns {boolean} true if declined, false otherwise
]]--
function util.isDeclined(val)
if not(val) then return false end
return string.find(L10n.str.declinedWords , ' '..val..' ', 1, true ) and true or false
end
--[[
Check if the name of a template matches the known coord templates or wrappers
(in L10n.template.templates and L10n.template.modules). The name is normalised
when checked, so e.g. the names "Coord", "coord", and " Coord" all return true.
@param {string} name
@returns {boolean} true if it is a coord template or wrapper, false otherwise
]]--
function util.isCoordTemplateOrWrapper(name)
name = mw.text.trim(name)
local modName = mw.ustring.gsub(name, '#invoke:', '')
local inputTitle = mw.title.new(modName, (name ~= modName) and 'Module' or 'Template')
if not inputTitle then
return false
end
-- Create (or reuse) mw.title objects for each known coord template/wrapper.
-- Stored in L10n.template.title so that they don't need to be recreated
-- each time this function is called
if not L10n.template.titles then
L10n.template.titles = {}
for _, v in pairs(L10n.template.templates) do
table.insert(L10n.template.titles, mw.title.new(v, 'Template'))
end
for _, v in pairs(L10n.template.modules) do
table.insert(L10n.template.titles, mw.title.new(v, 'Module'))
end
end
for _, templateTitle in pairs(L10n.template.titles) do
if mw.title.equals(inputTitle, templateTitle) then
return true
end
end
return false
end
--[[
Recursively extract coord templates which have a name parameter.
@param {string} wikitext
@returns {table} table sequence of coord templates
]]--
function util.extractCoordTemplates(wikitext)
local output = {}
local templates = mw.ustring.gmatch(wikitext, '{%b{}}')
for template in templates do
local templateName = mw.ustring.match(template, '{{([^}|]+)')
local nameParam = mw.ustring.match(template, "|%s*name%s*=%s*[^}|]+")
if util.isCoordTemplateOrWrapper(templateName) then
if nameParam then table.insert(output, template) end
elseif mw.ustring.find(mw.ustring.sub(template, 2), "{{") then
local subOutput = util.extractCoordTemplates(mw.ustring.sub(template, 2))
for _, t in pairs(subOutput) do
table.insert(output, t)
end
end
end
-- ensure coords are not using title display
for k, v in pairs(output) do
output[k] = mw.ustring.gsub(v, "|%s*display%s*=[^|}]+", "|display=inline")
end
return output
end
--[[
Gets all named coordinates from a page or a section of a page.
@param {string|nil} page Page name, or name#section, to get named coordinates
from. If the name is omitted, i.e. #section or nil or empty string, then
the current page will be used.
@returns {table} sequence of {coord, name, description} tables where coord is
the coordinates in a format suitable for #util.parseCoords, name is a string,
and description is a string (coordinates in a format suitable for displaying
to the reader). If for some reason the name can't be found, the description
is nil and the name contains display-format coordinates.
@throws {L10n.error.noNamedCoords} if no named coordinates are found.
]]--
function util.getNamedCoords(page)
local parts = mw.text.split(page or "", "#", true)
local name = parts[1] == "" and mw.title.getCurrentTitle().prefixedText or parts[1]
local section = parts[2]
local title = mw.title.new(name)
if title.isRedirect then
title = title.redirectTarget
end
local pageWikitext = title:getContent()
if section then
if parser == nil then
-- load [[Module:WikitextParser]] lazily so it is only transcluded on pages that use it
parser = require("Module:WikitextParser")
end
pageWikitext = parser.getSection(pageWikitext, section) or ''
end
local coordTemplates = util.extractCoordTemplates(pageWikitext)
if #coordTemplates == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
local frame = mw.getCurrentFrame()
local sep = "________"
local expandedContent = frame:preprocess(table.concat(coordTemplates, sep))
local expandedTemplates = mw.text.split(expandedContent, sep)
local namedCoords = {}
for _, expandedTemplate in pairs(expandedTemplates) do
local coord = mw.ustring.match(expandedTemplate, "<span class=\"geo%-dec\".->(.-)</span>")
if coord then
local coordname = (
-- name specified by a wrapper template, e.g [[Article|Name]]
mw.ustring.match(expandedTemplate, "<span class=\"mapframe%-coord%-name\">(.-)</span>") or
-- name passed into coord template
mw.ustring.match(expandedTemplate, "<span class=\"fn org\">(.-)</span>") or
-- default to the coordinates if the name can't be retrieved
coord
)
local description = coordname ~= coord and coord
table.insert(namedCoords, {
coord=mw.ustring.gsub(coord, "[° ]", "_"),
name=coordname, description=description
})
end
end
if #namedCoords == 0 then error(string.format(L10n.error.noNamedCoords, page or name), 0) end
return namedCoords
end
--[[
Parse coordinate values from the params passed in a GeoHack url (such as
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1_2_N_3_4_W_ or
//tools.wmflabs.org/geohack/geohack.php?pagename=Example¶ms=1.23_S_4.56_E_ )
or non-url string in the same format (such as `1_2_N_3_4_W_` or `1.23_S_4.56_E_`)
@param {string} coords string containing coordinates
@returns {number, number} latitude, longitude
]]--
function util.parseCoords(coords)
local coordsPatt
if mw.ustring.find(coords, "params=", 1, true) then
-- prevent false matches from page name, e.g. ?pagename=Lorem_S._Ipsum
coordsPatt = 'params=([_%.%d]+[NS][_%.%d]+[EW])'
else
-- not actually a geohack url, just the same format
coordsPatt = '[_%.%d]+[NS][_%.%d]+[EW]'
end
local parts = mw.text.split((mw.ustring.match(coords, coordsPatt) or ''), '_')
local lat_d = tonumber(parts[1])
assert(lat_d, "Unable to get latitude from input '"..coords.."'.")
local lat_m = tonumber(parts[2]) -- nil if coords are in decimal format
local lat_s = lat_m and tonumber(parts[3]) -- nil if coords are either in decimal format or degrees and minutes only
local lat = lat_d + (lat_m or 0)/60 + (lat_s or 0)/3600
if parts[#parts/2] == 'S' then
lat = lat * -1
end
local long_d = tonumber(parts[1+#parts/2])
assert(long_d, "Unable to get longitude from input '"..coords.."'.")
local long_m = tonumber(parts[2+#parts/2]) -- nil if coords are in decimal format
local long_s = long_m and tonumber(parts[3+#parts/2]) -- nil if coords are either in decimal format or degrees and minutes only
local long = long_d + (long_m or 0)/60 + (long_s or 0)/3600
if parts[#parts] == 'W' then
long = long * -1
end
return lat, long
end
--[[
Get coordinates from a Wikidata item
@param {string} item_id Wikidata item id (Q number)
@returns {number, number} latitude, longitude
@throws {L10n.error.noCoords} if item_id is invalid or the item does not exist
@throws {L10n.error.wikidataCoords} if the the item does not have a P625
statement (coordinates), or it is set to "no value"
]]--
function util.wikidataCoords(item_id)
if not (item_id and wb.isValidEntityId(item_id) and wb.entityExists(item_id)) then
error(L10n.error.noCoords, 0)
end
local coordStatements = wb.getBestStatements(item_id, 'P625')
if not coordStatements or #coordStatements == 0 then
error(L10n.error.wikidataCoords, 0)
end
local hasNoValue = ( coordStatements[1].mainsnak and (coordStatements[1].mainsnak.snaktype == 'novalue' or coordStatements[1].mainsnak.snaktype == 'somevalue') )
if hasNoValue then
error(L10n.error.wikidataCoords, 0)
end
local wdCoords = coordStatements[1]['mainsnak']['datavalue']['value']
return tonumber(wdCoords['latitude']), tonumber(wdCoords['longitude'])
end
--[[
Creates a polygon that approximates a circle
@param {number} lat Latitude
@param {number} long Longitude
@param {number} radius Radius in metres
@param {number} n Number of edges for the polygon
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
]]--
function util.circleToPolygon(lat, long, radius, n) -- n is number of edges
-- Based on https://github.com/gabzim/circle-to-polygon, ISC licence
local function offset(cLat, cLon, distance, bearing)
local lat1 = math.rad(cLat)
local lon1 = math.rad(cLon)
local dByR = distance / 6378137 -- distance divided by 6378137 (radius of the earth) wgs84
local offet_lat = math.asin(
math.sin(lat1) * math.cos(dByR) +
math.cos(lat1) * math.sin(dByR) * math.cos(bearing)
)
local offet_lon = lon1 + math.atan2(
math.sin(bearing) * math.sin(dByR) * math.cos(lat1),
math.cos(dByR) - math.sin(lat1) * math.sin(offet_lat)
)
return {math.deg(offet_lon), math.deg(offet_lat)}
end
local coordinates = {};
local i = 0;
while i < n do
table.insert(coordinates,
offset(lat, long, radius, (2*math.pi*i*-1)/n)
)
i = i + 1
end
table.insert(coordinates, offset(lat, long, radius, 0))
return coordinates
end
--[[
Get the number of key-value pairs in a table, which might not be a sequence.
@param {table} t
@returns {number} count of key-value pairs
]]--
function util.tableCount(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
--[[
For a table where the values are all tables, returns either the util.tableCount
of the subtables if they are all the same, or nil if they are not all the same.
@param {table} t
@returns {number|nil} count of key-value pairs of subtable, or nil if subtables
have different counts
]]--
function util.subTablesCount(t)
local count = nil
for k, v in pairs(t) do
if count == nil then
count = util.tableCount(v)
elseif count ~= util.tableCount(v) then
return nil
end
end
return count
end
--[[
Splits a list into a table sequence. The items in the list may be separated by
commas, or by semicolons (if items may contain commas), or by "###" (if items
may contain semicolons).
@param {string} listString
@returns {table} sequence of list items
]]--
function util.tableFromList(listString)
if type(listString) ~= "string" or listString == "" then return nil end
local separator = (mw.ustring.find(listString, "###", 0, true ) and "###") or
(mw.ustring.find(listString, ";", 0, true ) and ";") or ","
local pattern = "%s*"..separator.."%s*"
return mw.text.split(listString, pattern)
end
-- Boolean in outer scope indicating if Kartographer should be able to
-- automatically calculate coordinates (see phab:T227402)
local coordsDerivedFromFeatures = false;
--[[----------------------------------------------------------------------------
Make methods: These take in a table of arguments, and return either a string
or a table to be used in the eventual output.
----------------------------------------------------------------------------]]--
local make = {}
--[[
Makes content to go inside the maplink or mapframe tag.
@param {table} args
@returns {string} tag content
]]--
function make.content(args)
if util.getParameterValue(args, 'raw') then
coordsDerivedFromFeatures = true -- Kartographer should be able to automatically calculate coords from raw geoJSON
return util.getParameterValue(args, 'raw')
end
local content = {}
local argsExpanded = {}
for k, v in pairs(args) do
local index = string.match( k, '^[^0-9]+([0-9]*)$' )
if index ~= nil then
local indexNumber
if index ~= '' then
indexNumber = tonumber(index)
else
indexNumber = 1
end
if argsExpanded[indexNumber] == nil then
argsExpanded[indexNumber] = {}
end
argsExpanded[indexNumber][ string.gsub(k, index, '') ] = v
end
end
for contentIndex, contentArgs in pairs(argsExpanded) do
local argType = util.getParameterValue(contentArgs, "type")
-- Kartographer automatically calculates coords if geolines/shapes are used (T227402)
if not coordsDerivedFromFeatures then
coordsDerivedFromFeatures = ( argType == L10n.str.line or argType == L10n.str.shape ) and true or false
end
if argType == L10n.str.named then
local namedCoords = util.getNamedCoords(util.getParameterValue(contentArgs, "from"))
local typeKey = type(L10n.para.type) == "table" and L10n.para.type[1] or L10n.para.type
local coordKey = type(L10n.para.coord) == "table" and L10n.para.coord[1] or L10n.para.coord
local titleKey = type(L10n.para.title) == "table" and L10n.para.title[1] or L10n.para.title
local descKey = type(L10n.para.description) == "table" and L10n.para.description[1] or L10n.para.description
for _, namedCoord in pairs(namedCoords) do
contentArgs[typeKey] = "point"
contentArgs[coordKey] = namedCoord.coord
contentArgs[titleKey] = namedCoord.name
contentArgs[descKey] = namedCoord.description
content[#content+1] = make.contentJson(contentArgs)
end
else
content[#content + 1] = make.contentJson(contentArgs)
end
end
--Single item, no array needed
if #content==1 then return content[1] end
--Multiple items get placed in a FeatureCollection
local contentArray = '[\n' .. table.concat( content, ',\n') .. '\n]'
return contentArray
end
--[[
Make coordinates from the coord arg, or the id arg, or the current page's
Wikidata item.
@param {table} args
@param {boolean} [plainOutput]
@returns {Mixed} Either:
{number, number} latitude, longitude if plainOutput is true; or
{table} table sequence of longitude, then latitude (gives the required format
for GeoJSON when encoded)
]]--
function make.coords(args, plainOutput)
local coords, lat, long
local frame = mw.getCurrentFrame()
if util.getParameterValue(args, 'coord') then
coords = frame:preprocess( util.getParameterValue(args, 'coord') )
lat, long = util.parseCoords(coords)
else
lat, long = util.wikidataCoords(util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
end
if plainOutput then
return lat, long
end
return {[0] = long, [1] = lat}
end
--[[
Makes a table of coordinates that approximate a circle.
@param {table} args
@returns {table} sequence of {latitude, longitude} table sequences, where
latitude and longitude are both numbers
@throws {L10n.error.noCircleCoords} if centre coordinates are not specified
@throws {L10n.error.noRadius} if radius is not specified
@throws {L10n.error.negativeRadius} if radius is negative or zero
@throws {L10n.error.negativeEdges} if edges is negative or zero
]]--
function make.circleCoords(args)
local lat, long = make.coords(args, true)
local radius = util.getParameterValue(args, 'radius')
if not radius then
radius = util.getParameterValue(args, 'radiusKm') and tonumber(util.getParameterValue(args, 'radiusKm'))*1000
if not radius then
radius = util.getParameterValue(args, 'radiusMi') and tonumber(util.getParameterValue(args, 'radiusMi'))*1609.344
if not radius then
radius = util.getParameterValue(args, 'radiusFt') and tonumber(util.getParameterValue(args, 'radiusFt'))*0.3048
end
end
end
local edges = util.getParameterValue(args, 'edges') or L10n.defaults.edges
if not lat or not long then
error(L10n.error.noCircleCoords, 0)
elseif not radius then
error(L10n.error.noRadius, 0)
elseif tonumber(radius) <= 0 then
error(L10n.error.negativeRadius, 0)
elseif tonumber(edges) <= 0 then
error(L10n.error.negativeEdges, 0)
end
return util.circleToPolygon(lat, long, radius, tonumber(edges))
end
--[[
Makes JSON data for a feature
@param contentArgs args for this feature. Keys must be the non-suffixed version
of the parameter names, i.e. use type, stroke, fill,... rather than type3,
stroke3, fill3,...
@returns {string} JSON encoded data
]]--
function make.contentJson(contentArgs)
local data = {}
if util.getParameterValue(contentArgs, 'type') == L10n.str.point or util.getParameterValue(contentArgs, 'type') == L10n.str.circle then
local isCircle = util.getParameterValue(contentArgs, 'type') == L10n.str.circle
data.type = "Feature"
data.geometry = {
type = isCircle and "LineString" or "Point",
coordinates = isCircle and make.circleCoords(contentArgs) or make.coords(contentArgs)
}
data.properties = {
title = util.getParameterValue(contentArgs, 'title') or mw.getCurrentFrame():getParent():getTitle()
}
if isCircle then
-- TODO: This is very similar to below, should be extracted into a function
data.properties.stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor
data.properties["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
data.properties['fill-opacity'] = fillOpacity and tonumber(fillOpacity) or 0.6
end
else -- is a point
local markerSymbol = util.getParameterValue(contentArgs, 'marker') or L10n.defaults.marker
-- allow blank to be explicitly specified, for overriding infoboxes or other templates with a default value
if markerSymbol ~= "blank" then
data.properties["marker-symbol"] = markerSymbol
end
data.properties["marker-color"] = util.getParameterValue(contentArgs, 'markerColor') or L10n.defaults.markerColor
data.properties["marker-size"] = util.getParameterValue(contentArgs, 'markerSize') or L10n.defaults.markerSize
end
else
data.type = "ExternalData"
if util.getParameterValue(contentArgs, 'type') == L10n.str.data or util.getParameterValue(contentArgs, 'from') then
data.service = "page"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.line then
data.service = "geoline"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shape then
data.service = "geoshape"
elseif util.getParameterValue(contentArgs, 'type') == L10n.str.shapeInverse then
data.service = "geomask"
end
if util.getParameterValue(contentArgs, 'id') or (not (util.getParameterValue(contentArgs, 'from')) and wb.getEntityIdForCurrentPage()) then
data.ids = util.getParameterValue(contentArgs, 'id') or wb.getEntityIdForCurrentPage()
else
data.title = util.getParameterValue(contentArgs, 'from')
end
data.properties = {
stroke = util.getParameterValue(contentArgs, 'strokeColor') or L10n.defaults.strokeColor,
["stroke-width"] = tonumber(util.getParameterValue(contentArgs, 'strokeWidth')) or L10n.defaults.strokeWidth
}
local strokeOpacity = util.getParameterValue(contentArgs, 'strokeOpacity')
if strokeOpacity then
data.properties['stroke-opacity'] = tonumber(strokeOpacity)
end
local fill = util.getParameterValue(contentArgs, 'fill')
if fill and (data.service == "geoshape" or data.service == "geomask") then
data.properties.fill = fill
local fillOpacity = util.getParameterValue(contentArgs, 'fillOpacity')
if fillOpacity then
data.properties['fill-opacity'] = tonumber(fillOpacity)
end
end
end
data.properties.title = util.getParameterValue(contentArgs, 'title') or mw.title.getCurrentTitle().text
if util.getParameterValue(contentArgs, 'description') then
data.properties.description = util.getParameterValue(contentArgs, 'description')
end
return mw.text.jsonEncode(data)
end
--[[
Makes attributes for the maplink or mapframe tag.
@param {table} args
@param {boolean} [isTitle] Tag is to be displayed in the title of page rather
than inline
@returns {table<string,string>} key-value pairs of attribute names and values
]]--
function make.tagAttribs(args, isTitle)
local attribs = {}
if util.getParameterValue(args, 'zoom') then
attribs.zoom = util.getParameterValue(args, 'zoom')
end
if util.isDeclined(util.getParameterValue(args, 'icon')) then
attribs.class = "no-icon"
end
if util.getParameterValue(args, 'type') == L10n.str.point and not coordsDerivedFromFeatures then
local lat, long = make.coords(args, 'plainOutput')
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
if util.isAffirmed(util.getParameterValue(args, 'frame')) and not(isTitle) then
attribs.width = util.getParameterValue(args, 'frameWidth') or L10n.defaults.frameWidth
attribs.height = util.getParameterValue(args, 'frameHeight') or L10n.defaults.frameHeight
if util.getParameterValue(args, 'frameCoordinates') then
local frameLat, frameLong = util.parseCoords(util.getParameterValue(args, 'frameCoordinates'))
attribs.latitude = frameLat
attribs.longitude = frameLong
else
if util.getParameterValue(args, 'frameLatitude') then
attribs.latitude = util.getParameterValue(args, 'frameLatitude')
end
if util.getParameterValue(args, 'frameLongitude') then
attribs.longitude = util.getParameterValue(args, 'frameLongitude')
end
end
if not attribs.latitude and not attribs.longitude and not coordsDerivedFromFeatures then
local success, lat, long = pcall(util.wikidataCoords, util.getParameterValue(args, 'id') or wb.getEntityIdForCurrentPage())
if success then
attribs.latitude = tostring(lat)
attribs.longitude = tostring(long)
end
end
if util.getParameterValue(args, 'frameAlign') then
attribs.align = util.getParameterValue(args, 'frameAlign')
end
if util.isAffirmed(util.getParameterValue(args, 'plain')) then
attribs.frameless = "1"
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
else
attribs.text = util.getParameterValue(args, 'text') or L10n.defaults.text
end
return attribs
end
--[[
Makes maplink wikitext that will be located in the top-right of the title of the
page (the same place where coords with |display=title are positioned).
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.titleOutput(args, tagContent)
local titleTag = mw.text.tag('maplink', make.tagAttribs(args, true), tagContent)
local spanAttribs = {
style = "font-size: small;",
id = "mapframe-coordinates"
}
local indicatorContent = mw.text.tag('span', spanAttribs, titleTag)
return mw.getCurrentFrame():extensionTag {
name = "indicator",
content = indicatorContent,
args = {
name = "zzz-mapframe" --zzz: show as last indicator
}
}
end
--[[
Makes maplink or mapframe wikitext that will be located inline.
@param {table} args
@param {string} tagContent Content for the maplink tag
@returns {string}
]]--
function make.inlineOutput(args, tagContent)
local tagName = 'maplink'
if util.getParameterValue(args, 'frame') then
tagName = 'mapframe'
end
return mw.text.tag(tagName, make.tagAttribs(args), tagContent)
end
--[[
Makes the HTML required for the swicther to work, including the templatestyles
tag.
@param {table} params table sequence of {map, label} tables
@param {string} params{}.map Wikitext for mapframe map
@param {string} params{}.label Label text for swicther option
@param {table} options
@param {string} options.alignment "left" or "center" or "right"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} options.width Width of frame, e.g. "200"
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} swicther HTML
]]--
function make.switcherHtml(params, options)
options = options or {}
local frame = mw.getCurrentFrame()
local styles = frame:extensionTag{
name = "templatestyles",
args = {src = "Template:Maplink/styles-multi.css"}
}
local container = mw.html.create("div")
:addClass("switcher-container")
:addClass("mapframe-multi-container")
if options.alignment == "left" or options.alignment == "right" then
container:addClass("float"..options.alignment)
else -- alignment is "center"
container:addClass("center")
end
for i = 1, #params do
container
:tag("div")
:wikitext(params[i].map)
:tag("span")
:addClass("switcher-label")
:css("display", "none")
:wikitext(mw.text.trim(params[i].label))
end
if not options.isThumbnail then
return styles .. tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.alignment, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-multi-outer-container")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.alignment == "left" or options.alignment == "right" then
outerCountainer:addClass("float"..options.alignment)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return styles .. tostring(outerCountainer)
end
--[[
Makes the HTML required for an overlay map to work
tag.
@param {string} overlayMap wikitext for the overlay map
@param {string} baseMap wikitext for the base map
@param {table} options various styling/display options
@param {string} options.align "left" or "center" or "right"
@param {string|number} options.width Width of the base map, e.g. "300"
@param {string|number} options.width Height of the base map, e.g. "200"
@param {string} options.border Border style for the overlayed map, e.g. "1px solid white"
@param {string} options.horizontalAlignment Horizontal alignment for overlay map, "left" or "right"
@param {string|number} options.horizontalOffset Horizontal offset in pixels from the alignment edge, e.g "10"
@param {string} options.verticalAlignment Vertical alignment for overlay map, "top" or "bottom"
@param {string|number} options.verticalOffset Vertical offset in pixels from the alignment edge, e.g. is "10"
@param {boolean} options.isThumbnail Display in a thumbnail
@param {string} [options.caption] Caption wikitext for thumnail
@retruns {string} HTML for basemap with overlay
]]--
function make.overlayHtml(overlayMap, baseMap, options)
options = options or {}
local containerFloatClass = "float"..(options.align or "none")
if options.align == "center" then
containerFloatClass = "center"
end
local containerStyle = {
position = "relative",
width = options.width .. "px",
height = options.height .. "px",
overflow = "hidden" -- mobile/minerva tends to add scrollbars for a couple of pixels
}
if options.align == "center" then
containerStyle["margin-left"] = "auto"
containerStyle["margin-right"] = "auto"
end
local container = mw.html.create("div")
:addClass("mapframe-withOverlay-container")
:addClass(containerFloatClass)
:addClass("noresize")
:css(containerStyle)
local overlayStyle = {
position = "absolute",
["z-index"] = "1",
border = options.border or "1px solid white"
}
if options.horizontalAlignment == "right" then
overlayStyle.right = options.horizontalOffset .. "px"
else
overlayStyle.left = options.horizontalOffset .. "px"
end
if options.verticalAlignment == "bottom" then
overlayStyle.bottom = options.verticalOffset .. "px"
else
overlayStyle.top = options.verticalOffset .. "px"
end
local overlayDiv = mw.html.create("div")
:css(overlayStyle)
:wikitext(overlayMap)
container
:node(overlayDiv)
:wikitext(baseMap)
if not options.isThumbnail then
return tostring(container)
end
local classlist = container:getAttr("class")
classlist = mw.ustring.gsub(classlist, "%a*"..options.align, "")
container:attr("class", classlist)
local outerCountainer = mw.html.create("div")
:addClass("mapframe-withOverlay-outerContainer")
:addClass("mw-kartographer-container")
:addClass("thumb")
if options.align == "left" or options.align == "right" then
outerCountainer:addClass("t"..options.align)
else -- alignment is "center"
outerCountainer
:addClass("tnone")
:addClass("center")
end
outerCountainer
:tag("div")
:addClass("thumbinner")
:css("width", options.width.."px")
:node(container)
:node(options.caption and mw.html.create("div")
:addClass("thumbcaption")
:wikitext(options.caption)
)
return tostring(outerCountainer)
end
--[[----------------------------------------------------------------------------
Package to be exported, i.e. methods which will available to templates and
other modules.
----------------------------------------------------------------------------]]--
local p = {}
-- Entry point for templates
function p.main(frame)
local parent = frame.getParent(frame)
-- Check for overlay option
local overlay = util.getParameterValue(parent.args, 'overlay')
local hasOverlay = overlay and mw.text.trim(overlay) ~= ""
-- Check for switch option
local switch = util.getParameterValue(parent.args, 'switch')
local isMulti = switch and mw.text.trim(switch) ~= ""
-- Create output by choosing method to suit options
local output
if hasOverlay then
output = p.withOverlay(parent.args)
elseif isMulti then
output = p.multi(parent.args)
else
output = p._main(parent.args)
end
-- Preprocess output before returning it
return frame:preprocess(output)
end
-- Entry points for modules
function p._main(_args)
local args = util.trimArgs(_args)
local tagContent = make.content(args)
local display = mw.text.split(util.getParameterValue(args, 'display') or L10n.defaults.display, '%s*' .. L10n.str.dsep .. '%s*')
local displayInTitle = display[1] == L10n.str.title or display[2] == L10n.str.title
local displayInline = display[1] == L10n.str.inline or display[2] == L10n.str.inline
local output
if displayInTitle and displayInline then
output = make.titleOutput(args, tagContent) .. make.inlineOutput(args, tagContent)
elseif displayInTitle then
output = make.titleOutput(args, tagContent)
elseif displayInline then
output = make.inlineOutput(args, tagContent)
else
error(L10n.error.badDisplayPara)
end
return output
end
function p.multi(_args)
local args = util.trimArgs(_args)
if not args[L10n.para.switch] then error(L10n.error.noSwitchPara, 0) end
local switchParamValue = util.getParameterValue(args, 'switch')
local switchLabels = util.tableFromList(switchParamValue)
if #switchLabels == 1 then error(L10n.error.oneSwitchLabel, 0) end
local mapframeArgs = {}
local switchParams = {}
for name, val in pairs(args) do
-- Copy to mapframeArgs, if not the switch labels or a switch parameter
if val ~= switchParamValue and not string.match(val, "^"..L10n.str.switch..":") then
mapframeArgs[name] = val
end
-- Check if this is a param to switch. If so, store the name and switch
-- values in switchParams table.
local switchList = string.match(val, "^"..L10n.str.switch..":(.+)")
if switchList ~= nil then
local values = util.tableFromList(switchList)
if #values == 1 then
error(string.format(L10n.error.oneSwitchValue, name), 0)
end
switchParams[name] = values
end
end
if util.tableCount(switchParams) == 0 then
error(L10n.error.noSwitchLists, 0)
end
local switchCount = util.subTablesCount(switchParams)
if not switchCount then
error(L10n.error.switchMismatches, 0)
elseif switchCount > #switchLabels then
error(string.format(L10n.error.fewerSwitchLabels, switchCount, #switchLabels), 0)
end
-- Ensure a plain frame will be used (thumbnail will be built by the
-- make.switcherHtml function if required, so that switcher options are
-- inside the thumnail)
mapframeArgs.plain = "yes"
local switcher = {}
for i = 1, switchCount do
local label = switchLabels[i]
for name, values in pairs(switchParams) do
mapframeArgs[name] = values[i]
end
table.insert(switcher, {
map = p._main(mapframeArgs),
label = "Show "..label
})
end
return make.switcherHtml(switcher, {
alignment = args["frame-align"] or "right",
isThumbnail = (args.frame and not args.plain) and true or false,
width = args["frame-width"] or L10n.defaults.frameWidth,
caption = args.text
})
end
function p.withOverlay(_args)
-- Get and trim wikitext for overlay map
local overlayMap = _args.overlay
if type(overlayMap) == 'string' then
overlayMap = overlayMap:match('^%s*(.-)%s*$')
end
local isThumbnail = (util.getParameterValue(_args, "frame") and not util.getParameterValue(_args, "plain")) and true or false
-- Get base map using the _main function, as a plain map
local args = util.trimArgs(_args)
args.plain = "yes"
local basemap = p._main(args)
-- Extract overlay options from args
local overlayOptions = {
width = util.getParameterValue(args, "frameWidth") or L10n.defaults.frameWidth,
height = util.getParameterValue(args, "frameHeight") or L10n.defaults.frameHeight,
align = util.getParameterValue(args, "frameAlign") or L10n.defaults.frameAlign,
border = util.getParameterValue(args, "overlayBorder") or L10n.defaults.overlayBorder,
horizontalAlignment = util.getParameterValue(args, "overlayHorizontalAlignment") or L10n.defaults.overlayHorizontalAlignment,
horizontalOffset = util.getParameterValue(args, "overlayHorizontalOffset") or L10n.defaults.overlayHorizontalOffset,
verticalAlignment = util.getParameterValue(args, "overlayVerticalAlignment") or L10n.defaults.overlayVerticalAlignment,
verticalOffset = util.getParameterValue(args, "overlayVerticalOffset") or L10n.defaults.overlayVerticalOffset,
isThumbnail = isThumbnail,
caption = util.getParameterValue(args, "text") or L10n.defaults.text
}
-- Make the HTML for the overlaying maps
return make.overlayHtml(overlayMap, basemap, overlayOptions)
end
-- Entry point for testcase tests
p.test = util
return p
cbg20zhedgvi7tds8motk323r37gona
ಮೋಡ್ಯೂಲ್:Transclusion count/data/I
828
9814
373881
372957
2026-10-18T05:09:56Z
en>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
373881
Scribunto
text/plain
return {
["IAST"] = 6300,
["IA_SCOTUS_URL"] = 3300,
["IBDB_name"] = 9800,
["ICD10"] = 5000,
["ICD9"] = 4400,
["ICS"] = 3500,
["ICS_flag"] = 3500,
["IDN"] = 3800,
["IMDb_episode"] = 11000,
["IMDb_episodes"] = 4300,
["IMDb_name"] = 173000,
["IMDb_title"] = 212000,
["IMO_Number"] = 4500,
["IMSLP"] = 9200,
["INA"] = 2400,
["IND"] = 8800,
["INR"] = 6600,
["INRConvert"] = 6800,
["INRConvert/CurrentRate"] = 6700,
["INRConvert/USD"] = 6700,
["INRConvert/out"] = 6700,
["IOBDB_name"] = 2100,
["IP"] = 2800,
["IPA"] = 183000,
["IPA_audio_link"] = 5300,
["IPA_link"] = 5100,
["IPAblink"] = 2600,
["IPAc-cmn"] = 2800,
["IPAc-en"] = 56000,
["IPAc-pl"] = 51000,
["IPSummary"] = 82000,
["IP_summary"] = 83000,
["IPtalk"] = 18000,
["IPuser"] = 7600,
["IPvandal"] = 2800,
["IRC"] = 7200,
["IRI"] = 2600,
["IRL"] = 6100,
["IRN"] = 4000,
["ISBN"] = 475000,
["ISBN?"] = 2400,
["ISBNT"] = 46000,
["ISBN_missing"] = 3200,
["ISFDB_name"] = 4300,
["ISFDB_title"] = 5100,
["ISL"] = 2300,
["ISO_15924/script-example-character"] = 3100,
["ISO_15924/wp-article"] = 3100,
["ISO_15924/wp-article/format"] = 3100,
["ISO_15924/wp-article/label"] = 3000,
["ISO_3166_code"] = 277000,
["ISO_3166_name"] = 16000,
["ISO_639_name"] = 28000,
["ISP"] = 3700,
["ISR"] = 6100,
["ISSN"] = 12000,
["ISSN_link"] = 33000,
["ISTAT"] = 8100,
["ISU_figure_skater"] = 2300,
["ITA"] = 20000,
["ITF"] = 6800,
["ITF_profile"] = 2600,
["ITIS"] = 5900,
["ITN_talk"] = 13000,
["ITN_talk/date"] = 13000,
["IUCN_banner"] = 15000,
["I_sup"] = 4900,
["Ice_hockey_box"] = 2000,
["Ice_hockey_stats"] = 20000,
["Icehockeystats"] = 11000,
["Icelandic_name"] = 2200,
["Icon"] = 679000,
["If"] = 438000,
["If_all"] = 8000,
["If_autoconfirmed"] = 2200,
["If_between"] = 4800,
["If_both"] = 210000,
["If_dark"] = 4100,
["If_dark/styles.css"] = 4100,
["If_either"] = 22000,
["If_empty"] = 6800000,
["If_first_display_both"] = 122000,
["If_in_category"] = 164000,
["If_in_page"] = 23000,
["If_last_display_both"] = 38000,
["If_mobile"] = 2100,
["If_mobile/styles.css"] = 4400,
["If_preview"] = 66000,
["If_then_show"] = 89000,
["Ifempty"] = 949000,
["Ifeq"] = 84000,
["Iferror_then_show"] = 4000,
["Ifexist_not_redirect"] = 1990000,
["Ifnotempty"] = 19000,
["Ifnoteq_then_show"] = 2300,
["Ifnumber"] = 78000,
["Ifsubst"] = 1030000,
["Ih"] = 8100,
["Ill"] = 262000,
["Illm"] = 5800,
["Image_frame"] = 6200,
["Image_label"] = 4700,
["Image_label_begin"] = 4100,
["Image_label_end"] = 4100,
["Image_label_small"] = 2600,
["Image_needed"] = 4400,
["Image_other"] = 191000,
["Image_requested"] = 134000,
["Image_requested/Category_helper"] = 124000,
["Imbox"] = 1000000,
["Imdb_name"] = 5300,
["Imdb_title"] = 2900,
["Importance"] = 15000,
["Importance/colour"] = 30000,
["Importance_mask"] = 632000,
["Improve_categories"] = 7000,
["Improve_documentation"] = 4300,
["Improve_plot"] = 4200,
["In_class"] = 5600,
["In_lang"] = 390000,
["In_progress"] = 3800,
["In_string"] = 310000,
["In_title"] = 31000,
["Inactive_userpage_blanked"] = 3600,
["Inaturalist_taxon"] = 3800,
["Include-USGov"] = 24000,
["Incomplete_list"] = 24000,
["Inconclusive"] = 2400,
["Increase"] = 62000,
["Incumbent_pope"] = 4400,
["Indent"] = 2400,
["Indented_plain_list"] = 2800,
["Indented_plainlist"] = 2500,
["Independent_sources"] = 10000,
["IndexFungorum"] = 2100,
["Indian_English"] = 5000,
["Indian_railway_code"] = 3600,
["Indian_rupee"] = 12000,
["Inflation"] = 28000,
["Inflation-fn"] = 5900,
["Inflation-year"] = 4300,
["Inflation/IN/startyear"] = 6700,
["Inflation/UK"] = 5600,
["Inflation/UK/dataset"] = 5600,
["Inflation/UK/startyear"] = 5600,
["Inflation/US"] = 16000,
["Inflation/US-GDP"] = 3100,
["Inflation/US-GDP/dataset"] = 3100,
["Inflation/US-GDP/startyear"] = 3100,
["Inflation/US/dataset"] = 16000,
["Inflation/US/startyear"] = 16000,
["Inflation/fn"] = 7600,
["Inflation/year"] = 34000,
["Info"] = 5600,
["Infobox"] = 3440000,
["Infobox/Columns"] = 3300,
["Infobox/mobileviewfix.css"] = 177000,
["Infobox/styles-images.css"] = 21000,
["Infobox3cols"] = 28000,
["Infobox_AFL_biography"] = 15000,
["Infobox_Athletics_Championships"] = 3400,
["Infobox_Australian_place"] = 15000,
["Infobox_Australian_place/styles.css"] = 15000,
["Infobox_Australian_place/table"] = 11000,
["Infobox_COA_wide"] = 3700,
["Infobox_Canada_electoral_district"] = 2700,
["Infobox_Chinese"] = 24000,
["Infobox_Chinese/Chinese"] = 3200,
["Infobox_Chinese/Footer"] = 7200,
["Infobox_Chinese/Header"] = 7200,
["Infobox_Christian_leader"] = 23000,
["Infobox_French_commune"] = 38000,
["Infobox_French_subdivision"] = 2200,
["Infobox_Gaelic_games_biography"] = 5500,
["Infobox_Gaelic_games_player"] = 3000,
["Infobox_German_place"] = 14000,
["Infobox_Grand_Prix_race_report"] = 2200,
["Infobox_Greece_place"] = 3600,
["Infobox_Greek_Dimos"] = 2900,
["Infobox_Hindu_temple"] = 2900,
["Infobox_Indian_constituency"] = 5800,
["Infobox_Indian_constituency/defaultdata"] = 5800,
["Infobox_Italian_comune"] = 8100,
["Infobox_Korean"] = 2100,
["Infobox_Korean/auto"] = 15000,
["Infobox_Korean/auto/categories"] = 15000,
["Infobox_Korean/base"] = 2100,
["Infobox_Korean/base/auto"] = 18000,
["Infobox_Korean/categories"] = 2100,
["Infobox_Korean_name"] = 2100,
["Infobox_Korean_name/auto"] = 14000,
["Infobox_Korean_television_name"] = 3500,
["Infobox_NASCAR_driver"] = 2400,
["Infobox_NASCAR_race_report"] = 2800,
["Infobox_NCAA_basketball_conference_tournament"] = 2100,
["Infobox_NCAA_team_season"] = 11000,
["Infobox_NFL_biography"] = 27000,
["Infobox_NFL_team_season"] = 2300,
["Infobox_NRHP"] = 74000,
["Infobox_NRHP/conv"] = 19000,
["Infobox_NRHP/pushpinmap2region"] = 68000,
["Infobox_Olympic_event"] = 8100,
["Infobox_Olympic_event/event_link"] = 8100,
["Infobox_Olympic_event/games_text"] = 8100,
["Infobox_Pan_American_Games_event"] = 2900,
["Infobox_Paralympic_event"] = 2900,
["Infobox_Paralympic_event/games_text"] = 2900,
["Infobox_Romanian_subdivision"] = 3200,
["Infobox_Russian_district"] = 2100,
["Infobox_Russian_inhabited_locality"] = 4700,
["Infobox_Russian_inhabited_locality/PosMapFS"] = 4200,
["Infobox_Russian_inhabited_locality/federal_subject"] = 4700,
["Infobox_SCOTUS_case"] = 4600,
["Infobox_SSSI"] = 2000,
["Infobox_Site_of_Special_Scientific_Interest"] = 2100,
["Infobox_Slovak_place"] = 3000,
["Infobox_Swiss_town"] = 3000,
["Infobox_Switzerland_municipality"] = 3000,
["Infobox_Turkey_place"] = 20000,
["Infobox_U.S._county"] = 3000,
["Infobox_U.S._county/district"] = 3000,
["Infobox_U.S._legislation"] = 2300,
["Infobox_UK_constituency"] = 2200,
["Infobox_UK_constituency/year"] = 2200,
["Infobox_UK_legislation"] = 6500,
["Infobox_UK_place"] = 27000,
["Infobox_UK_place/NoDialCode"] = 8300,
["Infobox_UK_place/NoPostCode"] = 3700,
["Infobox_UK_place/area"] = 2800,
["Infobox_UK_place/dens"] = 2300,
["Infobox_UK_place/dist"] = 2800,
["Infobox_UK_place/local"] = 27000,
["Infobox_UK_place/styles.css"] = 27000,
["Infobox_UNESCO_World_Heritage_Site"] = 2100,
["Infobox_UN_resolution"] = 2300,
["Infobox_US_Supreme_Court_case"] = 4800,
["Infobox_US_Supreme_Court_case/courts"] = 4800,
["Infobox_United_States_legislative_district"] = 2800,
["Infobox_United_States_legislative_district/representative"] = 2800,
["Infobox_Wikipedia_user"] = 12000,
["Infobox_academic"] = 27000,
["Infobox_aircraft"] = 13000,
["Infobox_aircraft/styles.css"] = 14000,
["Infobox_aircraft_occurrence"] = 2900,
["Infobox_airline"] = 4800,
["Infobox_airline/styles.css"] = 4800,
["Infobox_airport"] = 14000,
["Infobox_airport/datatable"] = 13000,
["Infobox_airport/styles.css"] = 14000,
["Infobox_album"] = 169000,
["Infobox_album/color"] = 209000,
["Infobox_album/link"] = 169000,
["Infobox_anatomy"] = 4500,
["Infobox_animanga/Footer"] = 7800,
["Infobox_animanga/Header"] = 7800,
["Infobox_animanga/Print"] = 6700,
["Infobox_animanga/Video"] = 5100,
["Infobox_architect"] = 4500,
["Infobox_artist"] = 35000,
["Infobox_artist_discography"] = 6500,
["Infobox_artwork"] = 16000,
["Infobox_automobile"] = 9300,
["Infobox_award"] = 16000,
["Infobox_badminton_player"] = 3300,
["Infobox_baseball_biography"] = 30000,
["Infobox_baseball_biography/style"] = 30000,
["Infobox_baseball_biography/styles.css"] = 30000,
["Infobox_baseball_team_season"] = 3400,
["Infobox_baseball_team_season/leagueseason"] = 3400,
["Infobox_baseball_team_season/season"] = 3400,
["Infobox_baseball_team_season/styles.css"] = 3400,
["Infobox_basketball_biography"] = 24000,
["Infobox_basketball_biography/style"] = 24000,
["Infobox_basketball_club"] = 3300,
["Infobox_basketball_club/styles.css"] = 3300,
["Infobox_beauty_pageant"] = 2200,
["Infobox_bilateral_relations"] = 5100,
["Infobox_bishop_styles"] = 2500,
["Infobox_body_of_water"] = 19000,
["Infobox_book"] = 64000,
["Infobox_book/styles.css"] = 64000,
["Infobox_boxer"] = 6600,
["Infobox_brand"] = 2200,
["Infobox_brand/styles.css"] = 2200,
["Infobox_bridge"] = 6800,
["Infobox_building"] = 35000,
["Infobox_bus_company"] = 2100,
["Infobox_cemetery"] = 2200,
["Infobox_character"] = 8500,
["Infobox_character/styles.css"] = 8500,
["Infobox_chess_biography"] = 4800,
["Infobox_chess_player"] = 3800,
["Infobox_church"] = 17000,
["Infobox_church/denomination"] = 17000,
["Infobox_church/font_color"] = 17000,
["Infobox_civil_conflict"] = 3300,
["Infobox_civilian_attack"] = 7800,
["Infobox_college_coach"] = 13000,
["Infobox_college_football_game"] = 2300,
["Infobox_college_football_player"] = 2700,
["Infobox_college_sports_team_season"] = 46000,
["Infobox_college_sports_team_season/link"] = 46000,
["Infobox_college_sports_team_season/name"] = 46000,
["Infobox_college_sports_team_season/succession"] = 46000,
["Infobox_college_sports_team_season/team"] = 46000,
["Infobox_comedian"] = 2200,
["Infobox_comic_book_title"] = 3200,
["Infobox_comics_character"] = 3400,
["Infobox_comics_creator"] = 3600,
["Infobox_comics_creator/styles.css"] = 3600,
["Infobox_company"] = 93000,
["Infobox_company/styles.css"] = 93000,
["Infobox_computing_device"] = 2600,
["Infobox_concert"] = 4000,
["Infobox_constituency"] = 8100,
["Infobox_country"] = 7200,
["Infobox_country/formernext"] = 6800,
["Infobox_country/imagetable"] = 5600,
["Infobox_country/multirow"] = 9400,
["Infobox_country/status_text"] = 3100,
["Infobox_country/styles.css"] = 7200,
["Infobox_country_at_games"] = 17000,
["Infobox_country_at_games/core"] = 17000,
["Infobox_country_at_games/see_also"] = 14000,
["Infobox_court_case"] = 5400,
["Infobox_court_case/images"] = 2900,
["Infobox_court_case/styles.css"] = 5400,
["Infobox_cricket_tournament"] = 2800,
["Infobox_cricketer"] = 32000,
["Infobox_cricketer/career"] = 32000,
["Infobox_cricketer/national_side"] = 7700,
["Infobox_criminal"] = 7800,
["Infobox_curler"] = 2800,
["Infobox_cycling_race_report"] = 5000,
["Infobox_cyclist"] = 17000,
["Infobox_dam"] = 5900,
["Infobox_deity"] = 2300,
["Infobox_deity/color"] = 2300,
["Infobox_designation_list"] = 33000,
["Infobox_designation_list/entry"] = 23000,
["Infobox_dim"] = 6400,
["Infobox_diocese"] = 4100,
["Infobox_drug"] = 12000,
["Infobox_drug/chemical_formula"] = 12000,
["Infobox_drug/data_page_link"] = 12000,
["Infobox_drug/formatATC"] = 12000,
["Infobox_drug/formatCASnumber"] = 12000,
["Infobox_drug/formatChEBI"] = 12000,
["Infobox_drug/formatChEMBL"] = 12000,
["Infobox_drug/formatChemDBNIAID"] = 12000,
["Infobox_drug/formatChemSpider"] = 12000,
["Infobox_drug/formatCompTox"] = 12000,
["Infobox_drug/formatDrugBank"] = 12000,
["Infobox_drug/formatIUPHARBPS"] = 12000,
["Infobox_drug/formatJmol"] = 12000,
["Infobox_drug/formatKEGG"] = 12000,
["Infobox_drug/formatPDBligand"] = 11000,
["Infobox_drug/formatPubChemCID"] = 12000,
["Infobox_drug/formatPubChemSID"] = 12000,
["Infobox_drug/formatUNII"] = 12000,
["Infobox_drug/legal_status"] = 12000,
["Infobox_drug/licence"] = 12000,
["Infobox_drug/maintenance_categories"] = 12000,
["Infobox_drug/non-ref-space"] = 4000,
["Infobox_drug/pregnancy_category"] = 12000,
["Infobox_drug/styles.css"] = 12000,
["Infobox_drug/title"] = 12000,
["Infobox_economist"] = 2100,
["Infobox_election"] = 41000,
["Infobox_election/shortname"] = 2600,
["Infobox_election/styles.css"] = 41000,
["Infobox_enzyme"] = 5100,
["Infobox_ethnic_group"] = 8100,
["Infobox_event"] = 8100,
["Infobox_family"] = 2800,
["Infobox_field_hockey_player"] = 2600,
["Infobox_figure_skater"] = 4000,
["Infobox_film"] = 171000,
["Infobox_film/short_description"] = 167000,
["Infobox_film_awards"] = 3200,
["Infobox_film_awards/link"] = 3200,
["Infobox_film_awards/style"] = 3200,
["Infobox_film_or_theatre_festival"] = 2100,
["Infobox_food"] = 7800,
["Infobox_football_biography"] = 220000,
["Infobox_football_club"] = 30000,
["Infobox_football_club_season"] = 25000,
["Infobox_football_league"] = 2800,
["Infobox_football_league_season"] = 22000,
["Infobox_football_match"] = 6800,
["Infobox_football_tournament"] = 2200,
["Infobox_football_tournament_season"] = 9400,
["Infobox_former_subdivision"] = 3800,
["Infobox_former_subdivision/styles.css"] = 3800,
["Infobox_galaxy"] = 3400,
["Infobox_game"] = 3200,
["Infobox_game_score"] = 3800,
["Infobox_games"] = 2100,
["Infobox_gene"] = 13000,
["Infobox_given_name"] = 4100,
["Infobox_golfer"] = 4900,
["Infobox_golfer/highest_ranking"] = 4900,
["Infobox_government_agency"] = 13000,
["Infobox_government_cabinet"] = 3600,
["Infobox_gridiron_football_biography"] = 41000,
["Infobox_gridiron_football_biography/position"] = 40000,
["Infobox_gridiron_football_team_season"] = 4100,
["Infobox_gymnast"] = 6000,
["Infobox_handball_biography"] = 5600,
["Infobox_historic_site"] = 22000,
["Infobox_holiday"] = 2200,
["Infobox_holiday/date"] = 2200,
["Infobox_horseraces"] = 2700,
["Infobox_hospital"] = 7000,
["Infobox_hospital/care_system"] = 7000,
["Infobox_hospital/lists"] = 7000,
["Infobox_hurling_championship"] = 2700,
["Infobox_ice_hockey_biography"] = 21000,
["Infobox_ice_hockey_player"] = 18000,
["Infobox_ice_hockey_team"] = 3300,
["Infobox_ice_hockey_team_season"] = 2200,
["Infobox_international_football_competition"] = 6800,
["Infobox_islands"] = 9700,
["Infobox_islands/area"] = 10000,
["Infobox_islands/density"] = 10000,
["Infobox_islands/length"] = 9700,
["Infobox_islands/styles.css"] = 9700,
["Infobox_journal"] = 10000,
["Infobox_journal/Abbreviation_search"] = 10000,
["Infobox_journal/Bluebook_check"] = 10000,
["Infobox_journal/Former_check"] = 10000,
["Infobox_journal/ISO_4_check"] = 10000,
["Infobox_journal/ISSN-eISSN"] = 9900,
["Infobox_journal/Indexing_search"] = 10000,
["Infobox_journal/MathSciNet_check"] = 10000,
["Infobox_journal/NLM_check"] = 10000,
["Infobox_journal/frequency"] = 9100,
["Infobox_journal/openaccess"] = 2700,
["Infobox_judoka"] = 2800,
["Infobox_lake"] = 3800,
["Infobox_language"] = 10000,
["Infobox_language/family-color"] = 12000,
["Infobox_language/genetic"] = 7000,
["Infobox_language/lingualist"] = 12000,
["Infobox_language/linguistlist"] = 10000,
["Infobox_language/ref"] = 7400,
["Infobox_law_enforcement_agency"] = 2200,
["Infobox_legislation"] = 2800,
["Infobox_legislative_district"] = 2400,
["Infobox_legislative_election"] = 2700,
["Infobox_legislative_election/row"] = 2600,
["Infobox_legislative_election/styles.css"] = 2700,
["Infobox_legislative_term"] = 2300,
["Infobox_legislature"] = 4400,
["Infobox_library"] = 2500,
["Infobox_lighthouse"] = 2700,
["Infobox_lighthouse/light"] = 2700,
["Infobox_locomotive"] = 5000,
["Infobox_magazine"] = 8300,
["Infobox_manner_of_address"] = 4200,
["Infobox_martial_artist"] = 6300,
["Infobox_martial_artist/record"] = 6300,
["Infobox_medal_templates"] = 481000,
["Infobox_medical_condition"] = 9900,
["Infobox_medical_condition_(new)"] = 6200,
["Infobox_medical_person"] = 2600,
["Infobox_militant_organization"] = 2200,
["Infobox_military_conflict"] = 28000,
["Infobox_military_installation"] = 11000,
["Infobox_military_person"] = 54000,
["Infobox_military_unit"] = 29000,
["Infobox_mine"] = 2300,
["Infobox_mineral"] = 2000,
["Infobox_mobile_phone"] = 2600,
["Infobox_mobile_phone/size"] = 2200,
["Infobox_mobile_phone/weight"] = 2300,
["Infobox_model"] = 2300,
["Infobox_monument"] = 2900,
["Infobox_motorsport_season"] = 2900,
["Infobox_mountain"] = 30000,
["Infobox_multi-sport_competition_event"] = 2900,
["Infobox_museum"] = 12000,
["Infobox_musical_artist"] = 131000,
["Infobox_musical_artist/hCard_class"] = 122000,
["Infobox_musical_composition"] = 3700,
["Infobox_name"] = 8900,
["Infobox_name_module"] = 9700,
["Infobox_newspaper"] = 11000,
["Infobox_newspaper/styles.css"] = 11000,
["Infobox_noble"] = 7900,
["Infobox_officeholder"] = 284000,
["Infobox_officeholder/office"] = 291000,
["Infobox_official_post"] = 9900,
["Infobox_organization"] = 43000,
["Infobox_pageant_titleholder"] = 3100,
["Infobox_park"] = 10000,
["Infobox_person"] = 676000,
["Infobox_person/Wikidata"] = 5000,
["Infobox_person/height"] = 116000,
["Infobox_person/length"] = 7700,
["Infobox_person/weight"] = 74000,
["Infobox_philosopher"] = 3800,
["Infobox_planet"] = 4800,
["Infobox_play"] = 4600,
["Infobox_political_party"] = 16000,
["Infobox_power_station"] = 3400,
["Infobox_prepared_food"] = 2500,
["Infobox_professional_wrestler"] = 4800,
["Infobox_professional_wrestling_event"] = 3400,
["Infobox_protected_area"] = 15000,
["Infobox_protein_family"] = 2200,
["Infobox_publisher"] = 2600,
["Infobox_racehorse"] = 6000,
["Infobox_racing_driver"] = 6000,
["Infobox_racing_driver_series_section"] = 3000,
["Infobox_radio_station"] = 22000,
["Infobox_radio_station/styles.css"] = 22000,
["Infobox_rail"] = 3200,
["Infobox_rail_line"] = 8100,
["Infobox_rail_service"] = 3300,
["Infobox_reality_competition_season"] = 4400,
["Infobox_record_label"] = 4200,
["Infobox_recurring_event"] = 8200,
["Infobox_religious_biography"] = 7300,
["Infobox_religious_building"] = 15000,
["Infobox_religious_building/color"] = 22000,
["Infobox_restaurant"] = 4700,
["Infobox_river"] = 32000,
["Infobox_river/calcunit"] = 32000,
["Infobox_river/discharge"] = 32000,
["Infobox_river/row-style"] = 32000,
["Infobox_river/source"] = 32000,
["Infobox_road"] = 25000,
["Infobox_road/meta/mask/category"] = 24000,
["Infobox_road/meta/mask/country"] = 25000,
["Infobox_road/styles.css"] = 26000,
["Infobox_road_small"] = 2500,
["Infobox_rockunit"] = 6500,
["Infobox_royalty"] = 26000,
["Infobox_royalty/short_description"] = 8800,
["Infobox_rugby_biography"] = 19000,
["Infobox_rugby_biography/correct_date"] = 19000,
["Infobox_rugby_biography/depcheck"] = 19000,
["Infobox_rugby_league_biography"] = 11000,
["Infobox_rugby_league_biography/PLAYER"] = 11000,
["Infobox_rugby_team"] = 2700,
["Infobox_sailboat_specifications"] = 2300,
["Infobox_saint"] = 5500,
["Infobox_school"] = 39000,
["Infobox_school/short_description"] = 39000,
["Infobox_school/styles.css"] = 39000,
["Infobox_school_district"] = 6500,
["Infobox_school_district/styles.css"] = 6500,
["Infobox_scientist"] = 57000,
["Infobox_settlement"] = 599000,
["Infobox_settlement/areadisp"] = 261000,
["Infobox_settlement/columns"] = 108000,
["Infobox_settlement/columns/styles.css"] = 108000,
["Infobox_settlement/densdisp"] = 459000,
["Infobox_settlement/lengthdisp"] = 182000,
["Infobox_settlement/link"] = 108000,
["Infobox_settlement/styles.css"] = 599000,
["Infobox_ship"] = 43000,
["Infobox_ship/career"] = 39000,
["Infobox_ship/characteristics"] = 43000,
["Infobox_ship/class_overview"] = 4400,
["Infobox_ship/image"] = 42000,
["Infobox_ship/service_record"] = 2500,
["Infobox_shopping_mall"] = 3800,
["Infobox_short_story"] = 2800,
["Infobox_skier"] = 2700,
["Infobox_soap_character"] = 3100,
["Infobox_social_media_personality"] = 4400,
["Infobox_software"] = 14000,
["Infobox_software/simple"] = 15000,
["Infobox_song"] = 84000,
["Infobox_song/color"] = 84000,
["Infobox_song/link"] = 84000,
["Infobox_song_contest_national_year"] = 2000,
["Infobox_song_contest_national_year/Year"] = 2100,
["Infobox_spaceflight"] = 4100,
["Infobox_spaceflight/styles.css"] = 4100,
["Infobox_speed_skater"] = 2100,
["Infobox_sport_event"] = 2800,
["Infobox_sports_competition_event"] = 25000,
["Infobox_sports_competition_event/medalrow"] = 16000,
["Infobox_sports_league"] = 5700,
["Infobox_sports_season"] = 7000,
["Infobox_sports_team"] = 2300,
["Infobox_sportsperson"] = 179000,
["Infobox_stadium"] = 2600,
["Infobox_station"] = 58000,
["Infobox_station/services"] = 58000,
["Infobox_station/styles.css"] = 58000,
["Infobox_street"] = 4500,
["Infobox_swimmer"] = 11000,
["Infobox_television"] = 64000,
["Infobox_television/Short_description"] = 62000,
["Infobox_television/styles.css"] = 64000,
["Infobox_television_channel"] = 6800,
["Infobox_television_channel/styles.css"] = 6800,
["Infobox_television_episode"] = 13000,
["Infobox_television_episode/styles.css"] = 14000,
["Infobox_television_season"] = 11000,
["Infobox_television_station"] = 3200,
["Infobox_television_station/styles.css"] = 3300,
["Infobox_tennis_biography"] = 11000,
["Infobox_tennis_event"] = 3400,
["Infobox_tennis_tournament"] = 2100,
["Infobox_tennis_tournament/heading"] = 2100,
["Infobox_tennis_tournament/style"] = 2100,
["Infobox_tennis_tournament_event"] = 23000,
["Infobox_tennis_tournament_year"] = 11000,
["Infobox_tennis_tournament_year/color"] = 33000,
["Infobox_tennis_tournament_year/footer"] = 33000,
["Infobox_tournament_season"] = 13000,
["Infobox_train"] = 2600,
["Infobox_university"] = 25000,
["Infobox_user"] = 3000,
["Infobox_venue"] = 20000,
["Infobox_video_game"] = 30000,
["Infobox_video_game/styles.css"] = 30000,
["Infobox_volleyball_biography"] = 5900,
["Infobox_weapon"] = 8100,
["Infobox_weather_event"] = 3600,
["Infobox_weather_event/Effects"] = 3400,
["Infobox_weather_event/Footer"] = 3500,
["Infobox_weather_event/History"] = 3400,
["Infobox_weather_event/SSHWS"] = 2000,
["Infobox_weather_event/meteorology"] = 3300,
["Infobox_weather_event/scale"] = 2100,
["Infobox_weather_event/styles.css"] = 3600,
["Infobox_website"] = 8300,
["Infobox_writer"] = 46000,
["Information"] = 98000,
["Information/styles.css"] = 98000,
["Inlang"] = 2400,
["Inline"] = 3800,
["Inline_block"] = 5400,
["Inprogress"] = 2700,
["Input_link"] = 32000,
["Instagram"] = 21000,
["InterSportStats"] = 6900,
["Interlanguage_link"] = 310000,
["Interlanguage_link_multi"] = 9000,
["International_Paralympic_Committee"] = 4300,
["International_football_primary_link"] = 3600,
["International_football_primary_style"] = 3600,
["International_football_secondary_style"] = 3500,
["Internet_Archive"] = 2300,
["Internet_Archive_SCOTUS_URL"] = 3300,
["Internet_Archive_author"] = 19000,
["Internet_Archive_film"] = 2600,
["Intitle"] = 22000,
["Ip"] = 2100,
["Iptalk"] = 18000,
["IranCensus2006"] = 29000,
["IranNCSGN"] = 3100,
["Iran_Census_2006"] = 29000,
["Irish_place_name"] = 3000,
["IsIPAddress"] = 47000,
["IsValidPageName"] = 3400,
["Is_MLB_league"] = 3300,
["Is_NPB_league"] = 3400,
["Is_continent"] = 13000,
["Is_country_in_Central_America"] = 17000,
["Is_country_in_the_Caribbean"] = 17000,
["Is_interwiki_link"] = 6100,
["Is_italic_taxon"] = 657000,
["Is_redirect"] = 387000,
["Is_time"] = 6700,
["Is_valid_page_name"] = 3400,
["Isbn"] = 10000,
["Isnum"] = 3000,
["Isnumeric"] = 122000,
["Iso2continent"] = 110000,
["Iso2country"] = 26000,
["Iso2country/article"] = 25000,
["Iso2country/data"] = 26000,
["Issubst"] = 64000,
["Italic_dab2"] = 5900,
["Italic_disambiguation"] = 2400,
["Italic_title"] = 259000,
["Italic_title_prefixed"] = 8800,
["Italictitle"] = 3000,
["Ivmbox"] = 143000,
["Ivory_messagebox"] = 192000,
["Ivory_messagebox/styles.css"] = 192000,
["Module:I18n/complex_date"] = 49000,
["Module:IP"] = 223000,
["Module:IPA"] = 186000,
["Module:IPA/data"] = 168000,
["Module:IPA/styles.css"] = 153000,
["Module:IPA_symbol"] = 6900,
["Module:IPA_symbol/data"] = 6900,
["Module:IPAc-en"] = 56000,
["Module:IPAc-en/data"] = 56000,
["Module:IPAc-en/phonemes"] = 56000,
["Module:IPAc-en/pronunciation"] = 56000,
["Module:IPAddress"] = 292000,
["Module:ISO_3166"] = 949000,
["Module:ISO_3166/data/AT"] = 2500,
["Module:ISO_3166/data/BA"] = 3400,
["Module:ISO_3166/data/CA"] = 2600,
["Module:ISO_3166/data/CH"] = 4300,
["Module:ISO_3166/data/CN"] = 2800,
["Module:ISO_3166/data/CZ"] = 6600,
["Module:ISO_3166/data/DE"] = 15000,
["Module:ISO_3166/data/ES"] = 3700,
["Module:ISO_3166/data/FR"] = 38000,
["Module:ISO_3166/data/GB"] = 7100,
["Module:ISO_3166/data/GR"] = 3500,
["Module:ISO_3166/data/IN"] = 29000,
["Module:ISO_3166/data/IR"] = 24000,
["Module:ISO_3166/data/IT"] = 2500,
["Module:ISO_3166/data/National"] = 949000,
["Module:ISO_3166/data/PL"] = 7600,
["Module:ISO_3166/data/RS"] = 3200,
["Module:ISO_3166/data/RU"] = 27000,
["Module:ISO_3166/data/UA"] = 2200,
["Module:ISO_3166/data/US"] = 91000,
["Module:ISO_639_name"] = 34000,
["Module:ISO_639_name/ISO_639-1"] = 29000,
["Module:ISO_639_name/ISO_639-2"] = 21000,
["Module:ISO_639_name/ISO_639-2B"] = 20000,
["Module:ISO_639_name/ISO_639-3"] = 20000,
["Module:ISO_639_name/ISO_639-3_(dep)"] = 34000,
["Module:ISO_639_name/ISO_639-5"] = 19000,
["Module:ISO_639_name/ISO_639_deprecated"] = 34000,
["Module:ISO_639_name/ISO_639_name_to_code"] = 4600,
["Module:ISO_639_name/ISO_639_override"] = 34000,
["Module:ISOdate"] = 49000,
["Module:Ice_hockey_box"] = 2000,
["Module:Icon"] = 692000,
["Module:Icon/data"] = 692000,
["Module:Icon_box"] = 267000,
["Module:Icon_box/data"] = 267000,
["Module:If_any_equal"] = 255000,
["Module:If_empty"] = 6840000,
["Module:If_in_category"] = 164000,
["Module:If_in_page"] = 23000,
["Module:If_not_given_or_empty"] = 125000,
["Module:If_preview"] = 1440000,
["Module:If_preview/configuration"] = 1440000,
["Module:If_preview/styles.css"] = 1440000,
["Module:In_lang"] = 391000,
["Module:Indent"] = 2400,
["Module:Infobox"] = 4720000,
["Module:Infobox/dates"] = 78000,
["Module:Infobox/styles.css"] = 4990000,
["Module:Infobox/utilities"] = 2700,
["Module:Infobox3cols"] = 322000,
["Module:InfoboxBuilder"] = 3100,
["Module:InfoboxImage"] = 5650000,
["Module:InfoboxImage/data"] = 3390000,
["Module:Infobox_body_of_water_tracking"] = 19000,
["Module:Infobox_cyclist_tracking"] = 17000,
["Module:Infobox_dim"] = 383000,
["Module:Infobox_dim/data"] = 234000,
["Module:Infobox_election"] = 43000,
["Module:Infobox_gene"] = 14000,
["Module:Infobox_gene/orthologs"] = 14000,
["Module:Infobox_mapframe"] = 1690000,
["Module:Infobox_military_conflict"] = 28000,
["Module:Infobox_military_conflict/styles.css"] = 28000,
["Module:Infobox_multi-lingual_name"] = 24000,
["Module:Infobox_multi-lingual_name/data"] = 24000,
["Module:Infobox_power_station"] = 3400,
["Module:Infobox_road"] = 26000,
["Module:Infobox_road/browselinks"] = 26000,
["Module:Infobox_road/errors"] = 25000,
["Module:Infobox_road/length"] = 26000,
["Module:Infobox_road/locations"] = 25000,
["Module:Infobox_road/map"] = 25000,
["Module:Infobox_road/route"] = 26000,
["Module:Infobox_road/sections"] = 25000,
["Module:Infobox_ship"] = 43000,
["Module:Infobox_ship/data"] = 43000,
["Module:Infobox_ship/styles.css"] = 43000,
["Module:Infobox_television"] = 64000,
["Module:Infobox_television_disambiguation_check"] = 72000,
["Module:Infobox_television_episode"] = 13000,
["Module:Infobox_television_season_disambiguation_check"] = 10000,
["Module:Infobox_television_season_name"] = 11000,
["Module:Internet_Archive"] = 22000,
["Module:Is_article"] = 2300,
["Module:Is_infobox_in_lead"] = 462000,
["Module:Is_instance"] = 361000,
["Module:Iso2nationality"] = 96000,
["Module:Italic_title"] = 1260000,
["Module:Italic_title2"] = 5900,
}
mvg1awblmjpp8maxf9jwreh620cpua9
373882
373881
2026-10-28T05:55:29Z
ChiK
1136
1 revision imported from [[:en:Module:Transclusion_count/data/I]]
373881
Scribunto
text/plain
return {
["IAST"] = 6300,
["IA_SCOTUS_URL"] = 3300,
["IBDB_name"] = 9800,
["ICD10"] = 5000,
["ICD9"] = 4400,
["ICS"] = 3500,
["ICS_flag"] = 3500,
["IDN"] = 3800,
["IMDb_episode"] = 11000,
["IMDb_episodes"] = 4300,
["IMDb_name"] = 173000,
["IMDb_title"] = 212000,
["IMO_Number"] = 4500,
["IMSLP"] = 9200,
["INA"] = 2400,
["IND"] = 8800,
["INR"] = 6600,
["INRConvert"] = 6800,
["INRConvert/CurrentRate"] = 6700,
["INRConvert/USD"] = 6700,
["INRConvert/out"] = 6700,
["IOBDB_name"] = 2100,
["IP"] = 2800,
["IPA"] = 183000,
["IPA_audio_link"] = 5300,
["IPA_link"] = 5100,
["IPAblink"] = 2600,
["IPAc-cmn"] = 2800,
["IPAc-en"] = 56000,
["IPAc-pl"] = 51000,
["IPSummary"] = 82000,
["IP_summary"] = 83000,
["IPtalk"] = 18000,
["IPuser"] = 7600,
["IPvandal"] = 2800,
["IRC"] = 7200,
["IRI"] = 2600,
["IRL"] = 6100,
["IRN"] = 4000,
["ISBN"] = 475000,
["ISBN?"] = 2400,
["ISBNT"] = 46000,
["ISBN_missing"] = 3200,
["ISFDB_name"] = 4300,
["ISFDB_title"] = 5100,
["ISL"] = 2300,
["ISO_15924/script-example-character"] = 3100,
["ISO_15924/wp-article"] = 3100,
["ISO_15924/wp-article/format"] = 3100,
["ISO_15924/wp-article/label"] = 3000,
["ISO_3166_code"] = 277000,
["ISO_3166_name"] = 16000,
["ISO_639_name"] = 28000,
["ISP"] = 3700,
["ISR"] = 6100,
["ISSN"] = 12000,
["ISSN_link"] = 33000,
["ISTAT"] = 8100,
["ISU_figure_skater"] = 2300,
["ITA"] = 20000,
["ITF"] = 6800,
["ITF_profile"] = 2600,
["ITIS"] = 5900,
["ITN_talk"] = 13000,
["ITN_talk/date"] = 13000,
["IUCN_banner"] = 15000,
["I_sup"] = 4900,
["Ice_hockey_box"] = 2000,
["Ice_hockey_stats"] = 20000,
["Icehockeystats"] = 11000,
["Icelandic_name"] = 2200,
["Icon"] = 679000,
["If"] = 438000,
["If_all"] = 8000,
["If_autoconfirmed"] = 2200,
["If_between"] = 4800,
["If_both"] = 210000,
["If_dark"] = 4100,
["If_dark/styles.css"] = 4100,
["If_either"] = 22000,
["If_empty"] = 6800000,
["If_first_display_both"] = 122000,
["If_in_category"] = 164000,
["If_in_page"] = 23000,
["If_last_display_both"] = 38000,
["If_mobile"] = 2100,
["If_mobile/styles.css"] = 4400,
["If_preview"] = 66000,
["If_then_show"] = 89000,
["Ifempty"] = 949000,
["Ifeq"] = 84000,
["Iferror_then_show"] = 4000,
["Ifexist_not_redirect"] = 1990000,
["Ifnotempty"] = 19000,
["Ifnoteq_then_show"] = 2300,
["Ifnumber"] = 78000,
["Ifsubst"] = 1030000,
["Ih"] = 8100,
["Ill"] = 262000,
["Illm"] = 5800,
["Image_frame"] = 6200,
["Image_label"] = 4700,
["Image_label_begin"] = 4100,
["Image_label_end"] = 4100,
["Image_label_small"] = 2600,
["Image_needed"] = 4400,
["Image_other"] = 191000,
["Image_requested"] = 134000,
["Image_requested/Category_helper"] = 124000,
["Imbox"] = 1000000,
["Imdb_name"] = 5300,
["Imdb_title"] = 2900,
["Importance"] = 15000,
["Importance/colour"] = 30000,
["Importance_mask"] = 632000,
["Improve_categories"] = 7000,
["Improve_documentation"] = 4300,
["Improve_plot"] = 4200,
["In_class"] = 5600,
["In_lang"] = 390000,
["In_progress"] = 3800,
["In_string"] = 310000,
["In_title"] = 31000,
["Inactive_userpage_blanked"] = 3600,
["Inaturalist_taxon"] = 3800,
["Include-USGov"] = 24000,
["Incomplete_list"] = 24000,
["Inconclusive"] = 2400,
["Increase"] = 62000,
["Incumbent_pope"] = 4400,
["Indent"] = 2400,
["Indented_plain_list"] = 2800,
["Indented_plainlist"] = 2500,
["Independent_sources"] = 10000,
["IndexFungorum"] = 2100,
["Indian_English"] = 5000,
["Indian_railway_code"] = 3600,
["Indian_rupee"] = 12000,
["Inflation"] = 28000,
["Inflation-fn"] = 5900,
["Inflation-year"] = 4300,
["Inflation/IN/startyear"] = 6700,
["Inflation/UK"] = 5600,
["Inflation/UK/dataset"] = 5600,
["Inflation/UK/startyear"] = 5600,
["Inflation/US"] = 16000,
["Inflation/US-GDP"] = 3100,
["Inflation/US-GDP/dataset"] = 3100,
["Inflation/US-GDP/startyear"] = 3100,
["Inflation/US/dataset"] = 16000,
["Inflation/US/startyear"] = 16000,
["Inflation/fn"] = 7600,
["Inflation/year"] = 34000,
["Info"] = 5600,
["Infobox"] = 3440000,
["Infobox/Columns"] = 3300,
["Infobox/mobileviewfix.css"] = 177000,
["Infobox/styles-images.css"] = 21000,
["Infobox3cols"] = 28000,
["Infobox_AFL_biography"] = 15000,
["Infobox_Athletics_Championships"] = 3400,
["Infobox_Australian_place"] = 15000,
["Infobox_Australian_place/styles.css"] = 15000,
["Infobox_Australian_place/table"] = 11000,
["Infobox_COA_wide"] = 3700,
["Infobox_Canada_electoral_district"] = 2700,
["Infobox_Chinese"] = 24000,
["Infobox_Chinese/Chinese"] = 3200,
["Infobox_Chinese/Footer"] = 7200,
["Infobox_Chinese/Header"] = 7200,
["Infobox_Christian_leader"] = 23000,
["Infobox_French_commune"] = 38000,
["Infobox_French_subdivision"] = 2200,
["Infobox_Gaelic_games_biography"] = 5500,
["Infobox_Gaelic_games_player"] = 3000,
["Infobox_German_place"] = 14000,
["Infobox_Grand_Prix_race_report"] = 2200,
["Infobox_Greece_place"] = 3600,
["Infobox_Greek_Dimos"] = 2900,
["Infobox_Hindu_temple"] = 2900,
["Infobox_Indian_constituency"] = 5800,
["Infobox_Indian_constituency/defaultdata"] = 5800,
["Infobox_Italian_comune"] = 8100,
["Infobox_Korean"] = 2100,
["Infobox_Korean/auto"] = 15000,
["Infobox_Korean/auto/categories"] = 15000,
["Infobox_Korean/base"] = 2100,
["Infobox_Korean/base/auto"] = 18000,
["Infobox_Korean/categories"] = 2100,
["Infobox_Korean_name"] = 2100,
["Infobox_Korean_name/auto"] = 14000,
["Infobox_Korean_television_name"] = 3500,
["Infobox_NASCAR_driver"] = 2400,
["Infobox_NASCAR_race_report"] = 2800,
["Infobox_NCAA_basketball_conference_tournament"] = 2100,
["Infobox_NCAA_team_season"] = 11000,
["Infobox_NFL_biography"] = 27000,
["Infobox_NFL_team_season"] = 2300,
["Infobox_NRHP"] = 74000,
["Infobox_NRHP/conv"] = 19000,
["Infobox_NRHP/pushpinmap2region"] = 68000,
["Infobox_Olympic_event"] = 8100,
["Infobox_Olympic_event/event_link"] = 8100,
["Infobox_Olympic_event/games_text"] = 8100,
["Infobox_Pan_American_Games_event"] = 2900,
["Infobox_Paralympic_event"] = 2900,
["Infobox_Paralympic_event/games_text"] = 2900,
["Infobox_Romanian_subdivision"] = 3200,
["Infobox_Russian_district"] = 2100,
["Infobox_Russian_inhabited_locality"] = 4700,
["Infobox_Russian_inhabited_locality/PosMapFS"] = 4200,
["Infobox_Russian_inhabited_locality/federal_subject"] = 4700,
["Infobox_SCOTUS_case"] = 4600,
["Infobox_SSSI"] = 2000,
["Infobox_Site_of_Special_Scientific_Interest"] = 2100,
["Infobox_Slovak_place"] = 3000,
["Infobox_Swiss_town"] = 3000,
["Infobox_Switzerland_municipality"] = 3000,
["Infobox_Turkey_place"] = 20000,
["Infobox_U.S._county"] = 3000,
["Infobox_U.S._county/district"] = 3000,
["Infobox_U.S._legislation"] = 2300,
["Infobox_UK_constituency"] = 2200,
["Infobox_UK_constituency/year"] = 2200,
["Infobox_UK_legislation"] = 6500,
["Infobox_UK_place"] = 27000,
["Infobox_UK_place/NoDialCode"] = 8300,
["Infobox_UK_place/NoPostCode"] = 3700,
["Infobox_UK_place/area"] = 2800,
["Infobox_UK_place/dens"] = 2300,
["Infobox_UK_place/dist"] = 2800,
["Infobox_UK_place/local"] = 27000,
["Infobox_UK_place/styles.css"] = 27000,
["Infobox_UNESCO_World_Heritage_Site"] = 2100,
["Infobox_UN_resolution"] = 2300,
["Infobox_US_Supreme_Court_case"] = 4800,
["Infobox_US_Supreme_Court_case/courts"] = 4800,
["Infobox_United_States_legislative_district"] = 2800,
["Infobox_United_States_legislative_district/representative"] = 2800,
["Infobox_Wikipedia_user"] = 12000,
["Infobox_academic"] = 27000,
["Infobox_aircraft"] = 13000,
["Infobox_aircraft/styles.css"] = 14000,
["Infobox_aircraft_occurrence"] = 2900,
["Infobox_airline"] = 4800,
["Infobox_airline/styles.css"] = 4800,
["Infobox_airport"] = 14000,
["Infobox_airport/datatable"] = 13000,
["Infobox_airport/styles.css"] = 14000,
["Infobox_album"] = 169000,
["Infobox_album/color"] = 209000,
["Infobox_album/link"] = 169000,
["Infobox_anatomy"] = 4500,
["Infobox_animanga/Footer"] = 7800,
["Infobox_animanga/Header"] = 7800,
["Infobox_animanga/Print"] = 6700,
["Infobox_animanga/Video"] = 5100,
["Infobox_architect"] = 4500,
["Infobox_artist"] = 35000,
["Infobox_artist_discography"] = 6500,
["Infobox_artwork"] = 16000,
["Infobox_automobile"] = 9300,
["Infobox_award"] = 16000,
["Infobox_badminton_player"] = 3300,
["Infobox_baseball_biography"] = 30000,
["Infobox_baseball_biography/style"] = 30000,
["Infobox_baseball_biography/styles.css"] = 30000,
["Infobox_baseball_team_season"] = 3400,
["Infobox_baseball_team_season/leagueseason"] = 3400,
["Infobox_baseball_team_season/season"] = 3400,
["Infobox_baseball_team_season/styles.css"] = 3400,
["Infobox_basketball_biography"] = 24000,
["Infobox_basketball_biography/style"] = 24000,
["Infobox_basketball_club"] = 3300,
["Infobox_basketball_club/styles.css"] = 3300,
["Infobox_beauty_pageant"] = 2200,
["Infobox_bilateral_relations"] = 5100,
["Infobox_bishop_styles"] = 2500,
["Infobox_body_of_water"] = 19000,
["Infobox_book"] = 64000,
["Infobox_book/styles.css"] = 64000,
["Infobox_boxer"] = 6600,
["Infobox_brand"] = 2200,
["Infobox_brand/styles.css"] = 2200,
["Infobox_bridge"] = 6800,
["Infobox_building"] = 35000,
["Infobox_bus_company"] = 2100,
["Infobox_cemetery"] = 2200,
["Infobox_character"] = 8500,
["Infobox_character/styles.css"] = 8500,
["Infobox_chess_biography"] = 4800,
["Infobox_chess_player"] = 3800,
["Infobox_church"] = 17000,
["Infobox_church/denomination"] = 17000,
["Infobox_church/font_color"] = 17000,
["Infobox_civil_conflict"] = 3300,
["Infobox_civilian_attack"] = 7800,
["Infobox_college_coach"] = 13000,
["Infobox_college_football_game"] = 2300,
["Infobox_college_football_player"] = 2700,
["Infobox_college_sports_team_season"] = 46000,
["Infobox_college_sports_team_season/link"] = 46000,
["Infobox_college_sports_team_season/name"] = 46000,
["Infobox_college_sports_team_season/succession"] = 46000,
["Infobox_college_sports_team_season/team"] = 46000,
["Infobox_comedian"] = 2200,
["Infobox_comic_book_title"] = 3200,
["Infobox_comics_character"] = 3400,
["Infobox_comics_creator"] = 3600,
["Infobox_comics_creator/styles.css"] = 3600,
["Infobox_company"] = 93000,
["Infobox_company/styles.css"] = 93000,
["Infobox_computing_device"] = 2600,
["Infobox_concert"] = 4000,
["Infobox_constituency"] = 8100,
["Infobox_country"] = 7200,
["Infobox_country/formernext"] = 6800,
["Infobox_country/imagetable"] = 5600,
["Infobox_country/multirow"] = 9400,
["Infobox_country/status_text"] = 3100,
["Infobox_country/styles.css"] = 7200,
["Infobox_country_at_games"] = 17000,
["Infobox_country_at_games/core"] = 17000,
["Infobox_country_at_games/see_also"] = 14000,
["Infobox_court_case"] = 5400,
["Infobox_court_case/images"] = 2900,
["Infobox_court_case/styles.css"] = 5400,
["Infobox_cricket_tournament"] = 2800,
["Infobox_cricketer"] = 32000,
["Infobox_cricketer/career"] = 32000,
["Infobox_cricketer/national_side"] = 7700,
["Infobox_criminal"] = 7800,
["Infobox_curler"] = 2800,
["Infobox_cycling_race_report"] = 5000,
["Infobox_cyclist"] = 17000,
["Infobox_dam"] = 5900,
["Infobox_deity"] = 2300,
["Infobox_deity/color"] = 2300,
["Infobox_designation_list"] = 33000,
["Infobox_designation_list/entry"] = 23000,
["Infobox_dim"] = 6400,
["Infobox_diocese"] = 4100,
["Infobox_drug"] = 12000,
["Infobox_drug/chemical_formula"] = 12000,
["Infobox_drug/data_page_link"] = 12000,
["Infobox_drug/formatATC"] = 12000,
["Infobox_drug/formatCASnumber"] = 12000,
["Infobox_drug/formatChEBI"] = 12000,
["Infobox_drug/formatChEMBL"] = 12000,
["Infobox_drug/formatChemDBNIAID"] = 12000,
["Infobox_drug/formatChemSpider"] = 12000,
["Infobox_drug/formatCompTox"] = 12000,
["Infobox_drug/formatDrugBank"] = 12000,
["Infobox_drug/formatIUPHARBPS"] = 12000,
["Infobox_drug/formatJmol"] = 12000,
["Infobox_drug/formatKEGG"] = 12000,
["Infobox_drug/formatPDBligand"] = 11000,
["Infobox_drug/formatPubChemCID"] = 12000,
["Infobox_drug/formatPubChemSID"] = 12000,
["Infobox_drug/formatUNII"] = 12000,
["Infobox_drug/legal_status"] = 12000,
["Infobox_drug/licence"] = 12000,
["Infobox_drug/maintenance_categories"] = 12000,
["Infobox_drug/non-ref-space"] = 4000,
["Infobox_drug/pregnancy_category"] = 12000,
["Infobox_drug/styles.css"] = 12000,
["Infobox_drug/title"] = 12000,
["Infobox_economist"] = 2100,
["Infobox_election"] = 41000,
["Infobox_election/shortname"] = 2600,
["Infobox_election/styles.css"] = 41000,
["Infobox_enzyme"] = 5100,
["Infobox_ethnic_group"] = 8100,
["Infobox_event"] = 8100,
["Infobox_family"] = 2800,
["Infobox_field_hockey_player"] = 2600,
["Infobox_figure_skater"] = 4000,
["Infobox_film"] = 171000,
["Infobox_film/short_description"] = 167000,
["Infobox_film_awards"] = 3200,
["Infobox_film_awards/link"] = 3200,
["Infobox_film_awards/style"] = 3200,
["Infobox_film_or_theatre_festival"] = 2100,
["Infobox_food"] = 7800,
["Infobox_football_biography"] = 220000,
["Infobox_football_club"] = 30000,
["Infobox_football_club_season"] = 25000,
["Infobox_football_league"] = 2800,
["Infobox_football_league_season"] = 22000,
["Infobox_football_match"] = 6800,
["Infobox_football_tournament"] = 2200,
["Infobox_football_tournament_season"] = 9400,
["Infobox_former_subdivision"] = 3800,
["Infobox_former_subdivision/styles.css"] = 3800,
["Infobox_galaxy"] = 3400,
["Infobox_game"] = 3200,
["Infobox_game_score"] = 3800,
["Infobox_games"] = 2100,
["Infobox_gene"] = 13000,
["Infobox_given_name"] = 4100,
["Infobox_golfer"] = 4900,
["Infobox_golfer/highest_ranking"] = 4900,
["Infobox_government_agency"] = 13000,
["Infobox_government_cabinet"] = 3600,
["Infobox_gridiron_football_biography"] = 41000,
["Infobox_gridiron_football_biography/position"] = 40000,
["Infobox_gridiron_football_team_season"] = 4100,
["Infobox_gymnast"] = 6000,
["Infobox_handball_biography"] = 5600,
["Infobox_historic_site"] = 22000,
["Infobox_holiday"] = 2200,
["Infobox_holiday/date"] = 2200,
["Infobox_horseraces"] = 2700,
["Infobox_hospital"] = 7000,
["Infobox_hospital/care_system"] = 7000,
["Infobox_hospital/lists"] = 7000,
["Infobox_hurling_championship"] = 2700,
["Infobox_ice_hockey_biography"] = 21000,
["Infobox_ice_hockey_player"] = 18000,
["Infobox_ice_hockey_team"] = 3300,
["Infobox_ice_hockey_team_season"] = 2200,
["Infobox_international_football_competition"] = 6800,
["Infobox_islands"] = 9700,
["Infobox_islands/area"] = 10000,
["Infobox_islands/density"] = 10000,
["Infobox_islands/length"] = 9700,
["Infobox_islands/styles.css"] = 9700,
["Infobox_journal"] = 10000,
["Infobox_journal/Abbreviation_search"] = 10000,
["Infobox_journal/Bluebook_check"] = 10000,
["Infobox_journal/Former_check"] = 10000,
["Infobox_journal/ISO_4_check"] = 10000,
["Infobox_journal/ISSN-eISSN"] = 9900,
["Infobox_journal/Indexing_search"] = 10000,
["Infobox_journal/MathSciNet_check"] = 10000,
["Infobox_journal/NLM_check"] = 10000,
["Infobox_journal/frequency"] = 9100,
["Infobox_journal/openaccess"] = 2700,
["Infobox_judoka"] = 2800,
["Infobox_lake"] = 3800,
["Infobox_language"] = 10000,
["Infobox_language/family-color"] = 12000,
["Infobox_language/genetic"] = 7000,
["Infobox_language/lingualist"] = 12000,
["Infobox_language/linguistlist"] = 10000,
["Infobox_language/ref"] = 7400,
["Infobox_law_enforcement_agency"] = 2200,
["Infobox_legislation"] = 2800,
["Infobox_legislative_district"] = 2400,
["Infobox_legislative_election"] = 2700,
["Infobox_legislative_election/row"] = 2600,
["Infobox_legislative_election/styles.css"] = 2700,
["Infobox_legislative_term"] = 2300,
["Infobox_legislature"] = 4400,
["Infobox_library"] = 2500,
["Infobox_lighthouse"] = 2700,
["Infobox_lighthouse/light"] = 2700,
["Infobox_locomotive"] = 5000,
["Infobox_magazine"] = 8300,
["Infobox_manner_of_address"] = 4200,
["Infobox_martial_artist"] = 6300,
["Infobox_martial_artist/record"] = 6300,
["Infobox_medal_templates"] = 481000,
["Infobox_medical_condition"] = 9900,
["Infobox_medical_condition_(new)"] = 6200,
["Infobox_medical_person"] = 2600,
["Infobox_militant_organization"] = 2200,
["Infobox_military_conflict"] = 28000,
["Infobox_military_installation"] = 11000,
["Infobox_military_person"] = 54000,
["Infobox_military_unit"] = 29000,
["Infobox_mine"] = 2300,
["Infobox_mineral"] = 2000,
["Infobox_mobile_phone"] = 2600,
["Infobox_mobile_phone/size"] = 2200,
["Infobox_mobile_phone/weight"] = 2300,
["Infobox_model"] = 2300,
["Infobox_monument"] = 2900,
["Infobox_motorsport_season"] = 2900,
["Infobox_mountain"] = 30000,
["Infobox_multi-sport_competition_event"] = 2900,
["Infobox_museum"] = 12000,
["Infobox_musical_artist"] = 131000,
["Infobox_musical_artist/hCard_class"] = 122000,
["Infobox_musical_composition"] = 3700,
["Infobox_name"] = 8900,
["Infobox_name_module"] = 9700,
["Infobox_newspaper"] = 11000,
["Infobox_newspaper/styles.css"] = 11000,
["Infobox_noble"] = 7900,
["Infobox_officeholder"] = 284000,
["Infobox_officeholder/office"] = 291000,
["Infobox_official_post"] = 9900,
["Infobox_organization"] = 43000,
["Infobox_pageant_titleholder"] = 3100,
["Infobox_park"] = 10000,
["Infobox_person"] = 676000,
["Infobox_person/Wikidata"] = 5000,
["Infobox_person/height"] = 116000,
["Infobox_person/length"] = 7700,
["Infobox_person/weight"] = 74000,
["Infobox_philosopher"] = 3800,
["Infobox_planet"] = 4800,
["Infobox_play"] = 4600,
["Infobox_political_party"] = 16000,
["Infobox_power_station"] = 3400,
["Infobox_prepared_food"] = 2500,
["Infobox_professional_wrestler"] = 4800,
["Infobox_professional_wrestling_event"] = 3400,
["Infobox_protected_area"] = 15000,
["Infobox_protein_family"] = 2200,
["Infobox_publisher"] = 2600,
["Infobox_racehorse"] = 6000,
["Infobox_racing_driver"] = 6000,
["Infobox_racing_driver_series_section"] = 3000,
["Infobox_radio_station"] = 22000,
["Infobox_radio_station/styles.css"] = 22000,
["Infobox_rail"] = 3200,
["Infobox_rail_line"] = 8100,
["Infobox_rail_service"] = 3300,
["Infobox_reality_competition_season"] = 4400,
["Infobox_record_label"] = 4200,
["Infobox_recurring_event"] = 8200,
["Infobox_religious_biography"] = 7300,
["Infobox_religious_building"] = 15000,
["Infobox_religious_building/color"] = 22000,
["Infobox_restaurant"] = 4700,
["Infobox_river"] = 32000,
["Infobox_river/calcunit"] = 32000,
["Infobox_river/discharge"] = 32000,
["Infobox_river/row-style"] = 32000,
["Infobox_river/source"] = 32000,
["Infobox_road"] = 25000,
["Infobox_road/meta/mask/category"] = 24000,
["Infobox_road/meta/mask/country"] = 25000,
["Infobox_road/styles.css"] = 26000,
["Infobox_road_small"] = 2500,
["Infobox_rockunit"] = 6500,
["Infobox_royalty"] = 26000,
["Infobox_royalty/short_description"] = 8800,
["Infobox_rugby_biography"] = 19000,
["Infobox_rugby_biography/correct_date"] = 19000,
["Infobox_rugby_biography/depcheck"] = 19000,
["Infobox_rugby_league_biography"] = 11000,
["Infobox_rugby_league_biography/PLAYER"] = 11000,
["Infobox_rugby_team"] = 2700,
["Infobox_sailboat_specifications"] = 2300,
["Infobox_saint"] = 5500,
["Infobox_school"] = 39000,
["Infobox_school/short_description"] = 39000,
["Infobox_school/styles.css"] = 39000,
["Infobox_school_district"] = 6500,
["Infobox_school_district/styles.css"] = 6500,
["Infobox_scientist"] = 57000,
["Infobox_settlement"] = 599000,
["Infobox_settlement/areadisp"] = 261000,
["Infobox_settlement/columns"] = 108000,
["Infobox_settlement/columns/styles.css"] = 108000,
["Infobox_settlement/densdisp"] = 459000,
["Infobox_settlement/lengthdisp"] = 182000,
["Infobox_settlement/link"] = 108000,
["Infobox_settlement/styles.css"] = 599000,
["Infobox_ship"] = 43000,
["Infobox_ship/career"] = 39000,
["Infobox_ship/characteristics"] = 43000,
["Infobox_ship/class_overview"] = 4400,
["Infobox_ship/image"] = 42000,
["Infobox_ship/service_record"] = 2500,
["Infobox_shopping_mall"] = 3800,
["Infobox_short_story"] = 2800,
["Infobox_skier"] = 2700,
["Infobox_soap_character"] = 3100,
["Infobox_social_media_personality"] = 4400,
["Infobox_software"] = 14000,
["Infobox_software/simple"] = 15000,
["Infobox_song"] = 84000,
["Infobox_song/color"] = 84000,
["Infobox_song/link"] = 84000,
["Infobox_song_contest_national_year"] = 2000,
["Infobox_song_contest_national_year/Year"] = 2100,
["Infobox_spaceflight"] = 4100,
["Infobox_spaceflight/styles.css"] = 4100,
["Infobox_speed_skater"] = 2100,
["Infobox_sport_event"] = 2800,
["Infobox_sports_competition_event"] = 25000,
["Infobox_sports_competition_event/medalrow"] = 16000,
["Infobox_sports_league"] = 5700,
["Infobox_sports_season"] = 7000,
["Infobox_sports_team"] = 2300,
["Infobox_sportsperson"] = 179000,
["Infobox_stadium"] = 2600,
["Infobox_station"] = 58000,
["Infobox_station/services"] = 58000,
["Infobox_station/styles.css"] = 58000,
["Infobox_street"] = 4500,
["Infobox_swimmer"] = 11000,
["Infobox_television"] = 64000,
["Infobox_television/Short_description"] = 62000,
["Infobox_television/styles.css"] = 64000,
["Infobox_television_channel"] = 6800,
["Infobox_television_channel/styles.css"] = 6800,
["Infobox_television_episode"] = 13000,
["Infobox_television_episode/styles.css"] = 14000,
["Infobox_television_season"] = 11000,
["Infobox_television_station"] = 3200,
["Infobox_television_station/styles.css"] = 3300,
["Infobox_tennis_biography"] = 11000,
["Infobox_tennis_event"] = 3400,
["Infobox_tennis_tournament"] = 2100,
["Infobox_tennis_tournament/heading"] = 2100,
["Infobox_tennis_tournament/style"] = 2100,
["Infobox_tennis_tournament_event"] = 23000,
["Infobox_tennis_tournament_year"] = 11000,
["Infobox_tennis_tournament_year/color"] = 33000,
["Infobox_tennis_tournament_year/footer"] = 33000,
["Infobox_tournament_season"] = 13000,
["Infobox_train"] = 2600,
["Infobox_university"] = 25000,
["Infobox_user"] = 3000,
["Infobox_venue"] = 20000,
["Infobox_video_game"] = 30000,
["Infobox_video_game/styles.css"] = 30000,
["Infobox_volleyball_biography"] = 5900,
["Infobox_weapon"] = 8100,
["Infobox_weather_event"] = 3600,
["Infobox_weather_event/Effects"] = 3400,
["Infobox_weather_event/Footer"] = 3500,
["Infobox_weather_event/History"] = 3400,
["Infobox_weather_event/SSHWS"] = 2000,
["Infobox_weather_event/meteorology"] = 3300,
["Infobox_weather_event/scale"] = 2100,
["Infobox_weather_event/styles.css"] = 3600,
["Infobox_website"] = 8300,
["Infobox_writer"] = 46000,
["Information"] = 98000,
["Information/styles.css"] = 98000,
["Inlang"] = 2400,
["Inline"] = 3800,
["Inline_block"] = 5400,
["Inprogress"] = 2700,
["Input_link"] = 32000,
["Instagram"] = 21000,
["InterSportStats"] = 6900,
["Interlanguage_link"] = 310000,
["Interlanguage_link_multi"] = 9000,
["International_Paralympic_Committee"] = 4300,
["International_football_primary_link"] = 3600,
["International_football_primary_style"] = 3600,
["International_football_secondary_style"] = 3500,
["Internet_Archive"] = 2300,
["Internet_Archive_SCOTUS_URL"] = 3300,
["Internet_Archive_author"] = 19000,
["Internet_Archive_film"] = 2600,
["Intitle"] = 22000,
["Ip"] = 2100,
["Iptalk"] = 18000,
["IranCensus2006"] = 29000,
["IranNCSGN"] = 3100,
["Iran_Census_2006"] = 29000,
["Irish_place_name"] = 3000,
["IsIPAddress"] = 47000,
["IsValidPageName"] = 3400,
["Is_MLB_league"] = 3300,
["Is_NPB_league"] = 3400,
["Is_continent"] = 13000,
["Is_country_in_Central_America"] = 17000,
["Is_country_in_the_Caribbean"] = 17000,
["Is_interwiki_link"] = 6100,
["Is_italic_taxon"] = 657000,
["Is_redirect"] = 387000,
["Is_time"] = 6700,
["Is_valid_page_name"] = 3400,
["Isbn"] = 10000,
["Isnum"] = 3000,
["Isnumeric"] = 122000,
["Iso2continent"] = 110000,
["Iso2country"] = 26000,
["Iso2country/article"] = 25000,
["Iso2country/data"] = 26000,
["Issubst"] = 64000,
["Italic_dab2"] = 5900,
["Italic_disambiguation"] = 2400,
["Italic_title"] = 259000,
["Italic_title_prefixed"] = 8800,
["Italictitle"] = 3000,
["Ivmbox"] = 143000,
["Ivory_messagebox"] = 192000,
["Ivory_messagebox/styles.css"] = 192000,
["Module:I18n/complex_date"] = 49000,
["Module:IP"] = 223000,
["Module:IPA"] = 186000,
["Module:IPA/data"] = 168000,
["Module:IPA/styles.css"] = 153000,
["Module:IPA_symbol"] = 6900,
["Module:IPA_symbol/data"] = 6900,
["Module:IPAc-en"] = 56000,
["Module:IPAc-en/data"] = 56000,
["Module:IPAc-en/phonemes"] = 56000,
["Module:IPAc-en/pronunciation"] = 56000,
["Module:IPAddress"] = 292000,
["Module:ISO_3166"] = 949000,
["Module:ISO_3166/data/AT"] = 2500,
["Module:ISO_3166/data/BA"] = 3400,
["Module:ISO_3166/data/CA"] = 2600,
["Module:ISO_3166/data/CH"] = 4300,
["Module:ISO_3166/data/CN"] = 2800,
["Module:ISO_3166/data/CZ"] = 6600,
["Module:ISO_3166/data/DE"] = 15000,
["Module:ISO_3166/data/ES"] = 3700,
["Module:ISO_3166/data/FR"] = 38000,
["Module:ISO_3166/data/GB"] = 7100,
["Module:ISO_3166/data/GR"] = 3500,
["Module:ISO_3166/data/IN"] = 29000,
["Module:ISO_3166/data/IR"] = 24000,
["Module:ISO_3166/data/IT"] = 2500,
["Module:ISO_3166/data/National"] = 949000,
["Module:ISO_3166/data/PL"] = 7600,
["Module:ISO_3166/data/RS"] = 3200,
["Module:ISO_3166/data/RU"] = 27000,
["Module:ISO_3166/data/UA"] = 2200,
["Module:ISO_3166/data/US"] = 91000,
["Module:ISO_639_name"] = 34000,
["Module:ISO_639_name/ISO_639-1"] = 29000,
["Module:ISO_639_name/ISO_639-2"] = 21000,
["Module:ISO_639_name/ISO_639-2B"] = 20000,
["Module:ISO_639_name/ISO_639-3"] = 20000,
["Module:ISO_639_name/ISO_639-3_(dep)"] = 34000,
["Module:ISO_639_name/ISO_639-5"] = 19000,
["Module:ISO_639_name/ISO_639_deprecated"] = 34000,
["Module:ISO_639_name/ISO_639_name_to_code"] = 4600,
["Module:ISO_639_name/ISO_639_override"] = 34000,
["Module:ISOdate"] = 49000,
["Module:Ice_hockey_box"] = 2000,
["Module:Icon"] = 692000,
["Module:Icon/data"] = 692000,
["Module:Icon_box"] = 267000,
["Module:Icon_box/data"] = 267000,
["Module:If_any_equal"] = 255000,
["Module:If_empty"] = 6840000,
["Module:If_in_category"] = 164000,
["Module:If_in_page"] = 23000,
["Module:If_not_given_or_empty"] = 125000,
["Module:If_preview"] = 1440000,
["Module:If_preview/configuration"] = 1440000,
["Module:If_preview/styles.css"] = 1440000,
["Module:In_lang"] = 391000,
["Module:Indent"] = 2400,
["Module:Infobox"] = 4720000,
["Module:Infobox/dates"] = 78000,
["Module:Infobox/styles.css"] = 4990000,
["Module:Infobox/utilities"] = 2700,
["Module:Infobox3cols"] = 322000,
["Module:InfoboxBuilder"] = 3100,
["Module:InfoboxImage"] = 5650000,
["Module:InfoboxImage/data"] = 3390000,
["Module:Infobox_body_of_water_tracking"] = 19000,
["Module:Infobox_cyclist_tracking"] = 17000,
["Module:Infobox_dim"] = 383000,
["Module:Infobox_dim/data"] = 234000,
["Module:Infobox_election"] = 43000,
["Module:Infobox_gene"] = 14000,
["Module:Infobox_gene/orthologs"] = 14000,
["Module:Infobox_mapframe"] = 1690000,
["Module:Infobox_military_conflict"] = 28000,
["Module:Infobox_military_conflict/styles.css"] = 28000,
["Module:Infobox_multi-lingual_name"] = 24000,
["Module:Infobox_multi-lingual_name/data"] = 24000,
["Module:Infobox_power_station"] = 3400,
["Module:Infobox_road"] = 26000,
["Module:Infobox_road/browselinks"] = 26000,
["Module:Infobox_road/errors"] = 25000,
["Module:Infobox_road/length"] = 26000,
["Module:Infobox_road/locations"] = 25000,
["Module:Infobox_road/map"] = 25000,
["Module:Infobox_road/route"] = 26000,
["Module:Infobox_road/sections"] = 25000,
["Module:Infobox_ship"] = 43000,
["Module:Infobox_ship/data"] = 43000,
["Module:Infobox_ship/styles.css"] = 43000,
["Module:Infobox_television"] = 64000,
["Module:Infobox_television_disambiguation_check"] = 72000,
["Module:Infobox_television_episode"] = 13000,
["Module:Infobox_television_season_disambiguation_check"] = 10000,
["Module:Infobox_television_season_name"] = 11000,
["Module:Internet_Archive"] = 22000,
["Module:Is_article"] = 2300,
["Module:Is_infobox_in_lead"] = 462000,
["Module:Is_instance"] = 361000,
["Module:Iso2nationality"] = 96000,
["Module:Italic_title"] = 1260000,
["Module:Italic_title2"] = 5900,
}
mvg1awblmjpp8maxf9jwreh620cpua9
ಮೋಡ್ಯೂಲ್:Location map/data/India
828
10042
373869
2018-03-11T23:43:06Z
en>Plastikspork
0
Changed protection level for "[[Module:Location map/data/India]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
373869
Scribunto
text/plain
return {
name = 'India',
top = 37.5,
bottom = 5.0,
left = 67.0,
right = 99.0,
image = 'India location map.svg',
image1 = 'India relief location map.jpg'
}
gw0g2fn9r50gvo5ujlnzgldgkh2r3bs
373870
128412
2026-10-28T05:55:28Z
ChiK
1136
1 revision imported from [[:en:Module:Location_map/data/India]]
128412
Scribunto
text/plain
return {
name = 'India',
top = 37.5,
bottom = 5.0,
left = 67.0,
right = 99.0,
image = 'India location map.svg',
image1 = 'India relief location map.jpg'
}
gw0g2fn9r50gvo5ujlnzgldgkh2r3bs
ಟೆಂಪ್ಲೇಟ್:Inflation/year
10
14281
373857
357816
2026-09-29T21:07:21Z
en>Pppery
0
IN = 2026
373857
wikitext
text/x-wiki
<includeonly>{{#switch:{{{index|{{{1|ERR}}}}}}
<!-- *** When changing this, also update the reference in [[Template:Inflation/fn]] and the datasets for [[Template:Inflation]]! *** -->
| AR = 2020
| AT = 2018
| AU = 2022
| AU-road = 2018
| BD = 2024
| BE = 2025
| BR = 2020
| CA = 2025
| CH = 2021
| CL = 2024
| CN = 2024
| DE = 2021
| DK = 2022
| EG = 2024
| ES = 2022
| EU = 2023
| FI = 2023
| FR = 2025
| GR = 2025
| HK = 2020
| ID = 2025
| IL = 2021
| IN = 2026
| IR = 1398
| IS = 2025
| IT = 2020
| JP = 2024
| KRW = 2025
| MX = 2025
| NL = 2024
| NO = 2018
| NZ = 2026
| PE = 2017
| PH = 2021
| PK = 2021
| PL = 2021
| PT = 2007
| RU = 2023
| SE = 2023
| SG = 2022
| TEST = 2012
| TH = 2020
| TR = 2024
| TW = 2021
| UK|GBP = 2025
| UKGDP
| UK-GDP
| UK-CAP = 2024
| US|USD = 2025
| USGDP
| US-GDP
| US-CAP = 2024
| VN = 2022
| ZAR = 2018
| ERR = <span class="error">Error: no index specified when using {{tl|Inflation/year}}.{{main other|[[Category:Pages with errors in inflation template]]}}</span>
|#default = <span class="error">Error: undefined index "{{{index|{{{1}}}}}}" when using {{tl|Inflation/year}}.{{main other|[[Category:Pages with errors in inflation template]]}}</span>
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
l5cd2bczkvnyulumtlc8ugjhvpbob9r
373858
373857
2026-10-28T05:55:27Z
ChiK
1136
1 revision imported from [[:en:Template:Inflation/year]]
373857
wikitext
text/x-wiki
<includeonly>{{#switch:{{{index|{{{1|ERR}}}}}}
<!-- *** When changing this, also update the reference in [[Template:Inflation/fn]] and the datasets for [[Template:Inflation]]! *** -->
| AR = 2020
| AT = 2018
| AU = 2022
| AU-road = 2018
| BD = 2024
| BE = 2025
| BR = 2020
| CA = 2025
| CH = 2021
| CL = 2024
| CN = 2024
| DE = 2021
| DK = 2022
| EG = 2024
| ES = 2022
| EU = 2023
| FI = 2023
| FR = 2025
| GR = 2025
| HK = 2020
| ID = 2025
| IL = 2021
| IN = 2026
| IR = 1398
| IS = 2025
| IT = 2020
| JP = 2024
| KRW = 2025
| MX = 2025
| NL = 2024
| NO = 2018
| NZ = 2026
| PE = 2017
| PH = 2021
| PK = 2021
| PL = 2021
| PT = 2007
| RU = 2023
| SE = 2023
| SG = 2022
| TEST = 2012
| TH = 2020
| TR = 2024
| TW = 2021
| UK|GBP = 2025
| UKGDP
| UK-GDP
| UK-CAP = 2024
| US|USD = 2025
| USGDP
| US-GDP
| US-CAP = 2024
| VN = 2022
| ZAR = 2018
| ERR = <span class="error">Error: no index specified when using {{tl|Inflation/year}}.{{main other|[[Category:Pages with errors in inflation template]]}}</span>
|#default = <span class="error">Error: undefined index "{{{index|{{{1}}}}}}" when using {{tl|Inflation/year}}.{{main other|[[Category:Pages with errors in inflation template]]}}</span>
}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
l5cd2bczkvnyulumtlc8ugjhvpbob9r
ಮೋಡ್ಯೂಲ್:Params
828
18080
373835
372732
2026-10-27T22:28:15Z
Grufo
6930
Update from [[d:Special:GoToLinkedPage/mediawikiwiki/Q122696746|master]] using [[mw:Synchronizer| #Synchronizer]]
373835
Scribunto
text/plain
require[[strict]]
--- ---
--- PRIVATE ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Abstract utilities ]]--
----------------------------
-- Helper function for `string.gsub()` (for managing zero-padded numbers)
local function zero_padded (str)
return ('%03d%s'):format(#str, str)
end
-- Helper function for `table.sort()` (for natural sorting)
local function natural_sort (var1, var2)
return var1:gsub('%d+', zero_padded) < var2:gsub('%d+', zero_padded)
end
-- Return a copy or a reference to a table
local function copy_or_ref_table (src, refonly)
if refonly then return src end
local newtab = {}
for key, val in pairs(src) do newtab[key] = val end
return newtab
end
-- Copy at most N items (of all kinds) from `src` to `dest` and return `dest`
local function copy_table_maxn (dest, src, len)
local idx = 1
for key, val in pairs(src) do
dest[key], idx = val, idx + 1
if idx > len then break end
end
return dest
end
-- Remove some numeric elements from a table, shifting everything to the left
local function remove_numeric_keys (tbl, idx, len)
local cache, tmp = {}, idx + len - 1
for key, val in pairs(tbl) do
if type(key) == 'number' and key >= idx then
if key > tmp then cache[key - len] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
-- Make a reduced copy of a table (shifting in both directions if necessary)
local function copy_table_reduced (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
elseif key > tmp then ret[key - len] = val end
end
elseif tmp > 0 then
local nshift = 1 - idx
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > tmp then ret[key - tmp] = val
elseif key < idx then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
elseif key < idx then ret[key + len] = val end
end
end
return ret
end
-- Make an expanded copy of a table (shifting in both directions if necessary)
local function copy_table_expanded (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
else ret[key + len] = val end
end
elseif tmp > 0 then
local nshift = idx - 1
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > 0 then ret[key + tmp] = val
elseif key < 1 then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
else ret[key - len] = val end
end
end
return ret
end
-- Given a table, create two new tables containing the sorted list of keys
local function get_sorted_key_list (tbl, sort_fn)
local nums, words, nn, nw = {}, {}, 1, 1
for key, val in pairs(tbl) do
if type(key) == 'number' then nums[nn], nn = key, nn + 1
else words[nw], nw = key, nw + 1 end
end
table.sort(nums)
table.sort(words, sort_fn)
return nums, words, nn - 1, nw - 1
end
-- Parse a parameter name string and return it as a string or a number
local function get_param_name (par_str)
local ret = par_str:match'^%s*(.-)%s*$'
if ret ~= '0' and ret:find'^%-?[1-9]%d*$' == nil then return ret end
return tonumber(ret)
end
-- Move a key from a table to another, but only if under a different name and
-- always parsing numeric strings as numbers
local function steal_if_renamed (val, src, skey, dest, dkey)
local realkey = get_param_name(dkey)
if skey ~= realkey then dest[realkey], src[skey] = val, nil end
end
--[[ Public strings ]]--
------------------------
-- Special match keywords (functions and modifiers MUST avoid these names)
local mkeywords = {
['or'] = 0,
pattern = 1,
plain = 2,
strict = 3
}
-- Sort functions (functions and modifiers MUST avoid these names)
local sortfunctions = {
alphabetically = false,
naturally = natural_sort
}
-- Callback styles for the `mapping_*` and `renaming_*` class of modifiers
-- (functions and modifiers MUST avoid these names)
--[[
Meanings of the columns:
col[1] = Loop type (0-3)
col[2] = Number of module arguments that the style requires (1-3)
col[3] = Minimum number of sequential parameters passed to the callback
col[4] = Name of the callback parameter where to place each parameter name
col[5] = Name of the callback parameter where to place each parameter value
col[6] = Argument in the modifier's invocation that will override `col[4]`
col[7] = Argument in the modifier's invocation that will override `col[5]`
A value of `-1` indicates that no meaningful value is stored (i.e. `nil`)
]]--
local mapping_styles = {
names_and_values = { 3, 2, 2, 1, 2, -1, -1 },
values_and_names = { 3, 2, 2, 2, 1, -1, -1 },
values_only = { 1, 2, 1, -1, 1, -1, -1 },
names_only = { 2, 2, 1, 1, -1, -1, -1 },
names_and_values_as = { 3, 4, 0, -1, -1, 2, 3 },
names_only_as = { 2, 3, 0, -1, -1, 2, -1 },
values_only_as = { 1, 3, 0, -1, -1, -1, 2 },
blindly = { 0, 2, 0, -1, -1, -1, -1 }
}
-- Memory slots (functions and modifiers MUST avoid these names)
local memoryslots = {
h = 'header',
f = 'footer',
i = 'itersep',
l = 'lastsep',
n = 'ifngiven',
p = 'pairsep',
s = 'oxfordsep'
}
-- Possible trimming modes for the `parsing` modifier
local trim_parse_opts = {
trim_none = { false, false },
trim_positional = { false, true },
trim_named = { true, false },
trim_all = { true, true }
}
-- Possible string modes for the iteration separator in the `parsing` and
-- `reinterpreting` modifiers
local isep_parse_opts = {
splitter_pattern = false,
splitter_string = true
}
-- Possible string modes for the key-value separator in the `parsing` and
-- `reinterpreting` modifiers
local psep_parse_opts = {
setter_pattern = false,
setter_string = true
}
-- Possible position references for the `splicing` modifier
local position_references = {
add_nothing = 0,
add_smallest_number = 1,
add_last_of_sequence = 2,
add_largest_number = 3
}
-- Possible modes for the `reassigning` modifier
local a_modes = {
transfer = 0,
clone = 1,
rename = 2,
copy = 3,
sacrifice = 4,
provide = 5,
spare = 7
}
-- Functions and modifiers MUST avoid these names too: `here`, `in_substack`,
-- `let`, `expose`, `use`, `with_flushed_glue`, `without_flushed_glue`
-- `without_sorting`
--[[ Private constants ]]--
---------------------------
-- Hard-coded name of the module (to avoid going through `frame:getTitle()`)
local modulename = 'Module:Params'
-- The functions listed here declare that they don't need the
-- `frame:getParent().args` metatable to be copied into a regular table; if
-- they are modifiers they also guarantee that they will make their own
-- (modified) copy available
local refparams = {
call_for_each_group = true,
combining = true,
combining_by_calling = true,
combining_values = true,
concat_and_call = true,
concat_and_invoke = true,
concat_and_magic = true,
count = true,
grouping_by_calling = true,
mixing_names_and_values = true,
keeping_at_most = true,
renaming_by_mixing = true,
renaming_to_sequence = true,
renaming_to_uppercase = true,
renaming_to_lowercase = true,
shifting = true,
splicing = true,
value_of = true,
with_name_matching = true
}
-- Maximum number of numeric parameters that can be filled, if missing (we
-- chose an arbitrary number for this constant; you can discuss about its
-- optimal value at Module talk:Params)
local maxfill = 1024
-- The private table of functions
local library = {}
-- Functions and modifiers that can only be invoked in first position
local static_iface = {}
--[[ Private functions ]]--
---------------------------
-- Create a new context
local function context_new (child_frame, first_fn_name)
local main_frame, tpipe = child_frame:getParent(), { first_fn_name }
for key, val in pairs(child_frame.args) do
if type(key) == 'number' and key > 0 then tpipe[key + 1] = val
else tpipe[key] = val end
end
return {
frame = main_frame,
pipe = tpipe,
oparams = main_frame.args,
firstposonly = static_iface,
iterfunc = pairs,
fnpos = 1,
sorttype = 0,
n_parents = 0,
n_children = 0,
n_available = maxfill
}
end
-- Move to the next action within the user-given list
local function context_iterate (ctx, next_fn_pos, trimmed_fname)
local fname = trimmed_fname or ctx.pipe[next_fn_pos] and
ctx.pipe[next_fn_pos]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
': You must specify a function to call', 0) end
if library[fname] == nil then
if ctx.firstposonly[fname] == nil then error(modulename ..
': The function ‘' .. fname .. '’ does not exist', 0)
else error(modulename .. ': The ‘' .. fname ..
'’ directive can only appear in first position', 0)
end
end
ctx.fnpos = next_fn_pos
return library[fname]
end
-- Main loop
local function main_loop (ctx, start_with)
local fn = start_with
repeat fn = fn(ctx) until not fn
if ctx.n_parents > 0 then error(modulename ..
': One or more ‘merging_substack’ directives are missing', 0) end
if ctx.n_children > 0 then error(modulename ..
', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end
end
-- Load a `setting`-like directive string into the `dest` table
local function set_strings_from_opts (dest, opts, offs)
local cmd
if opts[offs] == nil then return offs - 1 end
cmd = opts[offs]:gsub('%s+', ''):gsub('/+', '/'):match'^/*(.*[^/])'
if cmd == nil then return offs end
local vname, chr
local amap, sep, argc = {}, string.byte('/'), offs + 1
for idx = 1, #cmd do
chr = cmd:byte(idx)
if chr == sep then
for key, val in ipairs(amap) do
dest[val], amap[key] = opts[argc], nil
end
argc = argc + 1
else
vname = memoryslots[string.char(chr)]
if vname == nil then error(modulename ..
', ‘setting’: Unknown slot ‘' .. string.char(chr) .. '’', 0) end
table.insert(amap, vname)
end
end
for key, val in ipairs(amap) do dest[val] = opts[argc] end
return argc
end
-- Add a new stack of parameters to `ctx.children`
local function new_substack (ctx)
local currsnap, newparams = ctx.n_children + 1, {}
if ctx.children == nil then ctx.children = { newparams }
else ctx.children[currsnap] = newparams end
ctx.n_children = currsnap
return newparams
end
-- Parse a raw argument containing a `sortfunctions` directive, or
-- `'without_sorting'`, or `nil`
local function load_sort_opt (raw_arg)
local trarg
if raw_arg ~= nil then trarg = raw_arg:match'^%s*(.*%S)' end
if trarg == nil then return nil, 1, false, nil end
if trarg == 'without_sorting' then return nil, 2, false, nil end
local tmp = sortfunctions[trarg]
if tmp == nil then return nil, 1, false, trarg end
return tmp or nil, 2, true, nil
end
-- Parse optional user arguments of type `...|[let/use]|[...]|[let/use]|[...]|
-- [number of additional parameters]|[parameter 1]|[parameter 2]|[...]`
local function load_child_opts (src, start_from, append_after, params)
local tnamed, tmp1, tmp2
local pin, tbl, mem = start_from, {}, {}
while src[pin] ~= nil and src[pin + 1] ~= nil do
tmp1 = src[pin]:match'^%s*(.*%S)'
if tmp1 == 'let' and src[pin + 2] ~= nil then
tmp1 = get_param_name(src[pin + 1])
tbl[tmp1], pin = src[pin + 2], pin + 3
--[[
elseif tmp1 == 'expose' then
tmp1 = get_param_name(src[pin + 1])
tmp2 = params[tmp1]
mem[tmp1], tbl[tmp1], pin = tmp2, tmp2, pin + 2
]]--
elseif tmp1 == 'use' and src[pin + 2] ~= nil then
tmp1 = get_param_name(src[pin + 2])
tmp2 = params[tmp1]
mem[tmp1], tbl[get_param_name(src[pin + 1])], pin =
tmp2, tmp2, pin + 3
else break end
end
local tnew = copy_or_ref_table(params, next(mem) == nil)
for key in pairs(mem) do tnew[key] = nil end
if pin ~= start_from then tnamed, tbl = tbl, {} end
tmp1 = tonumber(src[pin])
if tmp1 ~= nil and math.floor(tmp1) == tmp1 then
if tmp1 < 0 then tmp1 = -1 end
tmp2 = append_after - pin
for idx = pin + 1, pin + tmp1 do tbl[idx + tmp2] = src[idx] end
pin = pin + tmp1 + 1
end
if tnamed ~= nil then
for key, val in pairs(tnamed) do tbl[key] = val end
end
return tbl, pin, tnew, mem
end
-- Load the optional arguments of some of the `mapping_*` and `renaming_*`
-- class of modifiers
local function load_callback_opts (src, start_from, default_style, params)
local style, shf
local tmp = src[start_from + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then style, shf = default_style, start_from - 1
else shf = start_from end
local n_exist, karg, varg = style[3], style[4], style[5]
tmp = style[6]
if tmp > -1 then
karg = src[tmp + shf]:match'^%s*(.-)%s*$'
if karg == '0' or karg:find'^%-?[1-9]%d*$' ~= nil then
karg = tonumber(karg)
n_exist = math.max(n_exist, karg)
end
end
tmp = style[7]
if tmp > -1 then
varg = src[tmp + shf]:match'^%s*(.-)%s*$'
if varg == '0' or varg:find'^%-?[1-9]%d*$' ~= nil then
varg = tonumber(varg)
n_exist = math.max(n_exist, varg)
end
end
tmp = style[1]
local dest, argc, tnew, mem = load_child_opts(src, style[2] + shf,
n_exist, params)
if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then
tmp = tmp - 2 end
if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then
tmp = tmp - 1 end
return dest, argc, tmp, karg, varg, tnew, mem
end
-- Parse the arguments of some of the `mapping_*` and `renaming_*` class of
-- modifiers
local function load_replace_args (opts, offs, whoami)
if opts[offs + 1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No pattern string was given', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘' .. whoami .. '’: No replacement string was given', 0) end
local tn, flg
local ptn, repl, nmax, argc =
opts[offs + 1], opts[offs + 2], tonumber(opts[offs + 3]), 3
if nmax ~= nil then argc = 4
elseif opts[offs + 3] ~= nil then
tn = opts[offs + 3]:match'^%s*(.*%S)'
if tn == nil then argc = 4 end
end
if tn == nil and opts[offs + argc] ~= nil then
tn = opts[offs + argc]:match'^%s*(.*%S)'
end
if tn ~= nil then
flg = mkeywords[tn]
if flg ~= nil then tn = nil end
end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg, offs + argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl), tn
end
-- Parse the arguments of the `with_*_matching` class of modifiers
local function load_pattern_args (opts, offs, whoami)
local tn, kwid
local ptns, arg, state, nptns, idx = {}, opts[offs + 1], 0, 0, offs + 2
while arg ~= nil do
if state == 0 then
nptns, state = nptns + 1, -1
ptns[nptns] = { arg, false, false }
else
tn = arg:match'^%s*(.*%S)'
kwid = tn and mkeywords[tn]
if kwid == nil or (state > 0 and kwid > 0) then break
else
state = kwid
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
arg, idx = opts[idx], idx + 1
end
if state == 0 then error(modulename ..
', ‘' .. whoami .. '’: No pattern was given', 0) end
return ptns, nptns, idx - 1, kwid == nil and tn or nil
end
-- Load the optional arguments of the `parsing`, `reinterpreting` and
-- `evaluating` modifiers
local function load_parse_opts (opts, offs, isp, psp)
local tn, tmp
local optslots, noptslots, argc, trimn, trimu, iplain, pplain =
{ true, true, true }, 3, offs, true, false, true, true
repeat
noptslots, tmp = noptslots - 1, opts[argc]
tn = tmp and tmp:match'^%s*(.*%S)'
if tn == nil then break end
if optslots[1] ~= nil and trim_parse_opts[tn] ~= nil then
tmp = trim_parse_opts[tn]
trimn, trimu, optslots[1] = tmp[1], tmp[2], nil
elseif optslots[2] ~= nil and isep_parse_opts[tn] ~= nil then
argc = argc + 1
iplain, isp, optslots[2] = isep_parse_opts[tn],
opts[argc], nil
elseif optslots[3] ~= nil and psep_parse_opts[tn] ~= nil then
argc = argc + 1
pplain, psp, optslots[3] = psep_parse_opts[tn],
opts[argc], nil
else break end
argc, tn = argc + 1, nil
until noptslots < 1
return isp, iplain, psp, pplain, trimn, trimu, argc, tn
end
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
end
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
margs[karg] = key
tbl[key] = fn()
end
end,
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg], margs[varg] = key, val
tbl[key] = fn()
end
end
}
-- Private table for `map_names()`
local name_thieves = {
[0] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg], rargs[varg] = key, val
steal_if_renamed(val, tbl, key, cache, fn())
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numeric
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local prefix, gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
if type(key) == 'string' then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else prefix, gid = '', key end
if groups[gid] == nil then groups[gid] = {} end
if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then
prefix = tonumber(prefix)
if prefix < 1 then prefix = prefix - 1 end
end
groups[gid][prefix] = val
end
return groups
end
-- Split into parts a string containing the `$#` and `$@` placeholders and
-- return the information as a skeleton table, a canvas table and a length
local function parse_placeholder_string (target)
local skel, canvas, idx, s_pos, e_pos =
{}, {}, 1, 1, string.find(target, '%$[@#]', 1, false)
while e_pos ~= nil do
canvas[idx], skel[idx + 1] =
target:sub(s_pos, e_pos - 1),
target:sub(e_pos, e_pos + 1) == '$@'
idx, s_pos = idx + 2, e_pos + 2
e_pos = string.find(target, '%$[@#]', s_pos, false)
end
if (s_pos > target:len()) then idx = idx - 1
else canvas[idx] = target:sub(s_pos) end
return skel, canvas, idx
end
-- Populate a table by parsing a parameter string (heavy lifting for `parsing`,
-- `reinterpreting` and `evaluating`)
local function parse_parameter_string (tbl, str, isp, ipl, psp, ppl, trn, tru)
local key, val, spos1, spos2, pos1, pos2
local pos3, idx, lenplone = 0, 1, #str + 1
if isp == nil or isp == '' then
if psp == nil or psp == '' then
if tru then tbl[idx] = str:match'^%s*(.-)%s*$'
else tbl[idx] = str end
return
end
spos1, spos2 = str:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = str:match'^%s*(.-)%s*$'
else val = str end
else
key = get_param_name(str:sub(1, spos1 - 1))
val = str:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
return
end
if psp == nil or psp == '' then
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
if tru then val = val:match'^%s*(.-)%s*$' end
tbl[idx], idx = val, idx + 1
until pos2 == nil
return
end
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
spos1, spos2 = val:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = val:match'^%s*(.-)%s*$' end
idx = idx + 1
else
key = get_param_name(val:sub(1, spos1 - 1))
val = val:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
until pos2 == nil
return
end
-- Heavy lifting for `snapshotting` and `remembering`
local function make_child (ctx, src, whoami)
local len = tonumber(ctx.pipe[ctx.fnpos + 1])
if len == nil or len == 0 then
local stack = new_substack(ctx)
for key, val in pairs(src) do stack[key] = val end
return len == nil and 1 or 2
end
if len < 0 or math.floor(len) ~= len then error(modulename .. ', ‘' ..
whoami .. '’: The number of parameters to copy must be an integer greater than zero', 0) end
copy_table_maxn(new_substack(ctx), src, len)
return 2
end
-- Heavy lifting for `setting_by_flushing`, `combining` and `combining_values`
local function set_strings_from_substack (ctx, dest, whoami)
if ctx.n_children < 1 then error(modulename ..
', ‘' .. whoami .. '’: There are no substacks to flush', 0) end
local currsnap = ctx.n_children
local stack = ctx.children[currsnap]
for key, val in pairs(memoryslots) do
if stack[key] ~= nil then dest[val] = stack[key] end
end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
end
-- Heavy lifting for `combining` and `combining_values`
local function combine_parameters (ctx, keyval_fn, whoami)
-- NOTE: `ctx.params` might be the original metatable! This function
-- MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No parameter name was provided', 0) end
local argc
local tbl, vars = ctx.params, {}
local sortfn, ivar0, dosort, tmp = load_sort_opt(opts[offs + 2])
if ivar0 == 2 then
tmp = opts[offs + 3] ~= nil and opts[offs + 3]:match'^%s*(.*%S)'
end
ivar0 = ivar0 + offs
if tmp == 'with_flushed_glue' then
ivar0 = ivar0 + 1
argc = set_strings_from_opts(vars, opts, ivar0 + 1)
set_strings_from_substack(ctx, vars, whoami)
else
if tmp == 'without_flushed_glue' then ivar0 = ivar0 + 1 end
argc = set_strings_from_opts(vars, opts, ivar0 + 1)
end
if argc < ivar0 then error(modulename ..
', ‘' .. whoami .. '’: No setting directive was given', 0) end
if next(tbl) == nil then
if vars.ifngiven ~= nil then ctx.params =
{ [get_param_name(opts[offs + 1])] = vars.ifngiven }
elseif tbl == ctx.oparams then ctx.params = {} end
return argc + 1
end
local cache, len
if dosort then
local words
cache, words, len, tmp = get_sorted_key_list(tbl, sortfn)
for idx = 1, tmp do cache[len + idx] = words[idx] end
len = len + tmp
else
cache, len = {}, 1
for key in pairs(tbl) do cache[len], len = key, len + 1 end
len = len - 1
end
local pmap, nss, kvs, pps =
{}, 0, vars.pairsep or '', vars.itersep or ''
for idx = 1, len do
tmp, pmap[nss + 1] = cache[idx], pps
pmap[nss + 2] = keyval_fn(tmp, tbl[tmp], kvs)
nss = nss + 2
end
tmp = vars.oxfordsep or vars.lastsep
if tmp ~= nil and nss > 4 then pmap[nss - 1] = tmp
elseif nss > 2 and vars.lastsep ~= nil then
pmap[nss - 1] = vars.lastsep
end
pmap[1] = vars.header or ''
if vars.footer ~= nil then pmap[nss + 1] = vars.footer end
ctx.params = { [get_param_name(opts[offs + 1])] = table.concat(pmap) }
return argc + 1
end
-- Concatenate the numeric keys from the table of parameters to the numeric
-- keys from the table of options; non-numeric keys from the table of options
-- will prevail over colliding non-numeric keys from the table of parameters
local function concat_params (ctx, offs)
local tbl, retval, cache, nmax = ctx.params, {}, {}, 0
for key, val in pairs(ctx.pipe) do
if type(key) == 'number' then
if key < 1 then cache[key] = val
elseif key > offs then cache[key - offs] = val end
if key > nmax then nmax = key end
else cache[key] = val end
end
nmax = nmax - offs
if ctx.subset == 1 then
-- We need only the sequence
for key, val in ipairs(tbl) do retval[key + nmax] = val end
else
if ctx.subset == -1 then
for key in ipairs(tbl) do tbl[key] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
retval[key + nmax] = val
else retval[key] = val end
end
end
for key, val in pairs(cache) do retval[key] = val end
return retval
end
-- Flush the parameters by calling a custom function for each value (after this
-- function has been invoked `ctx.params` will be no longer usable)
local function flush_params (ctx, fn)
local tmp
local tbl = ctx.params
if ctx.subset == -1 then
for key, val in ipairs(tbl) do tbl[key] = nil end
elseif ctx.subset == 1 then
if ctx.pins == nil then
for key, val in ipairs(tbl) do fn(key, val) end
return
end
tmp = {}
for key, val in ipairs(tbl) do tmp[key] = val end
tbl = tmp
end
if ctx.pins ~= nil then
local marker = ctx.sorttype < 1 and ctx.subset ~= -1 or nil
for idx = 1, #ctx.pins do
tmp = ctx.pins[idx]
if tbl[tmp] ~= nil then
fn(tmp, tbl[tmp])
tbl[tmp] = marker
end
end
if ctx.subset == 1 then
for key, val in ipairs(tbl) do
if val ~= true then fn(key, val) end
end
return
end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw =
get_sorted_key_list(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
return
end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
return
end
if ctx.subset == -1 or ctx.pins == nil then
for key, val in ipairs(tbl) do
fn(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn(key, val) end
return
end
for key, val in ipairs(tbl) do
if val ~= true then fn(key, val) end
tbl[key] = nil
end
for key, val in pairs(tbl) do
if val ~= true then fn(key, val) end
end
end
-- Flush the parameters by calling one of two custom functions for each value
-- (after this function has been invoked `ctx.params` will be no longer usable)
local function mixed_flush_params (ctx, fn_seq, fn_oth)
if ctx.subset == 1 then
flush_params(ctx, fn_seq)
return
end
if ctx.subset == -1 then
flush_params(ctx, fn_oth)
return
end
local tbl = ctx.params
if ctx.pins == nil and ctx.sorttype < 1 then
for key, val in ipairs(tbl) do
fn_seq(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn_oth(key, val) end
return
end
local tseq = {}
for key, val in ipairs(tbl) do tseq[key] = val end
if ctx.pins ~= nil then
local tmp
local marker = ctx.sorttype < 1 or nil
for idx = 1, #ctx.pins do
tmp = ctx.pins[idx]
if tseq[tmp] ~= nil then
fn_seq(tmp, tbl[tmp])
tbl[tmp], tseq[tmp] = nil, marker
elseif tbl[tmp] ~= nil then
fn_oth(tmp, tbl[tmp])
tbl[tmp] = nil
end
end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw =
get_sorted_key_list(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do
fn_oth(words[idx], tbl[words[idx]])
end
end
for idx = 1, nn do
if tseq[nums[idx]] ~= nil then
fn_seq(nums[idx], tseq[nums[idx]])
else fn_oth(nums[idx], tbl[nums[idx]]) end
end
if ctx.sorttype ~= 2 then
for idx = 1, nw do
fn_oth(words[idx], tbl[words[idx]])
end
end
return
end
for key, val in ipairs(tseq) do
if val ~= true then
fn_seq(key, val)
tbl[key] = nil
end
end
for key, val in pairs(tbl) do fn_oth(key, val) end
end
-- Finalize and return a concatenated list
local function finalize_and_return_concatenated_list (ctx, lst, len, modsize)
if len > 0 then
local tmp = ctx.oxfordsep or ctx.lastsep
if tmp ~= nil and len > modsize * 2 then
lst[len - modsize + 1] = tmp
elseif len > modsize and ctx.lastsep ~= nil then
lst[len - modsize + 1] = ctx.lastsep
end
lst[1] = ctx.header or ''
if ctx.footer ~= nil then lst[len + 1] = ctx.footer end
ctx.text = table.concat(lst)
else ctx.text = ctx.ifngiven or '' end
end
--- ---
--- PUBLIC ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Modifiers ]]--
-------------------
-- Syntax: #invoke:params|sequential|pipe to
library.sequential = function (ctx)
if ctx.subset == 1 then error(modulename ..
': The ‘sequential’ directive has been provided more than once', 0) end
if ctx.subset == -1 then error(modulename ..
': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end
if ctx.sorttype > 0 then error(modulename ..
': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end
ctx.iterfunc, ctx.subset = ipairs, 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|non-sequential|pipe to
library['non-sequential'] = function (ctx)
if ctx.subset == -1 then error(modulename ..
': The ‘non-sequential’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end
ctx.iterfunc, ctx.subset = pairs, -1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|all_sorted|pipe to
library.all_sorted = function (ctx)
if ctx.sorttype == 1 then error(modulename ..
': The ‘all_sorted’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 2 then error(modulename ..
': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end
ctx.sorttype = 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|reassorted|pipe to
library.reassorted = function (ctx)
if ctx.sorttype == 2 then error(modulename ..
': The ‘reassorted’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end
ctx.sorttype = 2
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|pinned_until|sentinel|[parameter name 1]|[parameter
-- name 2]|...|parameter name N|sentinel|pipe to
library.pinned_until = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘pinned_until’: No sentinel was provided', 0) end
local tmp, bucket, curr, ncurr
local sntl, idx = opts[offs + 1]:match'^%s*(.-)%s*$', 2
if ctx.pin_bucket == nil then
bucket, curr, ncurr = {}, {}, 0
ctx.pin_bucket, ctx.pins = bucket, curr
else bucket, curr, ncurr = ctx.pin_bucket, ctx.pins, ctx.npins end
while opts[offs + idx] ~= nil do
tmp = opts[offs + idx]:match'^%s*(.-)%s*$'
if tmp == sntl then
if idx == 2 then error(modulename ..
', ‘pinned_until’: No parameters to pin were provided', 0) end
ctx.npins = ncurr + idx - 2
return context_iterate(ctx, offs + idx + 1)
end
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
if bucket[tmp] then error(modulename ..
', ‘pinned_until’: Duplicate pinned parameter ‘' .. tostring(tmp) .. '’', 0) end
curr[ncurr + idx - 1], bucket[tmp], idx = tmp, true, idx + 1
end
error(modulename .. ', ‘pinned_until’: Missing sentinel in position #' .. tostring(idx), 0)
end
-- Syntax: #invoke:params|setting|directives|...|pipe to
library.setting = function (ctx)
local new_offs = set_strings_from_opts(ctx, ctx.pipe, ctx.fnpos + 1)
if new_offs - ctx.fnpos < 2 then error(modulename ..
', ‘setting’: No directive was given', 0) end
return context_iterate(ctx, new_offs + 1)
end
-- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to
library.scoring = function (ctx)
local opts, offs, retval = ctx.pipe, ctx.fnpos, 0
if opts[offs + 1] == nil then error(modulename ..
', ‘scoring’: No parameter name was provided', 0) end
for _ in pairs(ctx.params) do retval = retval + 1 end
local tn = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if tn == 'in_substack' then
new_substack(ctx)[get_param_name(opts[offs + 1])] =
tostring(retval)
return context_iterate(ctx, offs + 3)
end
ctx.params[get_param_name(opts[offs + 1])] = tostring(retval)
return tn == 'here' and context_iterate(ctx, offs + 3) or
context_iterate(ctx, offs + 2, tn)
end
-- Syntax: #invoke:params|squeezing|pipe to
library.squeezing = function (ctx)
local store, indices, tbl, newlen = {}, {}, ctx.params, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
newlen = newlen + 1
indices[newlen], store[key], tbl[key] = key, val, nil
end
end
table.sort(indices)
for idx = 1, newlen do tbl[idx] = store[indices[idx]] end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|filling_the_gaps|pipe to
library.filling_the_gaps = function (ctx)
local newval, tbl, tmp, nmin, nmax, nnums =
ctx.pipe[ctx.fnpos + 1], ctx.params, {}, 1, nil, -1
if newval == nil then error(modulename ..
', ‘filling_the_gaps’: No value was provided', 0) end
for key, val in pairs(tbl) do
if type(key) == 'number' then
if nmax == nil then
if key < nmin then nmin = key end
nmax = key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
tmp[key], nnums = val, nnums + 1
end
end
if nmax ~= nil and nmax - nmin > nnums then
ctx.n_available = ctx.n_available + nmin + nnums - nmax
if ctx.n_available < 0 then error(modulename ..
', ‘filling_the_gaps’: It is possible to fill at most ' .. tostring(maxfill) .. ' parameters', 0) end
for idx = nmin, nmax do tbl[idx] = newval end
for key, val in pairs(tmp) do tbl[key] = val end
end
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|clearing|pipe to
library.clearing = function (ctx)
local tbl, numerics = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key], tbl[key] = val, nil
end
end
for key, val in ipairs(numerics) do tbl[key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local lcut = tonumber(opts[offs + 1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cutting’: Left cut must be an integer number', 0) end
local rcut = tonumber(opts[offs + 2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cutting’: Right cut must be an integer number', 0) end
local tbl = ctx.params
local len = #tbl
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
local tot = lcut + rcut
if tot > 0 then
local cache = {}
if tot >= len then
for key in ipairs(tbl) do tbl[key] = nil end
tot = len
else
for idx = len - rcut + 1, len do tbl[idx] = nil end
for idx = 1, lcut do tbl[idx] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
if key > len then cache[key - tot] = val
else cache[key - lcut] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local lcut = tonumber(opts[offs + 1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cropping’: Left crop must be an integer number', 0) end
local rcut = tonumber(opts[offs + 2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cropping’: Right crop must be an integer number', 0) end
local tbl = ctx.params
local nmin, nmax
for key in pairs(tbl) do
if type(key) == 'number' then
if nmin == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
if nmin ~= nil then
local len = nmax - nmin + 1
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
if lcut + rcut - len > -1 then
for key in pairs(tbl) do
if type(key) == 'number' then tbl[key] = nil end
end
elseif lcut + rcut > 0 then
for idx = nmax - rcut + 1, nmax do tbl[idx] = nil end
for idx = nmin, nmin + lcut - 1 do tbl[idx] = nil end
local lshift = nmin + lcut - 1
if lshift > 0 then
for idx = lshift + 1, nmax do
tbl[idx - lshift], tbl[idx] =
tbl[idx], nil
end
end
end
end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|purging|start offset|length|pipe to
library.purging = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local idx = tonumber(opts[offs + 1])
if idx == nil or math.floor(idx) ~= idx then error(modulename ..
', ‘purging’: Start offset must be an integer number', 0) end
local len = tonumber(opts[offs + 2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘purging’: Length must be an integer number', 0) end
local tbl = ctx.params
if len < 1 then
len = len + table.maxn(tbl)
if idx > len then return context_iterate(ctx, offs + 3) end
len = len - idx + 1
end
ctx.params = copy_table_reduced(tbl, idx, len)
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local last = tonumber(opts[offs + 1])
if last == nil or math.floor(last) ~= last then error(modulename ..
', ‘backpurging’: Start offset must be an integer number', 0) end
local len = tonumber(opts[offs + 2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘backpurging’: Length must be an integer number', 0) end
local idx
local tbl = ctx.params
if len > 0 then idx = last - len + 1
else
for key in pairs(tbl) do
if type(key) == 'number' and (idx == nil or
key < idx) then idx = key end
end
if idx == nil then return context_iterate(ctx, offs + 3) end
idx = idx - len
if last < idx then return context_iterate(ctx, offs + 3) end
len = last - idx + 1
end
ctx.params = copy_table_reduced(ctx.params, idx, len)
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|shifting|addend|pipe to
library.shifting = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local nshift = tonumber(ctx.pipe[ctx.fnpos + 1])
if nshift == nil or nshift == 0 or math.floor(nshift) ~= nshift then
error(modulename .. ', ‘shifting’: A non-zero integer number must be provided', 0) end
local tbl = {}
for key, val in pairs(ctx.params) do
if type(key) == 'number' then tbl[key + nshift] = val
else tbl[key] = val end
end
ctx.params = tbl
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|reversing_numeric_names|pipe to
library.reversing_numeric_names = function (ctx)
local tbl, numerics, nmax = ctx.params, {}, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key], tbl[key] = val, nil
if key > nmax then nmax = key end
end
end
for key, val in pairs(numerics) do tbl[nmax - key + 1] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|pivoting_numeric_names|pipe to
--[[
library.pivoting_numeric_names = function (ctx)
local tbl = ctx.params
local shift = #tbl + 1
if shift < 2 then return library.reversing_numeric_names(ctx) end
local tmp = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then tmp[key], tbl[key] = val, nil end
end
for key, val in pairs(tmp) do tbl[shift - key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
]]--
-- Syntax: #invoke:params|mirroring_numeric_names|pipe to
--[[
library.mirroring_numeric_names = function (ctx)
local nmax, nmin
local tbl, tmp = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
tmp[key], tbl[key] = val, nil
if nmax == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
for key, val in pairs(tmp) do tbl[nmax + nmin - key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
]]--
-- Syntax: #invoke:params|swapping_numeric_names|pipe to
--[[
library.swapping_numeric_names = function (ctx)
local tmp
local tbl, cache, nsize = ctx.params, {}, 1
for key in pairs(tbl) do
if type(key) == 'number' then
cache[nsize], nsize = key, nsize + 1
end
end
table.sort(cache)
for idx = math.floor((nsize - 1) / 2), 1, -1 do
tmp = tbl[cache[idx] ]
tbl[cache[idx] ] = tbl[cache[nsize - idx] ]
tbl[cache[nsize - idx] ] = tmp
end
return context_iterate(ctx, ctx.fnpos + 1)
end
]]--
-- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function (ctx)
local sortfn
local opts, offs = ctx.pipe, ctx.fnpos
local tn = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tn ~= nil then sortfn = sortfunctions[tn] end
if sortfn then table.sort(ctx.params, sortfn)
else table.sort(ctx.params) end -- i.e. either `false` or `nil`
if sortfn == nil then return context_iterate(ctx, offs + 1, tn) end
return context_iterate(ctx, offs + 2)
end
-- Syntax: #invoke:params|splicing|[add to position]|position|increment|
-- [number of elements to write]|...|pipe to
library.splicing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp2, argc, pos, refp
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local tmp1 = opts[offs + 1]
if tmp1 ~= nil then
tmp2 = tonumber(tmp1)
if tmp2 == nil or math.floor(tmp2) ~= tmp2 then
pos, argc, tmp2 = tonumber(opts[offs + 2]), offs + 4,
tmp1:match'^%s*(.*%S)'
if tmp2 ~= nil then
refp = position_references[tmp2]
if refp == nil then error(modulename ..
', ‘splicing’: ‘' .. tostring(tmp2) .. '’ is not a valid first argument', 0) end
else refp = 0 end
else pos, argc, refp = tmp2, offs + 3, 0 end
else pos, argc, refp = tonumber(opts[offs + 2]), offs + 4, 0 end
if pos == nil or math.floor(pos) ~= pos then error(modulename ..
', ‘splicing’: The position must be an integer number', 0) end
local len = tonumber(opts[argc - 1])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘splicing’: The increment must be an integer number', 0) end
local insn = tonumber(opts[argc])
if len == 0 and (insn == nil or insn < 1) then error(modulename ..
', ‘splicing’: When the increment is zero the number of elements to write cannot be zero', 0) end
if refp == 2 then
for _ in ipairs(tbl) do pos = pos + 1 end
refp = 0
end
tmp1, tmp2 = nil, nil
if refp ~= 0 or len ~= 0 then
for key, val in pairs(tbl) do
if type(key) == 'number' then
if tmp1 == nil then tmp1, tmp2 = key, key
elseif key < tmp1 then tmp1 = key
elseif key > tmp2 then tmp2 = key end
end
end
end
if tmp2 == nil then len = 0
elseif refp == 3 then pos = pos + tmp2
elseif refp == 1 then pos = pos + tmp1 end
if len > 0 and pos + len > tmp1 and pos <= tmp2 then
tbl = copy_table_expanded(tbl, pos, len)
elseif len < 0 and pos - len > tmp1 and pos <= tmp2 then
tbl = copy_table_reduced(tbl, pos, -len)
else tbl = copy_or_ref_table(tbl, tbl ~= ctx.oparams) end
ctx.params = tbl
if insn == nil or insn < 0 or math.floor(insn) ~= insn then
return context_iterate(ctx, argc)
end
tmp1 = argc - offs - pos + 1
for key = pos, pos + insn - 1 do tbl[key] = opts[offs + key + tmp1] end
return context_iterate(ctx, argc + insn + 1)
end
-- Syntax: #invoke:params|imposing|name|value|pipe to
library.imposing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘imposing’: Missing parameter name to impose', 0) end
ctx.params[get_param_name(opts[offs + 1])] = opts[offs + 2]
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = get_param_name(opts[offs + 1])
if ctx.params[key] == nil then ctx.params[key] = opts[offs + 2] end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|reassigning|source|destination|[mode]|pipe to
library.reassigning = function (ctx)
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘reassigning’: Missing source parameter', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘reassigning’: Missing destination parameter', 0) end
local mode, argc
local src, tn = get_param_name(opts[offs + 1]),
opts[offs + 3] ~= nil and opts[offs + 3]:match'^%s*(.*%S)'
local val = tbl[src]
if tn ~= nil then mode = a_modes[tn] end
if mode == nil then mode, argc = 0, offs + 3
else argc, tn = offs + 4, nil end
if val == nil and mode > 1 then
return context_iterate(ctx, argc, tn)
end
local dest = get_param_name(opts[offs + 2])
local tmp = tbl[dest] == nil
if mode % 2 == 0 or (mode == 7 and tmp) then tbl[src] = nil end
if tmp or mode < 4 then tbl[dest] = val end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘discarding’: Missing parameter name to discard', 0) end
local len = tonumber(opts[offs + 2])
if len == nil then
ctx.params[get_param_name(opts[offs + 1])] = nil
return context_iterate(ctx, offs + 2)
end
local key = tonumber(opts[offs + 1])
if key == nil or math.floor(key) ~= key then error(modulename ..
', ‘discarding’: A range was provided, but the initial parameter name is not an integer number', 0) end
if len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘discarding’: A range can only be an integer number greater than zero', 0) end
for idx = key, key + len - 1 do ctx.params[idx] = nil end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|excluding_non-numeric_names|pipe to
library['excluding_non-numeric_names'] = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) ~= 'number' then tmp[key] = nil end
end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|excluding_numeric_names|pipe to
library.excluding_numeric_names = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) == 'number' then tmp[key] = nil end
end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|with_name_matching|target 1|[plain flag 1]|[or]|
-- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_name_matching = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp, ptn
local tbl, newparams, opts, offs = ctx.params, {}, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_name_matching')
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
tmp = ptn[1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
newparams[tmp] = tbl[tmp]
else
for key, val in pairs(tbl) do
if tostring(key):find(ptn[1], 1, ptn[2]) then
newparams[key] = val
end
end
end
end
ctx.params = newparams
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]|
-- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_name_not_matching = function (ctx)
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_name_not_matching')
if nptns == 1 and targets[1][3] then
local tmp = targets[1][1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tbl[tonumber(tmp)] = nil
else tbl[tmp] = nil end
return context_iterate(ctx, argc, tn)
end
local yesmatch, ptn
for key in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if tostring(key) ~= ptn[1] then
yesmatch = false
break
end
elseif not tostring(key):find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]|
-- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_value_matching = function (ctx)
local nomatch, ptn
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_value_matching')
for key, val in pairs(tbl) do
nomatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val == ptn[1] then
nomatch = false
break
end
elseif val:find(ptn[1], 1, ptn[2]) then
nomatch = false
break
end
end
if nomatch then tbl[key] = nil end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]|
-- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_value_not_matching = function (ctx)
local yesmatch, ptn
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_value_not_matching')
for key, val in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val ~= ptn[1] then
yesmatch = false
break
end
elseif not val:find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|keeping_at_most|number of parameters to pick|pipe to
library.keeping_at_most = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local len = tonumber(ctx.pipe[ctx.fnpos + 1])
if len == nil or len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘keeping_at_most’: The number of parameters to keep must be an integer greater than zero', 0) end
ctx.params = copy_table_maxn({}, ctx.params, len)
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|trimming_values|pipe to
library.trimming_values = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|mapping_to_lowercase|pipe to
library.mapping_to_lowercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:lower() end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|mapping_to_uppercase|pipe to
library.mapping_to_uppercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:upper() end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|mapping_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.values_only,
ctx.params)
local model = { title = tname, args = margs }
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_invoking|module name|function name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘mapping_by_invoking’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 2, mapping_styles.values_only,
ctx.params)
local model = { title = 'Module:' .. mname, args = margs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end
value_maps[looptype](tbl, margs, karg, varg, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.values_only,
ctx.params)
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die, tn =
load_replace_args(ctx.pipe, ctx.fnpos, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc, tn) end
local tbl = ctx.params
if flg == 3 then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to
library.mapping_by_mixing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘mapping_by_mixing’: No mixing string was provided', 0) end
local tbl, mix = ctx.params, opts[offs + 1]
if mix == '$#' then
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, offs + 2)
end
local skel, cnv, n_parts = parse_placeholder_string(mix)
for key, val in pairs(tbl) do
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
tbl[key] = table.concat(cnv)
end
return context_iterate(ctx, offs + 2)
end
-- Syntax: #invoke:params|renaming_to_lowercase|pipe to
library.renaming_to_lowercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:lower()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|renaming_to_uppercase|pipe to
library.renaming_to_uppercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:upper()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to
library.renaming_to_sequence = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache, len
local tbl = ctx.params
local sortfn, argc, dosort, tn = load_sort_opt(ctx.pipe[ctx.fnpos + 1])
if dosort then
local words, wl
cache, words, len, wl = get_sorted_key_list(tbl, sortfn)
for idx = 1, len do cache[idx] = tbl[cache[idx]] end
for idx = 1, wl do cache[len + idx] = tbl[words[idx]] end
else
cache, len = {}, 1
for _, val in pairs(tbl) do cache[len], len = val, len + 1 end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + argc, tn)
end
-- Syntax: #invoke:params|renaming_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.names_only,
ctx.params)
local model = { title = tname, args = rargs }
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_invoking|module name|function
-- name|[call style]|[let/use]|[...]|[let/use]|[...]|[number of
-- additional arguments]|[argument 1]|[argument 2]|[...]|[argument
-- N]|pipe to
library.renaming_by_invoking = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘renaming_by_invoking’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 2, mapping_styles.names_only,
ctx.params)
local model = { title = 'Module:' .. mname, args = rargs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘renaming_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end
map_names(tbl, rargs, karg, varg, looptype, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_magic = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.names_only,
ctx.params)
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:callParserFunction(magic, rargs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die, tn =
load_replace_args(ctx.pipe, ctx.fnpos, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc, tn) end
local tbl = ctx.params
if flg == 3 then
ptn = get_param_name(ptn)
local val = tbl[ptn]
if val ~= nil then
tbl[ptn], tbl[get_param_name(repl)] = nil, val
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to
library.renaming_by_mixing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local mix = ctx.pipe[ctx.fnpos + 1]
if mix == nil then error(modulename ..
', ‘renaming_by_mixing’: No mixing string was provided', 0) end
local cache = {}
mix = mix:match'^%s*(.-)%s*$'
if mix == '$@' then
for _, val in pairs(ctx.params) do
cache[get_param_name(val)] = val
end
else
local skel, canvas, n_parts = parse_placeholder_string(mix)
for key, val in pairs(ctx.params) do
for idx = 2, n_parts, 2 do
if skel[idx] then canvas[idx] = val
else canvas[idx] = tostring(key) end
end
cache[get_param_name(table.concat(canvas))] = val
end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|grouping_by_calling|template
-- name|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.grouping_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local tmp, argc, tbl, mem =
load_child_opts(opts, offs + 2, 0, ctx.params)
local gargs = {}
for key, val in pairs(tmp) do
if type(key) == 'number' and key < 1 then gargs[key - 1] = val
else gargs[key] = val end
end
tmp = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tmp == nil then error(modulename ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local groups = make_groups(tbl)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0], model.args = gid, group
groups[gid] = ctx.frame:expandTemplate(model)
end
for key, val in pairs(mem) do groups[key] = val end
ctx.params = groups
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.parsing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘parsing’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc, tn =
load_parse_opts(opts, offs + 2, '|', '=')
parse_parameter_string(ctx.params, opts[offs + 1], isep, iplain, psep,
pplain, trimnamed, trimunnamed)
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim
-- flag]|[iteration delimiter setter]|[...]|[key-value delimiter
-- setter]|[...]|pipe to
library.reinterpreting = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc, tn =
load_parse_opts(opts, offs + 2, '|', '=')
local tbl, tmp = ctx.params, get_param_name(opts[offs + 1])
local str = tbl[tmp]
if str ~= nil then
tbl[tmp] = nil
parse_parameter_string(tbl, str, isep, iplain, psep, pplain,
trimnamed, trimunnamed)
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.evaluating = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘evaluating’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, repos, tn =
load_parse_opts(opts, offs + 2, '!', ':')
if opts[offs + 1]:match'^%s*(.*%S)' == nil then
remove_numeric_keys(opts, offs, repos - offs)
return context_iterate(ctx, offs, tn)
end
local new_opts, cache = {}, {}
parse_parameter_string(cache, opts[offs + 1], isep, iplain, psep,
pplain, trimnamed, trimunnamed)
local shift = #cache + offs - repos + 1
for key, val in pairs(opts) do
if type(key) ~= 'number' or key < offs then new_opts[key] = val
elseif key >= repos then new_opts[key + shift] = val end
end
for key, val in pairs(cache) do
if type(key) ~= 'number' or key < 1 then new_opts[key] = val
else new_opts[key + offs] = val end
end
ctx.pipe = new_opts
return context_iterate(ctx, offs + 1)
end
-- Syntax: #invoke:params|mixing_names_and_values|mixing string|pipe to
library.mixing_names_and_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end
local tmp
local cache, mix_k, mix_v =
{}, opts[offs + 1]:match'^%s*(.-)%s*$', opts[offs + 2]
if mix_k == '$@' and mix_v == '$@' then
for _, val in pairs(ctx.params) do
cache[get_param_name(val)] = val
end
elseif mix_k == '$@' and mix_v == '$#' then
for key, val in pairs(ctx.params) do
cache[get_param_name(val)] = tostring(key)
end
elseif mix_k == '$#' and mix_v == '$#' then
for key in pairs(ctx.params) do cache[key] = tostring(key) end
else
local skel_k, cnv_k, n_parts_k = parse_placeholder_string(mix_k)
local skel_v, cnv_v, n_parts_v = parse_placeholder_string(mix_v)
for key, val in pairs(ctx.params) do
tmp = tostring(key)
for idx = 2, n_parts_k, 2 do
if skel_k[idx] then cnv_k[idx] = val
else cnv_k[idx] = tmp end
end
for idx = 2, n_parts_v, 2 do
if skel_v[idx] then cnv_v[idx] = val
else cnv_v[idx] = tmp end
end
cache[get_param_name(table.concat(cnv_k))] =
table.concat(cnv_v)
end
end
ctx.params = cache
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|combining|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return key .. kvs .. val end,
'combining'
))
end
-- Syntax: #invoke:params|combining_values|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return val end,
'combining_values'
))
end
-- Syntax: #invoke:params|combining_by_calling|template name|new parameter
-- name|pipe to
library.combining_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘combining_by_calling’: No template name was provided', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘combining_by_calling’: No parameter name was provided', 0) end
ctx.params = {
[get_param_name(opts[offs + 2])] = ctx.frame:expandTemplate{
title = tname,
args = ctx.params
}
}
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|combining_by_invoking|module name|function name|new
-- parameter name|pipe to
library.combining_by_invoking = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘combining_by_invoking’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘combining_by_invoking’: No function name was provided', 0) end
if opts[offs + 3] == nil then error(modulename ..
', ‘combining_by_invoking’: No parameter name was provided', 0) end
local model = { title = 'Module:' .. mname, args = ctx.params }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end
ctx.params = {
[get_param_name(opts[offs + 3])] =
tostring(mfunc(ctx.frame:newChild(model)))
}
return context_iterate(ctx, offs + 4)
end
-- Syntax: #invoke:params|combining_by_magic|parser function|new parameter
-- name|pipe to
library.combining_by_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘combining_by_magic’: No parser function was provided', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘combining_by_magic’: No parameter name was provided', 0) end
ctx.params = {
[get_param_name(opts[offs + 2])] =
ctx.frame:callParserFunction(magic, ctx.params)
}
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|snapshotting|[maximum number]|pipe to
library.snapshotting = function (ctx)
return context_iterate(ctx, ctx.fnpos +
make_child(ctx, ctx.params, 'snapshotting'))
end
-- Syntax: #invoke:params|remembering|[maximum number]|pipe to
library.remembering = function (ctx)
return context_iterate(ctx, ctx.fnpos +
make_child(ctx, ctx.oparams, 'remembering'))
end
-- Syntax: #invoke:params|entering_substack|[new]|pipe to
library.entering_substack = function (ctx)
local tbl, opts, offs, ncurrparent =
ctx.params, ctx.pipe, ctx.fnpos, ctx.n_parents + 1
local tn = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if ctx.parents == nil then ctx.parents = { tbl }
else ctx.parents[ncurrparent] = tbl end
ctx.n_parents = ncurrparent
if tn == 'new' then
ctx.params = {}
return context_iterate(ctx, offs + 2)
end
local currsnap = ctx.n_children
if currsnap > 0 then
ctx.params, ctx.children[currsnap], ctx.n_children =
ctx.children[currsnap], nil, currsnap - 1
else
local newparams = {}
for key, val in pairs(tbl) do newparams[key] = val end
ctx.params = newparams
end
return context_iterate(ctx, offs + 1, tn)
end
-- Syntax: #invoke:params|pulling|parameter name|pipe to
library.pulling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘pulling’: No parameter to pull was provided', 0) end
local tmp = ctx.n_parents
local parent = tmp < 1 and ctx.oparams or ctx.parents[tmp]
tmp = get_param_name(opts[offs + 1])
if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|recalling|parameter name|pipe to
library.recalling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘recalling’: No parameter to recall was provided', 0) end
local arg = get_param_name(opts[offs + 1])
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|finding|parameter name|pipe to
--[[
library.finding = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘finding’: No parameter to find was provided', 0) end
local arg = get_param_name(opts[offs + 1])
local parent
for idx = ctx.n_parents, 1, -1 do
parent = ctx.parents[idx]
if parent[arg] ~= nil then
ctx.params[arg] = parent[arg]
return context_iterate(ctx, offs + 2)
end
end
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, offs + 2)
end
]]--
-- Syntax: #invoke:params|picking|number of parameters to pick|pipe to
--[[
library.picking = function (ctx)
local len = tonumber(ctx.pipe[ctx.fnpos + 1])
if len == nil or len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘picking’: The number of parameters to pick must be an integer greater than zero', 0) end
if ctx.n_parents < 1 then copy_table_maxn(ctx.params, ctx.oparams, len)
else copy_table_maxn(ctx.params, ctx.parents[ctx.n_parents], len) end
return context_iterate(ctx, ctx.fnpos + 2)
end
]]--
-- Syntax: #invoke:params|detaching_substack|pipe to
library.detaching_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘detaching_substack’: No substacks have been created', 0) end
local parent = ctx.parents[ncurrparent]
for key in pairs(ctx.params) do parent[key] = nil end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|dropping_substack|pipe to
library.dropping_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘dropping_substack’: No substacks have been created', 0) end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents =
ctx.parents[ncurrparent], nil, ncurrparent - 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|leaving_substack|pipe to
library.leaving_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘leaving_substack’: No substacks have been created', 0) end
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { ctx.params }
else ctx.children[currsnap] = ctx.params end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents, ctx.n_children =
ctx.parents[ncurrparent], nil, ncurrparent - 1, currsnap
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|merging_substack|pipe to
library.merging_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘merging_substack’: No substack has been created', 0) end
local parent, child = ctx.parents[ncurrparent], ctx.params
ctx.params, ctx.parents[ncurrparent], ctx.n_parents = parent, nil,
ncurrparent - 1
for key, val in pairs(child) do parent[key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|flushing|pipe to
library.flushing = function (ctx)
if ctx.n_children < 1 then error(modulename ..
', ‘flushing’: There are no substacks to flush', 0) end
local parent, currsnap = ctx.params, ctx.n_children
for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|setting_by_flushing|pipe to
library.setting_by_flushing = function (ctx)
set_strings_from_substack(ctx, ctx, 'setting_by_flushing')
return context_iterate(ctx, ctx.fnpos + 1)
end
--[[ Functions ]]--
-----------------------------
-- Syntax: #invoke:params|count
library.count = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local retval = 0
for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end
if ctx.subset == -1 then retval = retval - #ctx.params end
ctx.text = retval
return false
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]|
-- [...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘concat_and_call’: No template name was provided', 0) end
ctx.text = ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx, offs + 1)
}
return false
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘concat_and_invoke’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘concat_and_invoke’: No function name was provided', 0) end
local mfunc = require('Module:' .. mname)[fname]
if mfunc == nil then error(modulename ..
', ‘concat_and_invoke’: The function ‘' .. fname .. '’ does not exist', 0) end
ctx.text = mfunc(ctx.frame:newChild{
title = 'Module:' .. mname,
args = concat_params(ctx, offs + 2)
})
return false
end
-- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend
-- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
-- value n]|[...]
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘concat_and_magic’: No parser function was provided', 0) end
ctx.text = ctx.frame:callParserFunction(magic,
concat_params(ctx, offs + 1))
return false
end
-- Syntax: #invoke:params|value_of|parameter name
library.value_of = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘value_of’: No parameter name was provided', 0) end
local val
local key = opts[offs + 1]:match'^%s*(.-)%s*$'
if key == '0' or key:find'^%-?[1-9]%d*$' ~= nil then
key = tonumber(key)
val = ctx.params[key]
-- No worries: #ctx.params is unused when the modifier is in
-- first position (and therefore `ctx.params` is a metatable)
if val ~= nil and (
ctx.subset ~= -1 or key > #ctx.params or key < 1
) and (
ctx.subset ~= 1 or (key <= #ctx.params and key > 0)
) then
ctx.text = (ctx.header or '') .. val ..
(ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
else
val = ctx.params[key]
if ctx.subset ~= 1 and val ~= nil then ctx.text = (ctx.header
or '') .. val .. (ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
end
return false
end
-- Syntax: #invoke:params|list
library.list = function (ctx)
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
flush_params(ctx, function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3], ret[nss + 4], nss =
pps, key, kvs, val, nss + 4
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|list_values
library.list_values = function (ctx)
-- NOTE: `library.coins()` and `library.unique_coins()` rely on us
local ret, nss, pps = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
ret[nss + 1], ret[nss + 2], nss = pps, val, nss + 2
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|list_maybe_with_names
library.list_maybe_with_names = function (ctx)
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
mixed_flush_params(
ctx,
function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3],
ret[nss + 4], nss = pps, '', '', val, nss + 4
end,
function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3],
ret[nss + 4], nss = pps, key, kvs, val, nss + 4
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|for_each|wikitext
library.for_each = function (ctx)
local ret, nss, pps, txt =
{}, 0, ctx.itersep or '', ctx.pipe[ctx.fnpos + 1] or ''
local skel, cnv, n_parts = parse_placeholder_string(txt)
flush_params(ctx, function (key, val)
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
ret[nss + 1], nss = pps, nss + 2
ret[nss] = table.concat(cnv)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]|
-- [...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘call_for_each’: No template name was provided', 0) end
local cargs = copy_table_reduced(opts, 1, offs - 1)
local model, ret, nss, ccs =
{ title = tname, args = cargs }, {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
cargs[1], cargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|
-- [named param n=value n]|[...]
library.invoke_for_each = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘invoke_for_each’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘invoke_for_each’: No function name was provided', 0) end
local iargs = copy_table_reduced(ctx.pipe, 1, offs)
local model = { title = 'Module:' .. mname, args = iargs }
local mfunc, ret, nss, ccs =
require(model.title)[fname], {}, 0, ctx.itersep or ''
if mfunc == nil then error(modulename ..
', ‘invoke_for_each’: The function ‘' .. fname .. '’ does not exist', 0) end
flush_params(ctx, function (key, val)
iargs[1], iargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.magic_for_each = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘magic_for_each’: No parser function was provided', 0) end
local ret, nss, ccs, cargs = {}, 0, ctx.itersep or '',
copy_table_reduced(opts, 1, offs - 1)
flush_params(ctx, function (key, val)
cargs[1], cargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, cargs)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_value = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘call_for_each_value’: No template name was provided', 0) end
local cargs = copy_table_reduced(ctx.pipe, 1, offs)
local model = { title = tname, args = cargs }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
cargs[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each_value|module name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.invoke_for_each_value = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘invoke_for_each_value’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘invoke_for_each_value’: No function name was provided', 0) end
local iargs = copy_table_reduced(ctx.pipe, 1, offs + 1)
local model = { title = 'Module:' .. mname, args = iargs }
local mfunc, ret, nss, ccs =
require(model.title)[fname], {}, 0, ctx.itersep or ''
if mfunc == nil then error(modulename ..
', ‘invoke_for_each_value’: The function ‘' .. fname .. '’ does not exist', 0) end
flush_params(ctx, function (key, val)
iargs[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each_value|parser function|[append 1]|
-- [append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named
-- param n=value n]|[...]
library.magic_for_each_value = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘magic_for_each_value’: No parser function was provided', 0) end
local cargs, ret, nss, ccs =
copy_table_reduced(opts, 1, offs), {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
cargs[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, cargs)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_group|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_group = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local tmp = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tmp == nil then error(modulename ..
', ‘call_for_each_group’: No template name was provided', 0) end
local model = { title = tmp }
local bargs, ret, nss, ccs = {}, {}, 0, ctx.itersep or ''
for key, val in pairs(opts) do
if type(key) ~= 'number' then bargs[key] = val
elseif key > offs then bargs[key - offs - 1] = val
elseif key < 1 then bargs[key - 1] = val end
end
ctx.params = make_groups(ctx.params)
flush_params(ctx, function (gid, group)
for key, val in pairs(bargs) do group[key] = val end
group[0], model.args, ret[nss + 1], nss = gid, group, ccs,
nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
--[[ First-position-only modifiers ]]--
---------------------------------------
-- Syntax: #invoke:params|new|pipe to
static_iface.new = function (child_frame)
local ctx = context_new(child_frame, 'new')
ctx.params = {}
main_loop(ctx, context_iterate(ctx, 2))
return ctx.text
end
--[[ First-position-only functions ]]--
---------------------------------------
-- Syntax: #invoke:params|self
static_iface.self = function (child_frame)
return child_frame:getParent():getTitle()
end
--[[ Public metatable of functions ]]--
---------------------------------------
return setmetatable({}, {
__index = function (_, query)
local fname = query:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
': You must specify a function to call', 0) end
local func = static_iface[fname]
if func ~= nil then return func end
func = library[fname]
if func == nil then error(modulename ..
': The function ‘' .. fname .. '’ does not exist', 0) end
return function (child_frame)
local ctx = context_new(child_frame, fname)
ctx.params = copy_or_ref_table(ctx.oparams,
refparams[fname])
main_loop(ctx, func)
return ctx.text
end
end
})
ed6uj3jkl9sb18ckis1vsieht07yb7c
ಟೆಂಪ್ಲೇಟ್:INRConvert/CurrentRate
10
18422
373871
352181
2026-07-21T22:39:25Z
en>Paine Ellsworth
0
per edit request on talk page - update exchange rate
373871
wikitext
text/x-wiki
<noinclude>{{pp-template}}{{High-use}}{{asof|2026|07|21}}, 1 INR equals '''</noinclude>{{#switch: {{{1|USD}}}
| AED = 0.03845809
| AUD = 0.01509900
| BDT = 1.29185864
| CAD = 0.01487353
| CNY = 0.07100111
| EUR = 0.00915632
| GBP = 0.00784404
| LKR = 3.51101276
| PKR = 2.91422122
| NZD = 0.01834491
| USD = 0.01038425
| JPY = 1.68998778
}}<noinclude>''' USD.
Source: [[XE.com]] reported data at http://www.xe.com/. For USD converter, see http://themoneyconverter.com/INR/USD.aspx.
This page was last edited on {{#time:j F Y|{{REVISIONYEAR}}-{{REVISIONMONTH}}-{{REVISIONDAY2}}}}.</noinclude>
7xpoo7qxyo6ibzn3ovlrfowkd7zysw2
373872
373871
2026-10-28T05:55:28Z
ChiK
1136
1 revision imported from [[:en:Template:INRConvert/CurrentRate]]
373871
wikitext
text/x-wiki
<noinclude>{{pp-template}}{{High-use}}{{asof|2026|07|21}}, 1 INR equals '''</noinclude>{{#switch: {{{1|USD}}}
| AED = 0.03845809
| AUD = 0.01509900
| BDT = 1.29185864
| CAD = 0.01487353
| CNY = 0.07100111
| EUR = 0.00915632
| GBP = 0.00784404
| LKR = 3.51101276
| PKR = 2.91422122
| NZD = 0.01834491
| USD = 0.01038425
| JPY = 1.68998778
}}<noinclude>''' USD.
Source: [[XE.com]] reported data at http://www.xe.com/. For USD converter, see http://themoneyconverter.com/INR/USD.aspx.
This page was last edited on {{#time:j F Y|{{REVISIONYEAR}}-{{REVISIONMONTH}}-{{REVISIONDAY2}}}}.</noinclude>
7xpoo7qxyo6ibzn3ovlrfowkd7zysw2
ವಿಕಿಪೀಡಿಯ:ತಾಂತ್ರಿಕ ಸುದ್ದಿ/ಆರ್ಕೈವ್ 9
4
24597
373847
373100
2026-10-28T05:44:46Z
ChiK
1136
Adding 3 threads from [[ವಿಕಿಪೀಡಿಯ:ತಾಂತ್ರಿಕ_ಸುದ್ದಿ]] (using [[w:tcy:User:ChiK/Archiver|ಆರ್ಕೈವರ್]])
373847
wikitext
text/x-wiki
{{Archive}}
== <span lang="en" dir="ltr">Tech News: 2026-03</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W03"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/03|Translations]] are available.
'''Weekly highlight'''
* The Wikimedia Foundation has shared some guiding questions for the July 2026–June 2027 Annual Plan on [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] and ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. These focus on global trends, faster and healthier experimentation, better support for newcomers, strengthening editors and advanced users, improving collaboration across projects, and growing and retaining readership. Feedback and ideas are welcome on the [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|talk page]].
'''Updates for editors'''
* As part of the current work of Community Tech team on the [[m:Special:MyLanguage/Community Wishlist/W372|Multiple watchlists]] project, the display of [[Special:EditWatchlist|EditWatchlist]] will be updated as a first step towards multiple watchlists. Additionally, the pagination on [[Special:Search|Search]] will be updated too, as a part of the work on the [[m:Special:MyLanguage/Community Wishlist/W186|Revamp pagination / page navigation]] wish. [https://phabricator.wikimedia.org/T411596]
* [[m:Special:GlobalWatchlist|The Global Watchlist]] is a MediaWiki [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] that lets you see your watchlists from different wikis on the same page. It was recently updated to look more like the regular [[Special:Watchlist|Watchlist]], such as preparing it for temporary accounts in IP masking (including rerouting user links to contributions pages), making page titles bold, and opening links in edit summaries and tags in new browser tabs. [https://phabricator.wikimedia.org/T398361][https://phabricator.wikimedia.org/T298919][https://phabricator.wikimedia.org/T273526][https://phabricator.wikimedia.org/T286309]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:28}} community-submitted {{PLURAL:28|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where global blocks did not have the option to disable sending emails, has now been fixed, and will be available for use in the week of January 13. [https://phabricator.wikimedia.org/T401293]
'''Updates for technical contributors'''
* The [[mw:Special:MyLanguage/VisualEditor/Citation tool|VisualEditor citation tool]] and [[mw:Special:MyLanguage/Help:Reference Previews|Reference Previews]] now support "map" as a reference type. [https://phabricator.wikimedia.org/T411083]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.10|MediaWiki]]/[[mw:MediaWiki 1.46/wmf.11|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/03|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W03"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೧:೦೩, ೧೩ ಜನವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29907192 -->
== <span lang="en" dir="ltr">Tech News: 2026-04</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W04"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/04|Translations]] are available.
'''Updates for editors'''
* The tray shown on [[Special:Diff|Special:Diff]] in mobile view has been redesigned. It is now collapsed by default, and incorporates a link to undo the edit being viewed, making it easier for mobile editors and reviewers to take action while keeping the interface uncluttered. [https://phabricator.wikimedia.org/T402297]
* [[m:Special:GlobalWatchlist|The Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continues to improve — it now automatically determines the text direction (ensuring correct display of sites with unusual domain names) and shows detailed descriptions for log actions. Later this week, a new permanent link for page creations and CSS classes for each entry element will be added. [https://phabricator.wikimedia.org/T412505][https://phabricator.wikimedia.org/T287929][https://phabricator.wikimedia.org/T262768][https://phabricator.wikimedia.org/T414135]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:32}} community-submitted {{PLURAL:32|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the previously observed issue in Vector 2022, where anchor link targets were obscured by the sticky header, has now been addressed. [https://phabricator.wikimedia.org/T406114]
'''Updates for technical contributors'''
* As mentioned in the [[m:Special:MyLanguage/Tech/News/2025/44|October 2025 deprecation announcement]], MediaWiki Interfaces team will begin sunsetting all transform endpoints containing a trailing slash from the MediaWiki REST API the week of January 26. Changes are expected to roll out to all wikis on or before January 30th. All API users currently calling them are encouraged to transition to the non-trailing slash versions. Both endpoint variations can be found, compared, and tested using the [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox]. If you have questions or encounter any problems, please file a ticket in Phabricator to the [https://phabricator.wikimedia.org/project/view/6931/ #MW-Interfaces-Team board].
* Interactive reference documentation for the [[mw:Special:MyLanguage/Wikimedia REST API|Wikimedia REST API]] has moved. Requests to API docs previously hosted through [[mw:Special:MyLanguage/RESTBase|RESTBase]] (e.g.: <code dir=ltr>https://en.wikipedia.org/api/rest_v1/</code>) are now redirected to the [[w:en:Special:RestSandbox|REST Sandbox]].
* The [[mw:Special:MyLanguage/Wikidata Platform|WMF Wikidata Platform team]] (WDP) has published its [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|January 2026 newsletter]]. It includes updates on the legacy full-graph endpoint decommissioning, the User-Agent policy change, the monthly Blazegraph migration office hours, and efforts to reduce regressions caused by the legacy endpoint shutdown. As a reminder, you can [[m:Special:MyLanguage/Global message delivery/Targets/WDP team updates|subscribe to the WDP newsletter]]!
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.12|MediaWiki]]
'''Meetings and events'''
* The [[mw:Wikimedia Hackathon Northwestern Europe 2026|Wikimedia Hackathon Northwestern Europe 2026]] will take place on 13-14 March 2026 in Arnhem, the Netherlands. Applications opened mid-December and will close soon or when capacity is reached. It's a two-day, technically oriented hackathon bringing together Wikimedians from the region. Hope to see you there!
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/04|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W04"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೧:೫೯, ೨೦ ಜನವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29943403 -->
== <span lang="en" dir="ltr">Tech News: 2026-05</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W05"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/05|Translations]] are available.
'''Updates for editors'''
* Wikimedia Foundation invites comments on [[m:Special:MyLanguage/Product and Technology Advisory Council/Year1 Reflections and Proposed Way Forward 2026 Update|proposed future]] of the [[:m:Special:MyLanguage/Product and Technology Advisory Council|Product and Technology Advisory Council]] until 28 February.
* All users with registered accounts can now use passkeys for [[m:Special:MyLanguage/Help:Two-factor authentication|two-factor authentication]] (2FA). Passkeys are a simple way to log in without using a second device. They verify the user's identity using a fingerprint, face scan, or a PIN code. To set up a passkey, first set up a regular 2FA method. Currently, to log in with a passkey, users must also use a password. Later this quarter, passwordless login will allow users to log in with a single click and a passkey. Users with advanced rights will also be required to have 2FA enabled. This is part of the [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Account Security]] project.
* Unregistered contributors on blocked IPs or blocked IP ranges can now interact on-wiki to appeal a block by creating a temporary account to appeal a block on the user talk page, unless the "prevent this user from editing their own talk page" is enabled. This solves the problem of logged-out users unable to use the default unblock process via user talk page. [https://phabricator.wikimedia.org/T398673]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:20}} community-submitted {{PLURAL:20|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the Two-Factor Authentication (2FA) methods description on the management page has been updated. It is now clearer and easier for users to understand and make use of. [https://phabricator.wikimedia.org/T332385]
'''Updates for technical contributors'''
* A new AbuseFilter variable, <code>account_type</code>, has been added to provide a reliable way to determine the account type being created in the <code>createaccount</code> and <code>autocreateaccount</code> actions. As part of this change, the variable <code>accountname</code> has been renamed to <code>account_name</code>, and <code>accountname</code> is now deprecated. Edit filter managers should update any filters that use hardcoded account type checks or the deprecated variable. [https://phabricator.wikimedia.org/T414049]
* Image thumbnails that are requested in non-standard sizes, and using non-standard methods such as direct requests to <code dir=ltr><nowiki>upload.wikimedia.org/…</nowiki></code> will stop working in the near future. This change is to prevent ongoing external abuse by web-scrapers and bots. Some users with custom CSS/JS, Interface Admins who can fix gadgets and local skins, and Tool-authors, will need to update their code to use standard thumbnail sizes. [[phab:T414805|Details, search-links, and examples of how to fix them, are available in the task]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.13|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/05|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W05"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೪೭, ೨೭ ಜನವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:UOzurumba (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29969530 -->
== <span lang="en" dir="ltr">Tech News: 2026-06</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W06"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/06|Translations]] are available.
'''Updates for editors'''
* The "{{int:pageinfo-toolboxlink}}" feature, which gives validating information about a page ([{{fullurl:{{FULLPAGENAME}}|action=info}} example]), now automatically includes a table of contents. If there is a local [[{{ns:8}}:Pageinfo-header]] page created by individual users, it can now be removed. [https://phabricator.wikimedia.org/T363726]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:21}} community-submitted {{PLURAL:21|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, VisualEditor previously added bold or italic formatting inside link descriptions, making the wikicode complex. This has now been fixed. [https://phabricator.wikimedia.org/T409669]
'''Updates for technical contributors'''
* There was no XML dump on 20 January. Additionally, from now on, dumps will be generated once per month only. [https://phabricator.wikimedia.org/T414389]
* The MediaWiki Interfaces team removed support for all transform endpoints containing a trailing slash from the [https://www.mediawiki.org/wiki/Special:MyLanguage/API:REST%20API MediaWiki REST API]. All API users currently calling those endpoints are encouraged to transition to the non-trailing slash versions. If you have questions or encounter any problems, please file a ticket in phabricator to the [https://phabricator.wikimedia.org/project/view/6931/ #MW-Interfaces-Team board].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.14|MediaWiki]]
'''Weekly highlight'''
* Users are reminded that the Wikimedia Foundation has shared some guiding questions for the July 2026–June 2027 Annual Plan on [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] and ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. These focus on global trends, faster and healthier experimentation, better support for newcomers, strengthening editors and advanced users, improving collaboration across projects, and growing and retaining readership. Feedback and ideas are welcome on the [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|talk page]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/06|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W06"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೩:೧೩, ೨ ಪೆಬ್ರವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30000986 -->
== <span lang="en" dir="ltr">Tech News: 2026-07</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W07"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/07|Translations]] are available.
'''Updates for editors'''
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Wishlist item]] Logged-in contributors who manage large or complex watchlists can now organise and filter watched pages in ways that improve their workflows with the new [[mw:Special:MyLanguage/Help:Watchlist labels|Watchlist labels]] feature. By adding custom labels (for example: pages you created, pages being monitored for vandalism, or discussion pages) users can more quickly identify what needs attention, reduce cognitive load, and respond more efficiently. This improves watchlist usability, especially for highly active editors.
* A new feature available on [[Special:Contributions|Special:Contributions]] shows [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|temporary accounts]] that are likely operated by the same person, and so makes patrolling less time-consuming. Upon checking contributions of a temporary account, users with access to temporary account IP addresses can now see a view of contributions from the related temporary accounts. The feature looks up all the IPs associated with a given temporary account within the data retention period and shows all the contributions of all temporary accounts that have used these IPs. [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts#February 2026: Improvements to the patroller tooling|Learn more]]. [https://phabricator.wikimedia.org/T415674]
* When editors preview a wikitext edit, the reminder box that they are only seeing a preview (which is shown at the top), now has a grey/neutral background instead of a yellow/warning background. This makes it easier to distinguish preview notes from actual warnings (for example, edit conflicts or problematic redirect targets), which will now be shown in separate warning or error boxes. [https://phabricator.wikimedia.org/T414742]
* The [[m:Special:GlobalWatchlist|Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continues to improve — it now properly supports more than one Wikibase site, for example both [[d:|Wikidata]] and [[testwikidata:|testwikidata]]. In addition, issues regarding text direction have been fixed for users who prefer Wikidata or other Wikibase sites in right-to-left (RTL) languages. [https://phabricator.wikimedia.org/T415440][https://phabricator.wikimedia.org/T415458]
* The automatic "magic links" for ISBN, RFC, and PMID numbers have been [[mw:Special:MyLanguage/Help:Magic links|deprecated in wikitext since 2021]] due to inflexibility and difficulties with localization. Several wikis have successfully replaced RFC and PMID magic links with equivalent external links, but a template was often required to replace the functionality of the ISBN magic link. There is now a new [[mw:Special:MyLanguage/Help:Magic words#isbn|built-in parser function]] <code dir=ltr><nowiki>{{#isbn}}</nowiki></code> available to replace the basic functionality of the ISBN magic link. This makes it easier for wikis who wish to migrate off of the deprecated magic link functionality to do so. [https://phabricator.wikimedia.org/T145604]
* Two new wikis have been created:
** a {{int:project-localized-name-group-wikipedia}} in [[d:Q35401|Jju]] ([[w:kaj:|<code>w:kaj:</code>]]) [https://phabricator.wikimedia.org/T413283]
** a {{int:project-localized-name-group-wikipedia}} in [[d:Q1186896|Nawat]] ([[w:ppl:|<code>w:ppl:</code>]]) [https://phabricator.wikimedia.org/T413273]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:23}} community-submitted {{PLURAL:23|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]].
'''Updates for technical contributors'''
* A new global user group has been created: [[{{int:grouppage-local-bot}}|{{int:group-local-bot}}]]. It will be used internally by the software to allow community bots to bypass rate limits that are applied to abusive [[w:en:Web scraping|web scrapers]]. Accounts that are approved as bots on at least one Wikimedia wiki will be automatically added to this group. It will not change what user permissions the bot has. [https://phabricator.wikimedia.org/T415588]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.15|MediaWiki]]
'''Meetings and events'''
* The [[mw:Special:MyLanguage/MediaWiki Users and Developers Conference Spring 2026|MediaWiki Users and Developers Conference, Spring 2026]] will be held March 25–27 in Salt Lake City, USA. This event is organized by and for the third-party MediaWiki community. You can propose sessions and register to attend. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/AZBWVI46SDEB65PGR5J6E4TYOQQEZXM7/]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/07|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W07"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೫:೦೦, ೧೦ ಪೆಬ್ರವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:Quiddity (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30026671 -->
== <span lang="en" dir="ltr">Tech News: 2026-08</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W08"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/08|Translations]] are available.
'''Weekly highlight'''
* The [[mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|SRE Team]] will be performing a cleanup of Wikimedia's [[m:Special:MyLanguage/Etherpad|Etherpad]] instance, the web-based editor for real-time collaborative document editing. All pads will be permanently deleted after 30 April, 2026 – if there are still migration projects in progress at that point the team can revisit the date on a case by case basis. Please create local backups of any content you wish to keep, as deleted data cannot be recovered. This cleanup helps reduce database size and minimize infrastructure footprint. Etherpad will continue to support real-time collaboration, but long-term storage should not be expected. Additional cleanups may occur in the future without prior notice. [https://phabricator.wikimedia.org/T415237]
'''Updates for editors'''
* The Information Retrieval team will be launching an [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|Android mobile app experiment]] that tests hybrid search capabilities which can handle both semantic and keyword queries. The improvement of on-platform search will enable readers to find what they’re looking for directly on Wikipedia more easily. The experiment will first be launched on Greek Wikipedia in late February, followed by English, French, and Portuguese in March. [https://diff.wikimedia.org/2026/01/08/semantic-search-making-it-easier-to-find-the-information-readers-want/ Read more] on Diff blog. [https://www.mediawiki.org/wiki/Readers/Information_Retrieval]
* The Reader Growth team will run [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.10.2 Mobile Table of Contents|an experiment]] for mobile web users, that adds a table of contents and automatically expands all article sections, to learn more about navigation issues they face. The test will be available on Arabic, Chinese, English, French, Indonesian, and Vietnamese Wikipedias.
* Previously, site notices ([[{{ns:8}}:Sitenotice]] and [[{{ns:8}}:Anonnotice]]) would only render on the desktop site. Now, they will render on all platforms. Users on mobile web will now see these notices and be informed. Site administrators should be prepared to test and fix notices on mobile devices to avoid interference with articles. To opt out, interface admins can add <code dir="ltr">#siteNotice { display: none; }</code> to [[{{ns:8}}:Minerva.css]]. [https://phabricator.wikimedia.org/T138572][https://phabricator.wikimedia.org/T416644]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:19}} community-submitted {{PLURAL:19|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue on [[Special:RecentChanges|Special:RecentChanges]] has been fixed. Previously, clicking hide in the active filters caused the "view new changes since…" button to disappear, though it should have remained visible. The button now behaves as expected. [https://phabricator.wikimedia.org/T406339]
'''Updates for technical contributors'''
* New documentation is now available to help editors debug on-site search features. It supports troubleshooting when pages do not appear in results, when ranking seems unexpected, and when you need to inspect what content is being indexed, helping make search behavior easier to understand and analyze. [[mw:Help:CirrusSearch/Debug|Learn more]]. [https://phabricator.wikimedia.org/T411169]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/08|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W08"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೪೭, ೧೭ ಪೆಬ್ರವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30086330 -->
== <span lang="en" dir="ltr">Tech News: 2026-09</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W09"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/09|Translations]] are available.
'''Weekly highlight'''
* [[mw:Special:MyLanguage/Edit check/Reference Check|Reference Check]] has been deployed to English Wikipedia, completing its rollout across all Wikipedias. The feature prompts newcomers to add a citation before publishing new content, helping reduce common citation-related reverts and improve verifiability. In A/B testing, the impact was substantial: newcomers shown Reference Check were approximately 2.2 times more likely to include a reference on desktop and about 17.5 times more likely on mobile web. [https://analytics.wikimedia.org/published/reports/editing/reference_check_ab_test_report_final_2025.html]
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Extension:InterwikiSorting|InterwikiSorting extension]], which allowed for the [[m:Special:MyLanguage/Interwiki sorting order|sorting of interwiki links]], has been undeployed from Wikipedia. As a result, editors who had enabled interwiki link sorting in non-compact mode (full list format) will now see links reordered. The links moving forward will be listed in the alphabetical order of language code. [https://phabricator.wikimedia.org/T253764]
* Later this week, people who are editing a page-section using the mobile visual editor, will notice a new "Edit full page" button. When tapped, you will be able to edit the entire article. This helps when the change you want to make is outside the section you initially opened. [https://phabricator.wikimedia.org/T387175][https://phabricator.wikimedia.org/T409112]
* [[mw:Special:MyLanguage/Readers/Reader Experience|The Reader Experience team]] is inviting editors to assess whether dark mode should still be considered "beta" on their wiki, based on their experience of how well it functions on desktop and mobile. If the feature is deemed mature, editors can update the interface messages in <code dir=ltr>MediaWiki:skin-theme-description</code> and <code dir=ltr>MediaWiki:Vector-night-mode-beta-tag</code> to indicate that dark mode is ready and no longer considered beta.
* The improved [[mw:Wikimedia_Apps/Team/iOS/Activity_Tab|Activity tab]] which displays user-insights is now available to all users of the Wikipedia iOS app (version 7.9.0 and later). Following earlier A/B testing that showed higher account creation among users with access to the feature, it has been rolled out to 100% of users along with some updates. The Activity tab now shows your edited articles in the timeline, offers editing impact insights like contribution counts and article view trends, and customization options to improve in-app experience for users.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:21}} community-submitted {{PLURAL:21|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, a bug that prevented [[mw:Special:MyLanguage/Extension:DiscussionTools|DiscussionTools]] from working on mobile has now been fixed, restoring full functionality. [https://phabricator.wikimedia.org/T415303]
'''Updates for technical contributors'''
* The [[m:Special:GlobalWatchlist|Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] that makes this possible continues to improve. The latest upgrade is the inclusion of a [[mw:Extension:GlobalWatchlist#hook|new hook]], <code dir=ltr>ext.globalwatchlist.rebuild</code>, which fires after each watchlist rebuild. This allows you to run gadgets and user scripts for the Special page. [https://phabricator.wikimedia.org/T275159]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.17|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/09|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W09"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೩೩, ೨೪ ಪೆಬ್ರವರಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30119102 -->
== <span lang="en" dir="ltr">Tech News: 2026-10</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W10"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/10|Translations]] are available.
'''Weekly highlight'''
* Wikipedia 25 [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments|Birthday mode]] is now live on Betawi, Breton, Chinese, Czech, Dutch, English, French, Gorontalo, Indonesian, Italian, Luxembourgish, Madurese, Sicilian, Spanish, Thai, and Vietnamese Wikipedias! This limited-time campaign feature celebrates 25 years of Wikipedia with a birthday mascot, Baby Globe. When turned on, Baby Globe is shown on [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments/article configuration|~2,500 articles]], waiting to be discovered by readers. Communities can choose to turn Birthday mode on by getting consensus from their community and asking an admin to enable the feature and customize it via [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments#Community Configuration Demo|community configuration]] on the local wiki.
'''Updates for editors'''
* [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Sub-referencing]], a new feature to re-use references with different details has been released to Swedish Wikipedia, Polish Wikipedia and [[:phab:T418209|a couple of other wikis]]. You can [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#test|try the feature]] on these projects or on testwiki and [https://en.wikipedia.beta.wmcloud.org/wiki/Sub-referencing betawiki]. Learnings from the first pilot wiki German Wikipedia have been [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing/Learnings|published in a report]]. Reach out to the Wikimedia Deutschland team if you are [[:m:Talk:WMDE Technical Wishes/Sub-referencing#Pilot wikis|interested in becoming a pilot wiki]].
* [[mw:Special:MyLanguage/Help:Edit check#Paste check|Paste Check]] will become available at all Wikipedias this week. The feature prompts newcomers who are pasting text they are not likely to have written into VisualEditor to consider whether doing so risks a copyright violation. Paste Check [[mw:Special:MyLanguage/Edit check/Tags|tags]] all edits where it is shown for potential review. Local administrators can configure various aspects of the feature via [[{{#special:EditChecks}}]]. [[mw:Special:MyLanguage/Edit check/Paste Check#A/B Experiment|Research]] across 22 wikis found that Paste Check resulted in an 18% decrease in relative reverted-edits compared to the control group. Translators can [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-visualeditor-ve-mw-editcheck&filter=&optional=1&action=translate help to localize] this and related features.
* The [[mw:Special:MyLanguage/Readers/Reader Experience|Reader Experience team]] will be standardizing the user menu in the top right for all mobile users so that it is closer to the desktop experience. Currently this user menu is only visible to users with Advanced Mobile Controls (AMC) turned on. The only change is that a couple buttons previously in the left-side menu will move to the top right for users who do not have AMC turned on. This change is expected to go out March 9 and seeks to improve the user interface. [https://phabricator.wikimedia.org/T413912]
* Starting in the week of March 2, the emails sent out when an email address was added, removed, or changed for an account will switch to a substantially nicer and clearer HTML email from the prior plaintext one. [https://phabricator.wikimedia.org/T410807]
* Notifications are currently limited to 2,000 historic entries per user, and extend back to 2013 when the feature was released. This is going to be changed to only store Notifications from the last 5 years, but up to 10,000 of them. This will help with long-term infrastructure health and help to prevent more recent notifications from disappearing too soon. [https://phabricator.wikimedia.org/T383948]
* The [[m:Special:GlobalWatchlist|Global Watchlist]] which lets you view your watchlists from multiple wikis on a single page continues to see improvements. The latest update improves label usage experience. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] now allows activating the [[mw:Special:MyLanguage/Manual:Language#Fallback languages|language fallback system]] for Wikidata items without labels in the viewed language, and showing those labels in the user’s preferred Wikidata language if no <code dir=ltr>uselang=</code> URL parameter is provided. [https://phabricator.wikimedia.org/T373686][https://phabricator.wikimedia.org/T416111]
* The Wikipedia Android team has started a beta test of [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|hybrid search]] on Greek Wikipedia. Hybrid search capabilities can handle both semantic and keyword queries enabling readers to find what they’re looking for directly on Wikipedia more easily.
* For security reasons, members of certain user groups are [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|required to have two-factor authentication]] (2FA) enabled. Currently, 2FA is required to use the group, but not to be a member of it. Given that this model still has some vulnerabilities, the situation will [[phab:T418580|gradually change in March]]. Members of these groups will be unable to disable last 2FA method on their account, and it will be impossible to add users without 2FA to these groups. Users will still be able to add new authentication methods or remove them, as long as at least one method is continuously enabled. In the second half of March, users without 2FA will be removed from these groups. This applies to: CentralNotice administrators, checkusers, interface administrators, suppressors, Wikidata staff, Wikifunctions staff, WMF Office IT and WMF Trust & Safety. Nothing will change for other users. See the linked task for deployment schedule. [https://phabricator.wikimedia.org/T418580]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:27}} community-submitted {{PLURAL:27|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue preventing users from creating an instance in [https://www.wikibase.cloud/ Wikibase.cloud] has now been fixed. [https://phabricator.wikimedia.org/T416807]
'''Updates for technical contributors'''
* To help ensure [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|fair use of infrastructure]], over the next month the Wikimedia Foundation will implement global API rate limits across our APIs. In early March, stricter limits will be applied to unidentified requests from outside Toolforge/WMCS and API requests that are made from web browsers. In April, higher limits will be applied to identified traffic. These limits are intentionally set as high as possible to minimise impact on the community. Bots running in Toolforge/WMCS or with the bot user right on any wiki should not be affected for now. However, all developers are advised to follow updated best practices. For more information, see [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|Wikimedia APIs/Rate limits]].
* The Wikidata Query Service Linked Data Fragment (LDF) endpoint will be decommissioned in February. This endpoint served limited traffic, which was successfully migrated to other data access methods that were better suited to support existing use cases. The hardware used to support the LDF endpoint will be reallocated to support the ongoing backend migration efforts. [https://phabricator.wikimedia.org/T415696]
* The new Parsoid parser [[mw:Special:MyLanguage/Parsoid/Parser Unification/Updates|continues to be deployed to additional wikis]], improving platform sustainability and making it easier to introduce new reading and editing features. Parsoid is now the default parser on 488 WMF wikis (268 Wikipedias), now covering more than 10% of all Wikipedia page views.
* The process and criteria for [[Special:MyLanguage/Wikimedia Enterprise#Access|requesting exceptional access]] to the high volume feed of the ''Wikimedia Enterprise'' APIs (at no cost for mission-aligned usecases), [[m:Talk:Wikimedia Enterprise#Exceptional access criteria|have now been published]]. This is to provide more thorough and clearer documentation for users.
* [https://techblog.wikimedia.org/ Tech Blog], the blog dedicated to the Wikimedia technical community [https://techblog.wikimedia.org/2026/02/24/a-tech-blog-diff/ will be migrating] to [[diffblog:|Diff]], the community news and event blog. The migration should be complete in April 2026, after which new posts will be accepted for publishing. Readers will be able to access posts – old and new – on the landing page at https://diff.wikimedia.org/techblog.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.18|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/10|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W10"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೩:೨೧, ೨ ಮಾರ್ಚಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30137798 -->
== <span lang="en" dir="ltr">Tech News: 2026-11</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W11"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/11|Translations]] are available.
'''Weekly highlight'''
* [[m:Special:MyLanguage/Tech/Server switch|All wikis will be read-only]] for a few minutes on Wednesday, 25 March 2026 at [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. This is for the datacenter server switchover backup tests, [[wikitech:Deployments/Yearly calendar|which happen twice a year]]. During the switchover, all Wikimedia website traffic is shifted from one primary data center to the backup data center to test availability and prevent service disruption even in emergencies.
* Last week, all wikis had 2 hours of read-only time, and extended unavailability for user-scripts and gadgets. This was due to a security incident which has since been resolved. Work is ongoing to prevent re-occurrences. For current information please see the [[m:Steward's noticeboard#Statement on Meta about today's user script security incident|post on the Stewards' noticeboard]] ([[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Product Safety and Integrity/March 2026 User Script Incident|translations]]).
'''Updates for editors'''
* Users facing multiple blocks on mobile will now see the reasons for each block separately, instead of a generic message. This helps them understand why they are blocked and what steps they can take to resolve the issue. For example, users affected for using common VPNs (such as [[Special:MyLanguage/Apple iCloud Private Relay|iCloud Private Relay]]) will receive clearer guidance on what they need to do to start editing again. [https://phabricator.wikimedia.org/T357118]
* Later this week, [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Suggestion Mode]] will become available as a beta feature within the visual editor at all Wikipedias. This feature proactively suggests various types of actions that people can consider taking to improve Wikipedia articles, and learn about related guidelines. The feature is locally configurable, and can also be locally expanded with custom Suggestions. Current settings can be seen at [[Special:EditChecks]] and there are [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators %E2%80%93 local customization|instructions for how administrators can customize]] the links to point to local guidelines. The feature is connected to [[mw:Special:MyLanguage/Help:Edit check|Edit check]] which suggests improvements while someone is writing new content. In the future, the Editing team plans to evaluate the feature's impact with newcomers through a controlled experiment. [https://phabricator.wikimedia.org/T404600]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:23}} community-submitted {{PLURAL:23|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where the cursor became misaligned during the use of CodeMirror’s syntax highlighting, which makes wikitext and code easier to read, has now been fixed. This problem specifically affected users who defined a font rule in a custom stylesheet while creating a new topic with DiscussionTools. [https://phabricator.wikimedia.org/T418793]
'''Updates for technical contributors'''
* API rate limiting update: To help ensure [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|fair use of infrastructure]], global API rate limits will be applied this week to requests without a compliant User-Agent that originate from outside Toolforge/WMCS and to unauthenticated requests made from web browsers. Higher limits will be applied to identified traffic in April. Bots running in Toolforge/WMCS or with the bot user right on any wiki should not be affected for now. However, all developers are advised to follow updated best practices. For more information, see [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|Wikimedia APIs/Rate limits]].
* The new GraphQL API has been released. The API was developed as a flexible alternative to select features of the Wikidata Query Service (WDQS), to improve developer experience and foster adaptability, and efficient data access. Try it out and [[d:Wikidata:Wikibase GraphQL#Feedback and development|give feedback]]. You can also [https://greatquestion.co/wikimediadeutschland/GraphQLAPI/apply sign up for usability tests].
* The [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|PTAC Unsupported Tools Working Group]] continued improvements to [[commons:Special:MyLanguage/Commons:Video2commons#|Video2Commons]] in February, with fixes addressing authentication errors, large-file handling, task queue visibility, and clearer upload behavior. Work is still ongoing in some areas, including changes related to deprecated server-side uploads. Read [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group#February 2026|this update]] to learn more.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.19|MediaWiki]]
'''In depth'''
* The Article Guidance team invites experienced Wikipedia editors from selected [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators#Collaborators|pilot wikis]] and interested contributors from other Wikipedias to fill out this questionnaire which is available in [https://docs.google.com/forms/d/e/1FAIpQLSfmLeVWnxmsCbPoI_UF2jyRcn73WRGWCVPHzerXb4Cz97X_Ag/viewform English], [https://docs.google.com/forms/d/e/1FAIpQLSd6rzr4XXQw8r4024fE3geTPFe13M_6w7Mitj-YJi0sOlWTAw/viewform?usp=header Arabic], [https://docs.google.com/forms/d/e/1FAIpQLSdok3-RfB18lcugYTUMGkpwmqG_8p760Wv4dCXitOXOszjUDw/viewform?usp=header Bengali], [https://docs.google.com/forms/d/e/1FAIpQLSfjTfYp4jEo0akA4B1e-Nfg3QZPCudUjhJzHzzDi6AHyAaMGA/viewform?usp=header Japanese], [https://docs.google.com/forms/d/e/1FAIpQLScteVoI29Aue4xc72dekk-6RYtvmMgQxzMI900UOawrFrSTWg/viewform?usp=header Portuguese], [https://docs.google.com/forms/d/e/1FAIpQLSetdxnYwL3ub2vqA7awCg5hJZPMIYcDPaiTe12rY9h0GYnVlw/viewform?usp=header Persian], and [https://docs.google.com/forms/d/e/1FAIpQLScNvfJF-Ot-4pzA4qAN771_0QDJ4Li19YcUsaTgSKW8Nc7U_Q/viewform?usp=header Turkish]. Your answers will help the team customize guidance for less experienced editors and help them learn community policies and practices while creating an article. Learn more [[mw:Special:MyLanguage/Article guidance|on the project page]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/11|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W11"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೨೨, ೧೦ ಮಾರ್ಚಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30213008 -->
== <span lang="en" dir="ltr">Tech News: 2026-12</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W12"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/12|Translations]] are available.
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] beta feature, also known as [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], has been used for wikitext syntax highlighting since November 2024. It will be promoted out of beta by May 2026 in order to bring improvements and new [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Features|features]] to all editors who use the standard syntax highlighter. If you have any questions or concerns about promoting the feature out of beta, [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|please share]]. [https://phabricator.wikimedia.org/T259059]
* Some changes to local user groups are performed by stewards on Meta-Wiki and logged there only. Now, interwiki rights changes will be logged both on Meta-Wiki and the wiki of the target user to make it easier to access a full record of user's rights changes on a local wiki. Past log entries for such changes will be backfilled in the coming weeks. [https://phabricator.wikimedia.org/T6055]
* On wikis using [[m:Special:MyLanguage/Flagged Revisions|Flagged Revisions]], the number of pending changes shown on [[{{#Special:PendingChanges}}]] previously counted pages which were no longer pending review, because they have been removed from the system without being reviewed, e.g. due to being deleted, moved to a different namespace, or due to wiki configuration changes. The count will be correct now. On some wikis the number shown will be much smaller than before. There should be no change to the list of pages itself. [https://phabricator.wikimedia.org/T413016]
* Wikifunctions composition language has been rewritten, resulting in a new version of the language. This change aims to increase service stability by reducing the orchestrator's memory consumption. This rewrite also enables substantial latency reduction, code simplification, and better abstractions, which will open the door to later feature additions. Read more about [[f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-11|the changes]].
* Users can now sort search results alphabetically by page title. The update gives an additional option to finding pages more easily and quickly. Previously, results could be sorted by Edit date, Creation date, or Relevance. To use the new option, open 'Advanced Search' on the search results page and select 'Alphabetically' under 'Sorting Order'. [https://phabricator.wikimedia.org/T403775]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:28}} community-submitted {{PLURAL:28|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the bug that prevented UploadWizard on Wikimedia Commons from importing files from Flickr has now been fixed. [https://phabricator.wikimedia.org/T419263]
'''Updates for technical contributors'''
* A new special page, [[{{#special:LintTemplateErrors}}]], has been created to list transcluded pages that are flagged as containing lint errors to help users discover them easily. The list is sorted by the number of transclusions with errors. For example: [[{{#special:LintTemplateErrors}}/night-mode-unaware-background-color]]. [https://phabricator.wikimedia.org/T170874]
* Users of the [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] beta feature have been using [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] instead of [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] for syntax highlighting when editing JavaScript, CSS, JSON, Vue and Lua content pages, for some time now. Along with promoting CodeMirror 6 out of beta, the plan is to replace CodeEditor as the standard editor for these content models by May 2026. [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|Feedback or concerns are welcome]]. [https://phabricator.wikimedia.org/T419332]
* The [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] JavaScript modules will soon be upgraded to CodeMirror 6. Leading up to the upgrade, loading the <code dir=ltr>ext.CodeMirror</code> or <code dir=ltr>ext.CodeMirror.lib</code> modules from gadgets and user scripts was deprecated in July 2025. The use of the <code dir=ltr>ext.CodeMirror.switch</code> hook was also deprecated in March 2025. Contributors can now make their scripts or gadgets compatible with CodeMirror 6. See the [[mw:Special:MyLanguage/Extension:CodeMirror#Gadgets and user scripts|migration guide]] for more information. [https://phabricator.wikimedia.org/T373720]
* The MediaWiki Interfaces team is expanding coverage of REST API module definitions to include [[mw:Special:MyLanguage/API:REST API/Extensions|extension APIs]]. REST API modules are groups of related endpoints that can be independently managed and versioned. Modules now exist for [https://phabricator.wikimedia.org/T414470 GrowthExperiments] and [https://phabricator.wikimedia.org/T419053 Wikifunctions] APIs. As we migrate extension APIs to this structure, documentation will move out of the main MediaWiki OpenAPI spec and REST Sandbox view, and will instead be accessible via module-specific options in the dropdown on the [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox] (i.e., [[{{#Special:RestSandbox}}]], available on all wiki projects).
* The [[mw:Special:MyLanguage/Extension:Scribunto|Scribunto]] extension provides different pieces of information about the wiki where the module is being used via the [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual|mw.site]] library. Starting last week, the library also provides a [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#mw.site.wikiId|way]] of accessing the [[mw:Special:MyLanguage/Manual:Wiki ID|wiki ID]] that can be used to facilitate cross-wiki module maintenance. [https://phabricator.wikimedia.org/T146616]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.20|MediaWiki]]
'''In depth'''
* The [[m:Special:MyLanguage/Coolest Tool Award|2026 Coolest Tool Award]] celebrating outstanding community tools, is now open for nominations! Nominate your favorite tool using the [https://wikimediafoundation.limesurvey.net/435684?lang=en nomination survey] form by 23 March 2026. For more information on privacy and data handling, please see the [[foundation:Special:MyLanguage/Legal:Coolest_Tool_Award_2026_Survey_Privacy_Statement|survey privacy statement]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/12|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W12"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೧:೦೫, ೧೭ ಮಾರ್ಚಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30260505 -->
== <span lang="en" dir="ltr">Tech News: 2026-13</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W13"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/13|Translations]] are available.
'''Weekly highlight'''
* Wikimedia site users can now log in without a password using passkeys. This is a secure method supported by fingerprint, facial recognition, or PIN. With this change, all users who opt for passwordless login will find it easier, faster, and more secure to log in to their accounts using any device. The new passkey login option currently appears as an autofill suggestion in the username field. An additional [[phab:T417120|"Log in with passkey" button]] will soon be available for users who have already registered a passkey. This update will improve security and user experience. The [[c:File:Passwordless_login_screencast.webm|screen recording]] demonstrates the passwordless login process step by step.
* [[m:Special:MyLanguage/Tech/Server switch|All wikis will be read-only]] for a few minutes on Wednesday, 25 March 2026 at [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. This is for the datacenter server switchover backup tests, [[wikitech:Deployments/Yearly calendar|which happen twice a year]]. During the switchover, all Wikimedia website traffic is shifted from one primary data center to the backup data center to test availability and prevent service disruption even in emergencies.
'''Updates for editors'''
* Wikimedia site users can now export their notifications older than 5 years using a [[toolforge:echo-chamber|new Toolforge tool]]. This will ensure that users retain their important notifications and avoid them being lost based on the planned change to delete notifications older than 5 years, as previously announced. [https://phabricator.wikimedia.org/T383948]
* Wikipedia editors in Indonesian, Thai, Turkish, and Simple English now have access to Special:PersonalDashboard. This is an [[mw:Special:MyLanguage/Moderator Tools/Dashboard|early version of an experience]] that introduces newer editors to patrolling workflows, making it easier for them to move from making edits to participating in more advanced moderation work on their project. [https://phabricator.wikimedia.org/T402647]
* The [[Special:Block]] now has two minor interface changes. Administrators can now easily perform indefinite blocks through a dedicated radio button in the expiry section. Also, choosing an indefinite expiry provides a different set of common reasons to select from, which can be changed at: [[MediaWiki:Ipbreason-indef-dropdown]]. [https://phabricator.wikimedia.org/T401823]
* Mobile editors [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#Logged-out|at several wikis]] can now see an improved logged-out edit warning, thanks to the recent updates from the Growth team. These changes released last week are part of ongoing efforts and tests to enhance [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|account creation experience on mobile]] and then increase participation. [https://phabricator.wikimedia.org/T408484]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:36}} community-submitted {{PLURAL:36|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the bug that prevented mobile web users from seeing the block information when affected by multiple blocks has been fixed. They can now see messages of all the blocks currently affecting them when they access Wikipedia.
'''Updates for technical contributors'''
* Images built using Toolforge will soon get the upgraded buildpacks version, bringing support for newer language versions and other upstream improvements and fixes. If you use Toolforge Build Service, review the recent [https://lists.wikimedia.org/hyperkitty/list/cloud-announce@lists.wikimedia.org/thread/EMYTA32EV2V5SQ2JIEOD2CL66YFIZEKV/ cloud-announce email] and update your build configuration as necessary to ensure your tools are compatible. [https://wikitech.wikimedia.org/w/index.php?title=Help:Toolforge/Building_container_images&oldid=2392097#Buildpack_environment_upgrade_process][https://phabricator.wikimedia.org/T380127]
* The [https://api.wikimedia.org/wiki/Main_Page API Portal] documentation wiki will shut down in June 2026. API keys created on the API Portal will continue to work normally. api.wikimedia.org endpoints will be deprecated gradually starting in July 2026. Documentation on the API Portal is moving to [[mw:Wikimedia APIs|mediawiki.org]]. Learn more on the [[wikitech:API Portal/Deprecation|project page]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.21|MediaWiki]]
'''In depth'''
* [[m:Special:MyLanguage/WMDE Technical Wishes|WMDE Technical Wishes]] is considering improvements to [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|automatically generated reference names in VisualEditor]]. Please check out the [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names#Proposed solutions|proposed solutions]] and participate in the [[m:Talk:WMDE Technical Wishes/References/VisualEditor automatic reference names#Request for comment|request for comment]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/13|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W13"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೨:೨೧, ೨೩ ಮಾರ್ಚಿ ೨೦೨೬ (IST)
<!-- Message sent by User:UOzurumba (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30268305 -->
== <span lang="en" dir="ltr">Tech News: 2026-14</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W14"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/14|Translations]] are available.
'''Weekly highlight'''
* The Beta version of [[abstract:|Abstract Wikipedia]] a new Wikimedia project which is language-independent, was launched last week. The project allows communities to build Wikipedia articles in their native language, which can be readily accessed by other users in their own languages. The wiki is powered by instructions from Wikifunctions and also based on structured content from Wikidata. [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-26|Read more]].
'''Updates for editors'''
* The Growth team is running an A/B test to evaluate a clearer, more user-friendly message that promotes account creation on wikis. Currently when logged-out mobile users begin editing, they see a jarring warning message that can feel abrupt and discouraging. This also presents temporary account editing as the default rather than encouraging account creation. The test is running on ten Wikipedias, including Arabic, French, Spanish and German. [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#2. Improve logged-out warning message (T415160)|Read more]].
* The Wikimedia Apps team is inviting feedback on [[mw:Special:MyLanguage/Wikimedia Apps/Team/Future of Editing on the Mobile Apps|how editing should work on the Wikipedia mobile apps]]. The discussion focuses on improving how users access editing tools when they tap "Edit". This is part of a broader effort to convert readers who develop an interest in editing, to access a more user-friendly pathway to start contributing.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:45}} community-submitted {{PLURAL:45|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where citation fetching from the large newspaper archive [https://www.newspapers.com Newspapers.com] was no longer working, due to a block in [[mw:Special:MyLanguage/Citoid|Citoid]] requests, has now been fixed. [https://phabricator.wikimedia.org/T419903]
'''Updates for technical contributors'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.22|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/14|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W14"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೫೫, ೩೧ ಮಾರ್ಚಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30329462 -->
== <span lang="en" dir="ltr">Tech News: 2026-15</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W15"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/15|Translations]] are available.
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|CampaignEvents extension]] now includes a new group goal-setting feature, enabling organizers to set and track event goals such as the number of articles created and participating contributors in real time. Similarly, participants can work toward shared targets and see their collective impact as the event unfolds. The feature is now available on all Wikimedia wikis. Learn more in [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Collaborative contributions#Goal setting|the documentation]].
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Wishlist item]] The new [[mw:Special:MyLanguage/Help:Watchlist labels|watchlist labels]] feature (announced in [[m:Special:MyLanguage/Tech/News/2026/07|Tech News 2026-07]]) is now available via VisualEditor, the source editor, and the 'watchstar' (or watch link, for skins that don't have a star icon). Previously it was only possible to assign labels via [[Special:EditWatchlist|EditWatchlist]]. In all three places it is a new field following the expiry field.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:23}} community-submitted {{PLURAL:23|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where talk pages on mobile with Parsoid are unusable after empty section headers, has now been fixed. [https://phabricator.wikimedia.org/T419171]
'''Updates for technical contributors'''
* The [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|sub-referencing feature]], which lets editors add details to an existing reference without duplicating it, will be gradually rolled out to [[phab:T414094|more wikis]] later this year. Wikis using the [[mw:Special:MyLanguage/Reference Tooltips|Reference Tooltips]] gadget are encouraged to update their version (typically at [[m:MediaWiki:Gadget-ReferenceTooltips.js|MediaWiki:Gadget-ReferenceTooltips.js]] as shown [https://en.wikipedia.org/w/index.php?diff=1344408362 here]) to ensure compatibility. Other reference-related gadgets may also be affected. [https://phabricator.wikimedia.org/T416304]
* All Wikinews editions will be closed and switched to read-only mode on 4 May 2026. Content will remain accessible, but no new edits or articles can be added. This closure was approved by the Board of Trustees of the Wikimedia Foundation following extended discussions. [[m:Wikimedia Foundation Board noticeboard#Board of Trustees Approves Closure of Wikinews|Read more]].
* The [[:mw:Special:MyLanguage/API:Action API|Action API]] has had several formats for requested output. One of them, <bdi lang="zxx" dir="ltr"><code><nowiki>format=php</nowiki></code></bdi>, is being removed soon. Please ensure your scripts or bots use the [[mw:Special:MyLanguage/API:Data formats#Output|JSON format]]. This removal should affect very few scripts and bots. [https://phabricator.wikimedia.org/T118538]
* The [[Special:NamespaceInfo|Special:NamespaceInfo]] page now includes namespace aliases. For example "WP" for the "Project" ("Wikipedia") namespace on the German Wikipedia. [https://phabricator.wikimedia.org/T381455]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.23|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/15|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W15"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೧:೪೯, ೬ ಎಪ್ರಿಲ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30362761 -->
== <span lang="en" dir="ltr">Tech News: 2026-16</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W16"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/16|Translations]] are available.
'''Weekly highlight'''
* Experienced editors are invited to [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Main_Page test] the [[mw:Special:MyLanguage/Article guidance|Article guidance]] feature, designed to help less-experienced editors create well-structured, policy-compliant Wikipedia articles. Testing instructions are [[mw:Special:MyLanguage/Article guidance/Test feature guide|available]]. Also, after reviewing [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance the outlines], please provide feedback on the [[mw:Talk:Article guidance|project talk page]]. Based on your input, the feature will be refined and transferred to the pilot Wikipedias to translate and adapt. Check out [[c:File:Article Guidance workflow demo - April 2026.webm|the video]] explaining the feature.
'''Updates for editors'''
* On most wikis, all autoconfirmed users can now use [[Special:ChangeContentModel|Special:ChangeContentModel]] page to [[mw:Special:MyLanguage/Help:ChangeContentModel|create new pages with custom content models]], such as mass message lists, making custom page formats more accessible. Check [[Special:ListGroupRights|Special:ListGroupRights]] for the status of your wiki. [https://phabricator.wikimedia.org/T248294]
* The Growth team has launched an [[mw:Special:MyLanguage/Contributors/Account_Creation_Experiments|account creation experiment]] to evaluate whether adding an account creation button to the mobile web header increases new account registrations and encourages more mobile users to contribute to the wikis. The experiment is currently live on Hindi, Indonesian, Bengali, Thai, and Hebrew Wikipedia, and targets 10% of logged-out mobile web users.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:30}} community-submitted {{PLURAL:30|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where VisualEditor could get stuck loading on Windows devices with animations turned off, has now been fixed. [https://phabricator.wikimedia.org/T382856]
'''Updates for technical contributors'''
* Starting later this week, {{int:group-abusefilter}} who have the [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] beta feature enabled will have [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] instead of [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] as the editor at [[Special:AbuseFilter|Special:AbuseFilter]]. This is part of the broader effort to make the user experience more consistent across all editors. [https://phabricator.wikimedia.org/T399673][https://phabricator.wikimedia.org/T419332]
* Tools and bots that access the [[mw:Special:MyLanguage/Notifications/API|Notifications API]] (<bdi lang="zxx" dir="ltr"><code><nowiki>action=query&meta=notifications</nowiki></code></bdi>) will need to update their OAuth or BotPassword grants to also include access to private notifications. [https://phabricator.wikimedia.org/T421991]
* Due to a library upgrade, listings on category pages may be displayed out of order starting on Monday, 20th April. A migration script will be run to correct this, and will take hours to days depending on the size of the wiki (up to a week for English Wikipedia). [https://phabricator.wikimedia.org/T422544]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.24|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/16|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W16"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೦:೪೮, ೧೩ ಎಪ್ರಿಲ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30380527 -->
== <span lang="en" dir="ltr">Tech News: 2026-17</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W17"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/17|Translations]] are available.
'''Weekly highlight'''
* After two years of development, [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], also known as [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], is to be promoted out of beta on Tuesday, April 21. It brings better code and wikitext readability, reduction in typing errors, and other [[mw:Special:MyLanguage/Help:Extension:CodeMirror|benefits]] to all users of the standard syntax highlighter. A huge thank you to volunteer [https://phabricator.wikimedia.org/p/Bhsd/ Bhsd] who developed many of the new features, including [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Code folding|code folding]], [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Autocompletion|autocompletion]], and [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|linting]]. [https://phabricator.wikimedia.org/T259059]
* A major update to the Wikipedia app for iOS is now rolling out, redesigning the interface to align with Apple's latest "Liquid Glass" visual design. [https://apps.apple.com/us/app/wikipedia/id324715238 Download the latest version] and explore the update.
'''Updates for editors'''
* [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|Reading lists]] is a feature which allows readers to save articles to a list for reading later. This feature is now in beta on Arabic, French, Indonesian, Vietnamese, and Chinese Wikipedias and by default for all new accounts on all Wikipedias.
* An experiment which explores extending [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|Page Previews to mobile web]] will be launched in the week of April 20 on Arabic, English, French, Italian, Polish, and Vietnamese Wikipedias. Page Previews are pop-ups that display a thumbnail, lead paragraph, and a link to open the full article of a blue link, thereby improving content discovery. The feature is already available on desktop and in the apps. [[m:Special:MyLanguage/List of experiments in Product and Technology#Template|Read more about this experiment and others]].
* On several wikis, logged-in editors who haven't [[mw:Special:MyLanguage/Help:Email confirmation|confirmed their email addresses]] can now see a banner encouraging them to do so. Having the email address confirmed allows a user to restore access to the account if they lose it. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Encouraging users to confirm their email addresses|Learn more]]. [https://phabricator.wikimedia.org/T421366]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:15}} community-submitted {{PLURAL:15|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where editing very large wiki pages in the 2017 wikitext editor caused slow loading, preview and scrolling lag, and performance issues when selecting, cutting, or pasting content, has now been fixed. [https://phabricator.wikimedia.org/T184857]
'''Updates for technical contributors'''
* As part of the promotion of [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] from a beta feature, all users will use [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] instead of [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] for syntax highlighting when editing JavaScript, CSS, JSON, Vue and Lua content pages. [https://phabricator.wikimedia.org/T419332]
* The <code>mirrors.wikimedia.org</code> service for Debian and Ubuntu users will sunset and stop working on May 15. The resources for the service will be replaced with new and better options. Some users may need to switch to a different server which should take about a minute. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/LJYRIS4WB66HIRCAO4GIDTXCMDVZRBMA/ You can read more]. [https://phabricator.wikimedia.org/T416707]
* The <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi> table will be removed from [[wikitech:Help:Wiki Replicas|wikireplicas]]. If your tools or queries access <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> or <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi> directly, please update them to use the <bdi lang="zxx" dir="ltr"><code><nowiki>file</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>filerevision</nowiki></code></bdi> table before 28 May. [https://phabricator.wikimedia.org/T28741]
* Following the recent implementation of global API rate limits on unidentified traffic, the Wikimedia Foundation will continue efforts to ensure [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|fair use of infrastructure]] by applying global limits to identified API traffic beginning the last week of April. These limits are intentionally set as high as possible to minimise impact on the community. Bots running in Toolforge/WMCS or with the bot user right on any wiki should not be affected for now. However, all developers are advised to follow updated best practices. For more information, see [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|Wikimedia APIs/Rate limits]] and [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits/FAQ|Frequently Asked Questions]].
* The [[mw:Special:MyLanguage/Attribution API|Attribution API]] is now available as a [[mw:Special:MyLanguage/Wikimedia APIs/Stability policy|beta]]. The API fetches information for crediting Wikimedia articles and media files wherever they are used. Reference documentation is available through the REST Sandbox special page available on all Wikimedia wikis (such as the [https://en.wikipedia.org/w/index.php?api=attribution.v0-beta&title=Special%3ARestSandbox REST sandbox on English Wikipedia]). Share your feedback on the [[mw:Talk:Attribution API|project talk page]].
* There is no new MediaWiki version this week.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/17|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W17"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೦:೩೦, ೨೦ ಎಪ್ರಿಲ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30432763 -->
== <span lang="en" dir="ltr">Tech News: 2026-18</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W18"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/18|Translations]] are available.
'''Updates for editors'''
* There is a change in how new users are autoconfirmed that will improve anti-vandalism protection. Currently, users who have had an account for a few days and made a few edits are automatically added to the [[{{int:grouppage-autoconfirmed/{{CONTENTLANGUAGE}}}}|{{int:group-autoconfirmed}}]] group. This configuration tends to be exploited by some vandals, who create accounts and start to use them only after some time. To mitigate this, the configuration will be updated next week so that – for the purpose of becoming autoconfirmed – the account age will be counted from their first edit, instead of registration date. The numeric value of the age threshold will remain the same. This change will be deployed only to wikis which require at least one edit as part of the autoconfirmation conditions. [https://phabricator.wikimedia.org/T418484]
* All Wikipedia users with new accounts and those who activated the "automatically enable most beta features" option in their preference can now use the [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|reading lists]] beta feature to save articles for later reading. This helps organize reading interests in one place for convenient access.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:30}} community-submitted {{PLURAL:30|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where infobox images have huge padding in Firefox, has been fixed. [https://phabricator.wikimedia.org/T423676]
'''Updates for technical contributors'''
* As a reminder, the global API rate limits will be applied this week to identified API traffic. This is to help ensure [[mw:MediaWiki Product Insights/Responsible Reuse|fair use of infrastructure]]. Bots running in Toolforge/WMCS or with the bot user right on any wiki should not be affected for now. However, all developers are advised to follow updated best practices. For more information, including the actual rate limits, see [[mw:Wikimedia APIs/Rate limits|Wikimedia APIs/Rate limits]] and [[mw:Wikimedia APIs/Rate limits/FAQ|Frequently Asked Questions]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.26|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/18|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W18"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೩:೩೬, ೨೭ ಎಪ್ರಿಲ್ ೨೦೨೬ (IST)
<!-- Message sent by User:UOzurumba (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30458046 -->
== <span lang="en" dir="ltr">Tech News: 2026-19</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W19"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/19|Translations]] are available.
'''Weekly highlight'''
* The [[mw:Special:MyLanguage/Article guidance|Article guidance]] team invites experienced editors of [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators|pilot Wikipedias]]—Arabic, Bangla, Japanese, Portuguese, Persian, Turkish, Simple English, Spanish, and French—to help translate and adapt [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance sample outlines]. These outlines will guide editors in creating clear, well-structured, and policy-compliant articles when using [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Special:NewArticle the feature] once it is launched in May 2026. [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|Simple instructions]] on how to translate and adapt the outlines are available.
'''Updates for editors'''
* The [[:m:Special:MyLanguage/Product and Technology Advisory Council|Product and Technology Advisory Council]] has published [[:m:Special:MyLanguage/Product and Technology Advisory Council/May 2026 draft PTAC recommendation for feedback|draft recommendations]] on a model that affiliates can follow when contributing to the technical space. Community members are invited to provide feedback on the recommendation until May 8th [[:m:Talk:Product and Technology Advisory Council/May 2026 draft PTAC recommendation for feedback|on the talk page]].
* The number of available thumbnail size preferences in MediaWiki is being reduced to three standardized options—Small (180px), Regular (250px), and Large (400px), as part of ongoing efforts to improve performance and reduce strain on thumbnail services. As a result, existing preferences will be mapped to the nearest new size (for example, smaller selections like 120px or 150px will render at 180px, while larger ones like 300px or 360px will render at 400px). The preferences interface will soon be updated to reflect these changes, and users who wish to opt out or provide feedback can do so. [https://phabricator.wikimedia.org/T424909]
* From now on, even when a permission expires automatically, users will receive an Echo notification similar to the standard notification for permission changes. There is a difference between this and [[m:Special:MyLanguage/Global reminder bot|Global reminder bot]] in that the latter reminds users a week ''before'' the rights are due to expire, so that they can renew the rights.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:32}} community-submitted {{PLURAL:32|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the problem where the ULS language selector in [[m:Special:Translate|Special:Translate]] would scroll vertically when it shouldn't, has been resolved. Previously, when users opened the "Translate to English" dropdown and typed certain inputs, the dialog would scroll vertically by a few pixels even when there was enough space to display all results. The dropdown no longer shifts unnecessarily when filtering languages. [https://phabricator.wikimedia.org/T358864]
* The [[m:Special:GlobalWatchlist|Global Watchlist]], which lets you view your watchlists from multiple wikis on a single page, continues to improve. For example, watchlists for Wikibase sites such as [[:d:|Wikidata]] now support [[mw:Special:MyLanguage/Extension:EntitySchema|EntitySchema]] elements for better tracking. The Live Updates mode now refreshes the special page every 60 seconds to comply with the updated [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|global API rate limits]] for improved real-time responsiveness. Additionally, a directionality bug that displayed links as "changes 3" instead of "3 changes" in mixed-direction lists has been fixed. [https://phabricator.wikimedia.org/T415450][https://phabricator.wikimedia.org/T424422][https://phabricator.wikimedia.org/T418091]
'''Updates for technical contributors'''
* The second phase of [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|global API rate limits]] has been rolled out to reduce the [[diffblog:2026/03/26/quo-vadis-crawlers-progress-and-whats-next-on-safeguarding-our-infrastructure/|impact of AI crawlers]] and ensure fair, sustainable access to Wikimedia resources, prioritising human and mission-aligned traffic. [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits#Limits|Limits]] have been shifted from per-hour to per-minute, producing smoother traffic patterns and more predictable API load. Community users are not expected to be affected, and no action is required. Early indications show some User-Agent-based requestors are adjusting behaviour, and around 64% of automated API traffic has been identified. Monitoring continues, and Wikimedia Enterprise remains available for commercial support.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.46/wmf.27|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/19|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W19"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೧೩, ೫ ಮೇ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30498077 -->
== <span lang="en" dir="ltr">Tech News: 2026-20</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W20"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/20|Translations]] are available.
'''Weekly highlight'''
* Community Tech has published [[m:Special:MyLanguage/Community Wishlist/How to write a good wish|new guidance]] explaining how wishes on Community Wishlist are triaged and prioritized. The documentation is intended to help contributors write stronger proposals by clarifying the factors that influence prioritization decisions. Beyond vote counts, the guidance highlights considerations such as potential impact on the community when determining which wishes move forward.
'''Updates for editors'''
* The Reader Growth team is launching an experiment to test a new [[mw:Special:MyLanguage/Readers/Reader_Growth/Share_Card|Share Card feature]] that allows readers to create visually engaging cards from Wikipedia articles or selected article sections and share them online, with each card linking back to the original article to help expand readership and article discovery. The mobile-only A/B test will be available to a portion of readers on Arabic, Chinese, French, Vietnamese, and English Wikipedia to better understand reading and sharing habits, and is scheduled to begin the week of May 18 and run for four weeks.
* The Android and iOS Wikipedia apps recently released the [[mw:Special:MyLanguage/Wikimedia_Apps/Team/25th_Birthday_Reading_Challenge|25-day reading challenge]] into Beta, as part of efforts to drive reader engagement by encouraging users to complete reading milestones. To track their reading streak during the challenge, App users can add a widget featuring Baby Globe to their home screen. The challenge officially begins May 11.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:17}} community-submitted {{PLURAL:17|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the global preference for enabling syntax highlighting in wikitext could unexpectedly disable itself after being turned on, has now been fixed. [https://phabricator.wikimedia.org/T425286]
'''Updates for technical contributors'''
* [[File:Octicons-tools.svg|12px|link=|alt=|Advanced item]] The ResourceLoader module <bdi lang="zxx" dir="ltr"><code><nowiki>mediawiki.ui.input</nowiki></code></bdi>, deprecated since [[m:Special:MyLanguage/Tech/News/2023/39|September 2023]], will be removed this week. There is a [[mw:Special:MyLanguage/Codex/Migrating_from_MediaWiki_UI|guide for migrating from MediaWiki UI to Codex]] for any tools that use it. [https://phabricator.wikimedia.org/T420125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.2|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/20|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W20"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೫೦, ೧೨ ಮೇ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30524429 -->
== <span lang="en" dir="ltr">Tech News: 2026-21</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W21"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/21|Translations]] are available.
'''Weekly highlight'''
* The Abstract Wikipedia team has identified five potential pilot wikis to assess their interest in adopting abstract articles on their wikis. The pilots are Malayalam, Bengali, Dagbani, Arabic, and Indonesian Wikipedia. The feedback period will be open until May 22. If your community is interested in becoming a pilot, [[m:Talk:Abstract Wikipedia|let us know on Meta]].
'''Updates for editors'''
* An experiment to show [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Reading Lists]] to logged-out readers on mobile web will launch on May 18 across German, Spanish, Italian, Portuguese, Polish, Dutch, Turkish, and Urdu Wikipedias, and will run for one month. The effort supports broader goals of helping readers save and organize articles for later reading, while encouraging habits that could lead to future Wikipedia contributions.
* To support a bookmark button in the Reading List beta feature, the "Tools > Action" menu has been updated to display icons, including the watch star indicator that helps editors identify temporarily watched articles. The icons now also match those used on mobile, improving consistency across platforms. The change is currently limited to the actions menu and mainly affects editors with privileged user rights. [https://phabricator.wikimedia.org/T426008]
* [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Suggestion Mode]] was released as an [[w:en:A/B test|A/B test]] for newcomer editors on the mobile website at [[phab:T421189|~15 Wikipedias]]. The experiment will measure the impact that Suggestion Mode has on the proportion of newcomer mobile web edit sessions that result in constructive (un-reverted) article edits. The experiment will also evaluate the feature's impact on editor retention, and monitor changes in revert and block rates.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:27}} community-submitted {{PLURAL:27|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue in the Wikipedia Android app where images could sometimes fail to load after opening a recommended reading list notification, has now been fixed. [https://phabricator.wikimedia.org/T418231]
'''Updates for technical contributors'''
* The [[mw:Special:MyLanguage/Wikidata Platform|Wikidata Platform team]] has published its [[d:Special:MyLanguage/Wikidata:SPARQL query service/WDQS backend update/Backend Replacement|backend replacement recommendation]] and accompanying [[wikitech:Wikidata Query Service/WDQS Architecture re-design|technical architecture]] for the migration of the Wikidata Query Service (WDQS) away from Blazegraph. Feedback is invited until May 25th 2026, especially on potential gaps and impacts on advanced use cases. Wikidata community members and WDQS users are also encouraged to help identify high-impact tools and workflows that may need attention on [[d:Wikidata:SPARQL query service/WDQS backend update/High-Impact Use Cases|this page]]. Feedback can be shared on the [[d:Wikidata talk:SPARQL query service/WDQS backend update|Migration talk page]] or during the [[d:Special:MyLanguage/Wikidata:Blazegraph Migration Office Hours|next office hour]]. See the [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|WDP team newsletter]] for more details.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.3|MediaWiki]]
'''In depth'''
* On English, French, Japanese, and a few other Wikipedias, there was a [[diffblog:2025/09/02/better-detecting-bots-and-replacing-our-captcha/|trial of hCaptcha]], a third-party bot detection service. The trial showed that hCaptcha effectively detects and deters some bad-faith automated activity, on its own and by giving [[w:en:Wikipedia:Village pump (technical)/Archive 225#Introducing SuggestedInvestigations|checkusers and stewards]] signals to look into. Because the results were positive, hCaptcha will be rolled out across all wikis over the next few weeks. [[mw:Special:MyLanguage/Product Safety and Integrity/Anti-abuse signals/hCaptcha|See the hCaptcha project page]] for technical information about the implementation and privacy protections. [[diffblog:2026/05/04/better-detecting-bots-and-replacing-our-captcha-part-2/|Learn more]].
* The latest Community Tech update is now available, with progress across several Community Wishlist initiatives, including Reading Lists expansion from the mobile app to the website, new language support for "Who Wrote That" and the Personal Dashboard, improvements to 3D rendering and Charts, and upcoming work on talk page sorting, audio playback, and editing workflows. The update also shares current priorities, wishlist status trends, and opportunities for community feedback on future focus areas and the Wikimedia Foundation’s 2026–2027 Annual Plan. [[m:Special:MyLanguage/Community Wishlist/Updates#May 13, 2026: Latest updates from the Community Tech team|Read the full newsletter for details]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/21|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W21"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೧:೫೧, ೧೯ ಮೇ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30539262 -->
== <span lang="en" dir="ltr">Tech News: 2026-22</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W22"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/22|Translations]] are available.
'''Weekly highlight'''
* Following a [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#LOWM|successful account creation experiment]], an improved logged-out edit warning message will be deployed to all Wikimedia wikis in the first week of June. The change will only affect logged-out users on mobile web who open an editing session. The updated experience is designed to encourage account creation more clearly, while still allowing users to edit with temporary accounts. Results from the experiment showed a significant increase in account creation, with a 27% relative lift among users shown the updated message. As expected, as more people funnel into account creation, temporary accounts decreased by a relative 16%. The experiment did not show any significant changes in constructive edit rates or other monitored contributor metrics. [https://phabricator.wikimedia.org/T424595]
'''Updates for editors'''
* For security reasons, members of certain user groups are [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|required to have two-factor authentication]] (2FA) enabled. Members of these groups will be unable to disable the last 2FA method on their account, and it will be impossible to add users without 2FA to these groups. Users will still be able to add new authentication methods or remove them, as long as at least one method is continuously enabled. In the next few weeks, users without 2FA will be removed from these groups. Notably, this applies to bureaucrats. See the linked tasks for deployment schedules. [https://phabricator.wikimedia.org/T423119][https://phabricator.wikimedia.org/T423120]
* [[m:Special:MyLanguage/WMDE Technical Wishes|WMDE Technical Wishes]] will run an [[w:en:A/B testing|A/B test]] on [[:phab:T415904|10 wikis]], testing [[m:WMDE Technical Wishes/References/Reference Previews|potential improvements for Reference Previews]]. The experiment will run for ~2 weeks at the end of May / beginning of June and will affect 10% of desktop readers on the participating wikis.
* After two successful experiments, the Reader Growth team is rolling out an [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Image Browsing]] beta feature for all Wikipedias on mobile on May 25. This means that anyone who has all beta features on by default will start to see this feature, and others can check the box to turn it on in their preferences. The beta feature will include a carousel of all an article's images at the top of the article, with controls for editors to [[mw:Readers/Reader_Growth/Image_Browsing#Phase_2.1_beta_feature|exclude images from the article's carousel or to exclude an article from the feature entirely]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:30}} community-submitted {{PLURAL:30|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, three dimensional STL files were being rendered incorrectly by the media viewer 3D extension which is now fixed. [https://phabricator.wikimedia.org/T416723]
'''Updates for technical contributors'''
* The legacy CSS classes <bdi lang="zxx" dir="ltr"><code><nowiki>tleft</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>tright</nowiki></code></bdi> have been replaced with <bdi lang="zxx" dir="ltr"><code><nowiki>floatleft</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>floatright</nowiki></code></bdi> as the former do not work consistently across all MediaWiki platforms, notably mobile web and mobile apps. Projects relying on these classes are encouraged to review related usage and plan for migration. Please note that <bdi lang="zxx" dir="ltr"><code><nowiki>floatleft</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>floatright</nowiki></code></bdi> may also be deprecated in future, although there are currently no plans to do so. [[phab:T426452|Read more]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.4|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/22|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W22"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೩:೨೨, ೨೬ ಮೇ ೨೦೨೬ (IST)
<!-- Message sent by User:Quiddity (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30584502 -->
== <span lang="en" dir="ltr">Tech News: 2026-23</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W23"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/23|Translations]] are available.
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Readers/Reader Experience|Reader Experience team]] is conducting an experiment to show the [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|reading lists]] feature, which is still in development, to logged-out mobile readers to test whether it encourages account creation at a higher rate compared to the watchstar button. The [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists#Experiment timeline|experiment]] was launched on May 18th on German, Spanish, Italian, Portuguese, Polish, Dutch, Turkish, and Urdu wikis, and it will run for a month.
* The Wikimedia Apps team released [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh/Phase 1|Phase 1]] of the redesigned Home Feed to the Android Beta app. The new Home Feed includes a refreshed "Community" tab and a personalized "For You" tab featuring daily updated reading recommendations. The redesign is part of a broader effort to improve content discovery and create more engaging learning experiences in the Wikipedia apps.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:18}} community-submitted {{PLURAL:18|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where images could fail to load for some suggested edits on [[w:Special:Homepage|Special:Homepage]], leaving the thumbnail stuck in a loading state, has now been fixed. [https://phabricator.wikimedia.org/T424048]
'''Updates for technical contributors'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.5|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/23|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W23"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೩೮, ೨ ಜೂನ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30613639 -->
== <span lang="en" dir="ltr">Tech News: 2026-24</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W24"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/24|Translations]] are available.
'''Weekly highlight'''
* Wikimedia Enterprise has increased the free usage limits for its API offerings. The monthly request limit for the On-demand API has increased from 5,000 to 50,000 requests, while the Snapshot API limit has increased from 15 to 30 requests per month. In addition, Structured Contents snapshots are now available for free accounts. These changes expand access to Wikimedia Enterprise data for developers, researchers, and organizations using Wikimedia content. [https://enterprise.wikimedia.com/blog/enhanced-free-api]
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Explore Feed Refresh/Phase 1|refreshed Explore Feed]], now called the Home Feed, is rolling out to 50% of users of the Wikipedia Android app. The Home Feed helps readers discover relevant content through two new tabs: ''Community'' and ''For You''. The Community tab provides a scrollable feed of curated content and updates from the broader Wikimedia community and movement, while the ''For You'' tab offers a full-screen, swipeable experience that shows content tailored to a user's interests. The redesign is part of a broader effort to improve discovery and enhance the learning experience in the Wikipedia app.
* The [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/"Which came first?" Game|Which came first?]] daily trivia game is now available in the beta version of the Wikipedia iOS app in English, German, French, Portuguese, Russian, Spanish, Arabic, Chinese, and Turkish. The game uses historical events from Wikipedia's "On This Day" content and challenges readers to guess which of two events happened first. The game was previously released on Android. Communities interested in making the game available in their languages can [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Games#Game availability by language|read the instructions and requirements]].
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Sub-referencing]], a new MediaWiki feature that allows editors to reuse references with different details, will begin rolling out to Wikimedia wikis following a successful pilot phase. Deployment will start on 8 June for most [[wikitech:Deployments/Train#Wednesday|Group 1 wikis]] and French Wikipedia, with additional Wikipedia language editions receiving the feature over the coming months. Communities are encouraged to prepare by checking for [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-cite&language=en&action_source=search&filter=%21translated&optional=1&action=translate untranslated Cite extension messages] in their language and reviewing any use of [[mw:Special:MyLanguage/Reference Tooltips|Reference Tooltips]], which may require [[:phab:T416304#11668731|updates]] to support the new functionality. Wikis using [[mw:Special:MyLanguage/Help:Reference Previews|Reference Previews]] do not need to take any action. Communities may also wish to create the ''cite-tracking-category-ref-details'' [[Special:TrackingCategories|tracking category]] as a hidden category using <code><nowiki>__HIDDENCAT__</nowiki></code> (or a dedicated template), and connect it to the corresponding Wikidata item [[d:Q129764848]]. [https://phabricator.wikimedia.org/T425662]
* The [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews#Experimentation|Page Previews experiment]] on mobile web has concluded. The team decided not to roll out the feature after the results showed no statistically significant impact on reader retention, as the primary success metric was retention improvement. Page Previews, which are already available on desktop and in the apps, display a thumbnail, lead paragraph, and link to the full article when readers tap a blue link. The experiment tested this experience on mobile web across six Wikipedias.
* The [[mw:Special:MyLanguage/Codex/Design/Icons|user interface icon library]] will be [[phab:T399175|updated later this week or next week]]. Most of the ~300 icons have been slightly refined and ~30 new icons have been added. These changes improve the icons to make them more consistent and comprehensible, and provide more visual balance when they are used in groups.
* The [[mw:Special:MyLanguage/Universal Language Selector|Universal Language Selector]] (ULS) interface in MediaWiki, which helps users select content in other languages, has been updated. The new version improves speed and accessibility, and users of Wikimedia projects can now pin languages for quicker language switching. The deployment to Wikimedia sites will happen gradually in the coming weeks. You can test it now as a beta feature by selecting [[Special:Preferences#mw-prefsection-betafeatures|beta features]] in your profile preferences and share your feedback on [[mw:Special:MyLanguage/Universal Language Selector/New ULS|the project page]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:21}} community-submitted {{PLURAL:21|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the Pageviews Analysis dashboard on pageviews.wmcloud.org stopped updating graph data in May 2026, affecting all users, has been fixed. [https://phabricator.wikimedia.org/T427171]
'''Updates for technical contributors'''
* The function signature for <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink()</nowiki></code></bdi> has been simplified. Developers can now pass a configuration object instead of a list of positional parameters when creating portlet links. The previous function signature remains supported for backwards compatibility. For example, instead of: <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', '#', 'Stub', 'ca-stubtag', 'Add a stub tag to this page');</nowiki></code></bdi> use <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', { href: '#', text: 'Stub', id: 'ca-stubtag', tooltip: 'Add a stub tag to this page' });</nowiki></code></bdi>. Script maintainers are encouraged to review existing uses of <bdi lang="zxx" dir="ltr"><code><nowiki>addPortletLink()</nowiki></code></bdi> and update them where appropriate. This change will be available on all wikis from 11 June. Thanks to community volunteer Gerges for contributing this improvement. [https://phabricator.wikimedia.org/T427945]
* '''Community Wishlist discussion''': Product & Technology [[m:Special:MyLanguage/Community Wishlist/Updates#May 20, 2026: Community Tech becomes a program|introduced changes]] meant to increase the number and complexity of wishes fulfilled, including the disbanding of the Community Tech team. They are [[m:Special:MyLanguage/Community Wishlist/Updates|engaging in discussions]] about a [[m:Talk:Community Wishlist#Proposed direction for Wishlist|proposed direction for the wishlist]] from community members. Includes ways to structure annual voting, better tracking of wishes, removing focus areas, and [[m:Special:MyLanguage/Community Wishlist/Updates|staffing updates]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.6|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/24|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W24"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೫೯, ೯ ಜೂನ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30650573 -->
== <span lang="en" dir="ltr">Tech News: 2026-25</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W25"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/25|Translations]] are available.
'''Weekly highlight'''
* The [[mw:Special:MyLanguage/Readers/Reader Growth|Reader Growth team]] has launched an [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Image Browsing]] beta feature on the mobile web version of all Wikipedias. The feature shows an image carousel at the top of articles with 3 or more images. Editors can configure this feature with the following controls: to hide a specific image from a page, either use <code>class=notpageimage</code> excluding it from thumbnail previews, or <code>class=noviewer</code> excluding it from MediaViewer. The carousel can also be disabled from a page entirely, with the magic word <code><nowiki>__NOMEDIAVIEWERCAROUSEL__</nowiki></code>. To submit feedback or flag bugs, please visit the [[mw:Talk:Readers/Reader Growth/Image Browsing|project page]].
* [[mw:Special:MyLanguage/Help:Tables#class="wikitable"|Wikitables]] can now be [[mw:Special:MyLanguage/Help:Sortable tables#Forcing the initial sort direction|sorted in descending order]] on the first click by adding <code dir=ltr>data-sort-order="desc"</code> to the header cell. Previously, by default, clicking a column header for the first time sorts it in ascending order. This addition to a Wikitable gives it more control and flexibility, while the default behavior for subsequent clicks remains unchanged. [https://phabricator.wikimedia.org/T398416]
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Article guidance|Article guidance]] feature is currently being tested with some editors creating new articles on the Simple English, French, and Turkish Wikipedias. The experiment will soon begin on the Arabic and Bangla Wikipedias as well. [[w:simple:Special:NewArticle|This feature]] gives editors community-curated guidance to help them create articles that follow community standards. Experienced editors can continue creating or adapting outlines for specific article types that are commonly created by less experienced contributors. The outlines guide less experienced editors in creating high-quality articles. A quick guide to markups used in outlines can be found on [[mw:Special:MyLanguage/Article guidance/Test feature guide#Markups in outlines|this page]]. [[w:simple:Wikipedia:Article Guidance|Example outlines]] that can be adapted and instructions for how to adapt them are on [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|this section]] of the project page.
* Wikis that wish to replace the "indefinitely" button in Special:Block for temporary accounts (for example, wikis that block temporary users only until account expiration) will be able to do so by creating [[MediaWiki:ipb-indefinite-expiry-temporary-account]] with the block duration they want. [https://phabricator.wikimedia.org/T427125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:41}} community-submitted {{PLURAL:41|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]].
'''Updates for technical contributors'''
* By the end of June, a valid user-agent string will be required for automated dumps downloads from the dumps.wikimedia.org website. Automated requests that provide a generic or empty user-agent will be blocked. This [[phab:T400119|extends enforcement]] of the long standing [[foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|user-agent policy]]. Access to dumps through Wikimedia Cloud Services will not change.
* The roll out of global [[mw:Wikimedia APIs/Rate limits|API rate limits]] is now complete, with limits enforced across all APIs and at the documented levels for all groups. Bots running in Toolforge/WMCS or with the bot user right on any wiki remain exempt. All bots should continue to follow the documented best practices to avoid being rate limited.
* The [https://api.wikimedia.org/wiki/Main_Page API Portal wiki] will be read only starting this week (June 15-18). The following week (June 22-25), all API Portal wiki URLs will redirect to [[mw:Wikimedia APIs|Wikimedia APIs on mediawiki.org]]. Learn more on the [[wikitech:API Portal/Deprecation|project page]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.7|MediaWiki]]
'''Meetings and events'''
* On June 17th at 6pm UTC the WMF will be holding Discord call focused on a code review. We've heard through the [[mw:Special:MyLanguage/Developer Satisfaction Survey/2026|Developer Satisfaction Survey]] that volunteers are struggling with code review and we'd like to discuss these experiences with the goal of surfacing workable solutions. You can join the call [https://discord.gg/wikipedia?event=1514727511102062664 via the Wikimedia Community Discord server].
* The [[m:Special:MyLanguage/Conferencia Wikimedia de América Latina 2026|Latin American Wikimedia Conference]] will host a regional hackathon that will bring together the Wikimedia movement’s technical community including developers, system administrators, data scientists, and users with extended rights. Interested technical contributors can [https://docs.google.com/forms/d/e/1FAIpQLSf4osJzTHBJjQbYJk7TMVEJjTEQv7IgtsUDfP-o-qTgeRQQxw/viewform apply for a scholarship] to participate until June 21 at midnight (Bolivia time, UTC-4).
* Sign up for Wikimania Team Challenges to join this special event. The Team challenges will take place online and in person from July 21 to 22, before Wikimania conference. Everyone is welcome, regardless of skills or Wikimania registration. Teams will work on 10 important challenges supporting the Wikimedia community. For details, visit [[wmania:Special:MyLanguage/2026:Team challenges|the Team Challenges page]] and [https://wikimedia.eventyay.com/wm/teamchallenges/ register there]. Registration closes on June 20th at 11pm UTC.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/25|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W25"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೨:೧೮, ೧೫ ಜೂನ್ ೨೦೨೬ (IST)
<!-- Message sent by User:UOzurumba (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30689604 -->
== <span lang="en" dir="ltr">Tech News: 2026-26</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W26"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/26|Translations]] are available.
'''Weekly highlight'''
* [[mw:Special:MyLanguage/Growth/Feature summary|Growth features]] are [[phab:T418115|now available at Wikidata]]. This update enables access to Mentorship ([[mw:Special:MyLanguage/Help:Growth/Mentorship|if configured]]), Impact module, the Help Panel, and a simplified Newcomer Homepage (without Suggested Edits). Wikidata administrators are still configuring the features through Community Configuration.
'''Updates for editors'''
* The special page [[{{#special:RangeCalculator}}]] has been created. It allows users to find an IP range without needing to rely on external tools. Until now, this tool was only available to CheckUsers. [https://phabricator.wikimedia.org/T268429]
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Sub-referencing]] is a new MediaWiki feature that allows editors to reuse references with different details. It will be deployed to most small and medium-sized Wikipedia language versions on June 23. The [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#deployment|FAQ]] lists possible actions to take on your wiki to support the deployment. Check the [[:phab:T414094|rollout plan]] for the next deployment steps. [https://phabricator.wikimedia.org/T428902]
* Starting next week, users will get a notification when they are blocked or unblocked from editing, or if this block changes. [https://phabricator.wikimedia.org/T100974]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:32}} community-submitted {{PLURAL:32|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]].
'''Updates for technical contributors'''
* Starting next week, abuse filters that are set to "require CAPTCHA verification" will begin to also affect users with the <code>skipcaptcha</code> right, which includes most autoconfirmed users. Bots are exempted. This change only affects edits that trigger an abuse filter. The <code>skipcaptcha</code> right will continue to exempt users from having to solve CAPTCHAs in the ordinary course of using the wikis. [https://phabricator.wikimedia.org/T402595]
* Reference documentation for the [[wikitech:Machine_Learning/LiftWing/API|Lift Wing API]] has moved from the API Portal to the interactive [https://wikitech.wikimedia.org/w/index.php?api=lift-wing&title=Special%3ARestSandbox REST Sandbox].
* The API Portal wiki is now closed. For API documentation, see [[mw:Special:MyLanguage/Wikimedia_APIs|Wikimedia APIs on mediawiki.org]]. All API Portal wiki URLs (https://api.wikimedia.org/wiki/) will redirect to the mediawiki.org page starting June 22. [https://phabricator.wikimedia.org/T427537]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.8|MediaWiki]]
'''Meetings and events'''
* Join an online call on 25 June at 2:30pm UTC to meet the current Wikimedia interns for [[mw:Google_Summer_of_Code/2026|Google Summer of Code]] and [[mw:Outreachy/Round_32|Outreachy]]. Interns will provide an overview of their projects and a brief demo of their work so far. Attendees are encouraged to [[mw:event:Google_Summer_of_Code/Summer_2026_June_Internship_open_session|share ideas and connections in their community]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/26|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W26"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೧೮:೩೫, ೨೩ ಜೂನ್ ೨೦೨೬ (IST)
<!-- Message sent by User:Trizek (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30722494 -->
== <span lang="en" dir="ltr">Tech News: 2026-27</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W27"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/27|Translations]] are available.
'''Updates for editors'''
* As part of the [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|Account Creation Experiments]], the Growth team tested adding a user account icon in the mobile web header for logged-out users, providing direct access to "Create account" and "Log in" actions. The experiment increased account creation by about 20% without negatively affecting edit quality or constructive edit rates. The feature will now be rolled out to all Wikimedia Foundation wikis on mobile web in the first week of July. [https://phabricator.wikimedia.org/T428220]
* After a [[phab:T426248|successful experiment]], logged-in users who did not [[mw:Special:MyLanguage/Help:Email_confirmation|confirm their email address]] when their account was created see a new banner asking them to complete that process. This helps reduce the risk that users get locked out of their account, and makes account email addresses overall more reliable. This is part of the [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Account Security]] project. [https://phabricator.wikimedia.org/T428292]
* An update to [[Special:Search|Search]] is refining how the <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> behaves when used to exclude results. Previously, using <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> with negation could unintentionally broaden search results by adding the namespaces included in the search scope, leading to confusing behavior for users expecting a straightforward exclusion filter. With the update, <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> will now strictly exclude matching page titles as intended and may display a warning if the relevant namespace has not been explicitly selected. The behavior of <bdi lang="zxx" dir="ltr"><code><nowiki>prefix:</nowiki></code></bdi> without negation however remains unchanged. [https://phabricator.wikimedia.org/T427443]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:33}} community-submitted {{PLURAL:33|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where reviewers using the Page Curation toolbar were not automatically subscribed to talk page discussions they started has now been fixed. Reviewers will now receive notifications when someone replies to those discussions. [https://phabricator.wikimedia.org/T329346]
'''Updates for technical contributors'''
* Starting June 29th, automated downloads from the dumps.wikimedia.org website will be subject to the [[Foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|user-agent policy]]. Automated requests that provide a generic or empty user-agent will be blocked. Access to dumps through Wikimedia Cloud Services remains unaffected. This is a follow up to the announcement made in the [[m:Special:MyLanguage/Tech/News/2026/25|2026/25 issue of Tech News]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.9|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/27|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W27"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೧೭:೧೭, ೨೯ ಜೂನ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30744833 -->
== <span lang="en" dir="ltr">Tech News: 2026-28</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W28"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/28|Translations]] are available.
'''Updates for editors'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:34}} community-submitted {{PLURAL:34|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the search bar results on Wikidata, showed English results instead of using the correct language fallback for users of language variants, has now been fixed. Search suggestions will now follow the expected language fallback chain. [https://phabricator.wikimedia.org/T429769]
'''Updates for technical contributors'''
* In preparation for [[m:Special:MyLanguage/Event:Celebrate Women|Celebrate Women campaign]] planned for March 2027, the Wikimedia Foundation’s [[m:Special:MyLanguage/Wikimedia Foundation/Advancement/Community Growth/Content Enablement|Content Enablement team]] has launched a 22-question survey to better understand technical contributions by women+ (anyone who identifies as a woman) across Wikimedia projects. The survey takes approximately 15–20 minutes to complete and will remain open until 20 July 2026. The [[m:Special:MyLanguage/Celebrate Women/Technical contributions survey|questions]] are also available on-wiki for review in advance.
* The [[mw:Special:MyLanguage/Extension:Score|Score extension]] now supports rendering music scores as SVG images in addition to PNG, addressing a long-standing [[:phab:T49578|feature request]] and resolving historical image quality issues. Both formats are now provided to clients, with PNG in the <bdi lang="zxx" dir="ltr"><code><nowiki>src</nowiki></code></bdi> attribute and SVG in the <bdi lang="zxx" dir="ltr"><code><nowiki>srcset</nowiki></code></bdi> attribute.
* The new [[wikitech:Parsoid|Parsoid]] parser [[mw:Special:MyLanguage/Parsoid/Parser_Unification/Updates|continues to be deployed to additional wikis]], making it easier to introduce new reading and editing features. It was enabled on French Wikipedia, bringing total progress to covering 78.9% of Wikipedia page views. Rollout to English Wikipedia desktop will progress through this week.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.10|MediaWiki]]
'''In depth'''
* The Wikimedia Hackathon 2026 [[diffblog:2026/06/29/wikimedia-hackathon-2026-building-collaborating-and-shaping-the-future-together/|recap blog post]] is now live. It highlights the projects, sessions, and social activities from this year’s event, and shares initial plans for the 2027 Wikimedia Hackathon.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/28|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W28"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೧೯:೨೬, ೬ ಜುಲಾಯಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30773578 -->
== <span lang="en" dir="ltr">Tech News: 2026-29</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W29"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/29|Translations]] are available.
'''Updates for editors'''
* [[mw:Special:MyLanguage/Growth/Revise_Tone|Revise Tone]] helps newcomers identify passages in Wikipedia articles that may contain non-encyclopedic language and encourages them to consider revising the tone. The feature was [[w:en:A/B_testing|A/B tested]] on the Arabic, English, French, and Portuguese Wikipedias, where newcomer task completion rates [[mw:Special:MyLanguage/Growth/Revise_Tone#Experiment_Results|increased by 38.7%]] compared to the default Copyedit task, with no decrease in edit quality. The test ended on July 9, and the feature is now available for everyone on these wikis, configurable via Community Configuration. [[phab:T426364|The plan]] is to release Revise Tone to more wikis.
* The community configuration that allows [[mw:Special:MyLanguage/Help:Growth/Mentorship#Automated mentor list cleanup|automatic removal of inactive mentors]] based on configurable criteria will be enabled on Thursday 16, [[mw:Special:MyLanguage/Growth/Deployment|on some wikis]] to keep mentor lists up to date. Mentors are experienced contributors who opt in to help new users on-wiki through the [[mw:Special:MyLanguage/Growth/Feature summary|Growth Features]]. Administrators can now prepare the settings via [[w:Special:CommunityConfiguration/Mentorship|Special:CommunityConfiguration/Mentorship]]; they will take effect starting Thursday.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:38}} community-submitted {{PLURAL:38|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where some users of the Wikipedia Android app were logged out immediately after signing in, preventing them from staying logged in and editing pages, has now been fixed. [https://phabricator.wikimedia.org/T316916]
'''Updates for technical contributors'''
* Editing a page via user scripts or gadgets was causing watchlist labels that the user had assigned to that page to reset. This has now been fixed. [https://phabricator.wikimedia.org/T423778]
* To work around a Safari bug (see [[phab:T425211]]), on Parsoid-enabled wikis, wikilink hrefs now use absolute urls instead of protocol-relative urls. REST API output remains unchanged and continue to use protocol-relative urls. Gadgets, user scripts, bots, and CSS might need to be adapted if they relied on the presence of protocol-relative urls in wikilink hrefs. [https://phabricator.wikimedia.org/T431358]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.11|MediaWiki]]
'''In depth'''
* The Wikimedia Foundation’s Experiment Platform Team has published a blog post reflecting on its first year of structured experimentation. It highlights successful experiments such as Paste Check, Reference Check, and Tone Check, which improved editing outcomes and have been rolled out to more users, as well as experiments that did not lead to product changes. [[diffblog:2026/07/07/moving-the-needle-how-we-test-new-ideas-across-wikimedia-projects|Read more]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/29|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W29"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೧:೪೧, ೧೩ ಜುಲಾಯಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30804401 -->
== <span lang="en" dir="ltr">Tech News: 2026-30</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W30"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/30|Translations]] are available.
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Reader/Reader Experience|Reader Experience team]] has incorporated community feedback around the placement of watchstar and watchlist buttons for the [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|Reading Lists beta feature]], which would allow for saving articles for later reading – a [[m:Special:MyLanguage/Community Wishlist/W102|wishlist item]] to bring the functionality to web. Editors are invited to enable the beta feature to test it out and [[phab:T426453|share their thoughts]].
* [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Suggestion Mode]] offers edit suggestions within the VisualEditor for improving Wikipedia articles. [[Special:EditChecks|All suggestions]] are [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators – local customization|community-configurable]]. The [[mw:Special:MyLanguage/Edit check/TextMatch|TextMatch]] feature is a way for volunteers to create custom local suggestions. The feature searches in articles for strings of text, and now includes support for regular expressions. This gives volunteers greater precision and flexibility over the kinds of local suggestions they can create. Note: Suggestions [[mw:Special:MyLanguage/Edit check/Configuration#:~:text=maximumEditcount|can be targeted]] based on the edit count of the person editing as well as other aspects of the page. You can [[mw:Special:MyLanguage/Help:Suggestion mode#Create custom local types of Suggestions|find examples from other communities]] for inspiration, including TextMatches that detect: typos, grammar-errors, potential advertisements, clichés, incorrect dash or hyphen usage, non-specific time keywords, outdated names, and more. Any [[mw:Special:MyLanguage/Talk:VisualEditor/Suggestion Mode|feedback]] is appreciated.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:27}} community-submitted {{PLURAL:27|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the SVG Translate tool could use an outdated version of a file, causing existing translations to be overwritten when new ones were uploaded, has now [[phab:T430577|been fixed]]. Overall, in the last quarter from April – June 2026 about 337 community tasks were resolved by the Wikimedia Foundation.
'''Updates for technical contributors'''
* On Parsoid-enabled wikis, Parsoid now renders a maximum of 1,250 images per page. A new tracking category, "media-limit-reached", will be soon made available to identify pages where this limit is reached, making it easier to find content whose media output may have been restricted during rendering. See [[phab:T430854]] for more information and to provide feedback.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.12|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/30|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W30"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೧೧:೧೬, ೨೧ ಜುಲಾಯಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30836091 -->
== <span lang="en" dir="ltr">Tech News: 2026-31</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W31"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/31|Translations]] are available.
'''Updates for editors'''
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Wishlist item]] [[mw:Special:MyLanguage/ContentTranslation|Content Translation]] now supports dark mode, fulfilling a [[m:Community Wishlist/W544|Community Wishlist request]]. This brings the tool in line with the accessibility features available in the Vector 2022 and Minerva skins, helping reduce visual fatigue for users translating content. [https://phabricator.wikimedia.org/T367077]
* DiscussionTools' source mode and the 2017 wikitext editor will now offer autocomplete for links (<bdi lang="zxx" dir="ltr"><code><nowiki>[[</nowiki></code></bdi>), templates (<bdi lang="zxx" dir="ltr"><code><nowiki>{{</nowiki></code></bdi>), HTML and parser tags (<bdi lang="zxx" dir="ltr"><code><nowiki><</nowiki></code></bdi>), and magic words (<bdi lang="zxx" dir="ltr"><code><nowiki>__</nowiki></code></bdi>), making it quicker and easier to insert links, templates, and other wiki markup while editing. [https://phabricator.wikimedia.org/T432400]
* The [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|Readers Growth team]] has concluded its experiment with mobile page previews and will not roll out the feature. Page Previews are a pop-up bottom sheet that appears when readers tap a blue link, showing a thumbnail, lead paragraph, and an option to open the article. The experiment showed flat retention and negative indicator metrics, suggesting that mobile web readers preferred navigating directly to linked articles rather than using page previews.
* The Reader Experience team has seen encouraging early results from the [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Reading Lists feature]], with 93% of participating users reporting that it was useful. Reading Lists help active readers save articles for future reading and support their learning goals on Wikimedia projects. The team plans further improvements before expanding the feature to more users.
* The [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh|Explore Feed Refresh]] initiative was tested with new and casual Wikipedia app readers. The refreshed feed helps readers discover new and relevant content. After a 10.5% increase in engagement with the feed, Wikimedia Apps team has decided to scale the Home Feed redesign to iOS with the learnings from the Android release applied.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:23}} community-submitted {{PLURAL:23|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where subject names in the Article Guidance feature were displayed with incorrect capitalization on French Wikipedia, has now been fixed. Subject names will now follow the correct capitalization rules for the language. [https://phabricator.wikimedia.org/T427201]
'''Updates for technical contributors'''
* After running several [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|Account Creation Experiments]] to improve registration completion rates, a new version of the username field on [[Special:CreateAccount|Create Account]] has been rolled out. It includes [[:c:File:Create account - July 2026 updates.png|a popover summarizing the username policy]] to provide clearer guidance during account creation. As part of this change, the messages <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-helpusername</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-help</nowiki></code></bdi> that several communities have configured will no longer be used. If communities want to customize the guidance shown in the new popover, they can instead edit the following messages: <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet1</nowiki></code></bdi>, <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet2</nowiki></code></bdi>, and <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet3</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T430604]
* Later this week, the [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror syntax highlighter]] will offer [[w:en:Theme (computing)|themes]]. The themes can be picked from a dropdown menu in the full [[mw:Special:MyLanguage/Help:Extension:CodeMirror#CodeMirror preferences|CodeMirror preferences]] dialog. For wikitext, available themes are default, colorblind-friendly (previously the colorblind preference option on [[Special:Preferences#mw-prefsection-editing]]) and no-highlighting. For code languages (i.e., CSS/JavaScript/JSON/Vue/Lua), there are several themes available. These same themes will eventually be available for wikitext, too. [https://phabricator.wikimedia.org/T163533]
* From now on, wikis can restrict editing in the "User" namespace to only the page owner and certain user groups. [[mw:Special:MyLanguage/Manual:$wgRestrictUserPageEditing|Read the configuration documentation]] to learn more.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.14|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/31|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W31"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೧೯, ೨೮ ಜುಲಾಯಿ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30856308 -->
== <span lang="en" dir="ltr">Tech News: 2026-32</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W32"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/32|Translations]] are available.
'''Updates for editors'''
* The [[mw:Special:MyLanguage/Readers/Reader Experience|Reader Experience team]] has developed a [https://82db7c8d4b.catalyst.wmcloud.org/w/index.php?title=Regent%27s_Park&uselang=de patch demo] that wraps the page toolbar onto two lines when there is not enough horizontal space for all the buttons. This aims to reduce crowding in the Vector 2022 toolbar, which can occur on some language Wikipedias at certain screen widths. [https://phabricator.wikimedia.org/T429518]
* The Reader Experience team is planning to launch [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Reading Lists]], a [[m:Special:MyLanguage/Community Wishlist Survey 2021/Mobile and apps/Have Apps reading lists available on Destop/Mobile|Community Wishlist item]], which is currently available to try in beta, as a full feature in September. Before then, volunteer translator help is needed for [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-readinglists&filter=&action=translate string translations] into a number of languages. The feature supports reading and learning goals on Wikipedia.
* Next week, the table of contents on Wikimedia Commons file pages will be improved by consolidating the file page table of contents with the page table of contents. This will make it easier to understand a file page’s structure, navigate to specific sections, and share links to individual sections. [https://phabricator.wikimedia.org/T332644]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:24}} community-submitted {{PLURAL:24|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where some [[w:TIFF|TIFF]] images failed to load after clicking their thumbnail, causing a broken image to be displayed instead of the full-size image, has now been fixed. [https://phabricator.wikimedia.org/T429326]
'''Updates for technical contributors'''
* The variable and function selector in AbuseFilter has been updated to support search and autocomplete. It will allow filter maintainers to find the desired variable or function more quickly. [https://phabricator.wikimedia.org/T323698]
* The MJPEG and VP8 formats are removed from the video player. The MP4 format (MPEG-4 Part 2) is added instead, which provides higher quality videos to older iPhone devices. It may take a few weeks to retroactively update all existing videos. The default format for modern devices stays the same (VP9/WebM). [https://phabricator.wikimedia.org/T358266]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.15|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/32|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W32"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೧:೧೬, ೪ ಆಗೋಸ್ಟು ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30872536 -->
== <span lang="en" dir="ltr">Tech News: 2026-33</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W33"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/33|Translations]] are available.
'''Updates for editors'''
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Wishlist item]] A new ChartWizard is [[c:Special:ChartWizard/Data:Example.Pie.chart|now available on Wikimedia Commons]] for users interested in creating charts from their own data. The wizard makes the [[mw:Special:MyLanguage/Extension:Chart|Chart extension]] more beginner-friendly by allowing editors to create charts, such as bar and pie charts, without needing to use JSON. Users can still switch to the JSON editor if they prefer. Feedback on the new tool is welcome on the [[m:Talk:Community Wishlist/W414|wish talk page]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:19}} community-submitted {{PLURAL:19|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the Wikipedia iOS app’s Picture of the Day widget displayed the same image every day instead of updating daily, has now been fixed. [https://phabricator.wikimedia.org/T430692]
'''Updates for technical contributors'''
* [[mw:Special:MyLanguage/Extension:Math|Math formula]] SVG images will soon be generated in the browser instead of on the server. MathML continues to be generated on the server and renders in the browser without JavaScript. Wikibooks will see this change on 12 August, Wikisource on 19 August and Wikipedia from 20-27 August. You can try this by selecting "{{int:Mw-math-mathjax}}" in your preferences. This change is part of [[mw:Special:MyLanguage/RESTBase/deprecation|deprecating RESTBase]] and [[phab:T431372|deprecating Mathoid]]. [https://phabricator.wikimedia.org/T271001]
* Category pages will soon support sorting entries by the time they are added to a category. This will make it easier to find recently or long-standing categorized pages. It will also improve workflows for maintenance categories such as deletion backlogs and other time-based review tasks. You can use <bdi lang="zxx" dir="ltr"><code><nowiki>cldsort=timestamp</nowiki></code></bdi> URL argument in category view to sort the entries. [https://phabricator.wikimedia.org/T433768]
* [[mw:Special:MyLanguage/Extension:Gadgets|Gadgets]] and user scripts on Wikimedia wikis may now use [[phab:T395347|ES2018 features]] and [[phab:T419142|ES2019 features]] in JavaScript code. Previously, the platform only allowed up to ES2017. MediaWiki validates the source code to protect functionality from syntax errors and to ensure scripts are valid in all [[mw:Special:MyLanguage/Compatibility#Browser_support_matrix|supported browsers]]. [https://phabricator.wikimedia.org/T419142]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/33|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W33"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೧೫, ೧೧ ಆಗೋಸ್ಟು ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30901051 -->
== <span lang="en" dir="ltr">Tech News: 2026-34</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W34"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/34|Translations]] are available.
'''Weekly highlight'''
* The [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Worklist|Worklist feature]] for the Event Registration tool is now live on all Wikimedia wikis. With Worklist, event organizers can add the articles their event will focus on directly to the event page. The Worklist also powers [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Worklist#How Event Pathways uses the worklist|Event Pathways]] which notifies other editors of the upcoming or ongoing event when they edit an article featured in the event's Worklist. This is the minimum viable version (MVP), and feedback is welcome. Organizers are encouraged to try the feature. A hands-on [[m:Special:MyLanguage/Event:Worklist Setup Workshop: Get Your Event Ready|Worklist Setup Workshop]] will take place on 18 August at 16:00 UTC and 19 August at 11:00 UTC.
'''Updates for editors'''
* [[Special:ShortPages]] displays short pages by their size, but in many cases it gets filled with disambiguations and soft redirects, making it harder to find the short articles themselves. Starting this weekend, you will be able to choose not to include an article in the special page by adding the magic word <bdi lang="zxx" dir="ltr"><code><nowiki>__EXPECTSHORTPAGE__</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T433203]
* One new wiki has been created: a {{int:project-localized-name-group-wikipedia/en}} in [[d:Q3436680|Bole]] ([[w:bol:|<bdi lang="zxx" dir="ltr"><code><nowiki>w:bol:</nowiki></code></bdi>]]) [https://phabricator.wikimedia.org/T429921]
* Starting the week of August 17, the page toolbar will wrap onto two lines when there is not enough horizontal space for all the buttons. This is a [[phab:T429518|fully merged patch from the Reader Experience team]] which aims to reduce crowding in the Vector 2022 toolbar, that may occur on some language Wikipedias at certain screen widths.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:16}} community-submitted {{PLURAL:16|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, uploading large files to Wikimedia Commons has become more stable and less prone to failure following some fixes related to the “Could not acquire lock” upload error. [https://phabricator.wikimedia.org/T386640]
'''Updates for technical contributors'''
* Debian Bullseye will reach the end of its Long Term Support on 31 August 2026. [[phab:T434103|Some Cloud VPS projects]] still have instances running Debian Bullseye. Maintainers of those projects are encouraged to migrate to Debian Bookworm or Debian Trixie. A [[wikitech:Help:Cloud VPS instance operating system migration|migration guide]] is available to help with the process, and users may also want to consider whether their workload is better suited to Toolforge. If you need help or cannot complete the migration by 31 August, please contact the Cloud VPS admins as soon as possible. [[listarchive:list/cloud-announce@lists.wikimedia.org/thread/RVIPQSYLKMSL5M46JP6NEJVGVE6I2RXQ/|Read more]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/34|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W34"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೩೩, ೧೮ ಆಗೋಸ್ಟು ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30922806 -->
== <span lang="en" dir="ltr">Tech News: 2026-35</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W35"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/35|Translations]] are available.
'''Updates for editors'''
* The [[Special:CreateAccount|Special:CreateAccount]] page has been simplified as part of ongoing work to modernize the account creation experience. The panel showing project statistics no longer appears next to the form on desktop and mobile web. Multiple account creation experiments show that a simpler form helps newcomers complete registration. [https://phabricator.wikimedia.org/T433783]
* In order to improve page performance, images now load when they are viewed. This means images lower down an article will not load if a reader never scrolls to that part of the page, which may affect some image-related metrics. [https://phabricator.wikimedia.org/T148047]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:42}} community-submitted {{PLURAL:42|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where image thumbnails in Abstract Wikipedia could fail to display after the corresponding file was moved on Wikimedia Commons, has now been fixed. Thumbnails will now update correctly when files are moved. [https://phabricator.wikimedia.org/T433448]
'''Updates for technical contributors'''
* User Info card is a feature that helps patrollers see information about user accounts. So far, it has been available only in places such as page history, logs and recent changes. Now, it's possible to [[mw:Special:MyLanguage/Help:Extension:CheckUser#User_Info_card_in_page_content|place it in the page content]] as well, using the <bdi lang="zxx" dir="ltr"><code><nowiki>{{#uic:}}</nowiki></code></bdi> parser function. It can be particularly useful in templates like [[:en:Template:Userlinks|<bdi lang="zxx" dir="ltr"><code><nowiki>{{Userlinks}}</nowiki></code></bdi>]] (or their specialized variants), as it will make it easier to see the context about a user on various noticeboard pages. The card will be displayed only to users who have it enabled in their [[Special:Preferences#mw-input-wpcheckuser-userinfocard-enable|preferences]]. [https://phabricator.wikimedia.org/T424466]
* Due to user security and privacy risks, we have disabled access to <bdi lang="zxx" dir="ltr"><code><nowiki>Special:MyPage</nowiki></code></bdi> URLs when specifically using <bdi lang="zxx" dir="ltr"><code><nowiki>action=raw</nowiki></code></bdi>. If you are impacted by this, consider whether you can use an alternative approach. <bdi lang="zxx" dir="ltr"><code><nowiki>Special:MyPage</nowiki></code></bdi> URLs can still be accessed and used without <bdi lang="zxx" dir="ltr"><code><nowiki>action=raw</nowiki></code></bdi>. Specified user page URLs (e.g. <bdi lang="zxx" dir="ltr"><code><nowiki>User:Myusername</nowiki></code></bdi>) can still be used with <bdi lang="zxx" dir="ltr"><code><nowiki>action=raw</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T120386]
* Due to an update, the thumbnailing software has been improved. This includes upgrading <bdi lang="zxx" dir="ltr"><code><nowiki>librsvg</nowiki></code></bdi> to 2.60 and <bdi lang="zxx" dir="ltr"><code><nowiki>ImageMagick</nowiki></code></bdi> to 7, as well as resolving a number of long-standing thumbnailing bugs like rendering errors. [https://phabricator.wikimedia.org/T419815#12222841]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.17|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/35|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W35"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೧೫, ೨೫ ಆಗೋಸ್ಟು ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30961208 -->
== <span lang="en" dir="ltr">Tech News: 2026-36</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W36"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/36|Translations]] are available.
'''Weekly highlight'''
* A new format for the Community Wishlist is open for feedback. You can [[m:Special:MyLanguage/Community Wishlist/Community Wishlist 2027|read the proposed ideas on Meta]]. This new process plans to improve how wishes are triaged, voted on, and prioritized in a way that is transparent and balanced across project families and language editions. This consultation is open for two weeks.
'''Updates for editors'''
* The latest release of the Wikipedia Android app includes updates to the Saved feature, bringing the app’s saving experience closer to iOS and Web. The update redesigns the Saved tab with an “All articles” view, removes the default “Saved” reading list, renames reading lists to “Collections,” and modernizes the article-saving experience. [https://phabricator.wikimedia.org/T420788]
* The [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Reading Lists]] feature was enabled for all logged-in users on Bengali, Chinese, Czech and Vietnamese Wikipedias on August 25, after several months as a beta feature. Reading Lists will be available to all logged-in users on Arabic, French and Indonesian Wikipedias on September 1, followed by English Wikipedia on September 14, and all other Wikipedia wikis on September 28.
* At the end of the month, some logged-out readers on Bengali, Czech, Persian, English, and Polish Wikipedias using the Minerva skin on mobile will see an [[mw:Special:MyLanguage/Readers/Reader_Growth/Minimal_Minerva|updated navigation bar]] in an [[w:A/B test|A/B test]]. The test will compare the current navigation bar with a new version designed to make it easier to find information more quickly. The goal is to determine whether these changes encourage readers to return more often. This experiment will not change the experience for logged-in readers and/or editors.
* Editors who maintain redirects, templates, and categories used on redirect pages now have improved ways for finding and curating redirects. Previously, redirects pages could not be searched. Two new search keywords, <bdi lang="zxx" dir="ltr"><code><nowiki>onlyredirects:</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>withredirects:</nowiki></code></bdi>, now allow redirects to be searched directly and can be combined with existing keywords such as <bdi lang="zxx" dir="ltr"><code><nowiki>incategory:</nowiki></code></bdi>, <bdi lang="zxx" dir="ltr"><code><nowiki>intitle:</nowiki></code></bdi>, and <bdi lang="zxx" dir="ltr"><code><nowiki>insource:</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T204089]
* The ISBN lookup tools for generating citations were recently not working because of external service problems. Developers are working on solutions. [https://phabricator.wikimedia.org/T435179]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:30}} community-submitted {{PLURAL:30|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where searching for pages by category using <bdi lang="zxx" dir="ltr"><code><nowiki>deepcat</nowiki></code></bdi> could return no results or unrelated results has now been fixed. [https://phabricator.wikimedia.org/T414859]
'''Updates for technical contributors'''
* The domain of URLs for thumbnails is changing from upload.wikimedia.org to thumb.wikimedia.org. The old URLs will continue to work for the foreseeable future but MediaWiki will advertise the new domain instead. URLs to other types of media such as original files, videos and transcodes will still be served from upload.wikimedia.org. [https://phabricator.wikimedia.org/T427465]
* The Wikimedia [https://www.mediawiki.org/w/index.php?api=wmf-math%2Fv1&title=Special%3ARestSandbox Math API] is now deprecated. These endpoints will be fully sunset by the end of September 2026. Developers who call these endpoints should transition to alternative math rendering solutions, such as the native [https://developer.mozilla.org/en-US/docs/Web/MathML MathML] or [https://www.mathjax.org/ MathJax]. Third-party MediaWiki installations that utilize the Math extension for formula rendering are required to upgrade to v1.43+ to avoid disruption of service.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.18|MediaWiki]]
'''In depth'''
* Read more about [[mw:Special:MyLanguage/Edit_check/TextMatch|TextMatch]] in a Diff post titled, [[diffblog:2026/08/28/custom-edit-suggestions-for-every-wiki-how-communities-are-shaping-suggestion-mode-with-textmatch/|Custom edit suggestions for every wiki: How communities are shaping Suggestion Mode with TextMatch]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/36|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W36"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೨:೨೩, ೧ ಸಪ್ಟಂಬರ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30990659 -->
== <span lang="en" dir="ltr">Tech News: 2026-37</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W37"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/37|Translations]] are available.
'''Updates for editors'''
* [[mw:Special:MyLanguage/Help:Growth/Tools/Add_a_link|Add a Link]] has been upgraded for English Wikipedia users with improved detection of links that have different capitalization. This will help reduce ambiguous suggestions caused by differences in capitalization in article titles, including articles about cultural goods. A second phase of improvements is planned, which will also prepare the feature for release in other languages. [https://phabricator.wikimedia.org/T435526#12240876] [https://phabricator.wikimedia.org/T434259]
* The [[mw:Special:MyLanguage/Article_guidance|Article guidance]] feature will be enabled by default for junior editors on Simple English and Turkish Wikipedia starting 10 September 2026 following [[mw:Special:MyLanguage/Article_guidance/Updates#Summary_of_experiment_result|an experiment]]. Junior editors with 0 to 99 edits will automatically see the feature when they click a red link or use the "[[tr:Vikipedi:Madde_sihirbazı|Madde oluşturto]]" option on Turkish Wikipedia to create a new article. The change is intended to help junior editors create higher-quality articles that meet each Wikipedia’s standards. [[phab:maniphest/query/z3tcTjmLMxk5/#R|Additional improvements]] will continue based on the experiment results and community feedback.
* The [https://pageviews.wmcloud.org Pageviews Analysis] tool which allows users to compare pageviews across multiple pages, turns 10 years old this year and several new features have been added. They include [[toolforge:wikinav|WikiNav]] which provides insights into how readers of Wikipedia explore the content, editing stats in [https://pageviews.wmcloud.org/siteviews?range=latest-30&sites=en.wikipedia.org Siteviews], the ability to [https://pageviews.wmcloud.org/massviews?source=wikiproject&project=en.wikipedia.org lookup articles belonging to a WikiProject], and support for dark mode. [https://phabricator.wikimedia.org/T378549]
* A [[mw:Special:MyLanguage/Readers/Reader_Growth/Minimal_Minerva|visually simplified Minerva]] navigation bar is being tested for logged-out readers using mobile web on the Bengali, Czech, English, Farsi, and Polish Wikipedias. The experiment aims to determine whether simplifying the navigation improves reader retention. The test will run from August 31 to September 28, and no action is required from users.
* [[m:Special:MyLanguage/WMDE Technical Wishes|WMDE Technical Wishes]] is working on improving [[en:Wikipedia:VisualEditor/Named references|auto-generated reference names in VisualEditor]]. Editors will only notice a slight change starting this week. When adding automatic reference names the numbering will start at <bdi lang="zxx" dir="ltr"><code><nowiki>:1</nowiki></code></bdi> instead of <bdi lang="zxx" dir="ltr"><code><nowiki>:0</nowiki></code></bdi>. Read more on the [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|project page]]. [https://gerrit.wikimedia.org/r/c/VisualEditor/VisualEditor/+/1332704]
* All wikis will be [[m:Special:MyLanguage/Tech/Server switch|read-only for a few minutes]] on September 23. This is planned at 14:00 UTC. More information will be published in Tech News and will also be posted on individual wikis in the coming weeks. [https://phabricator.wikimedia.org/T433363]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:25}} community-submitted {{PLURAL:25|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where [[mw:Special:MyLanguage/Parsoid|Parsoid]] could mishandle nested nowiki tags, causing content to be lost and displaying unwanted text has now been fixed. [https://phabricator.wikimedia.org/T435116]
'''Updates for technical contributors'''
* Interface administrators can configure gadgets from [[MediaWiki:Gadgets-definition]]. The definition format has been updated and no longer requires the <bdi lang="zxx" dir="ltr"><code><nowiki>ResourceLoader</nowiki></code></bdi> option, as gadgets are always loaded through <bdi lang="zxx" dir="ltr"><code><nowiki>ResourceLoader</nowiki></code></bdi>. This simplifies gadget configuration by removing an option that is no longer necessary, making gadget definitions easier for administrators. [https://phabricator.wikimedia.org/T298199]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.19|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/37|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W37"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೦೦:೧೪, ೮ ಸಪ್ಟಂಬರ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31008437 -->
== <span lang="en" dir="ltr">Tech News: 2026-38</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W38"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/38|Translations]] are available.
'''Weekly highlight'''
* The Future Audiences team has started a [[en:Special:MyLanguage/Wikipedia:Village pump (proposals)#New proposed experiment to let readers know about “Google preferred sources”|discussion on English Wikipedia]] about a proposed new experiment to show a temporary notice about the new [https://blog.google/products-and-platforms/products/search/original-high-quality-content-search/ Google Preferred Sources] feature to Wikipedia readers coming from Google. The experiment is to test whether this notice makes visitors come back to Wikipedia more often. Preferred Sources feature lets users choose websites they trust so Google can highlight content from those sources more prominently in Search and AI experiences. We are interested in testing this on other languages that Google supports and would welcome assistance with starting conversations on other wikis. If interested, please reach out to Future Audiences on the [[m:Special:MyLanguage/Future Audiences/Preferred sources|talk page]].
'''Updates for editors'''
* The chat platform Discord is releasing a new self-service framework that websites can use to specify how their links should look when shared on Discord. The Future Audiences team is planning to start using this new framework to improve how Wikipedia links look when shared on Discord, giving better attribution and credit to contributors. The link appearance and behavior won't change in the first phase of this project as we want to first collect some baseline data to assess the impact of future changes. However, if community members who are active on Discord spot any issues, they can reach out on [[phab:tag/future-audiences/|Phabricator]] or [[m:Special:MyLanguage/Future Audiences|Metawiki]].
* The Reader Growth team will be running an experiment to test whether [[mw:Special:MyLanguage/Readers/Reader_Growth/Compact Lead|compacting article lead sections on mobiles]] with the addition of a "read more" button improves reader retention. The test will begin on September 17 on Arabic, Spanish, French, Indonesian, Italian, Japanese, Portuguese, Vietnamese, and Chinese Wikipedias and will run for four weeks.
* All wikis will be [[m:Special:MyLanguage/Tech/Server switch|read-only for a few minutes]] on September 23. This is planned at 14:00 UTC. More information will be published in Tech News and will also be posted on individual wikis in the coming week. [https://phabricator.wikimedia.org/T433363]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:28}} community-submitted {{PLURAL:28|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where [https://wikistats.wmcloud.org/ Wikistats] for Wikipedias was returning an HTTP 500 error and could not be reached, has now been fixed. [https://phabricator.wikimedia.org/T435959]
'''Updates for technical contributors'''
* Developers who maintain a tool that queries the Wikimedia Commons links tables need to update their code to connect to the new x4 database cluster. The links tables have been moved from the s4 cluster to x4, and will no longer receive updates on s4. The page and redirect tables remain available on both clusters. A wiki replica for the x4 cluster will be set up afterwards. The change is being made because the s4 cluster has grown too large to operate efficiently. You can [[wikitech:Special:MyLanguage/News/2026 Commons links tables database split|read more]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.20|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/38|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W38"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ೨೧:೦೦, ೧೪ ಸಪ್ಟಂಬರ್ ೨೦೨೬ (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31039826 -->
== <span lang="en" dir="ltr">Tech News: 2026-39</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W39"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/39|Translations]] are available.
'''Weekly highlight'''
* [[m:Special:MyLanguage/Tech/Server switch|All wikis will be read-only]] for a few minutes on Wednesday, 23 September 2026 at [https://zonestamp.toolforge.org/1790172000 14:00 UTC]. This is for the datacenter server switchover backup tests, [[wikitech:Special:MyLanguage/Deployments/Yearly calendar|which happen twice a year]]. During the switchover, all Wikimedia website traffic is shifted from one primary data center to the backup data center to test availability and prevent service disruption even in emergencies. [https://phabricator.wikimedia.org/T433363]
'''Updates for editors'''
* The Growth team tested a new post-edit notice designed to [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#4. Encourage Temporary Accounts to Register|encourage Temporary Account holders to register for a permanent account]]. The new notice replaced multiple dialogs and a simultaneous welcome notification with a single message highlighting the benefits of creating an account. The experiment increased permanent account creation from 1.94% to 3.66%, an 87% relative increase. The change will now be released to all wikis. [https://phabricator.wikimedia.org/T433551]
* For Wikipedia editors using the [[Special:Preferences#mw-prefsection-betafeatures|"Suggestion mode" Beta Feature]], there is a [[Special:Preferences#mw-input-wpvisualeditor-editcheck-experimental|new opt-in user preference]] for showing "experimental" edit checks and suggestions. These types are listed at [[Special:EditChecks#experimental-checks|Special:EditChecks]], and are intended for early developer-testing and for gathering feedback from experienced users. Administrators can change the [[mw:Special:MyLanguage/Edit check/Configuration|configuration details]] for each suggestion as usual. Administrators can also [[mw:Special:MyLanguage/Help:Suggestion mode#Experimental Suggestions|use this feature]] to help test their community's ideas for locally created checks and suggestions. Experimental types will have a more distinct visual style later this week. [[mw:Talk:VisualEditor/Suggestion Mode|Feedback is welcome]].
* The [[m:CEE Technical Village Pump|CEE Technical Village Pump]] has been launched as a space for technical discussions and collaboration among Wikimedia communities in Central and Eastern Europe.
* A new tool, [[mw:Special:MyLanguage/Language Onboarding and Development/Starter kit|Starter Kit]], is now available for new and small language Wikipedia communities. It brings together guided tasks, tools, and resources to help communities get started, monitor their progress, and collaborate with the broader Wikimedia community. Starter Kit is hosted on Wikimedia Toolforge and is designed for Wikipedias with fewer than 50,000 articles. Learn more about how Starter Kit works and how communities have been using it in [[diffblog:2026/09/18/introducing-starter-kit-for-new-and-small-language-wikipedias/|this Diff blog post]].
* The Reader Growth team is launching a retest of the [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|image carousel experiment]]. The retest will use three new versions of the design, updated based on community feedback. The team will assess results and determine with communities whether or not to proceed with the feature. The experiment will begin the week of September 28 and will run on Arabic, Bengali, Chinese, Czech, English, Farsi, French, German, Indonesian, Japanese, Polish, Portuguese, Spanish, Swedish, and Vietnamese Wikipedias.
* After successful rollouts to Arabic, Bengali, Chinese, Czech, English, French, Indonesian, and Vietnamese Wikipedias, the [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Reading Lists feature]] from the Reader Experience team will be available to all logged-in users on all Wikipedia wikis starting September 28.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:28}} community-submitted {{PLURAL:28|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the mentor status script repeatedly updated mentors’ status even when nothing had changed, creating unnecessary Recent Changes entries, has now been fixed. [https://phabricator.wikimedia.org/T436659]
'''Updates for technical contributors'''
* The <bdi lang="zxx" dir="ltr"><code><nowiki>abusefilters</nowiki></code></bdi> list query API, used to retrieve specific details about active or historical abuse filters configured on a wiki, has been updated to support the <bdi lang="zxx" dir="ltr"><code><nowiki>formatversion=2</nowiki></code></bdi> configuration parameter, thereby leading to breaking changes to the API response. All users who maintain user-scripts or other code need to check if they use the <bdi lang="zxx" dir="ltr"><code><nowiki>abusefilters</nowiki></code></bdi> list query API, and respond to any breaking changes. [https://phabricator.wikimedia.org/T435828]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.21|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/39|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W39"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:26, 27 ಸಪ್ಟಂಬರ್ 2026 (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31085309 -->
== <span lang="en" dir="ltr">Tech News: 2026-40</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W40"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/40|Translations]] are available.
'''Updates for editors'''
* Users of default skins on desktop and mobile web (Vector 2022 and Minerva respectively) will now be informed if the search suggestions displayed as they type into Search come from page redirects. Previously, users could get confused when the top search suggestions did not match exactly what they had typed. The new redirect notice clarifies that these suggestions are not random, but related to the search. The suggested pages may be redirects to the most relevant destination articles being searched for. [https://phabricator.wikimedia.org/T303013]
* Logged-out Wikipedia users on mobile web will begin to see a bookmark button for saving articles to their [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|reading lists]] instead of the current Watchstar button. When clicked, the bookmark button prompts users to log in or create an account to save an article for later. An earlier experiment found that the bookmark icon was four times more likely than the Watchstar button to encourage logged-out users to create an account. This change is part of efforts to encourage more readers to become account holders and use features that help them save and return to content. [https://phabricator.wikimedia.org/T438769]
* An experiment will begin on September 29 on Spanish, Arabic, English, and French Wikipedias to simplify the experience users encounter immediately after account creation. The test will explore whether removing friction from the current Welcome Survey helps new users understand what to do next more easily. The experiment will run through the end of October. [https://phabricator.wikimedia.org/T430058]
* The [[m:Special:MyLanguage/Product and Technology Advisory Council|Product and Technology Advisory Council]] has put out a call for the community to suggest topics that it should consider and discuss with the Wikimedia Foundation. Editors and technical contributors are invited to add topics to [[m:Talk:Product and Technology Advisory Council|the council's talk page]].
* Later this week, it will be possible for communities to configure [[mw:Special:MyLanguage/Help:Edit check|Edit Checks and Suggestions]] so that they are [[mw:Special:MyLanguage/Edit check/Configuration#extraNamespaces|shown within additional namespaces]], such as a <bdi lang="zxx" dir="ltr"><code><nowiki>Draft:</nowiki></code></bdi> namespace. [[mw:Talk:VisualEditor/Suggestion Mode|Feedback is welcome]].
* A bug in the [[m:Special:GlobalWatchlist|Global Watchlist]] is causing the page to fail to load for users that have unseen changes on Wikimedia Commons. Developers are working on a fix. Until then, affected users can follow the workarounds described in the [[mw:Special:MyLanguage/Extension:GlobalWatchlist#GlobalWatchlist temporarily broken for users with Wikimedia Commons|relevant]] help section.
* New magic words <bdi lang="zxx" dir="ltr"><code><nowiki>{{CATEGORYSORT:TIMESTAMP}}</nowiki></code></bdi> and <bdi lang="zxx" dir="ltr"><code><nowiki>{{CATEGORYSORT:RTIMESTAMP}}</nowiki></code></bdi> are now available for use. They are able to change the default sorting of categories to be based on timestamp of categorization. [https://phabricator.wikimedia.org/T433768]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:20}} community-submitted {{PLURAL:20|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where [https://wikistats.wmcloud.org/ Wikistats] for Wikipedias was not reachable has now been fixed. [https://phabricator.wikimedia.org/T435959]
'''Updates for technical contributors'''
* The datacenter switchover, scheduled on September 23, has been postponed. [[diffblog:2025/03/12/hear-that-the-wikis-go-silent-twice-a-year/|The equinox exercise]] revealed capacity issues, preventing the switch of all services to the other datacenter. The process has been paused, prioritizing investigating that issue, to ensure that we continue to be able to serve our users reliably. A new exercise will be scheduled. Meanwhile, all traffic and edits continue to work as usual.
* On September 23, a power loss briefly affected all wikis, creating intermittent issues on both reading and editing modes. This also affected Gerrit. This is unrelated to the datacenter switchover postponement. [https://www.wikimediastatus.net/incidents/9fm19t8qykk8]
* [[mw:Special:MyLanguage/Help:Extension:Produnto|Produnto]] has been deployed to mediawiki.org and [[phab:T421436|some Indic language wikis]]. We want to hear your feedback on this experimental product. Produnto allows users to use Lua modules hosted in [[gitlab:repos/lua|Wikimedia's GitLab]]. It simplifies the sharing of Lua code between wikis. Instead of copying each individual Lua module from one wiki to another, users will be able to easily share packages across all wikis.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.22|MediaWiki]]
'''Meetings and events'''
* A [[m:Event:Cross-wiki Code Collaboration Workshop|Cross-wiki code collaboration workshop]] will be held online on October 2 at 12:30 UTC, bringing together South Asian technical contributors to learn about Produnto and begin piloting it on Hindi, Punjabi, Odia, Telugu, and Malayalam Wikipedias. Produnto is a package manager for deploying Lua modules hosted on GitLab to Wikimedia wikis, and was recently deployed on some pilot wikis.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/40|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W40"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:18, 28 ಸಪ್ಟಂಬರ್ 2026 (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31092225 -->
== <span lang="en" dir="ltr">Tech News: 2026-41</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W41"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/41|Translations]] are available.
'''Weekly highlight'''
* The process for this year’s Community Wishlist [[m:Special:MyLanguage/Community Wishlist/Community Wishlist 2027#Updated Community Wishlist Process 2027/2028|has been published]], incorporating community feedback. The wish submission process will [[m:Special:MyLanguage/Community Wishlist/FAQ#What is the deadline for submitting wishes?|end on November 8]]. This year, [[m:Special:MyLanguage/Community Wishlist/Community Wishlist 2027/Working group|a working group (open for volunteering)]] that includes community members familiar with the technical aspect of our wikis alongside Wikimedia Foundation staff, will take care of the [[m:Special:MyLanguage/Community Wishlist/FAQ#What is triage?|triage process]]. The triage is expected to be completed by late November. Votes for wishes will start in January.
'''Updates for editors'''
* Editors using the [[mw:Special:MyLanguage/VisualEditor|visual editor]] will now see a warning when they paste text that is likely to have initially been copied from one of five external generative AI chatbots into Wikipedia. This feature is known as [[mw:Special:MyLanguage/Edit check/LLM Paste Check|LLM Paste Check]]. It is a type of [[mw:Special:MyLanguage/Edit check|Edit Check]] that is community configurable. The check looks for markers in the copied HTML and is not using content watermark detection. Edits will also [[mw:Special:MyLanguage/Edit check/LLM Paste Check#Edit tags|be tagged]] so that patrollers can review them more closely. The feature helps newcomers add content that respects Wikipedia’s policies and makes it easier for experienced editors to identify problematic edits. Communities with local policies about LLM usage can [[mw:Special:MyLanguage/Edit check/LLM Paste Check#Configuration|adjust the wording and policy that is linked]]. The team [[listarchive:list/translators-l@lists.wikimedia.org/message/EVHKWJ4IERZELMPIWNH3XUVUSQV5KOO4/|apologizes]] that this was rolled out without a delay for translations.
* Editors can now easily [[mw:Special:MyLanguage/Wikimedia Apps/Team/Future of Editing on the Mobile Apps|access the web visual editor directly from the iOS and Android apps]]. When opening the editor, users will be given a choice between visual editing and source editing. If they choose visual editing, they will be sent to a mobile web window in their phone's browser. After completing their edit, a banner will give them the option to return to the app. This enables readers to make quick contributions while casually reading.
* Users of the Wikipedia Android and iOS apps will now see a one-time account creation prompt after they have used the app for two consecutive weeks. This prompt explains the benefits of having an account. It is intended to help more casual readers become logged-in users who return to the apps regularly. [https://phabricator.wikimedia.org/T434847]
* Editors on [[wmnoc:conf/dblists/group1.dblist|group1 wikis]], including Wikiquote, Wikibooks, Wikiversity, Wikivoyage, and Wikisource, will no longer see notifications on [[mw:Special:MyLanguage/Help:Recent changes|Recent Changes]] and [[mw:Special:MyLanguage/Help: Watching pages|Watchlist]] when a link to another language version of a page is added, removed, or changed in its Wikidata item. This change will begin on October 5 at 07:00 UTC as a two-week trial to reduce high-volume, low-value notifications and make important changes easier to identify. Editors who rely on these notifications can read more on the [[m:Wikidata For Wikimedia Projects/Clearer Wikidata Edit Summaries/Hide Language Link edits|project page]] and share feedback or concerns on the [[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|talk page]]. [https://phabricator.wikimedia.org/T439415]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:36}} community-submitted {{PLURAL:36|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where mentors who removed themselves from the mentorship program could still have mentees assigned to them and receive questions, has now been fixed. Mentees will now be reassigned when a mentor leaves the program. [https://phabricator.wikimedia.org/T418194]
'''Updates for technical contributors'''
* Wikimedia Brasil has published its [[m:Special:MyLanguage/Wikimedia Brasil/Arcabouço de Boas Práticas de Desenvolvimento|Development Best Practices Framework]] (ABPD). It is a guide for staff, contractors and volunteers building technical tools and projects. It covers the project lifecycle, security, accessibility, personal data protection and responsible AI use, and explains how movement-wide guidelines were adapted to a local context. They encourage other affiliates to reuse it and adapt it. Read more in the [[wmfblog:2026/09/26/wikimedia-brasils-development-best-practices-framework-technical-sustainability-as-an-organizational-responsibility|Diff post]].
* A new, canonical base URL for Wikimedia APIs will soon be introduced. The new canonical route follows a <bdi lang="zxx" dir="ltr"><code><nowiki>{projectName}/api/</nowiki></code></bdi> pattern and will act as an alternative path for current REST APIs (for example: <bdi lang="zxx" dir="ltr"><code><nowiki>{projectName}/w/rest.php/</nowiki></code></bdi>). Both versions will be callable for all existing APIs, but the new structure will be the preferred path for newly created API modules. This change will be non-breaking for most users. The existing pathways will remain available for all existing endpoint requests. However, some endpoints may return URLs following the new pattern in response bodies. Changes will be available on test wiki first, with the rollout expected to cover all wikis by the end of October. [https://phabricator.wikimedia.org/T433535]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.23|MediaWiki]].
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/41|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W41"/>
</div>
00:21, 6 ಅಕ್ಟೋಬರ್ 2026 (IST)
<!-- Message sent by User:Trizek (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31098825 -->
l2x0txl2ga9gxhoyfauxc8zvgynh77f
ಟೆಂಪ್ಲೇಟ್:Crw
10
25299
373875
355281
2026-04-18T13:28:15Z
en>Primefac
0
Primefac moved page [[Template:Crw]] to [[Template:National women's cricket team]]: expand name for clarity
373875
wikitext
text/x-wiki
#REDIRECT [[Template:National women's cricket team]]
{{Redirect category shell|
{{R from move}}
}}
r17dl9qe7tw7hbp5spmyt7o44lh1vtx
373876
373875
2026-10-28T05:55:28Z
ChiK
1136
1 revision imported from [[:en:Template:Crw]]
373875
wikitext
text/x-wiki
#REDIRECT [[Template:National women's cricket team]]
{{Redirect category shell|
{{R from move}}
}}
r17dl9qe7tw7hbp5spmyt7o44lh1vtx
ಮೋಡ್ಯೂಲ್:TuluvasLivingandCultureHeritageTopicsTable
828
28163
373842
367176
2026-10-28T05:23:54Z
A826
4610
+ update table Last updated: 2026-10-28 05:20:38
373842
Scribunto
text/plain
--[[
Module:TuluvasLivingandCultureHeritageTopicsTable
Usage: {{#invoke:TuluvasLivingandCultureHeritageTopicsTable|table}}
This module generates language availability tables and sitelinks for English, Kannada, and Tulu Wikipedias.
]]
local p = {}
-- Define the languages to display in the table
local languages = {
{code = 'en', name = 'English', wiki = 'enwiki'},
{code = 'kn', name = 'ಕನ್ನಡ', wiki = 'knwiki'},
{code = 'tcy', name = 'ತುಳು', wiki = 'tcywiki'}
}
--[[
Module:WikiLovesTuluvasLivingAndCulturalHeritage
Table: Wiki Loves Tuluvas Living and Cultural Heritage
Automatically generated from Wikipedia categories
Last updated: 2026-10-28 05:20:38
]]
local topics = {
-- Tulu Cinema from Category:Tulu cinema
{"Tulu cinema", "Q7852417", "Tulu Cinema", "Tulu cinema", "ತುಳು ಸಿನಿಮಾ", "ತುಳು ಸಿನೆಮಾ"},
{"Cinema of South India", "Q7567541", "Tulu Cinema", "Cinema of South India", "", ""},
{"Ekka Saka", "Q19571574", "Tulu Cinema", "Ekka Saka", "", ""},
{"List of highest-grossing South Indian films", "Q105638942", "Tulu Cinema", "List of highest-grossing South Indian films", "", ""},
{"List of Tulu-language films", "Q21010883", "Tulu Cinema", "List of Tulu-language films", "", ""},
-- People (Udupi) from Category:People from Udupi
{"B.V. Acharya", "Q66442367", "People (Udupi)", "B.V. Acharya", "ಬಿ.ವಿ ಆಚಾರ್ಯ", ""},
{"Prahlad Acharya", "Q7237720", "People (Udupi)", "Prahlad Acharya", "", ""},
{"V. S. Acharya", "Q7906213", "People (Udupi)", "V. S. Acharya", "ವಿ. ಎಸ್. ಆಚಾರ್ಯ", "ವಿ. ಎಸ್. ಆಚಾರ್ಯ"},
{"N. M. Adyanthaya", "Q6951702", "People (Udupi)", "N. M. Adyanthaya", "", ""},
{"Pruthvi Ambaar", "Q95810821", "People (Udupi)", "Pruthvi Ambaar", "ಪೃಥ್ವಿ ಅಂಬಾರ್", "ಪೃಥ್ವಿ ಅಂಬಾರ್"},
{"H. S. Ballal", "Q5628543", "People (Udupi)", "H. S. Ballal", "ಎಚ್. ಎಸ್. ಬಲ್ಲಾಳ್", ""},
{"K. Raghupati Bhat", "Q6323875", "People (Udupi)", "K. Raghupati Bhat", "", ""},
{"Adline Castelino", "Q85943901", "People (Udupi)", "Adline Castelino", "", ""},
{"Meera Chandrasekhar", "Q20810631", "People (Udupi)", "Meera Chandrasekhar", "ಮೀರಾ ಚಂದ್ರಶೇಖರ್", ""},
{"Oscar Fernandes", "Q1453956", "People (Udupi)", "Oscar Fernandes", "ಆಸ್ಕರ್ ಫೆರ್ನಾಂಡಿಸ್", "ಆಸ್ಕರ್ ಫೆರ್ನಾಂಡಿಸ್"},
{"Bannanje Govindacharya", "Q4856866", "People (Udupi)", "Bannanje Govindacharya", "ಬನ್ನಂಜೆ ಗೋವಿಂದಾಚಾರ್ಯ", "ಬನ್ನಂಜೆ ಗೋವಿಂದಾಚಾರ್ಯ"},
{"Nik Gugger", "Q18132152", "People (Udupi)", "Nik Gugger", "", ""},
{"Harini (Kannada actress)", "Q15723133", "People (Udupi)", "Harini (Kannada actress)", "ಹರಿಣಿ", "ಹರಿಣಿ(ನಟಿ)"},
{"Ranjani Hebbar", "Q20880402", "People (Udupi)", "Ranjani Hebbar", "", ""},
{"B. M. Hegde", "Q4883664", "People (Udupi)", "B. M. Hegde", "ಬಿ.ಎಮ್.ಹೆಗ್ಡೆ", ""},
{"Khedinji Kanthappa Hegde", "Q6401191", "People (Udupi)", "Khedinji Kanthappa Hegde", "", ""},
{"Inna Rammohan Rao", "Q130265916", "People (Udupi)", "Inna Rammohan Rao", "", ""},
{"Udupi Jayaram", "Q100234492", "People (Udupi)", "Udupi Jayaram", "ಉಡುಪಿ ಜಯರಾಮ್", ""},
{"M. V. Kamath", "Q3877603", "People (Udupi)", "M. V. Kamath", "ಎಮ್. ವಿ. ಕಾಮತ್", "ಎಂ.ವಿ.ಕಾಮತ್"},
{"K. R. Karanth", "Q6323819", "People (Udupi)", "K. R. Karanth", "", ""},
{"Ganesh Karnik", "Q5520835", "People (Udupi)", "Ganesh Karnik", "", ""},
{"Santosh Kumar Gulwadi", "Q51091201", "People (Udupi)", "Santosh Kumar Gulwadi", "ಸಂತೋಷ ಕುಮಾರ್ ಗುಲ್ವಾಡಿ", ""},
{"Manorama Madhwaraj", "Q6751416", "People (Udupi)", "Manorama Madhwaraj", "", ""},
{"Lalaji Mendon", "Q6480170", "People (Udupi)", "Lalaji Mendon", "", ""},
{"Prabhu Mundkur", "Q65944580", "People (Udupi)", "Prabhu Mundkur", "", ""},
{"Ramdas Pai", "Q7289318", "People (Udupi)", "Ramdas Pai", "ರಾಮದಾಸ ಮಾಧವ ಪೈ", ""},
{"T. M. A. Pai", "Q7668481", "People (Udupi)", "T. M. A. Pai", "ಟಿ.ಎಮ್.ಎ.ಪೈ", "ಟಿ. ಎಮ್. ಎ. ಪೈ"},
{"Vinaya Prasad", "Q3595283", "People (Udupi)", "Vinaya Prasad", "ವಿನಯಾ ಪ್ರಸಾದ್", "ವಿನಯಾ ಪ್ರಸಾದ್"},
{"Ramchandra P. N.", "Q7289286", "People (Udupi)", "Ramchandra P. N.", "", ""},
{"Arun Shenoy", "Q16217614", "People (Udupi)", "Arun Shenoy", "", ""},
{"Nakul Shenoy", "Q35829956", "People (Udupi)", "Nakul Shenoy", "", ""},
{"P. Ranganath Shenoy", "Q7117489", "People (Udupi)", "P. Ranganath Shenoy", "", ""},
{"B. R. Shetty", "Q4834167", "People (Udupi)", "B. R. Shetty", "ಬಿ. ಆರ್. ಶೆಟ್ಟಿ", "ಬಾವಗುತ್ತು ರಘುರಾಮ ಶೆಟ್ಟಿ"},
{"B. Vithal Shetty", "Q4834247", "People (Udupi)", "B. Vithal Shetty", "", ""},
{"I. M. Jayarama Shetty", "Q5968029", "People (Udupi)", "I. M. Jayarama Shetty", "", "ಐ. ಎಮ್. ಜಯರಾಮ ಶೆಟ್ಟಿ"},
{"Kalmanje Jagannatha Shetty", "Q6354026", "People (Udupi)", "Kalmanje Jagannatha Shetty", "", ""},
{"Rakshit Shetty", "Q16239340", "People (Udupi)", "Rakshit Shetty", "ರಕ್ಷಿತ್ ಶೆಟ್ಟಿ", "ರಕ್ಷಿತ್ ಶೆಟ್ಟಿ"},
{"V. P. Shetty", "Q7906168", "People (Udupi)", "V. P. Shetty", "", ""},
{"Vinay Kumar Sorake", "Q7931379", "People (Udupi)", "Vinay Kumar Sorake", "", ""},
{"Gundibail Sunderam", "Q5618639", "People (Udupi)", "Gundibail Sunderam", "", ""},
{"Vishwesha Tirtha", "Q4112616", "People (Udupi)", "Vishwesha Tirtha", "ವಿಶ್ವೇಶ ತೀರ್ಥ", ""},
{"Archana Udupa", "Q4785561", "People (Udupi)", "Archana Udupa", "ಅರ್ಚನಾ ಉಡುಪ", ""},
{"H. V. K. Udupa", "Q66441101", "People (Udupi)", "H. V. K. Udupa", "", ""},
{"K. N. Udupa", "Q20687457", "People (Udupi)", "K. N. Udupa", "", ""},
{"Vadiraj", "Q140332589", "People (Udupi)", "Vadiraj", "", ""},
{"Vaidehi (Kannada writer)", "Q7908699", "People (Udupi)", "Vaidehi (Kannada writer)", "ವೈದೇಹಿ", "ವೈದೇಹಿ"},
{"B. Vittalacharya", "Q3714731", "People (Udupi)", "B. Vittalacharya", "ಬಿ.ವಿಠ್ಠಲಾಚಾರ್ಯ", ""},
-- Transport from Category:Transport in Dakshina Kannada district
{"Kabaka Puttur railway station", "Q63360791", "Transport", "Kabaka Puttur railway station", "", ""},
-- District from Category:Dakshina Kannada district
{"Mangaluru District", "Q950571", "District", "Mangaluru District", "ದಕ್ಷಿಣ ಕನ್ನಡ", "ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ"},
{"Bantval Assembly constituency", "Q55435116", "District", "Bantval Assembly constituency", "", ""},
{"Belthangady Assembly constituency", "Q17017113", "District", "Belthangady Assembly constituency", "", ""},
{"Dakshina Kannada Lok Sabha constituency", "Q5121423", "District", "Dakshina Kannada Lok Sabha constituency", "ದಕ್ಷಿಣ ಕನ್ನಡ (ಲೋಕ ಸಭೆ ಚುನಾವಣಾ ಕ್ಷೇತ್ರ)", ""},
{"Dharmasthala mass burial case", "Q135471372", "District", "Dharmasthala mass burial case", "", ""},
{"Kambala", "Q6356259", "District", "Kambala", "ಕಂಬಳ", "ಕಂಬುಲ"},
{"Mangalore City Assembly constituency", "Q124655666", "District", "Mangalore City Assembly constituency", "", ""},
{"Mangalore City North Assembly constituency", "Q28173545", "District", "Mangalore City North Assembly constituency", "", ""},
{"Mangalore Lok Sabha constituency", "Q6748709", "District", "Mangalore Lok Sabha constituency", "", ""},
{"Moodabidri Assembly constituency", "Q55435115", "District", "Moodabidri Assembly constituency", "", ""},
{"Panemangalore Assembly constituency", "Q124795470", "District", "Panemangalore Assembly constituency", "", ""},
{"Pattanaje", "Q31830233", "District", "Pattanaje", "ಪತ್ತನಾಜೆ", "ಪತ್ತನಾಜೆ"},
{"Kanara", "Q3010684", "District", "Kanara", "ಕೆನರಾ", ""},
{"Pili Yesa", "Q5935713", "District", "Pili Yesa", "ಹುಲಿವೇಷ", "ಪಿಲಿ ಏಸ"},
{"Puttur Assembly constituency", "Q55435117", "District", "Puttur Assembly constituency", "", ""},
{"Siddavesa", "Q31830689", "District", "Siddavesa", "ಸಿದ್ಧವೇಷ", "ಸಿದ್ದವೇಸ ನಲಿಕೆ"},
{"Soujanya rape and murder case", "Q141693449", "District", "Soujanya rape and murder case", "", ""},
{"South Kanara (North) Lok Sabha constituency", "Q48727343", "District", "South Kanara (North) Lok Sabha constituency", "", ""},
{"South Kanara (South) Lok Sabha constituency", "Q48727364", "District", "South Kanara (South) Lok Sabha constituency", "", ""},
{"St. Joseph Church, Belman", "Q60741501", "District", "St. Joseph Church, Belman", "", ""},
{"Sullia Assembly constituency", "Q55435118", "District", "Sullia Assembly constituency", "", ""},
{"Surathkal Assembly constituency", "Q124655639", "District", "Surathkal Assembly constituency", "", ""},
{"Tulu language", "Q34251", "District", "Tulu language", "ತುಳು", "ತುಳು ಬಾಸೆ"},
{"Udupi Assembly constituency", "Q55435028", "District", "Udupi Assembly constituency", "", ""},
{"Ullal Assembly constituency", "Q124655657", "District", "Ullal Assembly constituency", "", ""},
{"Ullal City Municipal Council", "Q28154562", "District", "Ullal City Municipal Council", "", ""},
{"Vittal Assembly constituency", "Q117705790", "District", "Vittal Assembly constituency", "", ""},
-- Museums from Category:Museums in Mangalore
{"Aloyseum", "Q85741013", "Museums", "Aloyseum", "ಅಲೋಸಿಯಮ್", ""},
{"Srimanthi Bhai Memorial Government Museum", "Q85802848", "Museums", "Srimanthi Bhai Memorial Government Museum", "ಶ್ರೀಮಂತಿ ಭಾಯಿ ಸ್ಮಾರಕ ಸರ್ಕಾರಿ ವಸ್ತುಸಂಗ್ರಹಾಲಯ", ""},
-- Buildings & Structures from Category:Buildings and structures in Mangalore
{"Centre for Entrepreneurship Opportunities and Learning", "Q85751277", "Buildings & Structures", "Centre for Entrepreneurship Opportunities and Learning", "", ""},
{"Light House Hill", "Q17068827", "Buildings & Structures", "Light House Hill", "", ""},
{"Mangala Stadium", "Q6748660", "Buildings & Structures", "Mangala Stadium", "ಮಂಗಳ ಕ್ರೀಡಾಂಗಣ", ""},
{"Mangalore Central railway station", "Q4855803", "Buildings & Structures", "Mangalore Central railway station", "ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ", ""},
{"Mangalore International Airport", "Q290527", "Buildings & Structures", "Mangalore International Airport", "ಮಂಗಳೂರು ಅಂತಾರಾಷ್ಟ್ರೀಯ ವಿಮಾನ ನಿಲ್ದಾಣ", ""},
{"Mangalore Junction railway station", "Q16894563", "Buildings & Structures", "Mangalore Junction railway station", "ಮಂಗಳೂರು ಜಂಕ್ಷನ್ ರೈಲು ನಿಲ್ದಾಣ", ""},
{"Netravati Bridge", "Q24912217", "Buildings & Structures", "Netravati Bridge", "", ""},
{"Pandava Caves", "Q15040933", "Buildings & Structures", "Pandava Caves", "ಪಾಂಡವರ ಗುಹೆಗಳು", ""},
{"List of tallest buildings in Mangaluru", "Q19893328", "Buildings & Structures", "List of tallest buildings in Mangaluru", "", ""},
{"TMA Pai International Convention Centre", "Q28154322", "Buildings & Structures", "TMA Pai International Convention Centre", "", ""},
{"Town Hall, Mangaluru", "Q28154431", "Buildings & Structures", "Town Hall, Mangaluru", "", ""},
{"U S Mallya Indoor Stadium", "Q60760744", "Buildings & Structures", "U S Mallya Indoor Stadium", "ಯು ಎಸ್ ಮಲ್ಯ ಒಳಾಂಗಣ ಕ್ರೀಡಾಂಗಣ", ""},
-- Tourist Attractions from Category:Tourist attractions in Dakshina Kannada district
{"Bandaje Falls", "Q4854332", "Tourist Attractions", "Bandaje Falls", "ಬಂಡಾಜೆ ಜಲಪಾತ", ""},
{"Manjusha Museum", "Q6750466", "Tourist Attractions", "Manjusha Museum", "ಮಂಜುಷಾ ವಸ್ತು ಸಂಗ್ರಹಾಲಯ", ""},
-- Temples from Category:Hindu temples in Udupi district
{"Ambalapady Mahakali Temple", "Q4740978", "Temples", "Ambalapady Mahakali Temple", "ಅಂಬಲಪಾಡಿ ಮಹಾಕಾಳಿ ಲಕ್ಷ್ಮೀಜನಾರ್ಧನ ದೇವಾಲಯ", ""},
{"Anantheshwara Temple, Udupi", "Q19899058", "Temples", "Anantheshwara Temple, Udupi", "ಅನಂತೇಶ್ವರ ದೇವಸ್ಥಾನ, ಉಡುಪಿ", ""},
{"Balekudru Shreematha", "Q4850689", "Temples", "Balekudru Shreematha", "", ""},
{"Gude Mahalingeswara Temple", "Q24943431", "Temples", "Gude Mahalingeswara Temple", "", ""},
{"Guru Narasimha Temple, Saligrama", "Q5620424", "Temples", "Guru Narasimha Temple, Saligrama", "ಗುರು ನರಸಿಂಹ ದೇವಸ್ಥಾನ, ಸಾಲಿಗ್ರಾಮ", ""},
{"Kollur Mookambika Temple", "Q3595863", "Temples", "Kollur Mookambika Temple", "ಕೊಲ್ಲೂರು ಮೂಕಾಂಬಿಕಾ ದೇವಸ್ಥಾನ", ""},
{"Maranakatte", "Q6754766", "Temples", "Maranakatte", "ಮಾರಣಕಟ್ಟೆ - ಬ್ರಹ್ಮಲಿಂಗೇಶ್ವರ", ""},
{"Mundkur", "Q5952313", "Temples", "Mundkur", "ಮುಂಡ್ಕೂರು", "ಮುಂಡ್ಕೂರು"},
{"Saarvajanika Nagabrahmastana Moodanidambooru, Bannanje", "Q7395703", "Temples", "Saarvajanika Nagabrahmastana Moodanidambooru, Bannanje", "", ""},
{"Sri Maha Vishnumoorthy Temple, Karval, Yerlapady", "Q7586148", "Temples", "Sri Maha Vishnumoorthy Temple, Karval, Yerlapady", "", ""},
{"Sri Venkataramana Temple, Karkala", "Q7124020", "Temples", "Sri Venkataramana Temple, Karkala", "ವೆಂಕಟರಮಣ ದೇವಸ್ಥಾನ, ಕಾರ್ಕಳ", ""},
{"Sri Vinayaka Temple, Guddattu", "Q60617898", "Temples", "Sri Vinayaka Temple, Guddattu", "ಶ್ರೀ ವಿನಾಯಕ ದೇವಸ್ಥಾನ, ಗುಡ್ಡೆಟ್ಟು", ""},
{"Sri Vishweshwara Temple, Yellur", "Q8052015", "Temples", "Sri Vishweshwara Temple, Yellur", "ಶ್ರೀ ವಿಶ್ವೇಶ್ವರ ದೇವಸ್ಥಾನ, ಎಲ್ಲೂರು", ""},
{"List of Hindu temples in Tulu Nadu", "Q6642825", "Temples", "List of Hindu temples in Tulu Nadu", "", ""},
{"Udupi Sri Krishna Matha", "Q2044395", "Temples", "Udupi Sri Krishna Matha", "ಕೃಷ್ಣ ಮಠ", "ಕೃಷ್ಣ ಮಠ"},
-- Buildings & Structures from Category:Buildings and structures in Udupi district
{"Ajjarakadu Mahatma Gandhi District Stadium", "Q24748065", "Buildings & Structures", "Ajjarakadu Mahatma Gandhi District Stadium", "", ""},
{"Chaturmukha Basadi, Karkala", "Q22952213", "Buildings & Structures", "Chaturmukha Basadi, Karkala", "ಚತುರ್ಮುಖ ಬಸದಿ, ಕಾರ್ಕಳ", "ಚತುರ್ಮುಖ ಬಸದಿ, ಕಾರ್ಕಳ"},
{"Our Lady of Lourdes Church, Kanajar", "Q24931711", "Buildings & Structures", "Our Lady of Lourdes Church, Kanajar", "", ""},
{"Our Lady of the Miracles Cathedral, Kallianpur (Milagres Cathedral)", "Q15253371", "Buildings & Structures", "Our Lady of the Miracles Cathedral, Kallianpur (Milagres Cathedral)", "", ""},
{"Suralu Mud Palace", "Q136436365", "Buildings & Structures", "Suralu Mud Palace", "", ""},
{"Udupi Power Plant", "Q11990788", "Buildings & Structures", "Udupi Power Plant", "", ""},
-- Geography from Category:Dakshina Kannada district geography stubs
{"102 Nekkilady", "Q4546414", "Geography", "102 Nekkilady", "೧೦೨ ನೆಕ್ಕಿಲಡಿ", ""},
{"Aithoor", "Q4699314", "Geography", "Aithoor", "ಐತ್ತೂರು", ""},
{"Aivarnadu", "Q4699367", "Geography", "Aivarnadu", "", ""},
{"Aivathoklu", "Q4699371", "Geography", "Aivathoklu", "", ""},
{"Ajjavara", "Q4699863", "Geography", "Ajjavara", "ಅಜ್ಜಾವರ", ""},
{"Ajjibettu", "Q4699876", "Geography", "Ajjibettu", "ಅಜ್ಜಿಬೆಟ್ಟು", ""},
{"Aletty", "Q4716527", "Geography", "Aletty", "ಅಲೆಟ್ಟಿ", "ಅಲೆಟ್ಟಿ"},
{"Alike", "Q4726612", "Geography", "Alike", "ಅಳಿಕೆ", ""},
{"Amtady", "Q4748878", "Geography", "Amtady", "", ""},
{"Aramboor", "Q4784003", "Geography", "Aramboor", "", ""},
{"Aranthodu", "Q4784155", "Geography", "Aranthodu", "", ""},
{"Aryapu (Rural)", "Q4802665", "Geography", "Aryapu (Rural)", "", ""},
{"Attur-kemral", "Q4818747", "Geography", "Attur-kemral", "", ""},
{"Baikampady", "Q4843250", "Geography", "Baikampady", "ಬೈಕಂಪಾಡಿ", ""},
{"Bajal", "Q627069", "Geography", "Bajal", "ಬಜಾಲ್", ""},
{"Bajathuru", "Q4848854", "Geography", "Bajathuru", "", ""},
{"Balkunje", "Q10737568", "Geography", "Balkunje", "", ""},
{"Balthila", "Q4852673", "Geography", "Balthila", "", ""},
{"Bellare, Dakshina Kannada", "Q4883495", "Geography", "Bellare, Dakshina Kannada", "ಬೆಳ್ಳಾರೆ", ""},
{"Boloor, Mangalore", "Q85748087", "Geography", "Boloor, Mangalore", "", ""},
{"Charmadi Ghat", "Q5086410", "Geography", "Charmadi Ghat", "ಚಾರ್ಮಾಡಿ ಘಾಟಿ", ""},
{"Devaragundi", "Q16919384", "Geography", "Devaragundi", "", ""},
{"Doddathota", "Q5287757", "Geography", "Doddathota", "ದೊಡ್ಡತೋಟ", ""},
{"Doddikatta", "Q5287772", "Geography", "Doddikatta", "", ""},
{"Ernody", "Q5394845", "Geography", "Ernody", "", ""},
{"Golthamajal", "Q5580983", "Geography", "Golthamajal", "", ""},
{"Gurupura River", "Q5620539", "Geography", "Gurupura River", "ಗುರುಪುರ ನದಿ", "ಗುರುಪುರ ಸುದೆ"},
{"Guthigaru", "Q5621744", "Geography", "Guthigaru", "", ""},
{"Hirebandadi", "Q5769581", "Geography", "Hirebandadi", "", ""},
{"Ilanthila", "Q5997147", "Geography", "Ilanthila", "", ""},
{"Inoli", "Q17056571", "Geography", "Inoli", "", ""},
{"Ira, Dakshina Kannada", "Q6065918", "Geography", "Ira, Dakshina Kannada", "", ""},
{"Jalsoor", "Q6126987", "Geography", "Jalsoor", "", ""},
{"Kabaka Puttur", "Q6343783", "Geography", "Kabaka Puttur", "", ""},
{"Kadandale", "Q6345146", "Geography", "Kadandale", "", ""},
{"Kakkinje", "Q6349531", "Geography", "Kakkinje", "ಕಕ್ಕಿಂಜೆ", ""},
{"Kalladka", "Q6353482", "Geography", "Kalladka", "ಕಲ್ಲಡ್ಕ", "ಕಲ್ಲಡ್ಕ"},
{"Kalmanja village", "Q16897869", "Geography", "Kalmanja village", "", ""},
{"Kaniyuru", "Q2725645", "Geography", "Kaniyuru", "ಕಾಣಿಯೂರು", ""},
{"Kannur, Dakshina Kannada", "Q3812794", "Geography", "Kannur, Dakshina Kannada", "ಕಣ್ಣೂರು, ದಕ್ಷಿಣ ಕನ್ನಡ", ""},
{"Kanyana", "Q6365834", "Geography", "Kanyana", "", ""},
{"Katipalla", "Q6377627", "Geography", "Katipalla", "ಕಾಟಿಪಳ್ಳ", ""},
{"Kayarthadka", "Q140196754", "Geography", "Kayarthadka", "", ""},
{"Kepu", "Q6393257", "Geography", "Kepu", "", ""},
{"Keyyur", "Q6398562", "Geography", "Keyyur", "", ""},
{"Kinnipadavu", "Q124349043", "Geography", "Kinnipadavu", "ಕಿನ್ನಿಪದವು", ""},
{"Kinnya", "Q6414147", "Geography", "Kinnya", "ಕಿನ್ಯ", ""},
{"Kodangallu", "Q6425213", "Geography", "Kodangallu", "", ""},
{"Kodimbala", "Q6425332", "Geography", "Kodimbala", "", ""},
{"Koila", "Q10780717", "Geography", "Koila", "", ""},
{"Kokradi", "Q6426858", "Geography", "Kokradi", "", ""},
{"Kolnadu", "Q6427431", "Geography", "Kolnadu", "", ""},
{"Kolthige", "Q6427911", "Geography", "Kolthige", "ಕೊಳ್ತಿಗೆ ಗ್ರಾಮ", "ಕೊಳ್ತಿಗೆ"},
{"Koluvail", "Q6427948", "Geography", "Koluvail", "", ""},
{"Kotekar", "Q6433924", "Geography", "Kotekar", "ಕೋಟೆಕಾರ್", ""},
{"Kotekara", "Q2234630", "Geography", "Kotekara", "ಕೋಟೆಕಾರು", ""},
{"Kumaradhara River", "Q3827648", "Geography", "Kumaradhara River", "ಕುಮಾರಧಾರ ನದಿ", "ಕುಮಾರಧಾರೆ ಸುದೆ"},
{"Kunchadka", "Q97261392", "Geography", "Kunchadka", "ಕುಂಚಡ್ಕ", "ಕುಂಚಡ್ಕ"},
{"Kurnad", "Q6372796", "Geography", "Kurnad", "", ""},
{"Kuvettu", "Q6448789", "Geography", "Kuvettu", "", ""},
{"Laila, Dakshina Kannada", "Q6473838", "Geography", "Laila, Dakshina Kannada", "", ""},
{"Madanthyar", "Q6728881", "Geography", "Madanthyar", "ಮಡಂತ್ಯಾರು", ""},
{"Manchi", "Q6747597", "Geography", "Manchi", "", ""},
{"Mandekolu", "Q6747944", "Geography", "Mandekolu", "ಮಂಡೆಕೋಲು", "ಮಂಡೆಕೋಲು"},
{"Mani, Karnataka", "Q6749387", "Geography", "Mani, Karnataka", "", "ಮಾಣಿ"},
{"Mannagudda", "Q85783664", "Geography", "Mannagudda", "", ""},
{"Marody", "Q24931708", "Geography", "Marody", "", ""},
{"Maryhill, Mangaluru", "Q17072289", "Geography", "Maryhill, Mangaluru", "ಮೇರಿಹಿಲ್ ಮಂಗಳೂರು", ""},
{"Mithur", "Q6881730", "Geography", "Mithur", "", ""},
{"Muchur", "Q6931115", "Geography", "Muchur", "", ""},
{"Mudushedde", "Q2558117", "Geography", "Mudushedde", "ಮೂಡುಶೆಡ್ಡೆ", ""},
{"Munnur", "Q2558083", "Geography", "Munnur", "", ""},
{"Munnuru", "Q6936808", "Geography", "Munnuru", "", ""},
{"Naravi", "Q6965454", "Geography", "Naravi", "", "ನಾರಾವಿ"},
{"Narikombu", "Q6965928", "Geography", "Narikombu", "", ""},
{"Narimogru", "Q6965957", "Geography", "Narimogru", "", ""},
{"Naringana", "Q6965970", "Geography", "Naringana", "", ""},
{"Nelliyadi", "Q6990200", "Geography", "Nelliyadi", "", ""},
{"Neriya", "Q6996406", "Geography", "Neriya", "", ""},
{"Nettanigemudnoor", "Q7000440", "Geography", "Nettanigemudnoor", "", ""},
{"Odadadka", "Q7077219", "Geography", "Odadadka", "", ""},
{"Olamogru", "Q7083073", "Geography", "Olamogru", "", ""},
{"Omzoor", "Q7090814", "Geography", "Omzoor", "", ""},
{"Padmanoor", "Q7123858", "Geography", "Padmanoor", "", ""},
{"Padu Kody", "Q7123967", "Geography", "Padu Kody", "", ""},
{"Pajiradka", "Q7125310", "Geography", "Pajiradka", "", ""},
{"Panemangalore, Karnataka", "Q7130798", "Geography", "Panemangalore, Karnataka", "ಪಾಣೆಮಂಗಳೂರು", ""},
{"Pavanje", "Q7155531", "Geography", "Pavanje", "", ""},
{"Phajeer", "Q7180203", "Geography", "Phajeer", "", ""},
{"Polali", "Q7208866", "Geography", "Polali", "ಪೊಳಲಿ", "ಪೊಳಲಿ"},
{"Pudu, Dakshina Kannada", "Q12127219", "Geography", "Pudu, Dakshina Kannada", "", ""},
{"Pumpwell", "Q28405187", "Geography", "Pumpwell", "", ""},
{"Punaroor", "Q7259909", "Geography", "Punaroor", "", ""},
{"Punjalkatte", "Q7260361", "Geography", "Punjalkatte", "", ""},
{"Puttur taluk", "Q7262501", "Geography", "Puttur taluk", "", ""},
{"Sajipamuda", "Q7402662", "Geography", "Sajipamuda", "", ""},
{"Sampaje", "Q7410078", "Geography", "Sampaje", "ಸಂಪಾಜೆ", "ಸಂಪಾಜೆ"},
{"Sarapady", "Q7423159", "Geography", "Sarapady", "", ""},
{"Shiradi", "Q7498222", "Geography", "Shiradi", "", "ಶಿರಾಡಿ"},
{"Shirthady", "Q17089910", "Geography", "Shirthady", "", ""},
{"Sullia taluk", "Q7636363", "Geography", "Sullia taluk", "", ""},
{"Surya Sadashiva Temple", "Q7647371", "Geography", "Surya Sadashiva Temple", "ಸದಾಶಿವ ರುದ್ರ ದೇವಸ್ಥಾನ ಸುರ್ಯ", "ಶ್ರೀ ಸದಾಶಿವರುದ್ರ ದೇವಸ್ತಾನ, ಸುರ್ಯ"},
{"Talipady", "Q7679535", "Geography", "Talipady", "", ""},
{"Thokur", "Q7786669", "Geography", "Thokur", "", ""},
{"Thokur-62", "Q2229183", "Geography", "Thokur-62", "", ""},
{"Thumbe", "Q2738770", "Geography", "Thumbe", "ತುಂಬೆ", ""},
{"Tokur, India", "Q7813748", "Geography", "Tokur, India", "", "ತೋಕೂರು"},
{"Ubaradka Mittur", "Q119084449", "Geography", "Ubaradka Mittur", "", ""},
{"Uchila, Dakshina Kannada district", "Q16726700", "Geography", "Uchila, Dakshina Kannada district", "", ""},
{"Ullal beach", "Q28154811", "Geography", "Ullal beach", "ಉಳ್ಳಾಲ ಕಡಲತೀರ", ""},
{"Ullal City Municipal Council", "Q28154562", "Geography", "Ullal City Municipal Council", "", ""},
{"Veerakamba", "Q7918151", "Geography", "Veerakamba", "", ""},
{"Vittal Assembly constituency", "Q117705790", "Geography", "Vittal Assembly constituency", "", ""},
{"Vittalpadanur", "Q7937274", "Geography", "Vittalpadanur", "", ""},
{"Yedamangala railway station", "Q63355710", "Geography", "Yedamangala railway station", "", ""},
{"Yedapadavu", "Q8051061", "Geography", "Yedapadavu", "", ""},
-- Geography from Category:Udupi district geography stubs
{"33 Shiroor", "Q4635213", "Geography", "33 Shiroor", "", ""},
{"34 Kudi", "Q4635384", "Geography", "34 Kudi", "", ""},
{"38 Kalthur", "Q4635980", "Geography", "38 Kalthur", "", ""},
{"41 Shiroor", "Q4637615", "Geography", "41 Shiroor", "", ""},
{"52 Heroor", "Q4640219", "Geography", "52 Heroor", "", ""},
{"92 Heroor", "Q4645819", "Geography", "92 Heroor", "", ""},
{"108 Kalthur", "Q4546766", "Geography", "108 Kalthur", "", ""},
{"Achalady", "Q4673432", "Geography", "Achalady", "ಅಚ್ಲಾಡಿ", ""},
{"Adamaru", "Q4680117", "Geography", "Adamaru", "", ""},
{"Ajekar", "Q4699704", "Geography", "Ajekar", "ಅಜೆಕಾರು", ""},
{"Ajri, India", "Q8000871", "Geography", "Ajri, India", "", ""},
{"Asodu", "Q10735796", "Geography", "Asodu", "", ""},
{"Attur, Udupi", "Q48727839", "Geography", "Attur, Udupi", "", ""},
{"Badagabettu", "Q4840507", "Geography", "Badagabettu", "", ""},
{"Badakere", "Q10737092", "Geography", "Badakere", "", ""},
{"Bankerkatta", "Q85745300", "Geography", "Bankerkatta", "", ""},
{"Beejadi", "Q4879814", "Geography", "Beejadi", "", ""},
{"Belve", "Q119039024", "Geography", "Belve", "", ""},
{"Benegal", "Q109448189", "Geography", "Benegal", "", ""},
{"Bijoor", "Q4907244", "Geography", "Bijoor", "", ""},
{"Bommarabettu", "Q4940875", "Geography", "Bommarabettu", "", ""},
{"Chakra River", "Q605465", "Geography", "Chakra River", "ಚಕ್ರ ನದಿ", ""},
{"Cherkady", "Q5091998", "Geography", "Cherkady", "", ""},
{"Devalkunda", "Q118950524", "Geography", "Devalkunda", "", ""},
{"Eedu", "Q5347031", "Geography", "Eedu", "", ""},
{"Gantihole", "Q24946418", "Geography", "Gantihole", "", ""},
{"Gavali, Udupi", "Q5527984", "Geography", "Gavali, Udupi", "ಗಾವಳಿ, ಉಡುಪಿ", ""},
{"Golihole", "Q10762145", "Geography", "Golihole", "", ""},
{"Greater Udupi", "Q5600795", "Geography", "Greater Udupi", "", ""},
{"Gujjadi", "Q10763056", "Geography", "Gujjadi", "", ""},
{"Hadavu", "Q10764596", "Geography", "Hadavu", "ಹಡವು", ""},
{"Hallihole", "Q108803611", "Geography", "Hallihole", "", ""},
{"Hejamadi", "Q5701222", "Geography", "Hejamadi", "ಹೆಜಮಾಡಿ", ""},
{"Hemmadi", "Q5712318", "Geography", "Hemmadi", "ಹೆಮ್ಮಾಡಿ", ""},
{"Heranjal", "Q10766772", "Geography", "Heranjal", "", ""},
{"Herga", "Q5738368", "Geography", "Herga", "", ""},
{"Heskathoor", "Q10766862", "Geography", "Heskathoor", "", ""},
{"Hirgana", "Q15947931", "Geography", "Hirgana", "", ""},
{"Hiriadka", "Q17055077", "Geography", "Hiriadka", "ಹಿರಿಯಡ್ಕ", "ಹಿರಿಯಡ್ಕ"},
{"Hoode Beach", "Q108749459", "Geography", "Hoode Beach", "", ""},
{"Hoovinakere", "Q5898852", "Geography", "Hoovinakere", "", ""},
{"Hosadu", "Q119039316", "Geography", "Hosadu", "", ""},
{"Innanje", "Q6035256", "Geography", "Innanje", "", ""},
{"Jadkal", "Q109340345", "Geography", "Jadkal", "", ""},
{"Japthi", "Q119398398", "Geography", "Japthi", "", ""},
{"Kadike Beach", "Q108649544", "Geography", "Kadike Beach", "", ""},
{"Kalthodu", "Q10775882", "Geography", "Kalthodu", "", ""},
{"Kamalashile", "Q16897903", "Geography", "Kamalashile", "", ""},
{"Kambadakone", "Q107313441", "Geography", "Kambadakone", "", ""},
{"Kavrady", "Q6379340", "Geography", "Kavrady", "", ""},
{"Kedaka River", "Q6382515", "Geography", "Kedaka River", "ಕೇದಕ ನದಿ", ""},
{"Kedoor", "Q10778534", "Geography", "Kedoor", "", ""},
{"Kemmannu", "Q6386968", "Geography", "Kemmannu", "ಕೆಮ್ಮಣ್ಣು", ""},
{"Kemundel", "Q6387181", "Geography", "Kemundel", "", ""},
{"Kenchanoor", "Q10778786", "Geography", "Kenchanoor", "", ""},
{"Keradi", "Q115805711", "Geography", "Keradi", "", ""},
{"Kirimanjeshwar", "Q6415294", "Geography", "Kirimanjeshwar", "", ""},
{"Kodavoor", "Q6425247", "Geography", "Kodavoor", "ಕೊಡವೂರು", ""},
{"Kodi, India", "Q6425275", "Geography", "Kodi, India", "", ""},
{"Kodibettu", "Q6425311", "Geography", "Kodibettu", "", ""},
{"Kollur, Udupi district", "Q6427407", "Geography", "Kollur, Udupi district", "ಕೊಲ್ಲೂರು", "ಕೊಲ್ಲೂರು"},
{"Koosalli Waterfalls", "Q16976126", "Geography", "Koosalli Waterfalls", "ಕೋಸಳ್ಳಿ ಜಲಪಾತ", ""},
{"Kotathattu", "Q6433893", "Geography", "Kotathattu", "", ""},
{"Kote, Karnataka", "Q6433776", "Geography", "Kote, Karnataka", "ಕೋಟೆ, ಕರ್ನಾಟಕ", ""},
{"Koteshwara", "Q3310789", "Geography", "Koteshwara", "ಕೋಟೇಶ್ವರ", "ಶ್ರೀ ಕ್ಷೇತ್ರ ಕೋಟೇಶ್ವರ"},
{"Kubja River", "Q6441277", "Geography", "Kubja River", "", ""},
{"Kukkikatte", "Q15240716", "Geography", "Kukkikatte", "", ""},
{"Kukkundoor", "Q6442506", "Geography", "Kukkundoor", "", ""},
{"Kundabarandadi", "Q10782261", "Geography", "Kundabarandadi", "", ""},
{"Kunjarugiri", "Q6444820", "Geography", "Kunjarugiri", "ದುರ್ಗಾದೇವಿ ದೇವಸ್ಥಾನ ಕುಂಜಾರುಗಿರಿ", ""},
{"Kuthpady", "Q6448443", "Geography", "Kuthpady", "", ""},
{"Mallar, Karnataka", "Q2625388", "Geography", "Mallar, Karnataka", "", ""},
{"Manoor, Karnataka", "Q6751294", "Geography", "Manoor, Karnataka", "", ""},
{"Marpalli", "Q141605841", "Geography", "Marpalli", "", ""},
{"Miyar", "Q6884400", "Geography", "Miyar", "", ""},
{"Molahalli", "Q10794364", "Geography", "Molahalli", "", ""},
{"Mudoor", "Q10795118", "Geography", "Mudoor", "", ""},
{"Mulur", "Q2552515", "Geography", "Mulur", "", ""},
{"Munder, Udupi", "Q109466875", "Geography", "Munder, Udupi", "", ""},
{"Nadsal", "Q6957978", "Geography", "Nadsal", "", ""},
{"Nagodi", "Q16878465", "Geography", "Nagodi", "", ""},
{"Nandanavana", "Q6963185", "Geography", "Nandanavana", "", ""},
{"Nandicoor", "Q15260940", "Geography", "Nandicoor", "ನಂದಿಕೂರು", "ನಂದಿಕೂರು"},
{"Navunda", "Q17078451", "Geography", "Navunda", "ನಾವುಂದ", ""},
{"Padubidri", "Q7123984", "Geography", "Padubidri", "ಪಡುಬಿದ್ರಿ", "ಪಡುಬಿದ್ರಿ"},
{"Pajaka", "Q7125277", "Geography", "Pajaka", "ಪಾಜಕ", ""},
{"Pangala", "Q7130899", "Geography", "Pangala", "ಪಾಂಗಾಳ", ""},
{"Parappady", "Q7135754", "Geography", "Parappady", "", ""},
{"Santhoor", "Q38249618", "Geography", "Santhoor", "", ""},
{"Seetha River", "Q24930508", "Geography", "Seetha River", "ಸೀತಾ ನದಿ", ""},
{"Shankaranarayana", "Q7488718", "Geography", "Shankaranarayana", "ಶಂಕರನಾರಾಯಣ", ""},
{"Shiroor", "Q7498948", "Geography", "Shiroor", "", ""},
{"Shirva, India", "Q7499005", "Geography", "Shirva, India", "", ""},
{"Siddapura, Udupi", "Q7508043", "Geography", "Siddapura, Udupi", "", ""},
{"Souparnika River", "Q3322775", "Geography", "Souparnika River", "ಸೌಪರ್ಣಿಕ ನದಿ", ""},
{"Taggarse", "Q107143870", "Geography", "Taggarse", "", ""},
{"Tenkanidyoor", "Q7699901", "Geography", "Tenkanidyoor", "", "ತೆಂಕನಿಡಿಯೂರು"},
{"Thekkatte", "Q119039488", "Geography", "Thekkatte", "", ""},
{"Thopanangadi", "Q7796008", "Geography", "Thopanangadi", "", ""},
{"Tonse East", "Q7821662", "Geography", "Tonse East", "", ""},
{"Tonse West", "Q7821664", "Geography", "Tonse West", "", ""},
{"Trasi", "Q7835753", "Geography", "Trasi", "ತ್ರಾಸಿ", ""},
{"Uchila, Udupi district", "Q7876725", "Geography", "Uchila, Udupi district", "", "ಉಚ್ಚಿಲ, ಉಡುಪಿ ಜಿಲ್ಲೆ"},
{"Udupi Power Plant", "Q11990788", "Geography", "Udupi Power Plant", "", ""},
{"Uliargoli", "Q7878951", "Geography", "Uliargoli", "", ""},
{"Ulloor (Karnataka)", "Q119084376", "Geography", "Ulloor (Karnataka)", "", ""},
{"Uppoor", "Q7899162", "Geography", "Uppoor", "", ""},
{"Uppunda", "Q7899192", "Geography", "Uppunda", "ಉಪ್ಪುಂದ", ""},
{"Vandse", "Q7914556", "Geography", "Vandse", "", ""},
{"Varahi River", "Q7915411", "Geography", "Varahi River", "ವಾರಾಹಿ ನದಿ", "ವಾರಾಹಿ ತುದೆ"},
{"Varamballi", "Q7915424", "Geography", "Varamballi", "", ""},
{"Varanga", "Q48723757", "Geography", "Varanga", "", ""},
{"Yedthare", "Q8051095", "Geography", "Yedthare", "", ""},
{"Yellur, Udupi", "Q8052014", "Geography", "Yellur, Udupi", "", ""},
{"Yenagudde", "Q2552537", "Geography", "Yenagudde", "", ""},
{"Yennehole", "Q8052378", "Geography", "Yennehole", "", ""},
-- Birds from Category:ಪಕ್ಕಿಲು
{"ಇಟ್ಟಿರಿ", "Q752398", "Birds", "Red-wattled lapwing", "ಕೆಂಪು ಟಿಟ್ಟಿಭ", "ಇಟ್ಟಿರಿ"},
{"ಓಂಗಿಲೆ", "Q26773", "Birds", "Hornbill", "ಮಂಗಟ್ಟೆ", "ಓಂಗಿಲೆ"},
{"ಕಕ್ಕೆ", "Q43365", "Birds", "Corvus", "ಕಾಗೆ", "ಕಕ್ಕೆ"},
{"ಕಾಡ್ ಕೋರಿ", "Q222951", "Birds", "Junglefowl", "ಕಾಡುಕೋಳಿ", "ಕಾಡ್ ಕೋರಿ"},
{"ಕುಂಡಕೋರಿ", "Q862825", "Birds", "White-breasted waterhen", "ಹುಂಡು ಕೋಳಿ", "ಕುಂಡಕೋರಿ"},
{"ಕುಪ್ಪುಲು", "Q767112", "Birds", "Greater coucal", "ಕೆಂಬೂತ-ಘನ", "ಕುಪ್ಪುಲು"},
{"ಕೆತ್ತಿ ಕಲುವೆ", "Q31830071", "Birds", "", "", "ಕೆತ್ತಿ ಕಲುವೆ"},
{"ಕೇಂಕನ್", "Q27074582", "Birds", "Red-necked spurfowl", "", "ಕೇಂಕನ್"},
{"ಕೊಕ್ಕರೆ", "Q312272", "Birds", "Egretta", "", "ಕೊಕ್ಕರೆ"},
{"ಕೊಟ್ಟು ಕೊಡ್ತಲೆ", "Q188854", "Birds", "Bulbul", "ಪಿಕಳಾರ", "ಕೊಟ್ಟು ಕೊಡ್ತಲೆ"},
{"ಕೋಗಿಲೆ", "Q26381", "Birds", "Cuckoo", "ಕೋಗಿಲೆ", "ಕೋಗಿಲೆ"},
{"ಕೋರಿ", "Q780", "Birds", "Chicken", "ಕೋಳಿ", "ಕೋರಿ"},
{"ಕೋರಿ ಸುಕ್ಕ", "", "Birds", "", "", ""},
{"ಕೋರಿಕಟ್ಟ", "Q319771", "Birds", "Cockfighting", "ಕೋಳಿ ಅಂಕ", "ಕೋರಿಕಟ್ಟ"},
{"ಗಿಡಿ", "Q374141", "Birds", "Tawny eagle", "", "ಗಿಡಿ"},
{"ಗುರ್ಬಿ", "Q28922", "Birds", "Old World sparrow", "", "ಗುರ್ಬಿ"},
{"ಗೂಮೆ", "Q25222", "Birds", "Owl", "ಗೂಬೆ", "ಗೂಮೆ"},
{"ಪಕ್ಕಿ", "Q5113", "Birds", "Bird", "ಪಕ್ಷಿ", "ಪಕ್ಕಿ"},
{"ಪೆರಡೆ", "Q31830322", "Birds", "", "", "ಪೆರಡೆ"},
{"ಬೊಲ್ಲರ ಮಾನಿಗ", "Q266761", "Birds", "Oriental magpie-robin", "ಮಡಿವಾಳ (ಹಕ್ಕಿ)", "ಬೊಲ್ಲರ ಮಾನಿಗ"},
{"ಮಯಿರ್", "Q61865", "Birds", "Indian peafowl", "", "ಮಯಿರ್"},
{"ಮರ ಕೊಡಪೆ", "Q25439", "Birds", "Woodpecker", "ಮರಕುಟಿಕ", "ಮರ ಕೊಡಪೆ"},
{"ಹಮ್ಮಿಂಗ್ ಬರ್ಡ್", "Q43624", "Birds", "Hummingbird", "ಹಮ್ಮಿಂಗ್ ಬರ್ಡ್", "ಹಮ್ಮಿಂಗ್ ಬರ್ಡ್"},
-- Trees from Category:ಮರೊಕುಲ್
{"ಅಡ್ಕಬಾರೆ", "Q25627246", "Trees", "", "ಅಡ್ಕಬಾರೆ", "ಅಡ್ಕಬಾರೆ"},
{"ಅರ್ತಿ", "Q36146", "Trees", "Fig", "ಅಂಜೂರ", "ಅರ್ತಿ"},
{"ಅಶೋಕ ಮರ", "Q757356", "Trees", "Saraca asoca", "ಅಶೋಕ ವೃಕ್ಷ", "ಅಶೋಕ ಮರ"},
{"ಆಂಡಿಪುನಾರ್", "Q13114481", "Trees", "Carallia brachiata", "ಅಂಡಿಪುನಾರ್", "ಆಂಡಿಪುನಾರ್"},
{"ಆಟಿ ಅಮಾಸೆ", "Q31829593", "Trees", "Aatida Amaase", "ಆಟಿ ಅಮಾವಾಸ್ಯೆ", "ಆಟಿ ಅಮಾಸೆ"},
{"ಇಜಿನ್ದ ಮರ", "Q370239", "Trees", "Cinnamomum verum", "", "ಇಜಿನ್ದ ಮರ"},
{"ಕಂಗ್", "Q31829694", "Trees", "", "", "ಕಂಗ್"},
{"ತಾರಿ", "Q31830007", "Trees", "", "", "ತಾರಿ"},
{"ತಾರೆದ ಮರ", "Q31830010", "Trees", "", "ತೆಂಗಿನಮರ", "ತಾರೆದ ಮರ"},
{"ದಡ್ಡಲ್ ಮರ", "Q2718249", "Trees", "Careya arborea", "ಕವಲು ಮರ", "ದಡ್ಡಲ್ ಮರ"},
{"ದೂಪದ ಮರ", "Q2576684", "Trees", "Vateria indica", "ಧೂಪದ ಮರ", "ದೂಪದ ಮರ"},
{"ನಾನಿಲ್ ಮರ", "Q97272056", "Trees", "", "", "ನಾನಿಲ್ ಮರ"},
{"ನೆಲ್ಲಿಕಾಯಿ", "Q310050", "Trees", "Phyllanthus emblica", "ನೆಲ್ಲಿ", "ನೆಲ್ಲಿಕಾಯಿ"},
{"ಪಾಲೆ ಮರ", "Q135307", "Trees", "Alstonia scholaris", "ಹಾಲೆ ಮರ", "ಪಾಲೆ ಮರ"},
{"ಪೆಜಕಾಯಿ", "Q3595140", "Trees", "Artocarpus hirsutus", "ಹೆಬ್ಬಲಸು", "ಪೆಜಕಾಯಿ"},
{"ಪೊಂಗರೆ ಮರ", "Q715744", "Trees", "Erythrina variegata", "ಹಾಲವಾಣ", "ಪೊಂಗರೆ ಮರ"},
{"ಬೀಜದ ಮರ", "Q31830429", "Trees", "", "", "ಬೀಜದ ಮರ"},
{"ಬೆದ್ರ್", "Q35922", "Trees", "Bambuseae", "", "ಬೆದ್ರ್"},
{"ಮಂತ್ ಪುಳಿ", "Q18187249", "Trees", "Garcinia gummi-gutta", "ಉಪ್ಪಾಗೆ", "ಮಂತ್ ಪುಳಿ"},
{"ಮರ ತೇವ್", "Q31830533", "Trees", "", "", "ಮರ ತೇವ್"},
{"ರೆಂಜೆ", "Q2088434", "Trees", "Mimusops elengi", "ರಂಜ", "ರೆಂಜೆ"},
{"ಶ್ರೀಗಂಧ", "Q210858", "Trees", "Santalum album", "ಶ್ರೀಗಂಧ", "ಶ್ರೀಗಂಧ"},
{"ಸೊರಗೆ", "Q31830699", "Trees", "", "", "ಸೊರಗೆ"},
-- Folk Worship from Category:ಭೂತಾರಾಧನೆ
{"ಅಕ್ಕೆರಸು ಸಿರಿ", "", "Folk Worship", "", "", ""},
{"ಅಗೆಲ್", "Q31829547", "Folk Worship", "", "", "ಅಗೆಲ್"},
{"ಅಣಿ", "Q31829559", "Folk Worship", "", "", "ಅಣಿ"},
{"ಅರ್ದಲ", "Q65452681", "Folk Worship", "", "", "ಅರ್ದಲ"},
{"ಉಲ್ಲಾಕುಳು", "Q31829642", "Folk Worship", "", "", "ಉಲ್ಲಾಕುಳು"},
{"ಕಲ್ಲುರ್ಟಿ", "Q31829766", "Folk Worship", "", "ಕಲ್ಲುರ್ಟಿ", "ಕಲ್ಲುರ್ಟಿ"},
{"ಕಾಪು ಪಿಲಿಕೋಲೊ", "Q31829779", "Folk Worship", "", "", "ಕಾಪು ಪಿಲಿಕೋಲೊ"},
{"ಕಾರ್ನಿಕೊದ ದೈವೊಲು", "Q12060940", "Folk Worship", "Kallil Temple", "", "ಕಾರ್ನಿಕೊದ ದೈವೊಲು"},
{"ಕುರವ ದೈವ", "Q97271761", "Folk Worship", "", "", "ಕುರವ ದೈವ"},
{"ಕೊಂತಿ ಪೂಜೆ", "Q97271832", "Folk Worship", "", "", "ಕೊಂತಿ ಪೂಜೆ"},
{"ಕೊರಗತನಿಯೆ", "Q31829849", "Folk Worship", "", "ಕೊರಗತನಿಯ", "ಕೊರಗತನಿಯೆ"},
{"ಕೊರತಿ ದೈವ", "Q31829858", "Folk Worship", "", "ಕೊರತಿ ದೈವ", "ಕೊರತಿ ದೈವ"},
{"ಕೋರ್ದಬ್ಬು", "Q65452595", "Folk Worship", "", "", "ಕೋರ್ದಬ್ಬು"},
{"ಗಗ್ಗರ", "Q65452670", "Folk Worship", "", "ಗಗ್ಗರ", "ಗಗ್ಗರ"},
{"ಗಗ್ಗರದೆಚ್ಚಿ", "Q97271899", "Folk Worship", "", "", "ಗಗ್ಗರದೆಚ್ಚಿ"},
{"ಜುಮಾದಿ", "Q16290343", "Folk Worship", "Jumadi", "ಜುಮಾದಿ", "ಜುಮಾದಿ"},
{"ತನ್ನಿಮಾನಿಗ", "Q97271994", "Folk Worship", "", "", "ತನ್ನಿಮಾನಿಗ"},
{"ಪಂಜುರ್ಲಿ", "Q136645746", "Folk Worship", "Panjurli", "", "ಪಂಜುರ್ಲಿ"},
{"ಪನಿಯಾರ", "Q97272123", "Folk Worship", "", "", "ಪನಿಯಾರ"},
{"ಭೂತ ಕೋಲ", "Q4902233", "Folk Worship", "Buta Kola", "ಭೂತಕೋಲ", "ಭೂತ ಕೋಲ"},
{"ಮಾಯಂದಾಲ್ ದೈವೊ", "Q25626738", "Folk Worship", "", "ಮಾಯಂದಾಲ್ ದೈವ", "ಮಾಯಂದಾಲ್ ದೈವೊ"},
{"ಮೂಕಾಂಬಿ ಗುಳಿಗ", "Q97272406", "Folk Worship", "", "", "ಮೂಕಾಂಬಿ ಗುಳಿಗ"},
{"ರುದ್ರಾಂಡಿ", "", "Folk Worship", "", "", ""},
{"ಲೆಕ್ಕೆಸಿರಿ", "Q89444381", "Folk Worship", "", "ಲೆಕ್ಕೆಸಿರಿ", "ಲೆಕ್ಕೆಸಿರಿ"},
{"ಶಿರಾಡಿ ದೈವ", "Q134960053", "Folk Worship", "", "", "ಶಿರಾಡಿ ದೈವ"},
{"ಶ್ರೀ ಕ್ಷೇತ್ರ ಪಣೋಲಿಬೈಲ್", "Q31792312", "Folk Worship", "", "ಶ್ರೀ ಕ್ಷೇತ್ರ ಪಣೋಲಿಬೈಲು", "ಶ್ರೀ ಕ್ಷೇತ್ರ ಪಣೋಲಿಬೈಲ್"},
-- Tulu Folklore from Category:ತುಳು_ಜಾನಪದ
{"ಅಗಸ್ಟ್ ಮೆನ್ನರ್", "Q65452688", "Tulu Folklore", "", "ಅಗಸ್ಟ್ ಮೆನ್ನರ್", "ಅಗಸ್ಟ್ ಮೆನ್ನರ್"},
{"ಅಗೆಲ್", "Q31829547", "Tulu Folklore", "", "", "ಅಗೆಲ್"},
{"ಅಜ್ಜಿಕತೆ", "Q31829550", "Tulu Folklore", "", "", "ಅಜ್ಜಿಕತೆ"},
{"ಅಣಿ", "Q31829559", "Tulu Folklore", "", "", "ಅಣಿ"},
{"ಅಪ್ಪೆ", "Q7560", "Tulu Folklore", "Mother", "ತಾಯಿ", "ಅಪ್ಪೆ"},
{"ಅಮಾಸೆ", "Q2641660", "Tulu Folklore", "Amavasya", "ಅಮಾವಾಸ್ಯೆ", "ಅಮಾಸೆ"},
{"ಅರಸಾಯ", "Q65452716", "Tulu Folklore", "", "", "ಅರಸಾಯ"},
{"ಆಟಿ", "Q65452742", "Tulu Folklore", "", "", "ಆಟಿ"},
{"ಆಟಿ ಕುಲ್ಲುನು", "Q31829596", "Tulu Folklore", "", "", "ಆಟಿ ಕುಲ್ಲುನು"},
{"ಆಟಿಕಳೆಂಜೆ", "Q4662783", "Tulu Folklore", "Aati kalenja", "ಆಟಿ ಕಳೆಂಜ", "ಆಟಿಕಳೆಂಜೆ"},
{"ಆಟಿಕುಲ್ಲುನೆ", "", "Tulu Folklore", "", "", ""},
{"ಆಟಿತಪ್ಪು", "", "Tulu Folklore", "", "", ""},
{"ಆಟಿದ ಸಮ್ಮನೊ", "Q65452544", "Tulu Folklore", "", "", "ಆಟಿದ ಸಮ್ಮನೊ"},
{"ಇನ್ಸುಲಿನ್ ದಯಿ", "Q3029378", "Tulu Folklore", "Chamaecostus cuspidatus", "", "ಇನ್ಸುಲಿನ್ ದಯಿ"},
{"ಇರನ ಅಮಾಸೆ", "Q31829613", "Tulu Folklore", "", "", "ಇರನ ಅಮಾಸೆ"},
{"ಎರುಕೋಲ", "", "Tulu Folklore", "", "", ""},
{"ಓ ಬೇಲೆಪದೊ", "Q31830769", "Tulu Folklore", "", "", "ಓ ಬೇಲೆಪದೊ"},
{"ಕಡ್ಯ", "Q65452487", "Tulu Folklore", "", "", "ಕಡ್ಯ"},
{"ಕದ್ರಿ ಕಂಬುಲ", "Q31829725", "Tulu Folklore", "", "", "ಕದ್ರಿ ಕಂಬುಲ"},
{"ಕಬತ್ತಾರ್", "", "Tulu Folklore", "", "", ""},
{"ಕರ್ಂಗೋಲು", "Q31829748", "Tulu Folklore", "", "", "ಕರ್ಂಗೋಲು"},
{"ಕು. ಶಿ ಹರಿದಾಸ ಭಟ್", "Q128231314", "Tulu Folklore", "", "", "ಕು. ಶಿ ಹರಿದಾಸ ಭಟ್"},
{"ಕುಟ್ಟಿ ಪೂಜೆ", "Q97271741", "Tulu Folklore", "", "", "ಕುಟ್ಟಿ ಪೂಜೆ"},
{"ಕುಟ್ಟಿದೊಣ್ಣೆ", "Q1254757", "Tulu Folklore", "Gillidanda", "ಚಿನ್ನಿ ದಾಂಡು", "ಕುಟ್ಟಿದೊಣ್ಣೆ"},
{"ಕುದ್ಪೆ", "Q65452417", "Tulu Folklore", "", "", "ಕುದ್ಪೆ"},
{"ಕುಲೆ", "Q31829812", "Tulu Folklore", "", "", "ಕುಲೆ"},
{"ಕುಲೆ ಮದಿಮೆ", "Q31829819", "Tulu Folklore", "", "", "ಕುಲೆ ಮದಿಮೆ"},
{"ಕೂರಿ", "Q65452369", "Tulu Folklore", "", "", "ಕೂರಿ"},
{"ಕೆ.ಅಭಯ್ ಕುಮಾರ್", "Q25628206", "Tulu Folklore", "", "ಕೆ.ಆಭಯ್ ಕುಮಾರ್", "ಕೆ.ಅಭಯ್ ಕುಮಾರ್"},
{"ಕೆಡ್ಡಸ", "Q6382557", "Tulu Folklore", "Keddaso", "ಕೆಡ್ಡಸ", "ಕೆಡ್ಡಸ"},
{"ಕೈ ಪತ್ತಾವುನೆ", "Q31829836", "Tulu Folklore", "", "", "ಕೈ ಪತ್ತಾವುನೆ"},
{"ಕೈಬಿತ್ತ್", "", "Tulu Folklore", "", "", ""},
{"ಕೊರಗ", "Q6431329", "Tulu Folklore", "Koraga people", "ಕೊರಗ", "ಕೊರಗ"},
{"ಕೋಲೊ", "Q31829859", "Tulu Folklore", "", "", "ಕೋಲೊ"},
{"ಗಟ್ಟಿ", "Q31829867", "Tulu Folklore", "", "", "ಗಟ್ಟಿ"},
{"ಗಾದೆ ಗೊಂಚಿಲ್", "Q31829881", "Tulu Folklore", "", "", "ಗಾದೆ ಗೊಂಚಿಲ್"},
{"ಗಾದೆಲು", "Q35102", "Tulu Folklore", "Proverb", "ಗಾದೆ", "ಗಾದೆಲು"},
{"ಚೆನ್ನು ನಲಿಕೆ", "Q31829923", "Tulu Folklore", "Chennu Nalike", "ಚೆನ್ನು ಕುಣಿತ", "ಚೆನ್ನು ನಲಿಕೆ"},
{"ಚೆನ್ನೆಮಣೆ", "Q3611616", "Tulu Folklore", "Ali Guli Mane", "ಚೆನ್ನೆಮಣೆ", "ಚೆನ್ನೆಮಣೆ"},
{"ಜುಬುಲಿ", "Q65403350", "Tulu Folklore", "", "ಕುಂಟೆ ಬಿಲ್ಲೆ", "ಜುಬುಲಿ"},
{"ಜೋಕುಲೆ ಕಬಿತೆ", "Q31830751", "Tulu Folklore", "", "", "ಜೋಕುಲೆ ಕಬಿತೆ"},
{"ತಂಬಿಲ", "Q31829973", "Tulu Folklore", "", "", "ತಂಬಿಲ"},
{"ತರ್ಂಬುಚ್ಛಿ", "Q31829993", "Tulu Folklore", "", "", "ತರ್ಂಬುಚ್ಛಿ"},
{"ತಾರಾನಾಥ ವರ್ಕಾಡಿ", "Q31830003", "Tulu Folklore", "", "", "ತಾರಾನಾಥ ವರ್ಕಾಡಿ"},
{"ತಾಳಮದ್ದಲೆ", "Q7678735", "Tulu Folklore", "Tala-Maddale", "ತಾಳಮದ್ದಳೆ", "ತಾಳಮದ್ದಲೆ"},
{"ತಾಸೆ", "Q31830015", "Tulu Folklore", "", "", "ತಾಸೆ"},
{"ತುಳು ತಿಂಗೊಲು", "Q7852416", "Tulu Folklore", "Tulu calendar", "ತುಳು ಕ್ಯಾಲೆಂಡರ್", "ತುಳು ತಿಂಗೊಲು"},
{"ತುಳು ಭಾಷೆಗ್ ಬಾಸೆಲ್ ಮಿಶನರಿಳೆನ ಕೊಡುಗೆ", "Q31830041", "Tulu Folklore", "", "", "ತುಳು ಭಾಷೆಗ್ ಬಾಸೆಲ್ ಮಿಶನರಿಳೆನ ಕೊಡುಗೆ"},
{"ತುಳು ಯಕ್ಷಗಾನ", "Q31830045", "Tulu Folklore", "", "", "ತುಳು ಯಕ್ಷಗಾನ"},
{"ತುಳುತ ಗಾದೆಲು", "Q31830051", "Tulu Folklore", "", "", "ತುಳುತ ಗಾದೆಲು"},
{"ತುಳುತ ಪಾಡ್ದಾನೊ", "Q31830052", "Tulu Folklore", "", "", "ತುಳುತ ಪಾಡ್ದಾನೊ"},
{"ತುಳುನಾಡ ಗೊಬ್ಬುಲು", "Q31830059", "Tulu Folklore", "", "", "ತುಳುನಾಡ ಗೊಬ್ಬುಲು"},
{"ತುಳುನಾಡ್ದ ಐತಿಹ್ಯೊಲು", "Q31830065", "Tulu Folklore", "", "", "ತುಳುನಾಡ್ದ ಐತಿಹ್ಯೊಲು"},
{"ತುಳುನಾಡ್ದ ಗೊಬ್ಬುಲು", "Q31830069", "Tulu Folklore", "", "", "ತುಳುನಾಡ್ದ ಗೊಬ್ಬುಲು"},
{"ತುಳುನಾಡ್ದ ಮೊಗೇರೆರ್", "Q31830081", "Tulu Folklore", "", "", "ತುಳುನಾಡ್ದ ಮೊಗೇರೆರ್"},
{"ತುಳುನಾಡ್ದ ದೇವತಾರಾಧನೆ", "Q31830085", "Tulu Folklore", "", "", "ತುಳುನಾಡ್ದ ದೇವತಾರಾಧನೆ"},
{"ದೇವಿ ಮಹಾತ್ಮೆ", "Q31830164", "Tulu Folklore", "", "", "ದೇವಿ ಮಹಾತ್ಮೆ"},
{"ದೈವಾರಾಧನೆ", "Q31830156", "Tulu Folklore", "", "", "ದೈವಾರಾಧನೆ"},
{"ನರ್ಸಣ್ಣೆ", "Q31830178", "Tulu Folklore", "", "", "ನರ್ಸಣ್ಣೆ"},
{"ನಲಿಕೆದಕುಲು", "Q31830768", "Tulu Folklore", "", "", "ನಲಿಕೆದಕುಲು"},
{"ನೂಲಮದಿಮೆ", "Q31830208", "Tulu Folklore", "", "", "ನೂಲಮದಿಮೆ"},
{"ನೋಲಿಸರೊ", "Q31830215", "Tulu Folklore", "", "", "ನೋಲಿಸರೊ"},
{"ಪಗ್ಗು", "Q31830224", "Tulu Folklore", "", "", "ಪಗ್ಗು"},
{"ಪಗ್ಗು ಪದಿನೆನ್ಮ", "Q97272100", "Tulu Folklore", "", "", "ಪಗ್ಗು ಪದಿನೆನ್ಮ"},
{"ಪನಿಯಾರ", "Q97272123", "Tulu Folklore", "", "", "ಪನಿಯಾರ"},
{"ಪಾಡ್ದನ", "Q31830262", "Tulu Folklore", "", "ಪಾಡ್ಡನ", "ಪಾಡ್ದನ"},
{"ಪಿಶಾಚಿ", "Q45529", "Tulu Folklore", "Ghost", "", "ಪಿಶಾಚಿ"},
{"ಪೂವರಿ", "Q97272168", "Tulu Folklore", "", "", "ಪೂವರಿ"},
{"ಪೆಲಕಾಯಿ", "Q45757", "Tulu Folklore", "Jackfruit", "ಹಲಸು", "ಪೆಲಕಾಯಿ"},
{"ಪೊಕ್ಕು", "Q97272188", "Tulu Folklore", "", "", "ಪೊಕ್ಕು"},
{"ಪೊಸಪ್ಪೆ ದೈವ", "Q31830350", "Tulu Folklore", "", "", "ಪೊಸಪ್ಪೆ ದೈವ"},
{"ಬಚ್ಚಂಗಾಯಿ", "Q17507129", "Tulu Folklore", "Watermelon", "ಕಲ್ಲಂಗಡಿ", "ಬಚ್ಚಂಗಾಯಿ"},
{"ಮಂಡಲ", "Q3011594", "Tulu Folklore", "Daboia", "", "ಮಂಡಲ"},
{"ಮಾಂಕಾಳಿ ನಲಿಕೆ", "Q31792147", "Tulu Folklore", "", "ಮಾಂಕಾಳಿ ಕುಣಿತ", "ಮಾಂಕಾಳಿ ನಲಿಕೆ"},
{"ಮಾಯಿದ ಪುರ್ಸೆರ್", "Q139502745", "Tulu Folklore", "", "ಮಾಯಿದ ಪುರುಷೆ", "ಮಾಯಿದ ಪುರ್ಸೆರ್"},
{"ಮಿಜಾರು ಅಣ್ಣಪ್ಪ", "Q135427578", "Tulu Folklore", "", "", "ಮಿಜಾರು ಅಣ್ಣಪ್ಪ"},
{"ಮೂಕಾಂಬಿ ಗುಳಿಗ", "Q97272406", "Tulu Folklore", "", "", "ಮೂಕಾಂಬಿ ಗುಳಿಗ"},
{"ಯಕ್ಷಗಾನ", "Q1584013", "Tulu Folklore", "Yakshagana", "ಯಕ್ಷಗಾನ", "ಯಕ್ಷಗಾನ"},
{"ಲಗೋರಿ", "Q97272441", "Tulu Folklore", "", "", "ಲಗೋರಿ"},
{"ವಾದ್ಯೊಲು", "Q31830623", "Tulu Folklore", "", "", "ವಾದ್ಯೊಲು"},
{"ವೀಳ್ಯೊಶಾಸ್ತ್ರ", "Q157512", "Tulu Folklore", "Engagement", "ನಿಶ್ಚಿತಾರ್ಥ", "ವೀಳ್ಯೊಶಾಸ್ತ್ರ"},
{"ಸಂದ್ ಬೂರು", "Q2157164", "Tulu Folklore", "Cissus quadrangularis", "ಮಂಗರವಳ್ಳಿ", "ಸಂದ್ ಬೂರು"},
{"ಸಿರಿ ಕಾವ್ಯ ಲೋಕ", "Q97272528", "Tulu Folklore", "", "", "ಸಿರಿ ಕಾವ್ಯ ಲೋಕ"},
}
-- Function to get sitelink for a given QID and wiki
local sitelinkCache = {}
local function getSitelink(qid, wiki)
if not qid or not wiki then
return nil
end
local cacheKey = qid .. '_' .. wiki
if sitelinkCache[cacheKey] ~= nil then
return sitelinkCache[cacheKey]
end
-- Try to get the entity from Wikidata
local success, entity = pcall(mw.wikibase.getEntityObject, qid)
if not success or not entity then
sitelinkCache[cacheKey] = nil
return nil
end
local sitelink = entity:getSitelink(wiki)
sitelinkCache[cacheKey] = sitelink
return sitelink
end
-- Function to create the navigation bar with jump links to each category
local function createNavigation()
-- Group topics by category to get unique category names
local categories = {}
for _, topic in ipairs(topics) do
local cat = topic[3] or 'General'
if not categories[cat] then
categories[cat] = true
end
end
-- Sort category names
local sortedCats = {}
for cat in pairs(categories) do
table.insert(sortedCats, cat)
end
table.sort(sortedCats)
local nav = {
'<div style="margin: 1em 0; padding: 0.5em; background: #f8f9fa; border: 1px solid #a2a9b1; border-radius: 4px;">',
'<strong>Jump to section:</strong> '
}
local links = {}
for _, cat in ipairs(sortedCats) do
local anchor = 'section-' .. cat:gsub(' ', '_'):gsub('[%(%)]', '')
links[#links + 1] = '[[' .. '#' .. anchor .. '|' .. cat .. ']]'
end
nav[#nav + 1] = table.concat(links, ' | ')
nav[#nav + 1] = '</div>'
return table.concat(nav)
end
-- Function to create the table header
local function createTableHeader()
local header = {
'{| class="wikitable sortable" style="width: 100%;"',
'! №',
'! style="width: 25%;" | Content name',
'! style="width: 15%;" | Category',
}
-- Add language columns
for _, lang in ipairs(languages) do
local title = ' title="' .. lang.name .. ' Wikipedia"'
header[#header + 1] = '!' .. title .. ' | ' .. lang.name
end
header[#header + 1] = '! Wikidata'
return table.concat(header, '\n')
end
-- Function to create a table row for a topic with sitelinks
local function createTopicRow(index, topic)
local title = topic[1]
local qid = topic[2]
local category = topic[3] or 'General'
local enSitelink = topic[4] or ''
local knSitelink = topic[5] or ''
local tcySitelink = topic[6] or ''
-- Build the row
local row = {
'\n|-',
'| ' .. index,
'| ' .. title,
'| ' .. category,
}
-- Display sitelinks for each language
-- English
if enSitelink and enSitelink ~= '' then
row[#row + 1] = '| style="background: #d4f4d4; text-align: center;" | [[:en:' .. enSitelink .. '|' .. enSitelink .. ']]'
else
row[#row + 1] = '| style="background: #ffe0e0; text-align: center;" | −'
end
-- Kannada
if knSitelink and knSitelink ~= '' then
row[#row + 1] = '| style="background: #d4f4d4; text-align: center;" | [[:kn:' .. knSitelink .. '|' .. knSitelink .. ']]'
else
row[#row + 1] = '| style="background: #ffe0e0; text-align: center;" | −'
end
-- Tulu
if tcySitelink and tcySitelink ~= '' then
row[#row + 1] = '| style="background: #d4f4d4; text-align: center;" | [[:tcy:' .. tcySitelink .. '|' .. tcySitelink .. ']]'
else
row[#row + 1] = '| style="background: #ffe0e0; text-align: center;" | −'
end
row[#row + 1] = '| [[d:' .. qid .. '|' .. qid .. ']]'
return table.concat(row, '\n')
end
-- Function to create the table footer with statistics
local function createTableFooter(topics)
local totalTopics = #topics
if totalTopics == 0 then
return '\n|-\n| colspan="7" style="text-align: center;" | No topics available'
end
-- Calculate column statistics
local colStats = {}
for i = 1, #languages do
colStats[i] = {exists = 0, missing = 0}
end
for _, topic in ipairs(topics) do
-- Check English
if topic[4] and topic[4] ~= '' then
colStats[1].exists = colStats[1].exists + 1
else
colStats[1].missing = colStats[1].missing + 1
end
-- Check Kannada
if topic[5] and topic[5] ~= '' then
colStats[2].exists = colStats[2].exists + 1
else
colStats[2].missing = colStats[2].missing + 1
end
-- Check Tulu
if topic[6] and topic[6] ~= '' then
colStats[3].exists = colStats[3].exists + 1
else
colStats[3].missing = colStats[3].missing + 1
end
end
-- Create footer row
local footer = {
'\n|- class="sortbottom" style="font-weight: bold; background: #f0f0f0;"',
'| colspan="3" | Total articles',
}
for i = 1, #languages do
footer[#footer + 1] = '| style="text-align: center;" | ' .. colStats[i].exists .. ' / ' .. totalTopics
end
footer[#footer + 1] = '|'
return table.concat(footer, '\n')
end
-- Function to render a single category table
local function renderCategoryTable(categoryName, categoryTopics, startIndex)
local result = {}
-- Add section anchor
local anchor = 'section-' .. categoryName:gsub(' ', '_'):gsub('[%(%)]', '')
result[#result + 1] = '<div id="' .. anchor .. '"></div>'
-- Add category header
result[#result + 1] = '\n=== ' .. categoryName .. ' ===\n'
-- Add data source info for the category
result[#result + 1] = '<div style="font-size: 90%; color: #555; margin-bottom: 0.5em;">Total: ' .. #categoryTopics .. ' articles</div>'
-- Start the table
result[#result + 1] = createTableHeader()
-- Add topic rows
local currentIndex = startIndex
for _, topic in ipairs(categoryTopics) do
result[#result + 1] = createTopicRow(currentIndex, topic)
currentIndex = currentIndex + 1
end
-- Add footer
result[#result + 1] = createTableFooter(categoryTopics)
-- Close the table
result[#result + 1] = '\n|}\n'
return table.concat(result, '\n')
end
-- Main function to render the complete table
function p.table(frame)
local result = {}
-- Group topics by category
local categories = {}
for _, topic in ipairs(topics) do
local cat = topic[3] or 'General'
if not categories[cat] then
categories[cat] = {}
end
table.insert(categories[cat], topic)
end
-- Sort category names
local sortedCats = {}
for cat in pairs(categories) do
table.insert(sortedCats, cat)
end
table.sort(sortedCats)
-- Add data source info
result[#result + 1] = [=[
<div style="margin-bottom: 1em; padding: 0.5em; background: #e8f4f8; border: 1px solid #a2a9b1; border-radius: 4px; font-size: 90%;">
<strong>Data sources:</strong>
<ul>
<li>Articles from Tuluva cuisine, Culture of Tuluvas, Birds, Buildings & Structures, District, Folk Worship, Geography, Museums, Temples, Tourist Attractions, Transport, Trees, Tulu Cinema, Tulu Folklore</li>
<li>Update to sitelinks from Wikidata can be done through editing [[Module:TuluvasLivingandCultureHeritageTopicsTable]] or by placing a request to [[User_talk:A826]]</li>
<li style="background: #d4f4d4; padding: 2px 4px;">Green = article exists in that language</li>
<li style="background: #ffe0e0; padding: 2px 4px;">Red = article does not exist</li>
</ul>
</div>
]=]
-- Add navigation
result[#result + 1] = createNavigation()
-- Render each category table
local startIndex = 1
for _, cat in ipairs(sortedCats) do
result[#result + 1] = renderCategoryTable(cat, categories[cat], startIndex)
startIndex = startIndex + #categories[cat]
end
return table.concat(result, '\n')
end
return p
m3nvi3x85auyxbo277d0i8b8h8qe1wk
ವಿಕಿಪೀಡಿಯ:ತಾಂತ್ರಿಕ ಸುದ್ದಿ
4
28314
373846
373831
2026-10-28T05:44:40Z
ChiK
1136
Removing 3 threads, will be on [[ವಿಕಿಪೀಡಿಯ:ತಾಂತ್ರಿಕ_ಸುದ್ದಿ/ಆರ್ಕೈವ್ 9]] (using [[w:tcy:User:ChiK/Archiver|ಆರ್ಕೈವರ್]])
373846
wikitext
text/x-wiki
{{Archives}}{{User:MiszaBot/config
| algo = old(30d)
| archive = ವಿಕಿಪೀಡಿಯ:ತಾಂತ್ರಿಕ ಸುದ್ದಿ/ಆರ್ಕೈವ್ %(counter)d
| counter = 9
| maxarchivesize = 150K
| archiveheader = {{Archive}}
| minthreadstoarchive = 1
| minthreadsleft = 3
}}ಇವರೊಲೆಗ್ [[m:Tech/News|ತಾಂತ್ರಿಕ ಸುದ್ದಿಲೆನ್]] ತೂಲೆ, ಬುಕ್ಕೊ ಚಂದಾದಾರಿಕೆಗ್ ಸೈನ್-ಅಪ್ ಮಲ್ಪುಲೆ. {{[[Template:Latest tech news|ಇಂಚಿಪೊದ ತಾಂತ್ರಿಕ ಸುದ್ದಿ]]}} ಟೆಂಪ್ಲೇಟ್ನ್ಲಾ ತೂಲೆ.
[[Category:ವಿಕಿಪೀಡಿಯ ಸುದ್ದಿ|ತಾಂತ್ರಿಕ]]
== <span lang="en" dir="ltr">Tech News: 2026-42</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W42"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/42|Translations]] are available.
'''Weekly highlight'''
* Starting October 13, wikis can change the default pattern for [[:en:Wikipedia:VisualEditor/Named references|auto-generated reference names in VisualEditor]] (currently <syntaxhighlight lang="wikitext" inline><ref name=":1" /></syntaxhighlight>). They will be able to use human-readable, content-based reference names that are more helpful to contributors using the source editor (e.g. <syntaxhighlight lang="wikitext" inline><ref name="Miller2026-1" /></syntaxhighlight>). VisualEditor reference name patterns can be defined using MediaWiki system messages, JSON, templates and modules ([[:mw:Special:MyLanguage/Help:Cite/VisualEditor reference names|more information]]). Admins can enable these changes via [[Special:CommunityConfiguration/Cite-VisualEditor-Autonames|community configuration]]. This is a [[:m:Special:MyLanguage/Community_Wishlist/W17|community wish]] implemented by [[:m:Special:MyLanguage/WMDE Technical Wishes|WMDE Technical Wishes]]. [https://phabricator.wikimedia.org/T436255]
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Sub-referencing]] is a new MediaWiki feature that allows editors to reuse references with different details. It will be deployed to English Wikipedia on October 14 and to remaining Wikimedia Foundation wikis by end of October (likely October 21). The [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#deployment|FAQ]] lists possible actions to take on your wiki to support the deployment. This is a [[:m:WMDE Technical Wishes/Sub-referencing/History|long-standing community wish]] implemented by [[:m:Special:MyLanguage/WMDE Technical Wishes|WMDE Technical Wishes]]. [https://phabricator.wikimedia.org/T440243][https://phabricator.wikimedia.org/T440304]
'''Updates for editors'''
* [[mw:Special:MyLanguage/Moderator Tools|Moderator Tools]] will be removing the list view of the Watchlist and defaulting everyone to the changelog view. Previously, there were two versions of how the Watchlist is shown to mobile web users: the list view, where editors could see watched articles in a list format, and the changelog view, where editors could see changes to watched articles in a log format, controlled by a user's Advanced Mobile Control settings. This has created issues for code-base maintenance: two different displays means two sets of code to manage. By defaulting to the changelog view, we are simplifying the codebase and avoiding the likelihood of missing bugs.
* The Wikipedia Android app is testing a way to listen to article introductions in the “For you” feed. A text-to-speech model reads the existing article text aloud without rewriting it or adding any content. The 30-day experiment will begin in the Wikipedia Beta app during the third week of September, then move to the regular Wikipedia Android app in October for a limited group of eligible users. A small portion of app users (those with English feeds and at least one topic interest) will have access to the feature. This experiment is part of broader efforts to give app readers options in how they consume content in order to deepen engagement and user retention. [[mw:Special:MyLanguage/Readers/Listening to Wikipedia/Phase 1|Learn more]] and [[mw:Talk:Readers/Listening to Wikipedia|share feedback]].
* [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror syntax highlighting]] was [[phab:T288161|enabled]] by default for all logged out and newly registered users on the English Wikipedia on September 14. With no signs of adverse effects, the same change is being proposed to be made globally across all wikis in a few weeks. If you have concerns or feedback, or if your wiki would like to opt out, [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror#Enabling CodeMirror by default on all WMF wikis for newbies|please see the help page]]. [https://phabricator.wikimedia.org/T440077]
* [[d:Wikidata:Usability_and_usefulness/Item_editing_experience/Mobile_editing_of_statements|Wikidata mobile statement editing]] of all datatypes will be officially launched on October 13, when it will be removed from Wikidata [[d:Special:Preferences#mw-prefsection-betafeatures|beta features]] and become available to all editors. Users can [[d:Wikidata_talk:Usability_and_usefulness/Item_editing_experience/Mobile_editing_of_statements|report bugs and share feedback]].
* Last week, language link changes were removed from [[Special:RecentChanges|Recent Changes]] and [[Special:Watchlist|Watchlist]] feeds on Wikivoyage, Wikisource, Wikiversity, Wikiquote and Wiktionary. As no adverse effects have been observed, the [[m:Wikidata_For_Wikimedia_Projects|Wikidata For Wikimedia Projects]] plans to roll out this change globally to all Wikipedias. This is scheduled for October 13 at 07:00 UTC, after which editors will no longer see when a link to ''another'' language version of a page is added, removed, or changed in its Wikidata item. Editors who rely on these notifications can read more on the [[m:Wikidata For Wikimedia Projects/Clearer Wikidata Edit Summaries/Hide Language Link edits|project page]] and share feedback or ask to opt out their wiki on the [[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|talk page]]. [https://phabricator.wikimedia.org/T440698]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:28}} community-submitted {{PLURAL:28|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where accidentally touching the graph while scrolling on the Pageviews tool on mobile could unintentionally zoom in has now been fixed. Click-and-drag zoom is now disabled on touch devices. [https://phabricator.wikimedia.org/T440075]
'''Updates for technical contributors'''
* There are three major changes coming to dumps: the legacy content dumps [https://lists.wikimedia.org/hyperkitty/list/xmldatadumps-l@lists.wikimedia.org/thread/E6D5EU4PMSTSOI2J7A46HJ3YW2W554CS/ deprecated in January 2026] will now be sunset, the replacement [https://wikitech.wikimedia.org/wiki/MediaWiki_Content_File_Exports MediaWiki Content File Exports] will be delayed to implement a “safety buffer”, and they are now also available as 7zip-compressed files. Users will need to switch the URL they download their dump from. For more information, timeline and migration instructions, see [https://wikitech.wikimedia.org/wiki/Legacy_content_dumps_sunset Legacy content dumps sunset].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.24|MediaWiki]]
'''In depth'''
* The Wikimedia Foundation discovered unauthorized activity by OpenAI agents on Wikimedia projects, including edits to wikis, attempts to exploit a public note-taking tool, and heavy automated traffic. [[diffblog:2026/10/05/openai-rogue-agent-activities-found-on-wikimedia-projects/|Read the blog post on Diff]] for more details about the activity and the Foundation’s response.
'''Meetings and events'''
* Save the date for the next Wikimedia Hackathon! We’ll be meeting in lovely Tirana, Albania for the [https://www.mediawiki.org/wiki/Wikimedia%20Hackathon%202027 2027 Wikimedia Hackathon] from April 9–11, 2027. Scholarship and staff sponsorship applications are currently being [https://pretix.eu/wikimedia/Hackathon-2027/ accepted through Pretix] and will close on October 30, 2026. General registration will open in January 2027.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/42|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W42"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13:09, 13 ಅಕ್ಟೋಬರ್ 2026 (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31142468 -->
== <span lang="en" dir="ltr">Tech News: 2026-43</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W43"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/43|Translations]] are available.
'''Updates for editors'''
* To measure the impact of incorporating some [[mw:Special:MyLanguage/Readers/Reader_Growth/Image_Browsing#November 2025: Ideas and feedback|community-requested features]] on logged-out reader retention, a test for [[mw:Special:MyLanguage/Readers/Reader_Growth/Image_Browsing|Image Carousel]] will be pushed to logged-out readers. With the Image Carousel feature, readers browse community-uploaded images, selected by editors as relevant to specific articles. The test starts on November 20.
* An experimental notice will be pushed to 0.5% of logged-out mobile readers who come to English Wikipedia from Google, asking them to add Wikipedia as a [https://blog.google/products-and-platforms/products/search/preferred-sources/ Google Preferred Source]. The test is to see if this notice increases reader retention and encourages people who use Google Search to visit Wikipedia more often. It will run from October 15–29 and will be assessed for its impact on retention and referrals.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:26}} community-submitted {{PLURAL:26|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where [[quarry:|Quarry]] returned an “Access denied” error when users tried to run SQL queries, preventing queries from running normally, has now been fixed. [https://phabricator.wikimedia.org/T440966]
'''Updates for technical contributors'''
* [[File:Cog-icon-grey.svg|12px|link=|class=skin-invert|Advanced item]] Due to a long-standing bug, applications that use the [[mw:Special:MyLanguage/OAuth/For_Developers|OAuth 2]] client credentials flow to act on their owners’ behalf are treated as if they are logged out. This will be fixed for new applications registered on or after Monday, October 19. Some affected applications need to re-register. [https://phabricator.wikimedia.org/T420297]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.48/wmf.1|MediaWiki]]
'''Meetings and events'''
* A proposal to hold the Wikimedia Hackathon every three years, with regional hackathons in between, [[mw:Wikimedia Hackathon/Community Proposal 2026|has been shared]]. It explores making the event more accessible to technical communities in different regions. Share your feedback on the proposal’s [[mw:Talk:Wikimedia Hackathon/Community Proposal 2026|talk page]] before November 6.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/43|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W43"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:07, 19 ಅಕ್ಟೋಬರ್ 2026 (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31178499 -->
== <span lang="en" dir="ltr">Tech News: 2026-44</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W44"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/44|Translations]] are available.
'''Weekly highlight'''
* An experiment launched on September 29 is testing [[mw:Special:MyLanguage/Readers/Reader_Experience/Reading_recommendations|article recommendations]] for new account holders who also identify as readers. By suggesting articles to read, similar to recommendations in the Wikipedia app for logged-in readers, the experiment aims to encourage new account holders to read and return to the website regularly, with the goal of increasing internal referrals by 1%. See the related [[m:Community Wishlist/W505|Community Wishlist]] proposal.
* Several Wikimedia services were taken offline last week because of a [https://www.php.net/archive/2026.php#2026-10-20-1 security vulnerability in PHP]. This is because they need to be updated before they are safe to put back online. This is not a problem just for the Wikimedia movement but affects a lot of websites. You can follow updates on [[wikitech:Incidents/2026-10-21 PHP security update/Community|Wikitech]]. Cloud VPS and Toolforge will take longer to bring back online. This is to make sure that applications which run on Cloud VPS or Toolforge are not affected. Tool developers can see updates and more information on the [https://lists.wikimedia.org/postorius/lists/cloud-announce.lists.wikimedia.org/ Cloud-announce mailing list]. [https://diff.wikimedia.org/2026/10/21/impact-of-php-vulnerabilities-on-wikimedia-tools-and-services/][https://diff.wikimedia.org/2026/10/21/impact-of-php-vulnerabilities-on-wikimedia-cloud-services/]
* [[m:Special:MyLanguage/Tech/News/2026/43|Last week we shared]] that to measure the impact of incorporating some community-requested features on logged-out reader retention, a test for the [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Image Carousel]] feature would be pushed to logged-out readers. Due to an issue, we will be restarting the test, but it will be live on October 26, not November 20 as initially announced.
'''Updates for editors'''
* A new [[wikitech:KAPOW|bot detection system]] to better identify automated traffic that disguises itself as human visitors, is coming to the Wikimedia wikis. This might cause sudden changes to visitor statistics starting from 26 October, going back to 20 June 2026.
* The [[mw:Special:MyLanguage/Extension:Score|Score extension]] which renders musical notation inside wiki pages, has been temporarily disabled on all wikis due to a security issue. Affected pages will display a notice instead of musical scores, but the underlying code remains intact. No action is needed from editors, and a fix is in progress. A separate announcement will follow when the extension is re-enabled. Read more on [[phab:T441579|Phabricator]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:18}} community-submitted {{PLURAL:18|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, the issue where CodeMirror syntax highlighter appears to have been enabled in error for existing editors has been fixed. [https://phabricator.wikimedia.org/T441308]
'''Updates for technical contributors'''
* [[m:Special:MyLanguage/Tech/Server switch|All wikis will be read-only]] for a few minutes on Wednesday, October 28 2026 at [https://zonestamp.toolforge.org/1793199600 15:00 UTC]. This is for the datacenter server switchover backup tests, [[wikitech:Deployments/Yearly calendar|which happen twice a year]]. During the switchover, all Wikimedia website traffic is shifted from one primary data center to the backup data center to test availability and prevent service disruption even in emergencies. [https://phabricator.wikimedia.org/T439703]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.48/wmf.2|MediaWiki]]
'''Meetings and events'''
* Scholarship and sponsorship applications for the [https://www.mediawiki.org/wiki/Wikimedia%20Hackathon%202027 2027 Wikimedia Hackathon] will close on Friday, October 30th. Submit your application [https://pretix.eu/wikimedia/Hackathon-2027/ through Pretix] before the deadline!
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/44|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W44"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 00:26, 27 ಅಕ್ಟೋಬರ್ 2026 (IST)
<!-- Message sent by User:STei (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=31199592 -->
8flwac68lazk3tpabl1eavf82zhg248
ಮೋಡ್ಯೂಲ್:R
828
29011
373887
373366
2026-10-19T16:09:42Z
en>Ahecht
0
spelling
373887
Scribunto
text/plain
local rp = {}
local r = {}
local hyphen2dash = require('Module:String2').hyphen_to_dash
local lang = require('Module:Lang')
local trim_quotes = require('Module:trim quotes')._trim
local getArgs = require('Module:Arguments').getArgs
local plainText = require('Module:Plain text')._main
local mt = {__call = function (t, v) t[#t+1] = v end}
local notblank = function(v) return (v or '') ~= '' end
local isblank = function(v) return (v or '') == '' end
local pageTest = {pages = 1, pp = 1, page = 1, p = 1}
local quoteTest = {quote = 1, q = 1}
local wrapTest = {yes = 1, y = 1, forced = 1, f = 1}
-- get first non-empty argument from a list of names
local function firstArg(args, ...)
for i = 1, select('#', ...) do
local n = select(i, ...)
local v = args[n]
if notblank(v) then return v end
end
return nil
end
local function firstArgN(s, args, ...)
for i = 1, select('#', ...) do
local n = select(i, ...)
local v = args[n .. s]
if notblank(v) then return v end
end
return nil
end
-- Implements [[Template:page_needed]]
-- may replace with lua implementation at some point
local function page_needed(frame, date, reason)
return frame:expandTemplate{title='Page needed', args = {date = date, reason = reason}}
end
-- Formats quotes
-- takes params{language=value, translation=value}
local function make_quote(params, contentId, qcli, quote)
local out = setmetatable({}, mt)
local langcode = ""
out("<q ")
if notblank(contentId) then
out('id="' .. contentId .. '" ')
end
if notblank(qcli) then
out('cite="#' .. (mw.uri.anchorEncode(qcli)) .. '" ')
end
if notblank(params.language) then
langcode = r._langcode(params.language)
out('lang="' .. langcode .. '">')
out('<bdi lang="' .. langcode .. '">')
else
out('><bdi>')
end
out(quote .. '</bdi></q>')
if notblank(params.translation) then
out(' [<bdi ')
if notblank(params.language) then
out('lang="' .. langcode .. '"')
end
out('>' .. trim_quotes(params.translation .. '</bdi>]'))
end
return table.concat(out)
end
-- Implements [[Template:R/langcode]]
-- Only for template/module use: |language=code/name
function r._langcode(language)
language = language or ''
local tag, result = lang._tag_from_name{language}
if result then
return tag
elseif lang._is_ietf_tag(language) then
return language
end
return 'mis' -- use language code "mis" for any unrecognized language
end
function r.langcode(frame)
local args = getArgs(frame)
return r._langcode(args.language)
end
-- Implements [[Template:R/where]] sub-template
-- Only for template/module use: |plural=pages |singular=page |location=in-source-location |spacing=character
-- |pluralleadin=pp |singularleadin=p |leadin=
function r._where(params)
local out = setmetatable({}, mt)
if notblank(params.plural) then
if notblank(params.pluralleadin) and notblank(params.singularleadin) then
out(tonumber(params.plural) and (params.singularleadin) or (params.pluralleadin))
out("." .. (params.spacing or ""))
end
out(params.plural)
if notblank(params.singular) then
out("," .. (params.spacing or "") .. "[" .. params.singular .. "]")
end
elseif notblank(params.singular) then
if notblank(params.singularleadin) then
out(params.singularleadin)
out("." .. (params.spacing or ""))
end
out(params.singular)
end
if notblank(params.location) then
if notblank(params.plural) or notblank(params.singular) then
out("," .. (params.spacing or ""))
end
if(params.leadin) then
out(params.leadin .. (params.spacing or ""))
end
out(params.location)
end
return table.concat(out)
end
function r.where(frame)
return r._where(getArgs(frame))
end
-- Implements [[Template:R/superscript]]
-- Only for template/module use: |wrap=n[o]/y[es]/f[orced] |leadin=value |prefix=value |pp=value |where=value |sup-where=value |quote-where=value |quote=value |language=value |translation=value |suffix=value
function r._superscript(params)
if not params or isblank(params.where) then
return ""
end
local out = setmetatable({}, mt)
-- "wrap" if wrap is "yes", "y", "f" or "forced", else "nowrap"
local wrap = wrapTest[string.ulower(params.wrap or '')]
out('<sup class="reference ' .. (wrap and "" or "no") .. 'wrap">')
--prefix, if there's a quote
if notblank(params.quote) and notblank(params.prefix) then
out(params.prefix)
end
-- open tooltip span
out('<span title="')
-- Lead-in text (escaped)
local whereText = notblank(params["quote-where"]) and params["quote-where"]
or (params["where"] or "")
local tooltipText = plainText((params.leadin or "") .. ": " .. whereText, false)
out(mw.text.encode(tooltipText, '<>"'))
-- Quotation block if present
if notblank(params.quote) then
local quoteTab = setmetatable({}, mt)
if notblank(params.language) then
local langText = lang._is_ietf_tag(params.language) and lang._name_from_tag{params.language} or params.language
quoteTab(" (" .. langText .. ")")
end
quoteTab(": "" .. trim_quotes(params.quote) ..
""")
if notblank(params.translation) then
quoteTab(" Translation: "" ..
trim_quotes(params.translation) .. """)
end
local quoteText = plainText(table.concat(quoteTab), false)
out(" Quotation" .. mw.text.encode(quoteText, '<>"') ..
'" class="tooltip tooltip-dashed" style="border-bottom: 1px dashed;')
end
-- close tooltip span
out('">')
-- prefix, if not inserted above
if (isblank(params.quote)) and notblank(params.prefix) then
out(params.prefix)
end
--pp and sup-where
out(params.pp or '')
out(params['sup-where'] or '')
-- suffix
if notblank(params.quote) then
out("</span>" .. (params.suffix or ""))
else
out((params.suffix or "") .. "</span>")
end
out("</sup>")
return table.concat(out)
end
function r.superscript(frame)
return r._superscript(getArgs(frame))
end
-- Implements [[Template:R/details]] formatting for the details= field
-- Only for template/module use: |where=value |quote-where=value |quote=value |language=value |translation=value |annotation=value |contentId=value |qcli = firstArg(params, 'quote-cite', 'link-id')
function r._details(params)
if not params or (
isblank(params["where"]) and
isblank(params["quote-where"]) and
isblank(params["quote"]) and
isblank(params["annotation"])
) then
return ""
end
local out = setmetatable({}, mt)
-- process language
local langText = ""
local langName = ""
if notblank(params.language) then
langName = lang._is_ietf_tag(params.language) and lang._name_from_tag{params.language} or params.language
langText = " (in " .. langName .. ")"
end
-- process location
local whereText = isblank(params["where"]) and (params["quote-where"] or "")
or (params["where"] or "")
if isblank(params.annotation) and isblank(params.quote) and notblank(whereText) then
out(whereText)
end
local stripError=false
-- Annotation block if present
local annotation = mw.text.killMarkers(params.annotation or '')
if notblank(annotation) then
if annotation ~= params.annotation then stripError=true end
annotation = mw.ustring.gsub(mw.text.trim(annotation), "^:", "")
if notblank(whereText) then
annotation = mw.ustring.gsub(annotation, "^" .. mw.text.decode(whereText) .. ": *", "")
out(whereText .. (isblank(params.quote) and langText or "") .. ": ")
end
out(annotation)
if mw.ustring.sub(annotation, -1) ~= "." then
out(".")
end
out(" ")
end
-- Quotation block if present
local quote = mw.text.killMarkers(trim_quotes(params.quote or ''))
if notblank(quote) then
if quote ~= trim_quotes(params.quote or '') then stripError = true end
if notblank(params["quote-where"]) then
if params["quote-where"] ~= whereText or isblank(annotation) then
if params["quote-where"] ~= whereText and isblank(annotation) then
out(whereText .. ". ")
end
out(params["quote-where"] .. langText .. ": ")
elseif notblank(langName) then
out("In " .. langName .. ": ")
end
elseif isblank(annotation) and notblank(whereText) then
out(whereText .. langText .. ": ")
elseif notblank(whereText) and table.concat(out) == whereText then
out(langText .. ": ")
elseif notblank(langName) then
out("In " .. langName .. ": ")
end
out(make_quote(params, params.contentId, params.qcli, quote))
elseif table.concat(out) == whereText then
out(langText .. ". ")
end
if stripError == true then
local errorMsg = ' Nested references and other parser functions that produce [[:mw:Strip_marker|strip markers]] are not supported in quotes or annotations when using sub-referencing.'
mw.addWarning('<span style="color:#d33">Error in citation using {{tl|R}}:</span>' .. errorMsg)
out('<span class="cs1-visible-error citation-comment template-r-error">' .. errorMsg .. '</span>')
end
return table.concat(out)
end
function r.details(frame)
return r._details(getArgs(frame))
end
-- Implements [[Template:R/ref]]
function r._ref(params, frame)
frame = frame or mw.getCurrentFrame()
local out = setmetatable({}, mt)
local contextSectionName = mw.uri.anchorEncode(
'cite_sect-' ..
trim_quotes(params[1] or '') .. '-' ..
trim_quotes(params[2] or '') .. '-' ..
trim_quotes(
(notblank(params.page) and params.page or hyphen2dash(params.pages or '', ' ')) ..
(params.location or '')
)
)
local contentId = notblank(params['content-id']) and mw.uri.anchorEncode(params['content-id']) or nil
local whereArgs = {
plural = hyphen2dash(params.pages, ' '),
singular = params.page,
location = params.location,
spacing = ' '
}
local quoteWhereArgs = {
plural = hyphen2dash(params['quote-pages'], ' '),
singular = params['quote-page'],
location = params['quote-location'],
spacing = ' '
}
local refArgs = {name = params[1] or '', group = params[2] or ''}
local leadin = params.leadin or ''
local quote = trim_quotes(params.quote or '')
local quotePage = firstArg(params, 'quote-pages', 'quote-page', 'quote-location')
local qcli = firstArg(params, 'quote-cite', 'link-id')
-- Whether or not to use subreferencing. Set to default for now, but this should changed when moved to enwiki
local subreferencing = ({sub = 1, subreference = 1, ['sub-reference']=1})[string.ulower(params.style or '')] == 1
-- Debug facility
if notblank(params.debug) then
out("DEBUG: ")
for k, v in pairs(params) do
out(k .. "=" .. (v or '') .. ", ")
end
out(". Potential context-section-name:")
out(contextSectionName .. '".')
end
-- Opening "support context" span
local lst
if notblank(params.section) then
local section = (params.section == 'yes' or params.section == 'y') and
contextSectionName or params.section
lst = frame:callParserFunction('#lst', {
mw.title.getCurrentTitle().fullText,
section
})
if notblank(lst) then
out(frame:extensionTag('templatestyles', '', {src='Template:Tooltip/styles.css'}))
out('<span class="rt-commentedText tooltip tooltip-dotted"' ..
'title="Context: "' .. mw.text.encode(plainText(lst, false), '<>"') ..
'"">')
end
end
--First call to create reference link (variants identical except for dir):
if notblank(params['link-id']) then
out('<span id="' .. mw.uri.anchorEncode(params['link-id']) ..
'class="citation">')
end
local refContent = setmetatable({}, mt)
if (isblank(params.annotation)) then
if contentId then
refContent('<span id="' .. contentId .. '" class="citation">')
refContent(params.reference or '')
refContent('</span>')
else
refContent(params.reference or '')
end
refContent(params.postscript or '')
end
if notblank(params.direction) then
refArgs.dir = params.direction
end
-- Generate details for subreferencing, if enabled
if subreferencing and firstArg(params, 'annotation', 'quote', 'page', 'pages', 'location') then
local detailsWhereArgs = mw.clone(whereArgs)
detailsWhereArgs.singularleadin = "p"
detailsWhereArgs.pluralleadin = "pp"
local detailsQuoteWhereArgs = mw.clone(quoteWhereArgs)
detailsQuoteWhereArgs.singularleadin = "p"
detailsQuoteWhereArgs.pluralleadin = "pp"
local details=r._details{
where = r._where(detailsWhereArgs), -- where must not include qp params
annotation = quoteTest[params.annotation] and '' or (leadin .. (params.annotation or '')),
['quote-where'] = r._where( -- quote-where must not contain normal in-source-location params
pageTest[quotePage] and detailsWhereArgs or detailsQuoteWhereArgs
),
quote = quote,
language = params.language,
translation = params.translation,
contentId=contentId,
qcli = qcli
}
if notblank(details) then
refArgs.details = details
end
end
out(frame:extensionTag('ref', table.concat(refContent), refArgs))
if notblank(params['link-id']) then
out('</span>')
end
if not subreferencing then
--Optional second call to append data to reference (variants identical except for dir):
if notblank(params.annotation) then
refContent = setmetatable({}, mt)
if pageTest[params.annotation] then
if notblank(firstArg(params, 'pages', 'page', 'location')) then
--refContent('‌')
if contentId then
refContent('<span id="' .. contentId .. '">')
end
refContent(leadin)
refContent(r._where(whereArgs))
if contentId then
refContent('</span>')
end
end
elseif quoteTest[params.annotation] then
--refContent('‌')
if pageTest[quotePage] then
if notblank(firstArg(params, 'pages', 'page', 'location')) then
refContent(leadin)
refContent(r._where(whereArgs) .. ': ')
end
elseif notblank(quotePage) then
refContent(leadin)
refContent(r._where(quoteWhereArgs) .. ': ')
end
refContent(make_quote(params, contentId, qcli, quote))
elseif contentId then
refContent('<span id="' .. contentId ..
' class="citation">' .. leadin ..
params.annotation .. '</span>')
else
refContent(leadin .. params.annotation)
end
refContent(params.postscript or '')
refArgs = {follow = params[1] or '', group = params[2] or ''}
if notblank(params.direction) then
refArgs.dir = params.direction
end
if notblank(params.annotation) and params.annotation:sub(1,1) == "#" then
local errorMsg = ' Automatic numbering by preceeding the annotation ' ..
'with <code>#</code> will not work with the new [[:mw:Parsoid|Parsoid]] ' ..
'parser, and therefore its use is discouraged'
mw.addWarning('<span style="color:#085">Maintenance messages for citation using {{tl|R}}:</span>' ..
errorMsg ..
'; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).')
refContent('<span class="cs1-maint citation-comment template-r-error">' .. errorMsg .. '.</span>')
end
out(frame:extensionTag('ref', table.concat(refContent), refArgs))
end
--Superscript pages and tooltip for help, pages, quotes:
local ssAma = string.ulower(params.style or '') == 'ama'
-- p/pp is only used in superscript label, therefore it does not contain any qp params
local ssPp = ''
if ssAma and (isblank(params['no-pp'])) then
if notblank(params.pages) then
ssPp = 'pp'
elseif notblank(params.page) then
ssPp = 'p'
end
end
-- leadin is only used in tooltip
local ssLeadin = 'Page / location'
if pageTest[quotePage] then
if notblank(params.pages) then
ssLeadin = 'Pages'
elseif notblank(params.page) then
ssLeadin = 'Page'
elseif notblank(params.location) then
ssLeadin = 'Location'
end
elseif notblank(params['quote-pages']) then
ssLeadin = 'Pages'
elseif notblank(params['quote-page']) then
ssLeadin = 'Page'
elseif notblank(params['quote-location']) then
ssLeadin = 'Location'
end
out(r._superscript{
prefix = ssAma and '(' or ': ',
suffix = ssAma and ')' or ' ',
pp = ssPp,
leadin = ssLeadin,
where = r._where(whereArgs), -- where must not include qp params
['sup-where'] = r._where{ -- sup-where same as where, but with improved list spacing for superscript
plural = hyphen2dash(params.pages, ' '),
singular = params.page,
location = params.location,
spacing=' '
},
['quote-where'] = r._where(pageTest[quotePage] and whereArgs or quoteWhereArgs),
quote = quote,
language = params.language,
translation = params.translation,
['wrap'] = params['wrap']
})
end
-- Closing "support context" span:
if notblank(params.section) and notblank(lst) then
out('</span>')
end
-- Page needed functionality:
if notblank(params['needed-reason']) then
local pnReason = ({yes = 1, y = 1})[params['needed-reason']] and
'No reason given' or params['needed-reason']
out(page_needed(frame, params['needed-date'], pnReason))
end
-- Line wrapping functionality:
if wrapTest[string.ulower(params.wrap or '')] then
out("​") --zero-width space
end
-- Tracking category for nested references
if (notblank(params.quote) and params.quote ~= mw.text.killMarkers(params.quote or '')) or
(notblank(params.annotation) and params.annotation ~= mw.text.killMarkers(params.annotation or '')) then
out('[[Category:Pages using Template:R with nested references]]')
end
--End of code
return table.concat(out)
end
function r.ref(frame)
return r._ref(getArgs(frame), frame)
end
function r._r(args, frame)
frame = frame or mw.getCurrentFrame()
local output = setmetatable({}, mt)
output(frame:extensionTag('templatestyles', '', {src='Module:Citation/CS1/styles.css'}))
-- ### 1 ###
output(r._ref({
[1] = firstArg(args, 'name1', 'name', 'n1', 'n', 1),
[2] = firstArg(args, 'group', 'grp', 'g'),
direction = firstArg(args, 'direction1', 'direction', 'dir1', 'dir'),
page = firstArg(args, 'page1', 'page', 'p1', '1p', 'p'),
pages = firstArg(args, 'pages1', 'pages', 'pp1', '1pp', 'pp'),
location = firstArg(args, 'location1', 'location', 'loc1', '1loc', 'loc', 'at1', 'at'),
['quote-page'] = firstArg(args, 'quotation-page1', 'quotation-page', 'quote-page1', 'quote-page', 'qp1', 'qp'),
['quote-pages'] = firstArg(args, 'quotation-pages1', 'quotation-pages', 'quote-pages1', 'quote-pages', 'qpp1', 'qpp'),
['quote-location'] = firstArg(args,
'quotation-location1', 'quotation-location', 'quote-location1', 'quote-location', 'quote-loc1', 'quote-loc',
'quote-at1', 'quote-at'
),
quote = firstArg(args, 'quotation1', 'quotation', 'quote1', 'quote', 'q1', 'q'),
language = firstArg(args,
'quotation-language1', 'quotation-language', 'quote-language1', 'quote-language', 'quotation-lang1',
'quotation-lang', 'quote-lang1', 'quote-lang', 'ql1', 'ql', 'language1', 'language', 'lang1', 'language', 'l1', 'l'
),
translation = firstArg(args,
'translation-quotation1', 'translation-quotation', 'trans-quotation1', 'trans-quotation', 'translation-quote1',
'translation-quote', 'trans-quote1', 'trans-quote', 'tq1', 'tq', 'translation1', 'translation', 'trans1', 'trans',
't1', 't', 'xlat1', 'xlat'
),
['quote-cite'] = firstArg(args, 'quotation-cite1', 'quotation-cite', 'quote-cite1', 'quote-cite', 'qc1', 'qc'),
reference = firstArg(args,
'reference1', 'references', 'reference', 'notes', 'note', 'content', 'text', 'refn1', 'refn', 'refs', 'r1', 'r'
),
annotation = firstArg(args, 'annotation1', 'annotation', 'annot1', 'annot', 'a1', 'a'),
leadin = args.leadin,
postscript = firstArg(args, 'postscript', 'postscript1', 'ps', 'ps1', '1ps'),
section = firstArg(args, 'section1', 'section', 'sec1', 'sec', 's1', 's'),
['needed-reason'] = firstArg(args, 'needed-reason1', 'needed-reason', 'needed1', 'needed', 'reason'),
['needed-date'] = firstArg(args, 'needed-date', 'date'),
wrap = args.wrap,
['no-pp'] = firstArg(args, 'no-pp', 'nopp'),
style = args.style,
['content-id'] = firstArg(args, 'ref1', '1ref', 'ref', 'id1', 'id'),
['link-id'] = firstArg(args, 'link-id1', 'link-id'),
['debug'] = args['debug']
}, frame))
-- ### 2+ ###
local n = 2
while firstArg(args, "name" .. n, "n" .. n, n) ~= nil do
output(r._ref({
[1] = firstArg(args, 'name' .. n, 'n' .. n, n),
[2] = firstArg(args, 'group', 'grp', 'g'),
direction = firstArgN(n, args, 'direction', 'dir'),
page = firstArg(args, 'page' .. n, 'p' .. n, n .. 'p'),
pages = firstArg(args, 'pages' .. n, 'pp' .. n, n .. 'pp'),
location = firstArg(args, 'location' .. n, 'loc' .. n, n .. 'loc', 'at' .. n),
['quote-page'] = firstArgN(n, args, 'quotation-page', 'quote-page', 'qp'),
['quote-pages'] = firstArgN(n, args, 'quotation-pages', 'quote-pages', 'qpp'),
['quote-location'] = firstArgN(n, args, 'quotation-location', 'quote-location', 'quote-loc', 'quote-at'),
quote = firstArgN(n, args, 'quotation', 'quote', 'q'),
language = firstArgN(n, args,
'quotation-language', 'quote-language', 'quotation-lang', 'quote-lang', 'ql', 'language', 'lang', 'l'
),
translation = firstArgN(n, args,
'translation-quotation', 'trans-quotation', 'translation-quote', 'trans-quote', 'tq', 'translation', 'trans', 't',
'xlat'
),
['quote-cite'] = firstArgN(n, args, 'quotation-cite', 'quote-cite', 'qc'),
reference = firstArgN(n, args, 'reference', 'refn', 'r'),
annotation = firstArgN(n, args, 'annotation', 'annot', 'a'),
leadin = args.leadin,
postscript = firstArg(args, 'postscript' .. n, 'ps' .. n, n .. 'ps', 'postscript', 'ps'),
section = firstArgN(n, args, 'section', 'sec', 's'),
['needed-reason'] = firstArgN(n, args, 'needed-reason', 'needed'),
['needed-date'] = firstArg(args, 'needed-date', 'date'),
['wrap'] = args['wrap'],
['no-pp'] = firstArg(args, 'no-pp', 'nopp'),
style = args.style,
['content-id'] = firstArg(args, 'ref' .. n, n .. 'ref', 'id' .. n),
['link-id'] = args['link-id' .. n],
['debug'] = args['debug'],
}, frame))
n = n + 1
end
local outputText = table.concat(output)
local errorText = outputText:find('template-r-error', 1, true) and
'[[Category:Pages with errors in Template:R]]' or ''
return (outputText .. errorText)
end
function r.r(frame)
return r._r(getArgs(frame), frame)
end
-- Implements [[Template:Rp]]
function rp._rp(args, frame)
frame = frame or mw.getCurrentFrame()
-- If needed param is present and non-empty, show {{page needed}}
if notblank(args.needed) then
return page_needed(frame, args.date, args.reason)
end
-- prefix/suffix depending on style
local ama = string.ulower(args.style or "") == "ama"
local prefix = ama and "(" or ": "
local suffix = ama and ")" or " "
-- p/pp is only used in superscript label, therefore it does not contain any qp params
local pp = ""
if ama and isblank(args["no-pp"]) and isblank(args.nopp) then
if notblank(args.pages) or notblank(args.pp) then
pp = "pp"
elseif notblank(args.page) or notblank(args.p) then
pp = "p"
end
end
-- leadin is only used in tooltip
local leadin
local quote_switch = firstArg(args, "quotation-pages", "quote-pages", "qpp",
"quotation-page", "quote-page", "qp",
"quotation-location", "quote-location", "quote-loc", "quote-at")
if not pageTest[quote_switch] then
if notblank(firstArg(args, "quotation-pages", "quote-pages", "qpp")) then
leadin = "Pages"
elseif notblank(firstArg(args, "quotation-page", "quote-page", "qp")) then
leadin = "Page"
elseif notblank(firstArg(args, "quotation-location", "quote-location", "quote-loc", "quote-at")) then
leadin = "Location"
end
end
if not leadin then
--either the quote_switch wasn't 'pages', 'pp', 'page',
-- or 'p', or the 'quotation' params were all blank/nil
if notblank(firstArg(args, "pages", "pp")) then
leadin = "Pages"
elseif notblank(firstArg(args, "page", "p")) then
leadin = "Page"
elseif notblank(firstArg(args, "location", "loc", "at")) then
leadin = "Location"
else
leadin = "Page / location"
end
end
-- where must not include qp params
local where = r._where{
plural = hyphen2dash(firstArg(args, "pages", "pp", "1"), ' '),
singular = firstArg(args, "page", "p"),
location = firstArg(args, "location", "loc", "at"),
spacing = " "
}
-- sup-where same as where, but with improved list spacing for superscript
local sup_where = r._where{
plural = hyphen2dash(firstArg(args, "pages", "pp", "1"), ' '),
singular = firstArg(args, "page", "p"),
location = firstArg(args, "location", "loc", "at"),
spacing = " "
}
-- quote-where must not contain normal in-source-location params
local quote_where
if pageTest[quote_switch] then
quote_where = r._where{
plural = hyphen2dash(firstArg(args, "pages", "pp", 1), ' '),
singular = firstArg(args, "page", "p"),
location = firstArg(args, "location", "loc", "at"),
spacing = " "
}
else
quote_where = r._where{
plural = hyphen2dash(firstArg(args, "quotation-pages", "quote-pages", "qpp"), ' '),
singular = firstArg(args, "quotation-page", "quote-page", "qp"),
location = firstArg(args, "quotation-location", "quote-location", "quote-loc", "quote-at"),
spacing = " "
}
end
local zws = ""
if wrapTest[string.ulower(args.wrap or '')] then
zws = "​" --zero-width space
end
return r._superscript{
prefix = prefix,
suffix = suffix,
pp = pp,
leadin = leadin,
["where"] = where,
["sup-where"] = sup_where,
["quote-where"] = quote_where,
quote = firstArg(args, "quotation", "quote", "q"),
language = firstArg(args, "quotation-language", "quote-language",
"quotation-lang", "quote-lang", "ql", "language", "lang", "l"),
translation = firstArg(args, "translation-quotation", "trans-quotation",
"translation-quote", "trans-quote", "tq", "translation", "trans",
"t", "xlat"),
["wrap"] = args.wrap
} .. zws
end
function rp.rp(frame)
return rp._rp(getArgs(frame), frame)
end
return {
[''] = r.r,
r = r.r,
_r = r._r,
rp = rp.rp,
_rp = rp._rp,
ref = r.ref,
_ref = r._ref,
where = r.where,
_where = r._where,
details = r.details,
_details = r._details,
langcode = r.langcode,
_langcode = r._langcode,
superscript = r.superscript,
_superscript = r._superscript
}
f6jesd4755x8ezmji2s8s3jq6fz9tt1
373888
373887
2026-10-28T05:55:30Z
ChiK
1136
1 revision imported from [[:en:Module:R]]
373887
Scribunto
text/plain
local rp = {}
local r = {}
local hyphen2dash = require('Module:String2').hyphen_to_dash
local lang = require('Module:Lang')
local trim_quotes = require('Module:trim quotes')._trim
local getArgs = require('Module:Arguments').getArgs
local plainText = require('Module:Plain text')._main
local mt = {__call = function (t, v) t[#t+1] = v end}
local notblank = function(v) return (v or '') ~= '' end
local isblank = function(v) return (v or '') == '' end
local pageTest = {pages = 1, pp = 1, page = 1, p = 1}
local quoteTest = {quote = 1, q = 1}
local wrapTest = {yes = 1, y = 1, forced = 1, f = 1}
-- get first non-empty argument from a list of names
local function firstArg(args, ...)
for i = 1, select('#', ...) do
local n = select(i, ...)
local v = args[n]
if notblank(v) then return v end
end
return nil
end
local function firstArgN(s, args, ...)
for i = 1, select('#', ...) do
local n = select(i, ...)
local v = args[n .. s]
if notblank(v) then return v end
end
return nil
end
-- Implements [[Template:page_needed]]
-- may replace with lua implementation at some point
local function page_needed(frame, date, reason)
return frame:expandTemplate{title='Page needed', args = {date = date, reason = reason}}
end
-- Formats quotes
-- takes params{language=value, translation=value}
local function make_quote(params, contentId, qcli, quote)
local out = setmetatable({}, mt)
local langcode = ""
out("<q ")
if notblank(contentId) then
out('id="' .. contentId .. '" ')
end
if notblank(qcli) then
out('cite="#' .. (mw.uri.anchorEncode(qcli)) .. '" ')
end
if notblank(params.language) then
langcode = r._langcode(params.language)
out('lang="' .. langcode .. '">')
out('<bdi lang="' .. langcode .. '">')
else
out('><bdi>')
end
out(quote .. '</bdi></q>')
if notblank(params.translation) then
out(' [<bdi ')
if notblank(params.language) then
out('lang="' .. langcode .. '"')
end
out('>' .. trim_quotes(params.translation .. '</bdi>]'))
end
return table.concat(out)
end
-- Implements [[Template:R/langcode]]
-- Only for template/module use: |language=code/name
function r._langcode(language)
language = language or ''
local tag, result = lang._tag_from_name{language}
if result then
return tag
elseif lang._is_ietf_tag(language) then
return language
end
return 'mis' -- use language code "mis" for any unrecognized language
end
function r.langcode(frame)
local args = getArgs(frame)
return r._langcode(args.language)
end
-- Implements [[Template:R/where]] sub-template
-- Only for template/module use: |plural=pages |singular=page |location=in-source-location |spacing=character
-- |pluralleadin=pp |singularleadin=p |leadin=
function r._where(params)
local out = setmetatable({}, mt)
if notblank(params.plural) then
if notblank(params.pluralleadin) and notblank(params.singularleadin) then
out(tonumber(params.plural) and (params.singularleadin) or (params.pluralleadin))
out("." .. (params.spacing or ""))
end
out(params.plural)
if notblank(params.singular) then
out("," .. (params.spacing or "") .. "[" .. params.singular .. "]")
end
elseif notblank(params.singular) then
if notblank(params.singularleadin) then
out(params.singularleadin)
out("." .. (params.spacing or ""))
end
out(params.singular)
end
if notblank(params.location) then
if notblank(params.plural) or notblank(params.singular) then
out("," .. (params.spacing or ""))
end
if(params.leadin) then
out(params.leadin .. (params.spacing or ""))
end
out(params.location)
end
return table.concat(out)
end
function r.where(frame)
return r._where(getArgs(frame))
end
-- Implements [[Template:R/superscript]]
-- Only for template/module use: |wrap=n[o]/y[es]/f[orced] |leadin=value |prefix=value |pp=value |where=value |sup-where=value |quote-where=value |quote=value |language=value |translation=value |suffix=value
function r._superscript(params)
if not params or isblank(params.where) then
return ""
end
local out = setmetatable({}, mt)
-- "wrap" if wrap is "yes", "y", "f" or "forced", else "nowrap"
local wrap = wrapTest[string.ulower(params.wrap or '')]
out('<sup class="reference ' .. (wrap and "" or "no") .. 'wrap">')
--prefix, if there's a quote
if notblank(params.quote) and notblank(params.prefix) then
out(params.prefix)
end
-- open tooltip span
out('<span title="')
-- Lead-in text (escaped)
local whereText = notblank(params["quote-where"]) and params["quote-where"]
or (params["where"] or "")
local tooltipText = plainText((params.leadin or "") .. ": " .. whereText, false)
out(mw.text.encode(tooltipText, '<>"'))
-- Quotation block if present
if notblank(params.quote) then
local quoteTab = setmetatable({}, mt)
if notblank(params.language) then
local langText = lang._is_ietf_tag(params.language) and lang._name_from_tag{params.language} or params.language
quoteTab(" (" .. langText .. ")")
end
quoteTab(": "" .. trim_quotes(params.quote) ..
""")
if notblank(params.translation) then
quoteTab(" Translation: "" ..
trim_quotes(params.translation) .. """)
end
local quoteText = plainText(table.concat(quoteTab), false)
out(" Quotation" .. mw.text.encode(quoteText, '<>"') ..
'" class="tooltip tooltip-dashed" style="border-bottom: 1px dashed;')
end
-- close tooltip span
out('">')
-- prefix, if not inserted above
if (isblank(params.quote)) and notblank(params.prefix) then
out(params.prefix)
end
--pp and sup-where
out(params.pp or '')
out(params['sup-where'] or '')
-- suffix
if notblank(params.quote) then
out("</span>" .. (params.suffix or ""))
else
out((params.suffix or "") .. "</span>")
end
out("</sup>")
return table.concat(out)
end
function r.superscript(frame)
return r._superscript(getArgs(frame))
end
-- Implements [[Template:R/details]] formatting for the details= field
-- Only for template/module use: |where=value |quote-where=value |quote=value |language=value |translation=value |annotation=value |contentId=value |qcli = firstArg(params, 'quote-cite', 'link-id')
function r._details(params)
if not params or (
isblank(params["where"]) and
isblank(params["quote-where"]) and
isblank(params["quote"]) and
isblank(params["annotation"])
) then
return ""
end
local out = setmetatable({}, mt)
-- process language
local langText = ""
local langName = ""
if notblank(params.language) then
langName = lang._is_ietf_tag(params.language) and lang._name_from_tag{params.language} or params.language
langText = " (in " .. langName .. ")"
end
-- process location
local whereText = isblank(params["where"]) and (params["quote-where"] or "")
or (params["where"] or "")
if isblank(params.annotation) and isblank(params.quote) and notblank(whereText) then
out(whereText)
end
local stripError=false
-- Annotation block if present
local annotation = mw.text.killMarkers(params.annotation or '')
if notblank(annotation) then
if annotation ~= params.annotation then stripError=true end
annotation = mw.ustring.gsub(mw.text.trim(annotation), "^:", "")
if notblank(whereText) then
annotation = mw.ustring.gsub(annotation, "^" .. mw.text.decode(whereText) .. ": *", "")
out(whereText .. (isblank(params.quote) and langText or "") .. ": ")
end
out(annotation)
if mw.ustring.sub(annotation, -1) ~= "." then
out(".")
end
out(" ")
end
-- Quotation block if present
local quote = mw.text.killMarkers(trim_quotes(params.quote or ''))
if notblank(quote) then
if quote ~= trim_quotes(params.quote or '') then stripError = true end
if notblank(params["quote-where"]) then
if params["quote-where"] ~= whereText or isblank(annotation) then
if params["quote-where"] ~= whereText and isblank(annotation) then
out(whereText .. ". ")
end
out(params["quote-where"] .. langText .. ": ")
elseif notblank(langName) then
out("In " .. langName .. ": ")
end
elseif isblank(annotation) and notblank(whereText) then
out(whereText .. langText .. ": ")
elseif notblank(whereText) and table.concat(out) == whereText then
out(langText .. ": ")
elseif notblank(langName) then
out("In " .. langName .. ": ")
end
out(make_quote(params, params.contentId, params.qcli, quote))
elseif table.concat(out) == whereText then
out(langText .. ". ")
end
if stripError == true then
local errorMsg = ' Nested references and other parser functions that produce [[:mw:Strip_marker|strip markers]] are not supported in quotes or annotations when using sub-referencing.'
mw.addWarning('<span style="color:#d33">Error in citation using {{tl|R}}:</span>' .. errorMsg)
out('<span class="cs1-visible-error citation-comment template-r-error">' .. errorMsg .. '</span>')
end
return table.concat(out)
end
function r.details(frame)
return r._details(getArgs(frame))
end
-- Implements [[Template:R/ref]]
function r._ref(params, frame)
frame = frame or mw.getCurrentFrame()
local out = setmetatable({}, mt)
local contextSectionName = mw.uri.anchorEncode(
'cite_sect-' ..
trim_quotes(params[1] or '') .. '-' ..
trim_quotes(params[2] or '') .. '-' ..
trim_quotes(
(notblank(params.page) and params.page or hyphen2dash(params.pages or '', ' ')) ..
(params.location or '')
)
)
local contentId = notblank(params['content-id']) and mw.uri.anchorEncode(params['content-id']) or nil
local whereArgs = {
plural = hyphen2dash(params.pages, ' '),
singular = params.page,
location = params.location,
spacing = ' '
}
local quoteWhereArgs = {
plural = hyphen2dash(params['quote-pages'], ' '),
singular = params['quote-page'],
location = params['quote-location'],
spacing = ' '
}
local refArgs = {name = params[1] or '', group = params[2] or ''}
local leadin = params.leadin or ''
local quote = trim_quotes(params.quote or '')
local quotePage = firstArg(params, 'quote-pages', 'quote-page', 'quote-location')
local qcli = firstArg(params, 'quote-cite', 'link-id')
-- Whether or not to use subreferencing. Set to default for now, but this should changed when moved to enwiki
local subreferencing = ({sub = 1, subreference = 1, ['sub-reference']=1})[string.ulower(params.style or '')] == 1
-- Debug facility
if notblank(params.debug) then
out("DEBUG: ")
for k, v in pairs(params) do
out(k .. "=" .. (v or '') .. ", ")
end
out(". Potential context-section-name:")
out(contextSectionName .. '".')
end
-- Opening "support context" span
local lst
if notblank(params.section) then
local section = (params.section == 'yes' or params.section == 'y') and
contextSectionName or params.section
lst = frame:callParserFunction('#lst', {
mw.title.getCurrentTitle().fullText,
section
})
if notblank(lst) then
out(frame:extensionTag('templatestyles', '', {src='Template:Tooltip/styles.css'}))
out('<span class="rt-commentedText tooltip tooltip-dotted"' ..
'title="Context: "' .. mw.text.encode(plainText(lst, false), '<>"') ..
'"">')
end
end
--First call to create reference link (variants identical except for dir):
if notblank(params['link-id']) then
out('<span id="' .. mw.uri.anchorEncode(params['link-id']) ..
'class="citation">')
end
local refContent = setmetatable({}, mt)
if (isblank(params.annotation)) then
if contentId then
refContent('<span id="' .. contentId .. '" class="citation">')
refContent(params.reference or '')
refContent('</span>')
else
refContent(params.reference or '')
end
refContent(params.postscript or '')
end
if notblank(params.direction) then
refArgs.dir = params.direction
end
-- Generate details for subreferencing, if enabled
if subreferencing and firstArg(params, 'annotation', 'quote', 'page', 'pages', 'location') then
local detailsWhereArgs = mw.clone(whereArgs)
detailsWhereArgs.singularleadin = "p"
detailsWhereArgs.pluralleadin = "pp"
local detailsQuoteWhereArgs = mw.clone(quoteWhereArgs)
detailsQuoteWhereArgs.singularleadin = "p"
detailsQuoteWhereArgs.pluralleadin = "pp"
local details=r._details{
where = r._where(detailsWhereArgs), -- where must not include qp params
annotation = quoteTest[params.annotation] and '' or (leadin .. (params.annotation or '')),
['quote-where'] = r._where( -- quote-where must not contain normal in-source-location params
pageTest[quotePage] and detailsWhereArgs or detailsQuoteWhereArgs
),
quote = quote,
language = params.language,
translation = params.translation,
contentId=contentId,
qcli = qcli
}
if notblank(details) then
refArgs.details = details
end
end
out(frame:extensionTag('ref', table.concat(refContent), refArgs))
if notblank(params['link-id']) then
out('</span>')
end
if not subreferencing then
--Optional second call to append data to reference (variants identical except for dir):
if notblank(params.annotation) then
refContent = setmetatable({}, mt)
if pageTest[params.annotation] then
if notblank(firstArg(params, 'pages', 'page', 'location')) then
--refContent('‌')
if contentId then
refContent('<span id="' .. contentId .. '">')
end
refContent(leadin)
refContent(r._where(whereArgs))
if contentId then
refContent('</span>')
end
end
elseif quoteTest[params.annotation] then
--refContent('‌')
if pageTest[quotePage] then
if notblank(firstArg(params, 'pages', 'page', 'location')) then
refContent(leadin)
refContent(r._where(whereArgs) .. ': ')
end
elseif notblank(quotePage) then
refContent(leadin)
refContent(r._where(quoteWhereArgs) .. ': ')
end
refContent(make_quote(params, contentId, qcli, quote))
elseif contentId then
refContent('<span id="' .. contentId ..
' class="citation">' .. leadin ..
params.annotation .. '</span>')
else
refContent(leadin .. params.annotation)
end
refContent(params.postscript or '')
refArgs = {follow = params[1] or '', group = params[2] or ''}
if notblank(params.direction) then
refArgs.dir = params.direction
end
if notblank(params.annotation) and params.annotation:sub(1,1) == "#" then
local errorMsg = ' Automatic numbering by preceeding the annotation ' ..
'with <code>#</code> will not work with the new [[:mw:Parsoid|Parsoid]] ' ..
'parser, and therefore its use is discouraged'
mw.addWarning('<span style="color:#085">Maintenance messages for citation using {{tl|R}}:</span>' ..
errorMsg ..
'; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).')
refContent('<span class="cs1-maint citation-comment template-r-error">' .. errorMsg .. '.</span>')
end
out(frame:extensionTag('ref', table.concat(refContent), refArgs))
end
--Superscript pages and tooltip for help, pages, quotes:
local ssAma = string.ulower(params.style or '') == 'ama'
-- p/pp is only used in superscript label, therefore it does not contain any qp params
local ssPp = ''
if ssAma and (isblank(params['no-pp'])) then
if notblank(params.pages) then
ssPp = 'pp'
elseif notblank(params.page) then
ssPp = 'p'
end
end
-- leadin is only used in tooltip
local ssLeadin = 'Page / location'
if pageTest[quotePage] then
if notblank(params.pages) then
ssLeadin = 'Pages'
elseif notblank(params.page) then
ssLeadin = 'Page'
elseif notblank(params.location) then
ssLeadin = 'Location'
end
elseif notblank(params['quote-pages']) then
ssLeadin = 'Pages'
elseif notblank(params['quote-page']) then
ssLeadin = 'Page'
elseif notblank(params['quote-location']) then
ssLeadin = 'Location'
end
out(r._superscript{
prefix = ssAma and '(' or ': ',
suffix = ssAma and ')' or ' ',
pp = ssPp,
leadin = ssLeadin,
where = r._where(whereArgs), -- where must not include qp params
['sup-where'] = r._where{ -- sup-where same as where, but with improved list spacing for superscript
plural = hyphen2dash(params.pages, ' '),
singular = params.page,
location = params.location,
spacing=' '
},
['quote-where'] = r._where(pageTest[quotePage] and whereArgs or quoteWhereArgs),
quote = quote,
language = params.language,
translation = params.translation,
['wrap'] = params['wrap']
})
end
-- Closing "support context" span:
if notblank(params.section) and notblank(lst) then
out('</span>')
end
-- Page needed functionality:
if notblank(params['needed-reason']) then
local pnReason = ({yes = 1, y = 1})[params['needed-reason']] and
'No reason given' or params['needed-reason']
out(page_needed(frame, params['needed-date'], pnReason))
end
-- Line wrapping functionality:
if wrapTest[string.ulower(params.wrap or '')] then
out("​") --zero-width space
end
-- Tracking category for nested references
if (notblank(params.quote) and params.quote ~= mw.text.killMarkers(params.quote or '')) or
(notblank(params.annotation) and params.annotation ~= mw.text.killMarkers(params.annotation or '')) then
out('[[Category:Pages using Template:R with nested references]]')
end
--End of code
return table.concat(out)
end
function r.ref(frame)
return r._ref(getArgs(frame), frame)
end
function r._r(args, frame)
frame = frame or mw.getCurrentFrame()
local output = setmetatable({}, mt)
output(frame:extensionTag('templatestyles', '', {src='Module:Citation/CS1/styles.css'}))
-- ### 1 ###
output(r._ref({
[1] = firstArg(args, 'name1', 'name', 'n1', 'n', 1),
[2] = firstArg(args, 'group', 'grp', 'g'),
direction = firstArg(args, 'direction1', 'direction', 'dir1', 'dir'),
page = firstArg(args, 'page1', 'page', 'p1', '1p', 'p'),
pages = firstArg(args, 'pages1', 'pages', 'pp1', '1pp', 'pp'),
location = firstArg(args, 'location1', 'location', 'loc1', '1loc', 'loc', 'at1', 'at'),
['quote-page'] = firstArg(args, 'quotation-page1', 'quotation-page', 'quote-page1', 'quote-page', 'qp1', 'qp'),
['quote-pages'] = firstArg(args, 'quotation-pages1', 'quotation-pages', 'quote-pages1', 'quote-pages', 'qpp1', 'qpp'),
['quote-location'] = firstArg(args,
'quotation-location1', 'quotation-location', 'quote-location1', 'quote-location', 'quote-loc1', 'quote-loc',
'quote-at1', 'quote-at'
),
quote = firstArg(args, 'quotation1', 'quotation', 'quote1', 'quote', 'q1', 'q'),
language = firstArg(args,
'quotation-language1', 'quotation-language', 'quote-language1', 'quote-language', 'quotation-lang1',
'quotation-lang', 'quote-lang1', 'quote-lang', 'ql1', 'ql', 'language1', 'language', 'lang1', 'language', 'l1', 'l'
),
translation = firstArg(args,
'translation-quotation1', 'translation-quotation', 'trans-quotation1', 'trans-quotation', 'translation-quote1',
'translation-quote', 'trans-quote1', 'trans-quote', 'tq1', 'tq', 'translation1', 'translation', 'trans1', 'trans',
't1', 't', 'xlat1', 'xlat'
),
['quote-cite'] = firstArg(args, 'quotation-cite1', 'quotation-cite', 'quote-cite1', 'quote-cite', 'qc1', 'qc'),
reference = firstArg(args,
'reference1', 'references', 'reference', 'notes', 'note', 'content', 'text', 'refn1', 'refn', 'refs', 'r1', 'r'
),
annotation = firstArg(args, 'annotation1', 'annotation', 'annot1', 'annot', 'a1', 'a'),
leadin = args.leadin,
postscript = firstArg(args, 'postscript', 'postscript1', 'ps', 'ps1', '1ps'),
section = firstArg(args, 'section1', 'section', 'sec1', 'sec', 's1', 's'),
['needed-reason'] = firstArg(args, 'needed-reason1', 'needed-reason', 'needed1', 'needed', 'reason'),
['needed-date'] = firstArg(args, 'needed-date', 'date'),
wrap = args.wrap,
['no-pp'] = firstArg(args, 'no-pp', 'nopp'),
style = args.style,
['content-id'] = firstArg(args, 'ref1', '1ref', 'ref', 'id1', 'id'),
['link-id'] = firstArg(args, 'link-id1', 'link-id'),
['debug'] = args['debug']
}, frame))
-- ### 2+ ###
local n = 2
while firstArg(args, "name" .. n, "n" .. n, n) ~= nil do
output(r._ref({
[1] = firstArg(args, 'name' .. n, 'n' .. n, n),
[2] = firstArg(args, 'group', 'grp', 'g'),
direction = firstArgN(n, args, 'direction', 'dir'),
page = firstArg(args, 'page' .. n, 'p' .. n, n .. 'p'),
pages = firstArg(args, 'pages' .. n, 'pp' .. n, n .. 'pp'),
location = firstArg(args, 'location' .. n, 'loc' .. n, n .. 'loc', 'at' .. n),
['quote-page'] = firstArgN(n, args, 'quotation-page', 'quote-page', 'qp'),
['quote-pages'] = firstArgN(n, args, 'quotation-pages', 'quote-pages', 'qpp'),
['quote-location'] = firstArgN(n, args, 'quotation-location', 'quote-location', 'quote-loc', 'quote-at'),
quote = firstArgN(n, args, 'quotation', 'quote', 'q'),
language = firstArgN(n, args,
'quotation-language', 'quote-language', 'quotation-lang', 'quote-lang', 'ql', 'language', 'lang', 'l'
),
translation = firstArgN(n, args,
'translation-quotation', 'trans-quotation', 'translation-quote', 'trans-quote', 'tq', 'translation', 'trans', 't',
'xlat'
),
['quote-cite'] = firstArgN(n, args, 'quotation-cite', 'quote-cite', 'qc'),
reference = firstArgN(n, args, 'reference', 'refn', 'r'),
annotation = firstArgN(n, args, 'annotation', 'annot', 'a'),
leadin = args.leadin,
postscript = firstArg(args, 'postscript' .. n, 'ps' .. n, n .. 'ps', 'postscript', 'ps'),
section = firstArgN(n, args, 'section', 'sec', 's'),
['needed-reason'] = firstArgN(n, args, 'needed-reason', 'needed'),
['needed-date'] = firstArg(args, 'needed-date', 'date'),
['wrap'] = args['wrap'],
['no-pp'] = firstArg(args, 'no-pp', 'nopp'),
style = args.style,
['content-id'] = firstArg(args, 'ref' .. n, n .. 'ref', 'id' .. n),
['link-id'] = args['link-id' .. n],
['debug'] = args['debug'],
}, frame))
n = n + 1
end
local outputText = table.concat(output)
local errorText = outputText:find('template-r-error', 1, true) and
'[[Category:Pages with errors in Template:R]]' or ''
return (outputText .. errorText)
end
function r.r(frame)
return r._r(getArgs(frame), frame)
end
-- Implements [[Template:Rp]]
function rp._rp(args, frame)
frame = frame or mw.getCurrentFrame()
-- If needed param is present and non-empty, show {{page needed}}
if notblank(args.needed) then
return page_needed(frame, args.date, args.reason)
end
-- prefix/suffix depending on style
local ama = string.ulower(args.style or "") == "ama"
local prefix = ama and "(" or ": "
local suffix = ama and ")" or " "
-- p/pp is only used in superscript label, therefore it does not contain any qp params
local pp = ""
if ama and isblank(args["no-pp"]) and isblank(args.nopp) then
if notblank(args.pages) or notblank(args.pp) then
pp = "pp"
elseif notblank(args.page) or notblank(args.p) then
pp = "p"
end
end
-- leadin is only used in tooltip
local leadin
local quote_switch = firstArg(args, "quotation-pages", "quote-pages", "qpp",
"quotation-page", "quote-page", "qp",
"quotation-location", "quote-location", "quote-loc", "quote-at")
if not pageTest[quote_switch] then
if notblank(firstArg(args, "quotation-pages", "quote-pages", "qpp")) then
leadin = "Pages"
elseif notblank(firstArg(args, "quotation-page", "quote-page", "qp")) then
leadin = "Page"
elseif notblank(firstArg(args, "quotation-location", "quote-location", "quote-loc", "quote-at")) then
leadin = "Location"
end
end
if not leadin then
--either the quote_switch wasn't 'pages', 'pp', 'page',
-- or 'p', or the 'quotation' params were all blank/nil
if notblank(firstArg(args, "pages", "pp")) then
leadin = "Pages"
elseif notblank(firstArg(args, "page", "p")) then
leadin = "Page"
elseif notblank(firstArg(args, "location", "loc", "at")) then
leadin = "Location"
else
leadin = "Page / location"
end
end
-- where must not include qp params
local where = r._where{
plural = hyphen2dash(firstArg(args, "pages", "pp", "1"), ' '),
singular = firstArg(args, "page", "p"),
location = firstArg(args, "location", "loc", "at"),
spacing = " "
}
-- sup-where same as where, but with improved list spacing for superscript
local sup_where = r._where{
plural = hyphen2dash(firstArg(args, "pages", "pp", "1"), ' '),
singular = firstArg(args, "page", "p"),
location = firstArg(args, "location", "loc", "at"),
spacing = " "
}
-- quote-where must not contain normal in-source-location params
local quote_where
if pageTest[quote_switch] then
quote_where = r._where{
plural = hyphen2dash(firstArg(args, "pages", "pp", 1), ' '),
singular = firstArg(args, "page", "p"),
location = firstArg(args, "location", "loc", "at"),
spacing = " "
}
else
quote_where = r._where{
plural = hyphen2dash(firstArg(args, "quotation-pages", "quote-pages", "qpp"), ' '),
singular = firstArg(args, "quotation-page", "quote-page", "qp"),
location = firstArg(args, "quotation-location", "quote-location", "quote-loc", "quote-at"),
spacing = " "
}
end
local zws = ""
if wrapTest[string.ulower(args.wrap or '')] then
zws = "​" --zero-width space
end
return r._superscript{
prefix = prefix,
suffix = suffix,
pp = pp,
leadin = leadin,
["where"] = where,
["sup-where"] = sup_where,
["quote-where"] = quote_where,
quote = firstArg(args, "quotation", "quote", "q"),
language = firstArg(args, "quotation-language", "quote-language",
"quotation-lang", "quote-lang", "ql", "language", "lang", "l"),
translation = firstArg(args, "translation-quotation", "trans-quotation",
"translation-quote", "trans-quote", "tq", "translation", "trans",
"t", "xlat"),
["wrap"] = args.wrap
} .. zws
end
function rp.rp(frame)
return rp._rp(getArgs(frame), frame)
end
return {
[''] = r.r,
r = r.r,
_r = r._r,
rp = rp.rp,
_rp = rp._rp,
ref = r.ref,
_ref = r._ref,
where = r.where,
_where = r._where,
details = r.details,
_details = r._details,
langcode = r.langcode,
_langcode = r._langcode,
superscript = r.superscript,
_superscript = r._superscript
}
f6jesd4755x8ezmji2s8s3jq6fz9tt1
ವಿಕಿಪೀಡಿಯ:ತುಳುವೆರೆ ಬದ್ಕ್ ಬುಕ್ಕೊ ಸಾಂಸ್ಕೃತಿಕ ಪರಂಪರೆ/ಪಾಲ್ ದೆತೊನುನಕುಲು
4
29028
373836
373749
2026-10-28T00:45:31Z
Mahaveer Indra
1023
/* */
373836
wikitext
text/x-wiki
''ನಿಕ್ಲೆಗ್ ಲೇಕನೊ ಮಲ್ಪೆರೆ ಇಚ್ಚೆ ಇತ್ತ್ಂಡ ಮುಲ್ಪ ತಿರ್ತ್ '''<nowiki># ~~~~</nowiki>''' ಇಂಚ ದಸ್ಕತ್ ಪಾಡ್ಲೆ.''
#--[[ಬಳಕೆದಾರೆ:Vishwanatha Badikana|Vishwanatha Badikana]] ([[ಬಳಕೆದಾರೆ ಪಾತೆರ:Vishwanatha Badikana|ಪಾತೆರ್ಲೆ]]) 12:51, 21 ಅಕ್ಟೋಬರ್ 2026 (IST)
# [[ಬಳಕೆದಾರೆ:ChiK|ChiK]] ([[ಬಳಕೆದಾರೆ ಪಾತೆರ:ChiK|ಪಾತೆರ್ಲೆ]]) 15:19, 24 ಅಕ್ಟೋಬರ್ 2026 (IST)
# [[ಬಳಕೆದಾರೆ:Mahaveer Indra|Mahaveer Indra]] ([[ಬಳಕೆದಾರೆ ಪಾತೆರ:Mahaveer Indra|ಪಾತೆರ್ಲೆ]]) 06:15, 28 ಅಕ್ಟೋಬರ್ 2026 (IST)
50284c7u65wmolpr3prsagnk1cvadxt
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
0
29106
373837
2026-10-28T04:13:20Z
Mahaveer Indra
1023
ಪೊಸ ಬರವು
373837
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.
cjk9tkt6mx6xpy6nd6q1de4rtnibt54
373838
373837
2026-10-28T04:18:14Z
Mahaveer Indra
1023
373838
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
==ವ್ಯವಸ್ತೆಲು==
==ಉಲ್ಲೇಕ==
{{reflist}}
5sghs0sxsg5j8wh3ctko7d7h9y2405h
373839
373838
2026-10-28T04:40:29Z
Mahaveer Indra
1023
/* ಇತಿಹಾಸೊ */
373839
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref>
==ವ್ಯವಸ್ತೆಲು==
==ಉಲ್ಲೇಕ==
{{reflist}}
i61fnw06674fxba58crv2elfnl3wbh1
373840
373839
2026-10-28T04:50:04Z
Mahaveer Indra
1023
/* ಇತಿಹಾಸೊ */
373840
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
==ಉಲ್ಲೇಕ==
{{reflist}}
9wkuvy23cw5umd5ffkmhczt0k2ufbyq
373841
373840
2026-10-28T05:11:23Z
Mahaveer Indra
1023
/* ವ್ಯವಸ್ತೆಲು */
373841
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
ಓಟದ ಟ್ರ್ಯಾಕ್ (Running Track): ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು (Field Events): ಕ್ರೀಡಾಂಗಣದ ಟ್ರ್ಯಾಕ್ದ ಉಲಾಯಿಡ್ 'ಡಿ-ಏರಿಯಾ' (D-area) ಉಂಡು. ಮುಲ್ಪ ಉದ್ದ ಲಾಗ್ಯುನೆ (Long jump), ಗುಂಡು ಎಸೆತ (Shot put), ಜಾವೆಲಿನ್ ತ್ರೋ (Javelin throw), ಚಕ್ರ ಎಸೆತ (Discus throw) ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
ಈಜುಗೊಳ (Swimming Pool): ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಈಜು ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
==ಉಲ್ಲೇಕ==
{{reflist}}
o5kyay37bast940efbhnwdtbyngel22
373843
373841
2026-10-28T05:27:47Z
Mahaveer Indra
1023
/* ವ್ಯವಸ್ತೆಲು */
373843
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
==ಉಲ್ಲೇಕ==
{{reflist}}
l6mokj6ndlzdp64e9j37o6s6q8gaybu
373844
373843
2026-10-28T05:37:19Z
Mahaveer Indra
1023
/* ವ್ಯವಸ್ತೆಲು */
373844
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
==ಉಲ್ಲೇಕ==
{{reflist}}
0i9cqmm6lxyzaf3ikf233i0c8il2zwq
373845
373844
2026-10-28T05:38:35Z
Mahaveer Indra
1023
/* ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು */
373845
wikitext
text/x-wiki
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
==ಉಲ್ಲೇಕ==
{{reflist}}
rmz6vdez3x8g3c2t14ebn40b7klklb2
373848
373845
2026-10-28T05:53:41Z
ChiK
1136
373848
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] ([[South United F.C.]]) (2018-ಇಂಚಿಶಿ / Present)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
==ಉಲ್ಲೇಕ==
{{reflist}}
aaasjzlk5r7q5rosntxobe2zz833fvv
373893
373848
2026-10-28T05:56:57Z
ChiK
1136
373893
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ ಕರ್ನಾಟಕ ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
==ವ್ಯವಸ್ತೆಲು==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
==ಉಲ್ಲೇಕ==
{{reflist}}
lvyx95yr99d83qnld6ptkwwjffgzovk
373894
373893
2026-10-28T05:58:29Z
ChiK
1136
373894
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
l9ow3grzarykk6qbdo6czx7yd9btx0d
373895
373894
2026-10-28T06:03:12Z
Mahaveer Indra
1023
/* ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು */
373895
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
# 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012): ಭಾರತ ಸರ್ಕಾರದ ಯುವಜನ ವ್ಯವಹಾರ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಸಚಿವಾಲಯದ ವತಿಯಿರ್ದ್ 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ ಮುಲ್ಪ ನಡತ್ಂಡ್. ಈ ಲೇಸ್ಡ್ ಭಾರತದ ಬೇತೆ ಬೇತೆ ರಾಜ್ಯೊಲೆರ್ದ್ ಯುವಜನೆರ್ ಪಾಲ್ ಪಡೆದಿತ್ತೆರ್.
# ಕರ್ನಾಟಕ ರಾಜ್ಯ ಕ್ರೀಡಾಕೂಟ (2025): ಜನವರಿ 2025ಡ್ ನಡತಿನ ರಾಜ್ಯ ಮಟ್ಟದ ಕ್ರೀಡಾಕೂಟನ್ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯ ಮೇರ್ ಮುಲ್ಪನೆ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್. ಈ ಲೇಸ್ಡ್ ವಾಲಿಬಾಲ್, ಹ್ಯಾಂಡ್ಬಾಲ್ ಬೊಕ್ಕ ನೆಟ್ಬಾಲ್ ಪಂತೊಲು ಮಂಗಳ ಸ್ಟೇಡಿಯಂಡ್ ನಡತ್ಂಡ್.
# ನಶಾ ಮುಕ್ತ ಭಾರತ ವಾಕಥಾನ್ (2025): ಯುವಜನೆರೆಡ್ ಮಾದಕವ್ಯಸನದ ಬಗ್ಗೆ ಜಾಗೃತಿ ಮೂಡಾಯೆರೆ ನವೆಂಬರ್ 2025ಕ್ ಮಂಗಳ ಸ್ಟೇಡಿಯಂರ್ದ್ ಕರಾವಳಿ ಮೈದಾನ ಮುಟ್ಟ ಮಲ್ಲ ಮಟ್ಟದ ವಾಕಥಾನ್ ನಡತ್ಂಡ್.
ಉಂದು ಮಾತ್ರ ಅತ್ತಂದೆ, ದಸರಾ ಕ್ರೀಡಾಕೂಟ, ಬೇತೆ ಬೇತೆ ಸಂಘ-ಸಂಸ್ಥೆಲೆನ ಕ್ರೀಡಾಕೂಟ, ಸ್ವಾತಂತ್ರ್ಯ ದಿನಾಚರಣೆ ಬೊಕ್ಕ ಗಣರಾಜ್ಯೋತ್ಸವದಂಚಿನ ರಾಷ್ಟ್ರೀಯ ಪರ್ಬೊಲೆನ ಪರೇಡ್ಲುಲಾ ಮುಲ್ಪನೆ ನಡಪುಂಡು.
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
izj56pybmk8dc3sc8s6oh7mzx5xd3sn
373896
373895
2026-10-28T06:04:14Z
Mahaveer Indra
1023
373896
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
# 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012): ಭಾರತ ಸರ್ಕಾರದ ಯುವಜನ ವ್ಯವಹಾರ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಸಚಿವಾಲಯದ ವತಿಯಿರ್ದ್ 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ ಮುಲ್ಪ ನಡತ್ಂಡ್. ಈ ಲೇಸ್ಡ್ ಭಾರತದ ಬೇತೆ ಬೇತೆ ರಾಜ್ಯೊಲೆರ್ದ್ ಯುವಜನೆರ್ ಪಾಲ್ ಪಡೆದಿತ್ತೆರ್.
# ಕರ್ನಾಟಕ ರಾಜ್ಯ ಕ್ರೀಡಾಕೂಟ (2025): ಜನವರಿ 2025ಡ್ ನಡತಿನ ರಾಜ್ಯ ಮಟ್ಟದ ಕ್ರೀಡಾಕೂಟನ್ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯ ಮೇರ್ ಮುಲ್ಪನೆ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್. ಈ ಲೇಸ್ಡ್ ವಾಲಿಬಾಲ್, ಹ್ಯಾಂಡ್ಬಾಲ್ ಬೊಕ್ಕ ನೆಟ್ಬಾಲ್ ಪಂತೊಲು ಮಂಗಳ ಸ್ಟೇಡಿಯಂಡ್ ನಡತ್ಂಡ್.
# ನಶಾ ಮುಕ್ತ ಭಾರತ ವಾಕಥಾನ್ (2025): ಯುವಜನೆರೆಡ್ ಮಾದಕವ್ಯಸನದ ಬಗ್ಗೆ ಜಾಗೃತಿ ಮೂಡಾಯೆರೆ ನವೆಂಬರ್ 2025ಕ್ ಮಂಗಳ ಸ್ಟೇಡಿಯಂರ್ದ್ ಕರಾವಳಿ ಮೈದಾನ ಮುಟ್ಟ ಮಲ್ಲ ಮಟ್ಟದ ವಾಕಥಾನ್ ನಡತ್ಂಡ್.
ಉಂದು ಮಾತ್ರ ಅತ್ತಂದೆ, ದಸರಾ ಕ್ರೀಡಾಕೂಟ, ಬೇತೆ ಬೇತೆ ಸಂಘ-ಸಂಸ್ಥೆಲೆನ ಕ್ರೀಡಾಕೂಟ, ಸ್ವಾತಂತ್ರ್ಯ ದಿನಾಚರಣೆ ಬೊಕ್ಕ ಗಣರಾಜ್ಯೋತ್ಸವದಂಚಿನ ರಾಷ್ಟ್ರೀಯ ಪರ್ಬೊಲೆನ ಪರೇಡ್ಲುಲಾ ಮುಲ್ಪನೆ ನಡಪುಂಡು.
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
0ainpp1xzba7p3v4isxejw9v7ppo4lk
373897
373896
2026-10-28T06:07:20Z
Mahaveer Indra
1023
/* ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು */
373897
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
===17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012)===
ಭಾರತ ಸರ್ಕಾರದ ಯುವಜನ ವ್ಯವಹಾರ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಸಚಿವಾಲಯದ ವತಿಯಿರ್ದ್ 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ ಮುಲ್ಪ ನಡತ್ಂಡ್. ಈ ಲೇಸ್ಡ್ ಭಾರತದ ಬೇತೆ ಬೇತೆ ರಾಜ್ಯೊಲೆರ್ದ್ ಯುವಜನೆರ್ ಪಾಲ್ ಪಡೆದಿತ್ತೆರ್.
===ಕರ್ನಾಟಕ ರಾಜ್ಯ ಕ್ರೀಡಾಕೂಟ (2025)===
ಜನವರಿ 2025ಡ್ ನಡತಿನ ರಾಜ್ಯ ಮಟ್ಟದ ಕ್ರೀಡಾಕೂಟನ್ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯ ಮೇರ್ ಮುಲ್ಪನೆ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್. ಈ ಲೇಸ್ಡ್ ವಾಲಿಬಾಲ್, ಹ್ಯಾಂಡ್ಬಾಲ್ ಬೊಕ್ಕ ನೆಟ್ಬಾಲ್ ಪಂತೊಲು ಮಂಗಳ ಸ್ಟೇಡಿಯಂಡ್ ನಡತ್ಂಡ್.
===ನಶಾ ಮುಕ್ತ ಭಾರತ ವಾಕಥಾನ್ (2025)===
ಯುವಜನೆರೆಡ್ ಮಾದಕವ್ಯಸನದ ಬಗ್ಗೆ ಜಾಗೃತಿ ಮೂಡಾಯೆರೆ ನವೆಂಬರ್ 2025ಕ್ ಮಂಗಳ ಸ್ಟೇಡಿಯಂರ್ದ್ ಕರಾವಳಿ ಮೈದಾನ ಮುಟ್ಟ ಮಲ್ಲ ಮಟ್ಟದ ವಾಕಥಾನ್ ನಡತ್ಂಡ್.
ಉಂದು ಮಾತ್ರ ಅತ್ತಂದೆ, ದಸರಾ ಕ್ರೀಡಾಕೂಟ, ಬೇತೆ ಬೇತೆ ಸಂಘ-ಸಂಸ್ಥೆಲೆನ ಕ್ರೀಡಾಕೂಟ, ಸ್ವಾತಂತ್ರ್ಯ ದಿನಾಚರಣೆ ಬೊಕ್ಕ ಗಣರಾಜ್ಯೋತ್ಸವದಂಚಿನ ರಾಷ್ಟ್ರೀಯ ಪರ್ಬೊಲೆನ ಪರೇಡ್ಲುಲಾ ಮುಲ್ಪನೆ ನಡಪುಂಡು.
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
3kv4i4xantalukf0gtcqgj1764rhe3d
373898
373897
2026-10-28T06:08:45Z
Mahaveer Indra
1023
/* 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012) */
373898
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
===17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012)===
ಭಾರತ ಸರ್ಕಾರದ ಯುವಜನ ವ್ಯವಹಾರ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಸಚಿವಾಲಯದ ವತಿಯಿರ್ದ್ 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ ಮುಲ್ಪ ನಡತ್ಂಡ್. ಈ ಲೇಸ್ಡ್ ಭಾರತದ ಬೇತೆ ಬೇತೆ ರಾಜ್ಯೊಲೆರ್ದ್ ಯುವಜನೆರ್ ಪಾಲ್ ಪಡೆದಿತ್ತೆರ್.
===ಕರ್ನಾಟಕ ರಾಜ್ಯ ಕ್ರೀಡಾಕೂಟ (2025)===
ಜನವರಿ 2025ಡ್ ನಡತಿನ ರಾಜ್ಯ ಮಟ್ಟದ ಕ್ರೀಡಾಕೂಟನ್ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯ ಮೇರ್ ಮುಲ್ಪನೆ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್. ಈ ಲೇಸ್ಡ್ ವಾಲಿಬಾಲ್, ಹ್ಯಾಂಡ್ಬಾಲ್ ಬೊಕ್ಕ ನೆಟ್ಬಾಲ್ ಪಂತೊಲು ಮಂಗಳ ಸ್ಟೇಡಿಯಂಡ್ ನಡತ್ಂಡ್.
===ನಶಾ ಮುಕ್ತ ಭಾರತ ವಾಕಥಾನ್ (2025)===
ಯುವಜನೆರೆಡ್ ಮಾದಕವ್ಯಸನದ ಬಗ್ಗೆ ಜಾಗೃತಿ ಮೂಡಾಯೆರೆ ನವೆಂಬರ್ 2025ಕ್ ಮಂಗಳ ಸ್ಟೇಡಿಯಂರ್ದ್ ಕರಾವಳಿ ಮೈದಾನ ಮುಟ್ಟ ಮಲ್ಲ ಮಟ್ಟದ ವಾಕಥಾನ್ ನಡತ್ಂಡ್.
ಉಂದು ಮಾತ್ರ ಅತ್ತಂದೆ, ದಸರಾ ಕ್ರೀಡಾಕೂಟ, ಬೇತೆ ಬೇತೆ ಸಂಘ-ಸಂಸ್ಥೆಲೆನ ಕ್ರೀಡಾಕೂಟ, ಸ್ವಾತಂತ್ರ್ಯ ದಿನಾಚರಣೆ ಬೊಕ್ಕ ಗಣರಾಜ್ಯೋತ್ಸವದಂಚಿನ ರಾಷ್ಟ್ರೀಯ ಪರ್ಬೊಲೆನ ಪರೇಡ್ಲುಲಾ ಮುಲ್ಪನೆ ನಡಪುಂಡು.
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
nw3bxn3x0z1r0b0zgrocq44ujcvp7n3
373900
373898
2026-10-28T07:00:40Z
Mahaveer Indra
1023
/* 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012) */
373900
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಗೆಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
===17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012)===
ಭಾರತ ಸರ್ಕಾರದ ಯುವಜನ ವ್ಯವಹಾರ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಸಚಿವಾಲಯದ ವತಿಯಿರ್ದ್ 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ ಮುಲ್ಪ ನಡತ್ಂಡ್. ಈ ಲೇಸ್ಡ್ ಭಾರತದ ಬೇತೆ ಬೇತೆ ರಾಜ್ಯೊಲೆರ್ದ್ ಯುವಜನೆರ್ ಪಾಲ್ ಪಡೆದಿತ್ತೆರ್.<ref>{{cite web |title=Mangalore all set for 17th National Youth Festival |url=https://www.mangaloretoday.com/main/Mangalore-all-set-for-17th-National-Youth-Festival.html |website=mangaloretoday.com |publisher=MangaloreToday |access-date=28 October 2026}}</ref>
===ಕರ್ನಾಟಕ ರಾಜ್ಯ ಕ್ರೀಡಾಕೂಟ (2025)===
ಜನವರಿ 2025ಡ್ ನಡತಿನ ರಾಜ್ಯ ಮಟ್ಟದ ಕ್ರೀಡಾಕೂಟನ್ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯ ಮೇರ್ ಮುಲ್ಪನೆ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್. ಈ ಲೇಸ್ಡ್ ವಾಲಿಬಾಲ್, ಹ್ಯಾಂಡ್ಬಾಲ್ ಬೊಕ್ಕ ನೆಟ್ಬಾಲ್ ಪಂತೊಲು ಮಂಗಳ ಸ್ಟೇಡಿಯಂಡ್ ನಡತ್ಂಡ್.<ref>{{cite web |title=Mangaluru: CM Siddaramaiah inaugurates State Games 2025 in city |url=https://daijiworld.com/news/newsDisplay?newsID=1263291#:~:text=Handball%3A%20January%2021%20to%2023%20at%20Mangala,and%2019%20at%20State%20Employees%20Hall%2C%20Hampankatta. |website=daijiworld.com |publisher=daijiworld |access-date=28 October 2026}}</ref>
===ನಶಾ ಮುಕ್ತ ಭಾರತ ವಾಕಥಾನ್ (2025)===
ಯುವಜನೆರೆಡ್ ಮಾದಕವ್ಯಸನದ ಬಗ್ಗೆ ಜಾಗೃತಿ ಮೂಡಾಯೆರೆ ನವೆಂಬರ್ 2025ಕ್ ಮಂಗಳ ಸ್ಟೇಡಿಯಂರ್ದ್ ಕರಾವಳಿ ಮೈದಾನ ಮುಟ್ಟ ಮಲ್ಲ ಮಟ್ಟದ ವಾಕಥಾನ್ ನಡತ್ಂಡ್.<ref>{{cite web |title=ವಾಕಥಾನ್ |url=https://www.varthabharati.in/dakshinakannada/mangalore-massive-walkathon-under-the-auspices-of-rguhs-2101619 |website=varthabharati.in |publisher=ವಾರ್ತಾ ಭಾರತಿ |access-date=28 October 2026}}</ref>
ಉಂದು ಮಾತ್ರ ಅತ್ತಂದೆ, ದಸರಾ ಕ್ರೀಡಾಕೂಟ, ಬೇತೆ ಬೇತೆ ಸಂಘ-ಸಂಸ್ಥೆಲೆನ ಕ್ರೀಡಾಕೂಟ, ಸ್ವಾತಂತ್ರ್ಯ ದಿನಾಚರಣೆ ಬೊಕ್ಕ ಗಣರಾಜ್ಯೋತ್ಸವದಂಚಿನ ರಾಷ್ಟ್ರೀಯ ಪರ್ಬೊಲೆನ ಪರೇಡ್ಲುಲಾ ಮುಲ್ಪನೆ ನಡಪುಂಡು.
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
k4y1jojr2agszy8kj9kxb2hhy5x1d77
373904
373900
2026-10-28T07:53:30Z
ChiK
1136
/* */
373904
wikitext
text/x-wiki
{{Infobox venue
| name = ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
| nickname =
| image = Near the entrance of Mangala Stadium in Mangalore.jpg
| image_caption = ಮಂಗಳೂರುಡುಪ್ಪುನ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಬಾಕಿಲ್ದ ಕೈತಲ್
| location = [[ಮಂಗಳೂರು]], [[ಕರ್ನಾಟಕ]]
| groundbreaking = 2009
| opened = ಅಕ್ಟೋಬರ್ 2011
| owner = [[ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ]]
| operator = (ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ)
| cost =
| architect =
| tenants = [[ಕರ್ನಾಟಕ ಕ್ರಿಕೆಟ್ ತಂಡ]] , ([[ಮಂಗಳೂರು ಯುನೈಟೆಡ್]]) <br/> [[ಸೌತ್ ಯುನೈಟೆಡ್ ಎಫ್.ಸಿ.]] (2018-ಇಂಚಿಪೊ)
| capacity = 8,000<ref name="capacity">{{Cite news |date=2019-12-20 |title=ಮಂಗಳಾ ಸ್ಟೇಡಿಯಂದ ಸುರೂತ ಹಂತದ ಬೇಲೆಗ್ ಸಿದ್ಧತೆ ಆತ್ಂಡ್ (Stage is set for first phase works of Mangala Stadium) |url=https://timesofindia.indiatimes.com/city/mangaluru/stage-set-for-first-phase-of-redevelopment-of-mangala-stadium/articleshow/72892244.cms |access-date=2026-06-09 |work=The Times of India |issn=0971-8257}}</ref>
}}
'''ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ''' [[ದಕ್ಷಿಣ ಕನ್ನಡ ಜಿಲ್ಲೆ|ದಕ್ಷಿಣ ಕನ್ನಡ]] ಜಿಲ್ಲೆದ ಕುಡ್ಲಡ್, ಪೇಂಟೆದ ನಡುಟು ಉಪ್ಪುನ ಒಂಜಿ ಪ್ರಮುಖವಾಯಿನ ಮಲ್ಲ ಮೈದಾನ. ಕುಡ್ಲದ ಗ್ರಾಮ ದೇವತೆ ಮಂಗಳಾದೇವಿನ ಪುದರ್ನ್ ಈ ಕ್ರೀಡಾಂಗಣಗ್ ದೀತೆರ್. ಈ ಮೈದಾನ ಮಂಗಳೂರು ಮಹಾನಗರ ಪಾಲಿಕೆ ಬೊಕ್ಕ [[ಕರ್ನಾಟಕ]] ರಾಜ್ಯದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆದ ಆಡಳಿತದ ಅಡಿಟ್ ಬರ್ಪುಂಡು. ಕರಾವಳಿ ಭಾಗದ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ಶಾಲೆ ಕಾಲೇಜಿದ ಜೋಕುಲೆಗ್ ಈ ಮೈದಾನ ಒಂಜಿ ಮುಖ್ಯವಾಯಿನ ತರಬೇತಿ ಕೇಂದ್ರ ಆದುಂಡು.<ref>{{cite web |title=Mangala Stadium |url=https://manipalblog.com/mangala-stadium/ |website=manipalblog.com |publisher=ManipalBlog.com |access-date=28 October 2026}}</ref>
==ಇತಿಹಾಸೊ==
ಇತ್ತೆ ಇಪ್ಪುನ ಮಲ್ಲ ಮೈದಾನ ದುಂಬು ಎಲ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಐಕ್ ಮಣ್ಣಗುಡ್ಡ ಮೈದಾನ ಪಂದ್ ಪುದರ್ ಇತ್ತ್ಂಡ್. ೧೯೯೫ನೇ ಇಸವಿಡ್ ಇಂದೆನ್ ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ಪಂದ್ ಪುದರ್ ದೀಯೆರ್, ಅತ್ತಂದೆ ಬೇತೆ ಬೇತೆ ರೀತಿದ ಆಟ ಕೂಟೊಲು ನಡಪರ ಸುರು ಆಂಡ್.<ref>{{cite web |title=ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ ೨ ತಿಂಗಳು ಬಂದ್ |url=https://udayavani.com/dakshina-kannada-news/mangaluru-mangala-stadium-closed-for-2-months-446890?lang=kn |website=udayavani.com |publisher=udayavani |access-date=28 October 2026}}</ref> ಸುರುಕು ಮುಲ್ಪ ಮಣ್ಣ್ದ ಓಟದ ಟ್ರ್ಯಾಕ್ ಇತ್ತ್ಂಡ್. ಕ್ರೀಡಾಪಟುಕುಲೆನ ಮಸ್ತ್ ವರ್ಷದ ಬೇಡಿಕೆದ ಪ್ರಕಾರ ೨೦೧೩ನೇ ಇಸವಿಡ್ ಕ್ರೀಡಾಂಗಣಗ್ ೪೦೦ ಮೀಟರ್ದ ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ನ್ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್.
== ವ್ಯವಸ್ತೆಲು ==
ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣೊಡು ಕ್ರೀಡಾಪಟುಕ್ಲೆಗ್ ಬೊಕ್ಕ ಸಾರ್ವಜನಿಕೆರೆಗ್ ಸದ್ಯೊಗು ಇಪ್ಪುನ ಸೌಲಭೊಲು
# ಓಟದ ಟ್ರ್ಯಾಕ್- ಬಲಿಪುನ ಕ್ರೀಡಾಪಟುಕುಲೆಗ್ ತರಬೇತಿ ಮಲ್ಪೆರೆ ೪೦೦ ಮೀಟರ್ದ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಮುಲ್ಪ ಉಂಡು.
# ಫೀಲ್ಡ್ ಕ್ರೀಡೆಲು - ಕ್ರೀಡಾಂಗಣದ ಉಲಾಯಿಡ್ ಮುಲ್ಪ ಉದ್ದ ಲಾಗಿಯರ, ಗುಂಡು ಎಸೆತ, ಜಾವೆಲಿನ್ ತ್ರೋ, ಚಕ್ರ ಎಸೆತ, ಬೊಕ್ಕ ಹ್ಯಾಮರ್-ತ್ರೋ ಇಂಚಿನ ಗೊಬ್ಬುಲೆಗ್ ಪ್ರತ್ಯೇಕ ವ್ಯವಸ್ಥೆ ಉಂಡು.
# ಈಜುಗೊಳ- ಕ್ರೀಡಾಂಗಣದ ಕೈತಲ್ಡ್ ಮೀಂದರ ಕಲ್ಪೆರೆ ಬೊಕ್ಕ ಸ್ಪರ್ಧೆಲೆಗ್ ಬೋಡಾದ್ ಈಜುಗೊಳ ಉಂಡು.
# ಗೊಬ್ಬುದ ಮೈದಾನ: ನಡುಟು ಉಪ್ಪುನ ಪಚ್ಚೆ ಮೈದಾನಡ್ ಫುಟ್ಬಾಲ್ ಬೊಕ್ಕ ಬೇತೆ ಕ್ರೀಡೆಲೆನ್ ಗೊಬ್ಬೊಲಿ.
# ಗ್ಯಾಲರಿಡ್ ಸಾವಿರಾರು ಜನ ಕುಲ್ಲುನೆಕ್ ಎಡ್ಡೆ ವ್ಯವಸ್ಥೆ ಉಂಡು.
== ದುಂಬಗ್ ನಡಪುನ ಅಬಿವೃದ್ಧಿ ಬೇಲೆಲು==
ಕರ್ನಾಟಕ ಸರ್ಕಾರದ ಯುವಜನ ಸಬಲೀಕರಣ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಖೆ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಇಲಾಕೆಲು ಜಂಟಿಯಾದ್, ದುಂಬುದ ದಿನೊಟು ಈ ಕ್ರೀಡಾಂಗಣಗ್ ಅಬಿವೃದ್ಧಿ ಮಲ್ಪುನ ಮಲ್ಲ ಯೋಜನೆನ್ ಪಾಡೊಂದೆರ್. ಐತ ಬಗೆಟ್ ಮಾಹಿತಿಲು
೩ ಕೋಟಿ ರೂ. ಅಭಿವೃದ್ಧಿ: ರಾಜ್ಯ ಸರ್ಕಾರ ಬೊಕ್ಕ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯೆರೆನ ಅನುದಾನದಡಿಟ್ ೩ ಕೋಟಿ ರೂಪಾಯಿ ಖರ್ಚ್ ಮಲ್ತ್ದ್ ಮಂಗಳ ಕ್ರೀಡಾಂಗಣದ ನವೀಕರಣ ಬೇಲೆಗ್ ಚಾಲನೆ ಕೊರ್ತೆರ್. ಉಂದೆಕ್ ೩ ಕೋಟಿ ರೂ. ಬಜೆಟ್ಡ್ ಮೀಸಲಾತ್ಂಡ್ ಬೊಕ್ಕ ೧.೫ ಕೋಟಿ ರೂ. ಹೆಚ್ಚುವರಿಯಾದ್ ಕೊರ್ತೆರ್.<ref>{{cite web |title=Stadium Development |url=https://www.thehindu.com/news/cities/Mangalore/35-crore-for-mangala-stadium-development/article29747722.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಪೊಸ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್: ಮುಲ್ಪ ಇತ್ತಿನ ೧೫ ವರ್ಷ ಪರತ್ ಆಯಿನ ಸಿಂಥೆಟಿಕ್ ಟ್ರ್ಯಾಕ್ ಬರ್ಸ ಬೊಕ್ಕ ದೊಂಬುಗು ಹಾಳಾದ್ ಜಾರುನಂಚಿತ್ತ್ಂಡ್. ಅಂಚಾದ್ ಪರತ್ ಟ್ರ್ಯಾಕ್ ದೆತ್ತ್ದ್ ಪೊಸತ್ ಪಾಡುನ ಬೇಲೆ ನಡತೊಂದು ಉಂಡು.<ref>{{cite web |title=synthetic Turf |url=https://www.thehindu.com/news/cities/Mangalore/mangala-stadium-is-all-set-to-get-fullfledged-synthetic-turf/article2773967.ece |website=thehindu.com |publisher=thehindu |access-date=28 October 2026}}</ref>
ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆ (Drainage System): ಕುಡ್ಲಡ್ ಬರ್ಸ ಜಾಸ್ತಿ ಬರ್ಪುನೈರ್ದಾವರ ಮೈದಾನಡ್ ನೀರ್ ಉಂತಂದಿಲೆಕ್ಕ ಬೊಕ್ಕ ಟ್ರ್ಯಾಕ್ ಹಾಳಾವಂದಿಲೆಕ್ಕ ಪೊಸ ವೈಜ್ಞಾನಿಕವಾಯಿನ ಒಳಚರಂಡಿ ವ್ಯವಸ್ಥೆನ್ ನಿರ್ಮಾಣ ಮಲ್ತೊಂದು ಉಲ್ಲೆರ್.
ಫೀಲ್ಡ್ ಅಪ್ಗ್ರೇಡ್: ಜಾವೆಲಿನ್ ತ್ರೋ, ಶಾಟ್ ಪುಟ್ ಬೊಕ್ಕ ಲಾಂಗ್ ಜಂಪ್ ಜಾಗೆನ್ ರಾಷ್ಟ್ರೀಯ ಮಟ್ಟದ ಸ್ಪರ್ಧೆಗ್ ಬೋಡಾಪಿನಂಚೆನೆ ಉನ್ನತೀಕರಣ ಮಲ್ಪುನ ಯೋಜನೆ ಉಂಡು.
== ಇಡೆಮುಟ್ಟ ನಡತ್ತಿನ ಮಲ್ಲ ಲೇಸುಲು==
===17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ (2012)===
ಭಾರತ ಸರ್ಕಾರದ ಯುವಜನ ವ್ಯವಹಾರ ಬೊಕ್ಕ ಕ್ರೀಡಾ ಸಚಿವಾಲಯದ ವತಿಯಿರ್ದ್ 17ನೇ ರಾಷ್ಟ್ರೀಯ ಯುವಜನೋತ್ಸವ ಮುಲ್ಪ ನಡತ್ಂಡ್. ಈ ಲೇಸ್ಡ್ ಭಾರತದ ಬೇತೆ ಬೇತೆ ರಾಜ್ಯೊಲೆರ್ದ್ ಯುವಜನೆರ್ ಪಾಲ್ ಪಡೆದಿತ್ತೆರ್.<ref>{{cite web |title=Mangalore all set for 17th National Youth Festival |url=https://www.mangaloretoday.com/main/Mangalore-all-set-for-17th-National-Youth-Festival.html |website=mangaloretoday.com |publisher=MangaloreToday |access-date=28 October 2026}}</ref>
===ಕರ್ನಾಟಕ ರಾಜ್ಯ ಕ್ರೀಡಾಕೂಟ (2025)===
ಜನವರಿ 2025ಡ್ ನಡತಿನ ರಾಜ್ಯ ಮಟ್ಟದ ಕ್ರೀಡಾಕೂಟನ್ ಮುಖ್ಯಮಂತ್ರಿ ಸಿದ್ದರಾಮಯ್ಯ ಮೇರ್ ಮುಲ್ಪನೆ ಉದ್ಘಾಟನೆ ಮಲ್ತೆರ್. ಈ ಲೇಸ್ಡ್ ವಾಲಿಬಾಲ್, ಹ್ಯಾಂಡ್ಬಾಲ್ ಬೊಕ್ಕ ನೆಟ್ಬಾಲ್ ಪಂತೊಲು ಮಂಗಳ ಸ್ಟೇಡಿಯಂಡ್ ನಡತ್ಂಡ್.<ref>{{cite web |title=Mangaluru: CM Siddaramaiah inaugurates State Games 2025 in city |url=https://daijiworld.com/news/newsDisplay?newsID=1263291#:~:text=Handball%3A%20January%2021%20to%2023%20at%20Mangala,and%2019%20at%20State%20Employees%20Hall%2C%20Hampankatta. |website=daijiworld.com |publisher=daijiworld |access-date=28 October 2026}}</ref>
===ನಶಾ ಮುಕ್ತ ಭಾರತ ವಾಕಥಾನ್ (2025)===
ಯುವಜನೆರೆಡ್ ಮಾದಕವ್ಯಸನದ ಬಗ್ಗೆ ಜಾಗೃತಿ ಮೂಡಾಯೆರೆ ನವೆಂಬರ್ 2025ಕ್ ಮಂಗಳ ಸ್ಟೇಡಿಯಂರ್ದ್ ಕರಾವಳಿ ಮೈದಾನ ಮುಟ್ಟ ಮಲ್ಲ ಮಟ್ಟದ ವಾಕಥಾನ್ ನಡತ್ಂಡ್.<ref>{{cite web |title=ವಾಕಥಾನ್ |url=https://www.varthabharati.in/dakshinakannada/mangalore-massive-walkathon-under-the-auspices-of-rguhs-2101619 |website=varthabharati.in |publisher=ವಾರ್ತಾ ಭಾರತಿ |access-date=28 October 2026}}</ref>
ಉಂದು ಮಾತ್ರ ಅತ್ತಂದೆ, ದಸರಾ ಕ್ರೀಡಾಕೂಟ, ಬೇತೆ ಬೇತೆ ಸಂಘ-ಸಂಸ್ಥೆಲೆನ ಕ್ರೀಡಾಕೂಟ, ಸ್ವಾತಂತ್ರ್ಯ ದಿನಾಚರಣೆ ಬೊಕ್ಕ ಗಣರಾಜ್ಯೋತ್ಸವದಂಚಿನ ರಾಷ್ಟ್ರೀಯ ಪರ್ಬೊಲೆನ ಪರೇಡ್ಲುಲಾ ಮುಲ್ಪನೆ ನಡಪುಂಡು.
==ಉಲ್ಲೇಕೊಲು==
{{reflist}}
c18nf25jncm7061hyqn5bjk916vgnv5
ಟೆಂಪ್ಲೇಟ್:Infobox stadium
10
29107
373849
2018-02-23T16:30:06Z
en>Primefac
0
Changed protection level for "[[Template:Infobox stadium]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
373849
wikitext
text/x-wiki
#REDIRECT [[Template:Infobox venue]]
{{R from move}}
3jw4m9ixjzvi00mdpr3at13yjmgp36y
373850
373849
2026-10-28T05:54:31Z
ChiK
1136
1 revision imported from [[:en:Template:Infobox_stadium]]
373849
wikitext
text/x-wiki
#REDIRECT [[Template:Infobox venue]]
{{R from move}}
3jw4m9ixjzvi00mdpr3at13yjmgp36y
ಟೆಂಪ್ಲೇಟ್:Infobox venue
10
29108
373851
2026-10-24T02:17:01Z
en>Zackmann08
0
replacing param with full_name to be auto replaced.
373851
wikitext
text/x-wiki
<includeonly>{{Infobox
| child = {{{child|}}}
| bodyclass = vcard
| autoheaders = yes
| headerstyle = background-color:#ccc; color:inherit;
| title = {{If empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| titleclass = fn org
| subheader = {{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}} }}
| subheader2 = {{#if:{{{nickname|}}}|<div class="nickname">{{{nickname|}}}</div>}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{logo_image|}}}|size={{{logo_size|}}}|sizedefault=frameless|upright={{if empty|{{{logo_upright|}}}|1}}|alt={{{logo_alt|}}}|class=notpageimage {{{logo_class|}}}}}
| caption = {{{logo_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|upright={{if empty|{{{image_upright|}}}|1}}|alt={{{image_alt|}}}|class=pageimage|data-pageimage=1}}
| caption2 = {{{image_caption|}}}
| image3 = {{#invoke:InfoboxImage|InfoboxImage|image={{{image_map|}}}|size={{if empty|{{{map_size|}}}|{{{image_size|}}}}}|sizedefault=frameless|upright=1|alt={{{map_alt|}}}|class=notpageimage}}
| caption3 = {{{map_caption|}}}
| image4 = {{#invoke:Location map|infobox_pushpin_map
| pushpin_label = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| image5 = {{#invoke:Infobox mapframe|autoWithCaption
|onByDefault = {{#if:{{{pushpin_map|}}}{{{image_map|}}}|no|yes}}
|mapframe-frame-width = 250
|mapframe-wikidata = yes
|mapframe-zoom = 13
|mapframe-marker = stadium
|mapframe-caption = Interactive map of {{If empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| label1 = {{longitem|Full name}}
| data1 = {{{full_name|}}}
| label2 = {{longitem|Former names}}
| data2 = {{{former_names|}}}
| class2 = nickname
| label3 = Address
| data3 = {{br separated entries|1={{{address|}}}|2={{{city|}}}|3={{{country|}}} }}
| class3 = label
| label4 = Location
| data4 = {{{location|}}}
| class4 = label
| label5 = Coordinates
| data5 = {{{coordinates|}}}
| label6 = Elevation
| data6 = {{{elevation|}}}
| label7 = Owner
| data7 = {{{owner|}}}
| class7 = agent
| label8 = Operator
| data8 = {{{operator|}}}
| class8 = agent
| label9 = {{longitem|Seating type}}
| data9 = {{{seating_type|}}}
| label10 = Capacity
| data10 = {{{capacity|}}}
| label11 = {{longitem|Executive suites}}
| data11 = {{{suites|}}}
| label12 = Type
| data12 = {{{type|}}}
| class12 = category
| label13 = Event{{pluralize from text|{{{event|}}}|plural=s}}
| data13 = {{{event|}}}
| label14 = Roof
| data14 = {{{roof|}}}
| label15 = Surface
| data15 = {{{surface|}}}
| label16 = Scoreboard
| data16 = {{{scoreboard|}}}
| label17 = Screen{{pluralize from text|{{{screens|}}}|plural=s}}
| data17 = {{{screens|}}}
| label18 = Designation
| data18 = {{{designation|}}}
| label19 = {{longitem|Main venue}}
| data19 = {{br separated entries
|1={{{main_venue|}}}
|2={{#if:{{{main_venue_capacity|}}}|Capacity: {{{main_venue_capacity|}}}}}
}}
| label20 = Facilities
| data20 = {{{facilities|}}}
| label21 = {{longitem|Record attendance}}
| data21 = {{{record_attendance|}}}
| label22 = Height
| data22 = {{{height|}}}
| label23 = {{longitem|{{if empty|{{{dimensions_label|}}}|Field size}}}}
| data23 = {{{dimensions|}}}
| label24 = {{longitem|Field shape}}
| data24 = {{{field_shape|}}}
| label25 = Acreage
| data25 = {{{acreage|}}}
| label26 = {{longitem|Current use}}
| data26 = {{{current_use|}}}
| class26 = category
| label27 = Production
| data27 = {{{production|}}}
| label28 = Public transit
| data28 = {{{public_transit|}}}
| label29 = Parking
| data29 = {{{parking|}}}
| header30 = Convention use
| label31 = Total space
| data31 = {{{total_space|}}}
| label32 = Exhibit hall floor
| data32 = {{{exhibit|}}}
| label33 = Breakout/meeting space
| data33 = {{{breakout|}}}
| label34 = Ballroom space
| data34 = {{{ballroom|}}}
| header35 = Construction
| label36 = Groundbreaking
| data36 = {{{groundbreaking|}}}
| label37 = Built
| data37 = {{{built|}}}
| label38 = Opened
| data38 = {{{opened|}}}
| label39 = Renovated
| data39 = {{{renovated|}}}
| label40 = Expanded
| data40 = {{{expanded|}}}
| label41 = Closed
| data41 = {{{closed|}}}
| label42 = Reopened
| data42 = {{{reopened|}}}
| label43 = Demolished
| data43 = {{{demolished|}}}
| label44 = Rebuilt
| data44 = {{{rebuilt|}}}
| label45 = {{longitem|Years active}}
| data45 = {{{years_active|}}}
| label46 = Cost
| data46 = {{{cost|}}}
| label47 = {{longitem|Architectural style}}
| data47 = {{{architectural_style|}}}
| label48 = Architect{{pluralize from text|{{{architect|}}}|plural=s}}
| data48 = {{{architect|}}}
| label49 = Builder{{pluralize from text|{{{builder|}}}|plural=s}}
| data49 = {{{builder|}}}
| label50 = {{longitem|Project manager{{pluralize from text|{{{project_manager|}}}|plural=s}}}}
| data50 = {{{project_manager|}}}
| label51 = {{longitem|Structural engineer{{pluralize from text|{{{structural_engineer|}}}|plural=s}}}}
| data51 = {{{structural_engineer|}}}
| label52 = {{longitem|Services engineer{{pluralize from text|{{{services_engineer|}}}|plural=s}}}}
| data52 = {{{services_engineer|}}}
| label53 = {{longitem|General contractor{{pluralize from text|{{{general_contractor|}}}|plural=s}}}}
| data53 = {{{general_contractor|}}}
| label54 = {{longitem|Main contractor{{pluralize from text|{{{main_contractors|}}}|plural=s}}}}
| data54 = {{{main_contractors|}}}
| header55 = Tenant{{pluralize from text|{{{tenants|}}}|plural=s}}
| data56 = {{{tenants|}}}
| header57 = Website
| data58 = {{{website|}}}
| header59 = _BLANK_
| data60 = {{{nrhp|}}}
| data61 = {{{embedded|}}}
}}</includeonly>{{main other|{{#if:{{both|{{{image_map|}}}|{{{pushpin_map|}}}}}|[[Category:Pages using infobox venue with both image_map and pushpin_map]]}}{{#if:{{both|{{{map_caption|}}}|{{{pushpin_map|}}}}}|[[Category:Pages using infobox venue with both map_caption and pushpin_map]]}}}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox venue with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox venue]] with unknown parameter "_VALUE_" | ignoreblank = y | mapframe_args = y | pushpin_map_args = y | acreage | address | architect | architectural_style | ballroom | breakout | builder | built | capacity | child | city | closed | coordinates | cost | country | current_use | demolished | designation | dimensions | dimensions_label | elevation | embedded | event | exhibit | expanded | facilities | field_shape | former_names | full_name | general_contractor | groundbreaking | height | image | image_alt | image_caption | image_map | image_size | image_upright | location | logo_alt | logo_caption | logo_class | logo_image | logo_size | logo_upright | main_contractors | main_venue | main_venue_capacity | map_alt | map_caption | map_size | name | native_name | native_name_lang | nickname | nrhp | opened | operator | owner | parking | production | project_manager | public_transit | rebuilt | record_attendance | renovated | reopened | roof | scoreboard | screens | seating_type | services_engineer | structural_engineer | suites | surface | tenants | total_space | type | website | years_active }}<noinclude>
{{documentation}}<!-- Add category links to the /doc subpage, not here! -->
</noinclude>
h5bmqjt5yl6kcclh9lgussoz7n34vpy
373852
373851
2026-10-28T05:55:25Z
ChiK
1136
1 revision imported from [[:en:Template:Infobox_venue]]
373851
wikitext
text/x-wiki
<includeonly>{{Infobox
| child = {{{child|}}}
| bodyclass = vcard
| autoheaders = yes
| headerstyle = background-color:#ccc; color:inherit;
| title = {{If empty|{{{name|}}}|{{PAGENAMEBASE}}}}
| titleclass = fn org
| subheader = {{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<div class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</div>}} }}
| subheader2 = {{#if:{{{nickname|}}}|<div class="nickname">{{{nickname|}}}</div>}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{{logo_image|}}}|size={{{logo_size|}}}|sizedefault=frameless|upright={{if empty|{{{logo_upright|}}}|1}}|alt={{{logo_alt|}}}|class=notpageimage {{{logo_class|}}}}}
| caption = {{{logo_caption|}}}
| image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{image_size|}}}|upright={{if empty|{{{image_upright|}}}|1}}|alt={{{image_alt|}}}|class=pageimage|data-pageimage=1}}
| caption2 = {{{image_caption|}}}
| image3 = {{#invoke:InfoboxImage|InfoboxImage|image={{{image_map|}}}|size={{if empty|{{{map_size|}}}|{{{image_size|}}}}}|sizedefault=frameless|upright=1|alt={{{map_alt|}}}|class=notpageimage}}
| caption3 = {{{map_caption|}}}
| image4 = {{#invoke:Location map|infobox_pushpin_map
| pushpin_label = {{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| image5 = {{#invoke:Infobox mapframe|autoWithCaption
|onByDefault = {{#if:{{{pushpin_map|}}}{{{image_map|}}}|no|yes}}
|mapframe-frame-width = 250
|mapframe-wikidata = yes
|mapframe-zoom = 13
|mapframe-marker = stadium
|mapframe-caption = Interactive map of {{If empty|{{{name|}}}|{{PAGENAMEBASE}}}}
}}
| label1 = {{longitem|Full name}}
| data1 = {{{full_name|}}}
| label2 = {{longitem|Former names}}
| data2 = {{{former_names|}}}
| class2 = nickname
| label3 = Address
| data3 = {{br separated entries|1={{{address|}}}|2={{{city|}}}|3={{{country|}}} }}
| class3 = label
| label4 = Location
| data4 = {{{location|}}}
| class4 = label
| label5 = Coordinates
| data5 = {{{coordinates|}}}
| label6 = Elevation
| data6 = {{{elevation|}}}
| label7 = Owner
| data7 = {{{owner|}}}
| class7 = agent
| label8 = Operator
| data8 = {{{operator|}}}
| class8 = agent
| label9 = {{longitem|Seating type}}
| data9 = {{{seating_type|}}}
| label10 = Capacity
| data10 = {{{capacity|}}}
| label11 = {{longitem|Executive suites}}
| data11 = {{{suites|}}}
| label12 = Type
| data12 = {{{type|}}}
| class12 = category
| label13 = Event{{pluralize from text|{{{event|}}}|plural=s}}
| data13 = {{{event|}}}
| label14 = Roof
| data14 = {{{roof|}}}
| label15 = Surface
| data15 = {{{surface|}}}
| label16 = Scoreboard
| data16 = {{{scoreboard|}}}
| label17 = Screen{{pluralize from text|{{{screens|}}}|plural=s}}
| data17 = {{{screens|}}}
| label18 = Designation
| data18 = {{{designation|}}}
| label19 = {{longitem|Main venue}}
| data19 = {{br separated entries
|1={{{main_venue|}}}
|2={{#if:{{{main_venue_capacity|}}}|Capacity: {{{main_venue_capacity|}}}}}
}}
| label20 = Facilities
| data20 = {{{facilities|}}}
| label21 = {{longitem|Record attendance}}
| data21 = {{{record_attendance|}}}
| label22 = Height
| data22 = {{{height|}}}
| label23 = {{longitem|{{if empty|{{{dimensions_label|}}}|Field size}}}}
| data23 = {{{dimensions|}}}
| label24 = {{longitem|Field shape}}
| data24 = {{{field_shape|}}}
| label25 = Acreage
| data25 = {{{acreage|}}}
| label26 = {{longitem|Current use}}
| data26 = {{{current_use|}}}
| class26 = category
| label27 = Production
| data27 = {{{production|}}}
| label28 = Public transit
| data28 = {{{public_transit|}}}
| label29 = Parking
| data29 = {{{parking|}}}
| header30 = Convention use
| label31 = Total space
| data31 = {{{total_space|}}}
| label32 = Exhibit hall floor
| data32 = {{{exhibit|}}}
| label33 = Breakout/meeting space
| data33 = {{{breakout|}}}
| label34 = Ballroom space
| data34 = {{{ballroom|}}}
| header35 = Construction
| label36 = Groundbreaking
| data36 = {{{groundbreaking|}}}
| label37 = Built
| data37 = {{{built|}}}
| label38 = Opened
| data38 = {{{opened|}}}
| label39 = Renovated
| data39 = {{{renovated|}}}
| label40 = Expanded
| data40 = {{{expanded|}}}
| label41 = Closed
| data41 = {{{closed|}}}
| label42 = Reopened
| data42 = {{{reopened|}}}
| label43 = Demolished
| data43 = {{{demolished|}}}
| label44 = Rebuilt
| data44 = {{{rebuilt|}}}
| label45 = {{longitem|Years active}}
| data45 = {{{years_active|}}}
| label46 = Cost
| data46 = {{{cost|}}}
| label47 = {{longitem|Architectural style}}
| data47 = {{{architectural_style|}}}
| label48 = Architect{{pluralize from text|{{{architect|}}}|plural=s}}
| data48 = {{{architect|}}}
| label49 = Builder{{pluralize from text|{{{builder|}}}|plural=s}}
| data49 = {{{builder|}}}
| label50 = {{longitem|Project manager{{pluralize from text|{{{project_manager|}}}|plural=s}}}}
| data50 = {{{project_manager|}}}
| label51 = {{longitem|Structural engineer{{pluralize from text|{{{structural_engineer|}}}|plural=s}}}}
| data51 = {{{structural_engineer|}}}
| label52 = {{longitem|Services engineer{{pluralize from text|{{{services_engineer|}}}|plural=s}}}}
| data52 = {{{services_engineer|}}}
| label53 = {{longitem|General contractor{{pluralize from text|{{{general_contractor|}}}|plural=s}}}}
| data53 = {{{general_contractor|}}}
| label54 = {{longitem|Main contractor{{pluralize from text|{{{main_contractors|}}}|plural=s}}}}
| data54 = {{{main_contractors|}}}
| header55 = Tenant{{pluralize from text|{{{tenants|}}}|plural=s}}
| data56 = {{{tenants|}}}
| header57 = Website
| data58 = {{{website|}}}
| header59 = _BLANK_
| data60 = {{{nrhp|}}}
| data61 = {{{embedded|}}}
}}</includeonly>{{main other|{{#if:{{both|{{{image_map|}}}|{{{pushpin_map|}}}}}|[[Category:Pages using infobox venue with both image_map and pushpin_map]]}}{{#if:{{both|{{{map_caption|}}}|{{{pushpin_map|}}}}}|[[Category:Pages using infobox venue with both map_caption and pushpin_map]]}}}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox venue with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox venue]] with unknown parameter "_VALUE_" | ignoreblank = y | mapframe_args = y | pushpin_map_args = y | acreage | address | architect | architectural_style | ballroom | breakout | builder | built | capacity | child | city | closed | coordinates | cost | country | current_use | demolished | designation | dimensions | dimensions_label | elevation | embedded | event | exhibit | expanded | facilities | field_shape | former_names | full_name | general_contractor | groundbreaking | height | image | image_alt | image_caption | image_map | image_size | image_upright | location | logo_alt | logo_caption | logo_class | logo_image | logo_size | logo_upright | main_contractors | main_venue | main_venue_capacity | map_alt | map_caption | map_size | name | native_name | native_name_lang | nickname | nrhp | opened | operator | owner | parking | production | project_manager | public_transit | rebuilt | record_attendance | renovated | reopened | roof | scoreboard | screens | seating_type | services_engineer | structural_engineer | suites | surface | tenants | total_space | type | website | years_active }}<noinclude>
{{documentation}}<!-- Add category links to the /doc subpage, not here! -->
</noinclude>
h5bmqjt5yl6kcclh9lgussoz7n34vpy
ಟೆಂಪ್ಲೇಟ್:Primary source inline
10
29109
373859
2024-04-28T23:57:54Z
en>El C
0
Changed protection settings for "[[Template:Primary source inline]]": [[WP:High-risk templates|High-risk template or module]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
373859
wikitext
text/x-wiki
{{ {{{|safesubst:}}}#invoke:Unsubst||date=__DATE__ |$B=
{{Fix
| subst = <includeonly>{{subst:substcheck}}</includeonly>
| link = Wikipedia:No original research#Primary, secondary and tertiary sources
| text = non-primary source{{#if:{{{plural|}}}|s|}} needed
| class = noprint Template-Fact
| title = {{{reason|This claim needs references to reliable secondary sources.}}}
| date = {{{date|}}}
| cat = {{#if:{{{demo|}}}{{{nocat|}}}||[[Category:All pages needing factual verification]]}}
| cat-date = {{#if:{{{demo|}}}{{{nocat|}}}||Category:Wikipedia articles needing factual verification}}}}
}}<noinclude>
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
{{Documentation}}
</noinclude>
fb9agpgin7g1illn9bgc61za5qusowt
373860
373859
2026-10-28T05:55:27Z
ChiK
1136
1 revision imported from [[:en:Template:Primary_source_inline]]
373859
wikitext
text/x-wiki
{{ {{{|safesubst:}}}#invoke:Unsubst||date=__DATE__ |$B=
{{Fix
| subst = <includeonly>{{subst:substcheck}}</includeonly>
| link = Wikipedia:No original research#Primary, secondary and tertiary sources
| text = non-primary source{{#if:{{{plural|}}}|s|}} needed
| class = noprint Template-Fact
| title = {{{reason|This claim needs references to reliable secondary sources.}}}
| date = {{{date|}}}
| cat = {{#if:{{{demo|}}}{{{nocat|}}}||[[Category:All pages needing factual verification]]}}
| cat-date = {{#if:{{{demo|}}}{{{nocat|}}}||Category:Wikipedia articles needing factual verification}}}}
}}<noinclude>
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
{{Documentation}}
</noinclude>
fb9agpgin7g1illn9bgc61za5qusowt
ಟೆಂಪ್ಲೇಟ್:Cr
10
29110
373861
2026-04-18T13:24:05Z
en>Primefac
0
Primefac moved page [[Template:Cr]] to [[Template:National men's cricket team]]: expand name for clarity
373861
wikitext
text/x-wiki
#REDIRECT [[Template:National men's cricket team]]
{{Redirect category shell|
{{R from move}}
}}
q24ewbe5zxzgj1pjxnvtjpq9qvg5jqm
373862
373861
2026-10-28T05:55:27Z
ChiK
1136
1 revision imported from [[:en:Template:Cr]]
373861
wikitext
text/x-wiki
#REDIRECT [[Template:National men's cricket team]]
{{Redirect category shell|
{{R from move}}
}}
q24ewbe5zxzgj1pjxnvtjpq9qvg5jqm
ಟೆಂಪ್ಲೇಟ್:Cite tweet
10
29111
373863
2023-08-14T09:22:29Z
en>RMCD bot
0
Removing notice of move discussion
373863
wikitext
text/x-wiki
<includeonly>{{#invoke:cite tweet|main}}</includeonly><noinclude>{{documentation}}</noinclude>
68a6vc2qauxvburafhefmwiuimiwhwt
373864
373863
2026-10-28T05:55:27Z
ChiK
1136
1 revision imported from [[:en:Template:Cite_tweet]]
373863
wikitext
text/x-wiki
<includeonly>{{#invoke:cite tweet|main}}</includeonly><noinclude>{{documentation}}</noinclude>
68a6vc2qauxvburafhefmwiuimiwhwt
ಮೋಡ್ಯೂಲ್:Cite tweet
828
29112
373865
2026-03-15T11:04:49Z
en>Trappist the monk
0
373865
Scribunto
text/plain
local TwitterSnowflake = require('Module:TwitterSnowflake')
local err_msgs_t = { -- a sequence of snowflake date error messages; all must be terminated with a semicolon (;)
' <kbd>|date=</kbd> / <kbd>|number=</kbd> mismatch;', -- [1]
' <kbd>|date=</kbd> required;', -- [2]
' Invalid <kbd>|number=</kbd>;', -- [3]
' Missing or empty <kbd>|number=</kbd>;', -- [4]
' Missing or empty <kbd>|user=</kbd>;' -- [5]
}
--[[--------------------------< S U P P R E S S _ U R L _ I N _ T I T L E >------------------------------------
This function searches for and suppresses urls in |title=, |script-title=, and |trans-title= parameters so that
{{cite web}} won't emit 'External link in |title=' error messages when rendered In the redering, urls are correctly
formed as they were in the original tweet. The function looks for valid schemes and then wraps them in
<nowiki>..</nowiki> tags.
]]
local function suppress_url_in_title (frame, title)
local schemes = { -- schemes commonly found in tweets
'https://',
'http://',
'ftp://',
}
if title then -- when there is a title, suppress any urls with known schemes; abandon else
for _, scheme in ipairs (schemes) do -- spin through the list of schemes looking for a match
title = title:gsub (scheme, frame:callParserFunction ('#tag', {'nowiki', scheme})); -- replace the scheme with its nowiki'd form (a strip marker)
end
end
return title; -- done; return <title> modified or not
end
--[[--------------------------< D A T E _ N U M B E R _ U R L _ G E T >----------------------------------------
extract |date= and |number= parameter values if present. Extract date from |number= and compare to |date=.
contruct |url= for {{cite web}} from the base url and |number= and |user=
returns nothing; adds date, number, url to <cite_args_t>; adds error message(s) to <errors_t>.
]]
local function date_number_url_get (args_t, cite_args_t, errors_t)
local err_msg_index;
cite_args_t.url = 'https://x.com/'; -- initialize with minimal base url because {{cite web}} requires |url=
if not args_t.user then
table.insert (errors_t, err_msgs_t[5]); -- error: missing or empty |user=
end
if not args_t.date and not args_t.number then
err_msg_index = 4; -- error: missing or empty |number=
elseif tonumber (args_t.number) then -- |number= without |date=? use number
if tonumber(args_t.number) then
cite_args_t.date = args_t.date or (args_t.number and TwitterSnowflake.snowflakeToDate{ args = {id_str = args_t.number} }); -- prefer |date=; extract date from |number= else
else
cite_args_t.date = args_t.date; -- |number= appears to be invalid; use |date= if provided
end
cite_args_t.number = args_t.number; -- use |number= valid or not
if args_t.user then -- |number= appears to have a valid value; if |user= has a value
local lang_obj = mw.getContentLanguage();
local good, test_date = pcall (lang_obj.formatDate, lang_obj, 'Ymd', cite_args_t.date);
if good then
if 20240517 > tonumber (test_date) then -- the switch to x.com was completed 2024-05-17
cite_args_t.url = 'https://twitter.com/';
end
if 20230723 > tonumber (test_date) then -- rebranded to x on 2023-07-23
cite_args_t.via = args_t.link == 'no' and 'Twitter' or '[[Twitter]]';
else
cite_args_t.via = args_t.link == 'no' and 'X (formerly Twitter)' or '[[X (formerly Twitter)]]';
end
end
cite_args_t.url = cite_args_t.url .. args_t.user .. '/status/' .. args_t.number; -- construct |url= for {{cite web}}
end
elseif args_t.number then -- |number= with a value that can't be converted to a number; invalid
err_msg_index = 3; -- error: invalid number (couldn't convert to number)
elseif not args_t.number then -- |date= without |number= use date
cite_args_t.date = args_t.date; -- |date= has a value, use it
err_msg_index = 4; -- error: missing or empty |number=
end
if err_msg_index then
table.insert (errors_t, err_msgs_t[err_msg_index]); -- invalid number or missing necessary parameters so abandon
return;
end
err_msg_index = TwitterSnowflake.datecheck ({ args = { -- returns error message index number on error; nil else
id_str = args_t.number or '',
date = args_t.date or '',
error1 = 1, -- these numbers are indexes into <err_msgs_t> to override snowflake default error messages
error2 = 2, -- done this way to avoid long string comparison looking for
error3 = 3 -- the undated-pre-twitter-epoch-post message
}});
if 2 == err_msg_index then -- when no date and posted before twitter epoch
cite_args_t.date = nil; -- suppress default date because {{cite tweet}} should not claim in its own voice that the undated post was posted 2010-11-04
end
table.insert (errors_t, err_msgs_t[err_msg_index]); -- add error message
end
--[[--------------------------< M A I N >----------------------------------------------------------------------
construct parameter set for {{cite web}} from {{cite tweet}} parameters; do some error checking
]]
local function main (frame)
local args_t = require ('Module:Arguments').getArgs (frame);
local cite_args_t = {
title = suppress_url_in_title (frame, args_t.title),
['script-title'] = suppress_url_in_title (frame, args_t['script-title']),
['trans-title'] = suppress_url_in_title (frame, args_t['trans-title']),
language = args_t.language,
last1 = args_t.last1 or args_t.last,
first1 = args_t.first1 or args_t.first,
author1 = args_t.author1 or args_t.author,
['author-link'] = args_t['author-link'] or args_t.authorlink,
others = args_t.retweet and ('Retweeted by ' .. args_t.retweet),
type = args_t.link == 'no' and 'Tweet' or '[[Tweet (social media)|Tweet]]',
location = args_t.location, -- why |location=? tweets are online; there is no publication place
['access-date'] = args_t['access-date'] or args_t.accessdate,
['archive-date'] = args_t['archive-date'] or args_t.archivedate,
['archive-url'] = args_t['archive-url'] or args_t.archiveurl,
['url-status'] = args_t['url-status'],
['url-access'] = args_t['url-access'],
quote = args_t.quote,
ref = args_t.ref,
df = args_t.df,
mode = args_t.mode
}
local errors_t = {'<span class="cs1-visible-error citation-comment"> <kbd>{{[[Template:Cite tweet|Cite tweet]]}}</kbd>:'}; -- initialize sequence of error messages with style tag
date_number_url_get (args_t, cite_args_t, errors_t); -- add |date=, |number=, |url= to <cite_args_t>
local author = ((cite_args_t.last1 and cite_args_t.first1) and cite_args_t.last1 .. ', ' .. cite_args_t.first1) or -- concatenate |last= with |first= for |author-mask=
(cite_args_t.last1 and cite_args_t.last1) or -- only |last= for |author-mask=
(cite_args_t.author1 and cite_args_t.author1:gsub('^%(%((.+)%)%)$', '%1')); -- |author= or |author1= stripped of accept-as-written markup for |author-mask=
if author and args_t.user then
cite_args_t['author-mask'] = author .. ' [@' .. (args_t.user or '') .. ']' -- concatenate <author> and |user= into |author-mask=
elseif args_t.user then
cite_args_t.author1 = '((' .. args_t.user .. '))'; -- just the user name for cs1|2 metadata
cite_args_t['author-mask'] = '@' .. args_t.user; -- make a mask for display
else -- here when neither <author> nor |user=
cite_args_t.author1 = nil; -- so unset
end
local rendering = require ('Module:Citation/CS1')._citation (nil, cite_args_t, {CitationClass = 'web'});
---------- error messaging ----------
if errors_t[2] then -- errors_t[2] nil when no errors
if rendering:find ('cs1-visible-error', 1, true) then -- rendered {{cite web}} with errors will have this string
errors_t[1] = errors_t[1]:gsub ('> <', '>; <'); -- insert semicolon to terminate cs1|2 error message string
end
errors_t[#errors_t] = errors_t[#errors_t]:gsub (';$',' ([[Template:Cite_tweet#Error_detection|help]])'); -- replace trailing semicolon with help link
table.insert (errors_t, '</span>'); -- close style span tag
if mw.title.getCurrentTitle():inNamespace (0) then -- mainspace only
table.insert (errors_t, '[[Category:Cite tweet templates with errors]]'); -- add error category
end
rendering = rendering .. table.concat (errors_t); -- append error messaging, help links and catagories
end
return rendering;
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return {
main = main, -- entry points; {{#invoke:cite tweet|main|...}} is preferred
[''] = main, -- but {{#invoke:cite tweet||...}} is also acceptable
}
ta5t21jgn7hypav1bwn6tqln3ap0f3b
373866
373865
2026-10-28T05:55:27Z
ChiK
1136
1 revision imported from [[:en:Module:Cite_tweet]]
373865
Scribunto
text/plain
local TwitterSnowflake = require('Module:TwitterSnowflake')
local err_msgs_t = { -- a sequence of snowflake date error messages; all must be terminated with a semicolon (;)
' <kbd>|date=</kbd> / <kbd>|number=</kbd> mismatch;', -- [1]
' <kbd>|date=</kbd> required;', -- [2]
' Invalid <kbd>|number=</kbd>;', -- [3]
' Missing or empty <kbd>|number=</kbd>;', -- [4]
' Missing or empty <kbd>|user=</kbd>;' -- [5]
}
--[[--------------------------< S U P P R E S S _ U R L _ I N _ T I T L E >------------------------------------
This function searches for and suppresses urls in |title=, |script-title=, and |trans-title= parameters so that
{{cite web}} won't emit 'External link in |title=' error messages when rendered In the redering, urls are correctly
formed as they were in the original tweet. The function looks for valid schemes and then wraps them in
<nowiki>..</nowiki> tags.
]]
local function suppress_url_in_title (frame, title)
local schemes = { -- schemes commonly found in tweets
'https://',
'http://',
'ftp://',
}
if title then -- when there is a title, suppress any urls with known schemes; abandon else
for _, scheme in ipairs (schemes) do -- spin through the list of schemes looking for a match
title = title:gsub (scheme, frame:callParserFunction ('#tag', {'nowiki', scheme})); -- replace the scheme with its nowiki'd form (a strip marker)
end
end
return title; -- done; return <title> modified or not
end
--[[--------------------------< D A T E _ N U M B E R _ U R L _ G E T >----------------------------------------
extract |date= and |number= parameter values if present. Extract date from |number= and compare to |date=.
contruct |url= for {{cite web}} from the base url and |number= and |user=
returns nothing; adds date, number, url to <cite_args_t>; adds error message(s) to <errors_t>.
]]
local function date_number_url_get (args_t, cite_args_t, errors_t)
local err_msg_index;
cite_args_t.url = 'https://x.com/'; -- initialize with minimal base url because {{cite web}} requires |url=
if not args_t.user then
table.insert (errors_t, err_msgs_t[5]); -- error: missing or empty |user=
end
if not args_t.date and not args_t.number then
err_msg_index = 4; -- error: missing or empty |number=
elseif tonumber (args_t.number) then -- |number= without |date=? use number
if tonumber(args_t.number) then
cite_args_t.date = args_t.date or (args_t.number and TwitterSnowflake.snowflakeToDate{ args = {id_str = args_t.number} }); -- prefer |date=; extract date from |number= else
else
cite_args_t.date = args_t.date; -- |number= appears to be invalid; use |date= if provided
end
cite_args_t.number = args_t.number; -- use |number= valid or not
if args_t.user then -- |number= appears to have a valid value; if |user= has a value
local lang_obj = mw.getContentLanguage();
local good, test_date = pcall (lang_obj.formatDate, lang_obj, 'Ymd', cite_args_t.date);
if good then
if 20240517 > tonumber (test_date) then -- the switch to x.com was completed 2024-05-17
cite_args_t.url = 'https://twitter.com/';
end
if 20230723 > tonumber (test_date) then -- rebranded to x on 2023-07-23
cite_args_t.via = args_t.link == 'no' and 'Twitter' or '[[Twitter]]';
else
cite_args_t.via = args_t.link == 'no' and 'X (formerly Twitter)' or '[[X (formerly Twitter)]]';
end
end
cite_args_t.url = cite_args_t.url .. args_t.user .. '/status/' .. args_t.number; -- construct |url= for {{cite web}}
end
elseif args_t.number then -- |number= with a value that can't be converted to a number; invalid
err_msg_index = 3; -- error: invalid number (couldn't convert to number)
elseif not args_t.number then -- |date= without |number= use date
cite_args_t.date = args_t.date; -- |date= has a value, use it
err_msg_index = 4; -- error: missing or empty |number=
end
if err_msg_index then
table.insert (errors_t, err_msgs_t[err_msg_index]); -- invalid number or missing necessary parameters so abandon
return;
end
err_msg_index = TwitterSnowflake.datecheck ({ args = { -- returns error message index number on error; nil else
id_str = args_t.number or '',
date = args_t.date or '',
error1 = 1, -- these numbers are indexes into <err_msgs_t> to override snowflake default error messages
error2 = 2, -- done this way to avoid long string comparison looking for
error3 = 3 -- the undated-pre-twitter-epoch-post message
}});
if 2 == err_msg_index then -- when no date and posted before twitter epoch
cite_args_t.date = nil; -- suppress default date because {{cite tweet}} should not claim in its own voice that the undated post was posted 2010-11-04
end
table.insert (errors_t, err_msgs_t[err_msg_index]); -- add error message
end
--[[--------------------------< M A I N >----------------------------------------------------------------------
construct parameter set for {{cite web}} from {{cite tweet}} parameters; do some error checking
]]
local function main (frame)
local args_t = require ('Module:Arguments').getArgs (frame);
local cite_args_t = {
title = suppress_url_in_title (frame, args_t.title),
['script-title'] = suppress_url_in_title (frame, args_t['script-title']),
['trans-title'] = suppress_url_in_title (frame, args_t['trans-title']),
language = args_t.language,
last1 = args_t.last1 or args_t.last,
first1 = args_t.first1 or args_t.first,
author1 = args_t.author1 or args_t.author,
['author-link'] = args_t['author-link'] or args_t.authorlink,
others = args_t.retweet and ('Retweeted by ' .. args_t.retweet),
type = args_t.link == 'no' and 'Tweet' or '[[Tweet (social media)|Tweet]]',
location = args_t.location, -- why |location=? tweets are online; there is no publication place
['access-date'] = args_t['access-date'] or args_t.accessdate,
['archive-date'] = args_t['archive-date'] or args_t.archivedate,
['archive-url'] = args_t['archive-url'] or args_t.archiveurl,
['url-status'] = args_t['url-status'],
['url-access'] = args_t['url-access'],
quote = args_t.quote,
ref = args_t.ref,
df = args_t.df,
mode = args_t.mode
}
local errors_t = {'<span class="cs1-visible-error citation-comment"> <kbd>{{[[Template:Cite tweet|Cite tweet]]}}</kbd>:'}; -- initialize sequence of error messages with style tag
date_number_url_get (args_t, cite_args_t, errors_t); -- add |date=, |number=, |url= to <cite_args_t>
local author = ((cite_args_t.last1 and cite_args_t.first1) and cite_args_t.last1 .. ', ' .. cite_args_t.first1) or -- concatenate |last= with |first= for |author-mask=
(cite_args_t.last1 and cite_args_t.last1) or -- only |last= for |author-mask=
(cite_args_t.author1 and cite_args_t.author1:gsub('^%(%((.+)%)%)$', '%1')); -- |author= or |author1= stripped of accept-as-written markup for |author-mask=
if author and args_t.user then
cite_args_t['author-mask'] = author .. ' [@' .. (args_t.user or '') .. ']' -- concatenate <author> and |user= into |author-mask=
elseif args_t.user then
cite_args_t.author1 = '((' .. args_t.user .. '))'; -- just the user name for cs1|2 metadata
cite_args_t['author-mask'] = '@' .. args_t.user; -- make a mask for display
else -- here when neither <author> nor |user=
cite_args_t.author1 = nil; -- so unset
end
local rendering = require ('Module:Citation/CS1')._citation (nil, cite_args_t, {CitationClass = 'web'});
---------- error messaging ----------
if errors_t[2] then -- errors_t[2] nil when no errors
if rendering:find ('cs1-visible-error', 1, true) then -- rendered {{cite web}} with errors will have this string
errors_t[1] = errors_t[1]:gsub ('> <', '>; <'); -- insert semicolon to terminate cs1|2 error message string
end
errors_t[#errors_t] = errors_t[#errors_t]:gsub (';$',' ([[Template:Cite_tweet#Error_detection|help]])'); -- replace trailing semicolon with help link
table.insert (errors_t, '</span>'); -- close style span tag
if mw.title.getCurrentTitle():inNamespace (0) then -- mainspace only
table.insert (errors_t, '[[Category:Cite tweet templates with errors]]'); -- add error category
end
rendering = rendering .. table.concat (errors_t); -- append error messaging, help links and catagories
end
return rendering;
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return {
main = main, -- entry points; {{#invoke:cite tweet|main|...}} is preferred
[''] = main, -- but {{#invoke:cite tweet||...}} is also acceptable
}
ta5t21jgn7hypav1bwn6tqln3ap0f3b
ಮೋಡ್ಯೂಲ್:TwitterSnowflake
828
29113
373867
2023-01-24T23:20:20Z
en>Pppery
0
Fix a Lua error appearing on pages such as [[August 11]] when there's no date
373867
Scribunto
text/plain
local p = {}
local Date = require('Module:Date')._Date
function p.snowflakeToDate(frame)
local format = frame.args.format or "%B %e, %Y"
local epoch = tonumber(frame.args.epoch) or 1288834974
local id_str = frame.args.id_str
if type(id_str) ~= "string" then error("bad argument #1 (expected string, got " .. type(id_str) .. ")", 2) end
if type(format) ~= "string" then error("bad argument #2 (expected string, got " .. type(format) .. ")", 2) end
if type(epoch) ~= "number" then error("bad argument #3 (expected number, got " .. type(epoch) .. ")", 2) end
local hi, lo = 0, 0
local hiexp = 1
local two32 = 2^32
for c in id_str:gmatch(".") do
lo = lo * 10 + c
if lo >= two32 then
hi, lo = hi * 10^hiexp + math.floor(lo / two32), lo % two32
hiexp = 1
else hiexp = hiexp + 1 end
end
hi = hi * 10^(hiexp-1)
local timestamp = math.floor((hi * 1024 + math.floor(lo / 4194304)) / 1000) + epoch
return os.date(format, timestamp)
end
function p.getDate(frame)
-- just pass frame directly to snowflakeToDate, this wraps it but the args are the same plus
if (frame.args.id_str):match("%D") then -- not a number, so return -2
return -2
end
frame.args.format = "%B %e, %Y"
if frame.args.date then
frame.args.date = mw.ustring.gsub(frame.args.date, "(%d%d%d%d)%a", "%1")
end
frame.args.epoch = tonumber(frame.args.epoch) or 1288834974
local epochdate = Date(os.date("%B %e, %Y", frame.args.epoch))
local twitterdate = Date(p.snowflakeToDate(frame))
if twitterdate == epochdate then -- created before epoch, so can't determine the date
return -1
end
local date = Date(frame.args.date) or 0 -- if we error here, then an input of no date causes an error, which is contrary to the entire way {{TwitterSnowflake/datecheck}} works
return date - twitterdate
end
local function abs_datediff(x)
if type(x) == 'number' then return math.abs(x) end
return math.abs(x.age_days)
end
function p.datecheck(frame)
local args = frame.args
if not (args.date and args.id_str) then
error('Must define date and id_str, even if they are blank.')
end
local errors = {
args.error1 or 'Date mismatch of two or more days',
args.error2 or 'No date, and posted before November 4, 2010',
args.error3 or 'Invalid id_str'
}
if mw.title.getCurrentTitle():inNamespace(0) and args.error_cat then
for i = 1, 3 do errors[i] = errors[i] .. '[[' .. args.error_cat .. ']]' end
end
if not args.date:match('^%s*$') then -- #if:{{{date|}}}
local testResult = p.getDate{ args = { date = args.date, id_str = args.id_str }}
if testResult == -2 then return errors[3] end
if abs_datediff(testResult) > 1 then return errors[1] end
elseif not args.id_str:match('^%s*$') then
local testResult = p.getDate{ args = { id_str = args.id_str }}
if testResult == -1 then return errors[2] end
if testResult == -2 then return errors[3] end
end
end
return p
khfowsd9glcvpr7q9l5wtfn1h6n245w
373868
373867
2026-10-28T05:55:27Z
ChiK
1136
1 revision imported from [[:en:Module:TwitterSnowflake]]
373867
Scribunto
text/plain
local p = {}
local Date = require('Module:Date')._Date
function p.snowflakeToDate(frame)
local format = frame.args.format or "%B %e, %Y"
local epoch = tonumber(frame.args.epoch) or 1288834974
local id_str = frame.args.id_str
if type(id_str) ~= "string" then error("bad argument #1 (expected string, got " .. type(id_str) .. ")", 2) end
if type(format) ~= "string" then error("bad argument #2 (expected string, got " .. type(format) .. ")", 2) end
if type(epoch) ~= "number" then error("bad argument #3 (expected number, got " .. type(epoch) .. ")", 2) end
local hi, lo = 0, 0
local hiexp = 1
local two32 = 2^32
for c in id_str:gmatch(".") do
lo = lo * 10 + c
if lo >= two32 then
hi, lo = hi * 10^hiexp + math.floor(lo / two32), lo % two32
hiexp = 1
else hiexp = hiexp + 1 end
end
hi = hi * 10^(hiexp-1)
local timestamp = math.floor((hi * 1024 + math.floor(lo / 4194304)) / 1000) + epoch
return os.date(format, timestamp)
end
function p.getDate(frame)
-- just pass frame directly to snowflakeToDate, this wraps it but the args are the same plus
if (frame.args.id_str):match("%D") then -- not a number, so return -2
return -2
end
frame.args.format = "%B %e, %Y"
if frame.args.date then
frame.args.date = mw.ustring.gsub(frame.args.date, "(%d%d%d%d)%a", "%1")
end
frame.args.epoch = tonumber(frame.args.epoch) or 1288834974
local epochdate = Date(os.date("%B %e, %Y", frame.args.epoch))
local twitterdate = Date(p.snowflakeToDate(frame))
if twitterdate == epochdate then -- created before epoch, so can't determine the date
return -1
end
local date = Date(frame.args.date) or 0 -- if we error here, then an input of no date causes an error, which is contrary to the entire way {{TwitterSnowflake/datecheck}} works
return date - twitterdate
end
local function abs_datediff(x)
if type(x) == 'number' then return math.abs(x) end
return math.abs(x.age_days)
end
function p.datecheck(frame)
local args = frame.args
if not (args.date and args.id_str) then
error('Must define date and id_str, even if they are blank.')
end
local errors = {
args.error1 or 'Date mismatch of two or more days',
args.error2 or 'No date, and posted before November 4, 2010',
args.error3 or 'Invalid id_str'
}
if mw.title.getCurrentTitle():inNamespace(0) and args.error_cat then
for i = 1, 3 do errors[i] = errors[i] .. '[[' .. args.error_cat .. ']]' end
end
if not args.date:match('^%s*$') then -- #if:{{{date|}}}
local testResult = p.getDate{ args = { date = args.date, id_str = args.id_str }}
if testResult == -2 then return errors[3] end
if abs_datediff(testResult) > 1 then return errors[1] end
elseif not args.id_str:match('^%s*$') then
local testResult = p.getDate{ args = { id_str = args.id_str }}
if testResult == -1 then return errors[2] end
if testResult == -2 then return errors[3] end
end
end
return p
khfowsd9glcvpr7q9l5wtfn1h6n245w
ಟೆಂಪ್ಲೇಟ್:Rcb
10
29114
373873
2025-08-11T23:24:16Z
en>Pppery
0
Changed protection settings for "[[Template:Rcb]]" ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
373873
wikitext
text/x-wiki
#REDIRECT [[Template:Rail color box]]
hn08it8gws98wut5a7rb5e1v19xw4ag
373874
373873
2026-10-28T05:55:28Z
ChiK
1136
1 revision imported from [[:en:Template:Rcb]]
373873
wikitext
text/x-wiki
#REDIRECT [[Template:Rail color box]]
hn08it8gws98wut5a7rb5e1v19xw4ag
ಟೆಂಪ್ಲೇಟ್:Infobox cricket ground
10
29115
373877
2026-04-19T14:07:01Z
en>Mashfi23
0
373877
wikitext
text/x-wiki
{{Infobox
|child = {{lc:{{{embed|}}}}}
|bodyclass = vcard
|titleclass = adr
|title = {{#ifeq:{{lc:{{{embed|}}}}}|yes||<span class="fn org extended-address">{{if empty|{{{ground_name|}}}|{{{ground|}}}|<includeonly>{{PAGENAMEBASE}}</includeonly>}}</span>}}
|subheader = {{#if:{{{nickname|{{{othernames|}}}}}}|<span class="nickname">{{{nickname|{{{othernames|}}}}}}</span>}}
|image = {{#invoke:InfoboxImage|InfoboxImage|image={{{logo_image|}}}|size={{{logosize|{{{logo_size|}}}}}}|sizedefault=frameless}}
|caption = {{{logo_caption|}}}
|image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{imagesize|{{{image_size|}}}}}}|sizedefault=270px}}
|caption2 = {{{caption|}}}
|image3 = {{{map|}}}
|image4 ={{#invoke:Infobox mapframe|autoWithCaption
|onByDefault={{#if:{{{embed|}}}|no|yes}}
|mapframe-marker=cricket
|mapframe-wikidata=yes
|mapframe-zoom=13
|mapframe-caption = Interactive map of {{if empty|{{{ground_name|}}}|{{{ground|}}}|{{PAGENAMEBASE}}}}
}}
|headerstyle = background:lavender;color:inherit;
|header1 = {{#if:{{{international|}}}{{{club1|}}}{{#ifeq:{{lc:{{{embed|}}}}}|yes|yes}}|Ground information}}<!-- suppress first header if it's the only header -->
|label2 = Location
|data2 = {{{location|}}}
|label3 = Country
|data3 = {{{country|}}}
|label4 = Coordinates
|data4 = {{{coordinates|{{{coord|}}} }}}
|label5 = Home club
|data5 = {{{home_club|{{{home club|}}}}}}
|label6 = County club
|data6 = {{{county_club|{{{county club|}}}}}}
|label7 = Establishment
|data7 = {{{establishment|{{{established|}}}}}}
|label8 = Demolished
|data8 = {{{demolished|}}}
|label9 = Capacity
|data9 = {{{seating_capacity|}}}
|label10 = Owner
|data10 = {{{owner|}}}
|label11 = Architect
|data11 = {{{architect|}}}
|label12 = Contractor
|data12 = {{{contractor|}}}
|label13 = Operator
|data13 = {{{operator|}}}
|label14 = Tenants
|data14 = {{{tenants|}}}
|label15 = Website
|data15 = {{{website|}}}
|label16 = Last used
|data16 = {{{last_used|{{{last used|}}}}}}
|data17 = {{#if:{{{end1|}}}{{{end2|}}}|'''End names'''}}
|data18 = {{br separated entries|1={{{end1|}}}|2={{{end2|}}}}}
|header19= {{#if:{{{international|}}}|International information}}
|label20 = First men's Test
|data20 = {{#if:{{{firsttestdate|}}}|{{{firsttestdate|}}} {{{firsttestyear|}}}:<br>{{cr|{{{firsttesthome|}}}|{{{firsttesthomevar|}}}}} v {{cr|{{{firsttestaway|}}}|{{{firsttestawayvar|}}}}}}}
|label21 = Last men's Test
|data21 = {{#if:{{{lasttestdate|}}}|{{{lasttestdate|}}} {{{lasttestyear|}}}:<br>{{cr|{{{lasttesthome|}}}|{{{lasttesthomevar|}}}}} v {{cr|{{{lasttestaway|}}}|{{{lasttestawayvar|}}}}}}}
|label22 = Only men's Test
|data22 = {{#if:{{{onlytestdate|}}}|{{{onlytestdate|}}} {{{onlytestyear|}}}:<br>{{cr|{{{onlytesthome|}}}|{{{onlytesthomevar|}}}}} v {{cr|{{{onlytestaway|}}}|{{{onlytestawayvar|}}}}}}}
|label23 = First men's ODI
|data23 = {{#if:{{{firstodidate|}}}|{{{firstodidate|}}} {{{firstodiyear|}}}:<br>{{cr|{{{firstodihome|}}}|{{{firstodihomevar|}}}}} v {{cr|{{{firstodiaway|}}}|{{{firstodiawayvar|}}}}}}}
|label24 = Last men's ODI
|data24 = {{#if:{{{lastodidate|}}}|{{{lastodidate|}}} {{{lastodiyear|}}}:<br>{{cr|{{{lastodihome|}}}|{{{lastodihomevar|}}}}} v {{cr|{{{lastodiaway|}}}|{{{lastodiawayvar|}}}}}}}
|label25 = Only men's ODI
|data25 = {{#if:{{{onlyodidate|}}}|{{{onlyodidate|}}} {{{onlyodiyear|}}}:<br>{{cr|{{{onlyodihome|}}}|{{{onlyodihomevar|}}}}} v {{cr|{{{onlyodiaway|}}}|{{{onlyodiawayvar|}}}}}}}
|label26 = First men's T20I
|data26 = {{#if:{{{firstt20idate|}}}|{{{firstt20idate|}}} {{{firstt20iyear|}}}:<br>{{cr|{{{firstt20ihome|}}}|{{{firstt20ihomevar|}}}}} v {{cr|{{{firstt20iaway|}}}|{{{firstt20iawayvar|}}}}}}}
|label27 = Last men's T20I
|data27 = {{#if:{{{lastt20idate|}}}|{{{lastt20idate|}}} {{{lastt20iyear|}}}:<br>{{#ifeq:{{{lastt20ihomeflag|}}}|no|{{{lastt20ihome|}}}|{{cr|{{{lastt20ihome|}}}|{{{lastt20ihomevar|}}}}}}} v {{cr|{{{lastt20iaway|}}}|{{{lastt20iawayvar|}}}}}}}
|label28 = Only men's T20I
|data28 = {{#if:{{{onlyt20idate|}}}|{{{onlyt20idate|}}} {{{onlyt20iyear|}}}:<br>{{cr|{{{onlyt20ihome|}}}|{{{onlyt20ihomevar|}}}}} v {{cr|{{{onlyt20iaway|}}}|{{{onlyt20iawayvar|}}}}}}}
|label29 = First women's Test
|data29 = {{#if:{{{firstwtestdate|}}}|{{{firstwtestdate|}}} {{{firstwtestyear|}}}:<br>{{crw|{{{firstwtesthome|}}}|{{{firstwtesthomevar|}}}}} v {{crw|{{{firstwtestaway|}}}|{{{firstwtestawayvar|}}}}}}}
|label30 = Last women's Test
|data30 = {{#if:{{{lastwtestdate|}}}|{{{lastwtestdate|}}} {{{lastwtestyear|}}}:<br>{{crw|{{{lastwtesthome|}}}|{{{lastwtesthomevar|}}}}} v {{crw|{{{lastwtestaway|}}}|{{{lastwtestawayvar|}}}}}}}
|label31 = Only women's Test
|data31 = {{#if:{{{onlywtestdate|}}}|{{{onlywtestdate|}}} {{{onlywtestyear|}}}:<br>{{crw|{{{onlywtesthome|}}}|{{{onlywtesthomevar|}}}}} v {{crw|{{{onlywtestaway|}}}|{{{onlywtestawayvar|}}}}}}}
|label32 = First women's ODI
|data32 = {{#if:{{{firstwodidate|}}}|{{{firstwodidate|}}} {{{firstwodiyear|}}}:<br>{{crw|{{{firstwodihome|}}}|{{{firstwodihomevar|}}}}} v {{crw|{{{firstwodiaway|}}}|{{{firstwodiawayvar|}}}}}}}
|label33 = Last women's ODI
|data33 = {{#if:{{{lastwodidate|}}}|{{{lastwodidate|}}} {{{lastwodiyear|}}}:<br>{{crw|{{{lastwodihome|}}}|{{{lastwodihomevar|}}}}} v {{crw|{{{lastwodiaway|}}}|{{{lastwodiawayvar|}}}}}}}
|label34 = Only women's ODI
|data34 = {{#if:{{{onlywodidate|}}}|{{{onlywodidate|}}} {{{onlywodiyear|}}}:<br>{{crw|{{{onlywodihome|}}}|{{{onlywodihomevar|}}}}} v {{crw|{{{onlywodiaway|}}}|{{{onlywodiawayvar|}}}}}}}
|label35 = First women's T20I
|data35 = {{#if:{{{firstwt20idate|}}}|{{{firstwt20idate|}}} {{{firstwt20iyear|}}}:<br>{{crw|{{{firstwt20ihome|}}}|{{{firstwt20ihomevar|}}}}} v {{crw|{{{firstwt20iaway|}}}|{{{firstwt20iawayvar|}}}}}}}
|label36 = Last women's T20I
|data36 = {{#if:{{{lastwt20idate|}}}|{{{lastwt20idate|}}} {{{lastwt20iyear|}}}:<br>{{crw|{{{lastwt20ihome|}}}|{{{lastwt20ihomevar|}}}}} v {{crw|{{{lastwt20iaway|}}}|{{{lastwt20iawayvar|}}}}}}}
|label37 = Only women's T20I
|data37 = {{#if:{{{onlywt20idate|}}}|{{{onlywt20idate|}}} {{{onlywt20iyear|}}}:<br>{{crw|{{{onlywt20ihome|}}}|{{{onlywt20ihomevar|}}}}} v {{crw|{{{onlywt20iaway|}}}|{{{onlywt20iawayvar|}}}}}}}
|header38= {{#if:{{{club1|}}}|Team information}}
|data39 = {{#if:{{{club1|}}}|<table style="width:100%">
{{#if:{{{club1|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club1}}}</th>
<td style="text-align:right">{{#if:{{{year1|}}}|({{{year1|}}})}}</td></tr>
}}{{#if:{{{club2|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club2}}}</th>
<td style="text-align:right">{{#if:{{{year2|}}}|({{{year2|}}})}}</td></tr>
}}{{#if:{{{club3|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club3}}}</th>
<td style="text-align:right">{{#if:{{{year3|}}}|({{{year3|}}})}}</td></tr>
}}{{#if:{{{club4|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club4}}}</th>
<td style="text-align:right">{{#if:{{{year4|}}}|({{{year4|}}})}}</td></tr>
}}{{#if:{{{club5|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club5}}}</th>
<td style="text-align:right">{{#if:{{{year5|}}}|({{{year5|}}})}}</td></tr>
}}{{#if:{{{club6|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club6}}}</th>
<td style="text-align:right">{{#if:{{{year6|}}}|({{{year6|}}})}}</td></tr>
}}{{#if:{{{club7|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club7}}}</th>
<td style="text-align:right">{{#if:{{{year7|}}}|({{{year7|}}})}}</td></tr>
}}{{#if:{{{club8|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club8}}}</th>
<td style="text-align:right">{{#if:{{{year8|}}}|({{{year8|}}})}}</td></tr>
}}{{#if:{{{club9|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club9}}}</th>
<td style="text-align:right">{{#if:{{{year9|}}}|({{{year9|}}})}}</td></tr>
}}{{#if:{{{club10|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club10}}}</th>
<td style="text-align:right">{{#if:{{{year10|}}}|({{{year10|}}})}}</td></tr>
}}</table>}}
|belowstyle = border-top:#ccc 1px solid;font-size:smaller;
|below = {{br separated entries
|1= {{#if:{{{date|}}} {{{year|}}}|As of {{{date|}}} {{{year|}}}}}
|2= {{#if:{{{source|}}}|Source: {{#ifeq:{{Str left|{{{source}}}|4}}|http|[{{{source}}}]|{{{source}}}}}}}
}}
}}{{#if:{{{source|}}}|{{#ifeq:{{Str left|{{{source}}}|4}}|http||[[Category:Infobox cricket ground maintenance]]
}}}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox cricket ground with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox cricket ground]] with unknown parameter "_VALUE_"|ignoreblank=y|mapframe_args=y| architect | caption | club1 | club2 | club3 | club4 | club5 | club6 | club7 | club8 | club9 | club10 | contractor | coord | coordinates | country | county club | county_club | date | demolished | embed | end1 | end2 | established | establishment | firstodiaway | firstodiawayvar | firstodidate | firstodihome | firstodihomevar | firstodiyear | firstt20iaway | firstt20iawayvar | firstt20idate | firstt20ihome | firstt20ihomevar | firstt20iyear | firsttestaway | firsttestawayvar | firsttestdate | firsttesthome | firsttesthomevar | firsttestyear | firstwodiaway | firstwodiawayvar | firstwodidate | firstwodihome | firstwodihomevar | firstwodiyear | firstwt20iaway | firstwt20iawayvar | firstwt20idate | firstwt20ihome | firstwt20ihomevar | firstwt20iyear | firstwtestaway | firstwtestawayvar | firstwtestdate | firstwtesthome | firstwtesthomevar | firstwtestyear | ground | ground_name | home club | home_club | image | image_size | imagesize | international | last used | last_used | lastodiaway | lastodiawayvar | lastodidate | lastodihome | lastodihomevar | lastodiyear | lastt20iaway | lastt20iawayvar | lastt20idate | lastt20ihome | lastt20ihomeflag | lastt20ihomevar | lastt20iyear | lasttestaway | lasttestawayvar | lasttestdate | lasttesthome | lasttesthomevar | lasttestyear | lastwodiaway | lastwodiawayvar | lastwodidate | lastwodihome | lastwodihomevar | lastwodiyear | lastwt20iaway | lastwt20iawayvar | lastwt20idate | lastwt20ihome | lastwt20ihomevar | lastwt20iyear | lastwtestaway | lastwtestawayvar | lastwtestdate | lastwtesthome | lastwtesthomevar | lastwtestyear | location | logo_caption | logo_image | logo_size | logosize | map | nickname | onlyodiaway | onlyodiawayvar | onlyodidate | onlyodihome | onlyodihomevar | onlyodiyear | onlyt20iaway | onlyt20iawayvar | onlyt20idate | onlyt20ihome | onlyt20ihomevar | onlyt20iyear | onlytestaway | onlytestawayvar | onlytestdate | onlytesthome | onlytesthomevar | onlytestyear | onlywodiaway | onlywodiawayvar | onlywodidate | onlywodihome | onlywodihomevar | onlywodiyear | onlywt20iaway | onlywt20iawayvar | onlywt20idate | onlywt20ihome | onlywt20ihomevar | onlywt20iyear | onlywtestaway | onlywtestawayvar | onlywtestdate | onlywtesthome | onlywtesthomevar | onlywtestyear | operator | othernames | owner | seating_capacity | source | tenants | website | year | year1 | year2 | year3 | year4 | year5 | year6 | year7 | year8 | year9 | year10 }}<noinclude>{{template doc}}</noinclude>
05626gb5atsr42gdo8bfys2gcprwpg6
373878
373877
2026-10-28T05:55:28Z
ChiK
1136
1 revision imported from [[:en:Template:Infobox_cricket_ground]]
373877
wikitext
text/x-wiki
{{Infobox
|child = {{lc:{{{embed|}}}}}
|bodyclass = vcard
|titleclass = adr
|title = {{#ifeq:{{lc:{{{embed|}}}}}|yes||<span class="fn org extended-address">{{if empty|{{{ground_name|}}}|{{{ground|}}}|<includeonly>{{PAGENAMEBASE}}</includeonly>}}</span>}}
|subheader = {{#if:{{{nickname|{{{othernames|}}}}}}|<span class="nickname">{{{nickname|{{{othernames|}}}}}}</span>}}
|image = {{#invoke:InfoboxImage|InfoboxImage|image={{{logo_image|}}}|size={{{logosize|{{{logo_size|}}}}}}|sizedefault=frameless}}
|caption = {{{logo_caption|}}}
|image2 = {{#invoke:InfoboxImage|InfoboxImage|image={{{image|}}}|size={{{imagesize|{{{image_size|}}}}}}|sizedefault=270px}}
|caption2 = {{{caption|}}}
|image3 = {{{map|}}}
|image4 ={{#invoke:Infobox mapframe|autoWithCaption
|onByDefault={{#if:{{{embed|}}}|no|yes}}
|mapframe-marker=cricket
|mapframe-wikidata=yes
|mapframe-zoom=13
|mapframe-caption = Interactive map of {{if empty|{{{ground_name|}}}|{{{ground|}}}|{{PAGENAMEBASE}}}}
}}
|headerstyle = background:lavender;color:inherit;
|header1 = {{#if:{{{international|}}}{{{club1|}}}{{#ifeq:{{lc:{{{embed|}}}}}|yes|yes}}|Ground information}}<!-- suppress first header if it's the only header -->
|label2 = Location
|data2 = {{{location|}}}
|label3 = Country
|data3 = {{{country|}}}
|label4 = Coordinates
|data4 = {{{coordinates|{{{coord|}}} }}}
|label5 = Home club
|data5 = {{{home_club|{{{home club|}}}}}}
|label6 = County club
|data6 = {{{county_club|{{{county club|}}}}}}
|label7 = Establishment
|data7 = {{{establishment|{{{established|}}}}}}
|label8 = Demolished
|data8 = {{{demolished|}}}
|label9 = Capacity
|data9 = {{{seating_capacity|}}}
|label10 = Owner
|data10 = {{{owner|}}}
|label11 = Architect
|data11 = {{{architect|}}}
|label12 = Contractor
|data12 = {{{contractor|}}}
|label13 = Operator
|data13 = {{{operator|}}}
|label14 = Tenants
|data14 = {{{tenants|}}}
|label15 = Website
|data15 = {{{website|}}}
|label16 = Last used
|data16 = {{{last_used|{{{last used|}}}}}}
|data17 = {{#if:{{{end1|}}}{{{end2|}}}|'''End names'''}}
|data18 = {{br separated entries|1={{{end1|}}}|2={{{end2|}}}}}
|header19= {{#if:{{{international|}}}|International information}}
|label20 = First men's Test
|data20 = {{#if:{{{firsttestdate|}}}|{{{firsttestdate|}}} {{{firsttestyear|}}}:<br>{{cr|{{{firsttesthome|}}}|{{{firsttesthomevar|}}}}} v {{cr|{{{firsttestaway|}}}|{{{firsttestawayvar|}}}}}}}
|label21 = Last men's Test
|data21 = {{#if:{{{lasttestdate|}}}|{{{lasttestdate|}}} {{{lasttestyear|}}}:<br>{{cr|{{{lasttesthome|}}}|{{{lasttesthomevar|}}}}} v {{cr|{{{lasttestaway|}}}|{{{lasttestawayvar|}}}}}}}
|label22 = Only men's Test
|data22 = {{#if:{{{onlytestdate|}}}|{{{onlytestdate|}}} {{{onlytestyear|}}}:<br>{{cr|{{{onlytesthome|}}}|{{{onlytesthomevar|}}}}} v {{cr|{{{onlytestaway|}}}|{{{onlytestawayvar|}}}}}}}
|label23 = First men's ODI
|data23 = {{#if:{{{firstodidate|}}}|{{{firstodidate|}}} {{{firstodiyear|}}}:<br>{{cr|{{{firstodihome|}}}|{{{firstodihomevar|}}}}} v {{cr|{{{firstodiaway|}}}|{{{firstodiawayvar|}}}}}}}
|label24 = Last men's ODI
|data24 = {{#if:{{{lastodidate|}}}|{{{lastodidate|}}} {{{lastodiyear|}}}:<br>{{cr|{{{lastodihome|}}}|{{{lastodihomevar|}}}}} v {{cr|{{{lastodiaway|}}}|{{{lastodiawayvar|}}}}}}}
|label25 = Only men's ODI
|data25 = {{#if:{{{onlyodidate|}}}|{{{onlyodidate|}}} {{{onlyodiyear|}}}:<br>{{cr|{{{onlyodihome|}}}|{{{onlyodihomevar|}}}}} v {{cr|{{{onlyodiaway|}}}|{{{onlyodiawayvar|}}}}}}}
|label26 = First men's T20I
|data26 = {{#if:{{{firstt20idate|}}}|{{{firstt20idate|}}} {{{firstt20iyear|}}}:<br>{{cr|{{{firstt20ihome|}}}|{{{firstt20ihomevar|}}}}} v {{cr|{{{firstt20iaway|}}}|{{{firstt20iawayvar|}}}}}}}
|label27 = Last men's T20I
|data27 = {{#if:{{{lastt20idate|}}}|{{{lastt20idate|}}} {{{lastt20iyear|}}}:<br>{{#ifeq:{{{lastt20ihomeflag|}}}|no|{{{lastt20ihome|}}}|{{cr|{{{lastt20ihome|}}}|{{{lastt20ihomevar|}}}}}}} v {{cr|{{{lastt20iaway|}}}|{{{lastt20iawayvar|}}}}}}}
|label28 = Only men's T20I
|data28 = {{#if:{{{onlyt20idate|}}}|{{{onlyt20idate|}}} {{{onlyt20iyear|}}}:<br>{{cr|{{{onlyt20ihome|}}}|{{{onlyt20ihomevar|}}}}} v {{cr|{{{onlyt20iaway|}}}|{{{onlyt20iawayvar|}}}}}}}
|label29 = First women's Test
|data29 = {{#if:{{{firstwtestdate|}}}|{{{firstwtestdate|}}} {{{firstwtestyear|}}}:<br>{{crw|{{{firstwtesthome|}}}|{{{firstwtesthomevar|}}}}} v {{crw|{{{firstwtestaway|}}}|{{{firstwtestawayvar|}}}}}}}
|label30 = Last women's Test
|data30 = {{#if:{{{lastwtestdate|}}}|{{{lastwtestdate|}}} {{{lastwtestyear|}}}:<br>{{crw|{{{lastwtesthome|}}}|{{{lastwtesthomevar|}}}}} v {{crw|{{{lastwtestaway|}}}|{{{lastwtestawayvar|}}}}}}}
|label31 = Only women's Test
|data31 = {{#if:{{{onlywtestdate|}}}|{{{onlywtestdate|}}} {{{onlywtestyear|}}}:<br>{{crw|{{{onlywtesthome|}}}|{{{onlywtesthomevar|}}}}} v {{crw|{{{onlywtestaway|}}}|{{{onlywtestawayvar|}}}}}}}
|label32 = First women's ODI
|data32 = {{#if:{{{firstwodidate|}}}|{{{firstwodidate|}}} {{{firstwodiyear|}}}:<br>{{crw|{{{firstwodihome|}}}|{{{firstwodihomevar|}}}}} v {{crw|{{{firstwodiaway|}}}|{{{firstwodiawayvar|}}}}}}}
|label33 = Last women's ODI
|data33 = {{#if:{{{lastwodidate|}}}|{{{lastwodidate|}}} {{{lastwodiyear|}}}:<br>{{crw|{{{lastwodihome|}}}|{{{lastwodihomevar|}}}}} v {{crw|{{{lastwodiaway|}}}|{{{lastwodiawayvar|}}}}}}}
|label34 = Only women's ODI
|data34 = {{#if:{{{onlywodidate|}}}|{{{onlywodidate|}}} {{{onlywodiyear|}}}:<br>{{crw|{{{onlywodihome|}}}|{{{onlywodihomevar|}}}}} v {{crw|{{{onlywodiaway|}}}|{{{onlywodiawayvar|}}}}}}}
|label35 = First women's T20I
|data35 = {{#if:{{{firstwt20idate|}}}|{{{firstwt20idate|}}} {{{firstwt20iyear|}}}:<br>{{crw|{{{firstwt20ihome|}}}|{{{firstwt20ihomevar|}}}}} v {{crw|{{{firstwt20iaway|}}}|{{{firstwt20iawayvar|}}}}}}}
|label36 = Last women's T20I
|data36 = {{#if:{{{lastwt20idate|}}}|{{{lastwt20idate|}}} {{{lastwt20iyear|}}}:<br>{{crw|{{{lastwt20ihome|}}}|{{{lastwt20ihomevar|}}}}} v {{crw|{{{lastwt20iaway|}}}|{{{lastwt20iawayvar|}}}}}}}
|label37 = Only women's T20I
|data37 = {{#if:{{{onlywt20idate|}}}|{{{onlywt20idate|}}} {{{onlywt20iyear|}}}:<br>{{crw|{{{onlywt20ihome|}}}|{{{onlywt20ihomevar|}}}}} v {{crw|{{{onlywt20iaway|}}}|{{{onlywt20iawayvar|}}}}}}}
|header38= {{#if:{{{club1|}}}|Team information}}
|data39 = {{#if:{{{club1|}}}|<table style="width:100%">
{{#if:{{{club1|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club1}}}</th>
<td style="text-align:right">{{#if:{{{year1|}}}|({{{year1|}}})}}</td></tr>
}}{{#if:{{{club2|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club2}}}</th>
<td style="text-align:right">{{#if:{{{year2|}}}|({{{year2|}}})}}</td></tr>
}}{{#if:{{{club3|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club3}}}</th>
<td style="text-align:right">{{#if:{{{year3|}}}|({{{year3|}}})}}</td></tr>
}}{{#if:{{{club4|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club4}}}</th>
<td style="text-align:right">{{#if:{{{year4|}}}|({{{year4|}}})}}</td></tr>
}}{{#if:{{{club5|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club5}}}</th>
<td style="text-align:right">{{#if:{{{year5|}}}|({{{year5|}}})}}</td></tr>
}}{{#if:{{{club6|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club6}}}</th>
<td style="text-align:right">{{#if:{{{year6|}}}|({{{year6|}}})}}</td></tr>
}}{{#if:{{{club7|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club7}}}</th>
<td style="text-align:right">{{#if:{{{year7|}}}|({{{year7|}}})}}</td></tr>
}}{{#if:{{{club8|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club8}}}</th>
<td style="text-align:right">{{#if:{{{year8|}}}|({{{year8|}}})}}</td></tr>
}}{{#if:{{{club9|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club9}}}</th>
<td style="text-align:right">{{#if:{{{year9|}}}|({{{year9|}}})}}</td></tr>
}}{{#if:{{{club10|}}}|<tr><th style="font-weight:normal;text-align:left">{{{club10}}}</th>
<td style="text-align:right">{{#if:{{{year10|}}}|({{{year10|}}})}}</td></tr>
}}</table>}}
|belowstyle = border-top:#ccc 1px solid;font-size:smaller;
|below = {{br separated entries
|1= {{#if:{{{date|}}} {{{year|}}}|As of {{{date|}}} {{{year|}}}}}
|2= {{#if:{{{source|}}}|Source: {{#ifeq:{{Str left|{{{source}}}|4}}|http|[{{{source}}}]|{{{source}}}}}}}
}}
}}{{#if:{{{source|}}}|{{#ifeq:{{Str left|{{{source}}}|4}}|http||[[Category:Infobox cricket ground maintenance]]
}}}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox cricket ground with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox cricket ground]] with unknown parameter "_VALUE_"|ignoreblank=y|mapframe_args=y| architect | caption | club1 | club2 | club3 | club4 | club5 | club6 | club7 | club8 | club9 | club10 | contractor | coord | coordinates | country | county club | county_club | date | demolished | embed | end1 | end2 | established | establishment | firstodiaway | firstodiawayvar | firstodidate | firstodihome | firstodihomevar | firstodiyear | firstt20iaway | firstt20iawayvar | firstt20idate | firstt20ihome | firstt20ihomevar | firstt20iyear | firsttestaway | firsttestawayvar | firsttestdate | firsttesthome | firsttesthomevar | firsttestyear | firstwodiaway | firstwodiawayvar | firstwodidate | firstwodihome | firstwodihomevar | firstwodiyear | firstwt20iaway | firstwt20iawayvar | firstwt20idate | firstwt20ihome | firstwt20ihomevar | firstwt20iyear | firstwtestaway | firstwtestawayvar | firstwtestdate | firstwtesthome | firstwtesthomevar | firstwtestyear | ground | ground_name | home club | home_club | image | image_size | imagesize | international | last used | last_used | lastodiaway | lastodiawayvar | lastodidate | lastodihome | lastodihomevar | lastodiyear | lastt20iaway | lastt20iawayvar | lastt20idate | lastt20ihome | lastt20ihomeflag | lastt20ihomevar | lastt20iyear | lasttestaway | lasttestawayvar | lasttestdate | lasttesthome | lasttesthomevar | lasttestyear | lastwodiaway | lastwodiawayvar | lastwodidate | lastwodihome | lastwodihomevar | lastwodiyear | lastwt20iaway | lastwt20iawayvar | lastwt20idate | lastwt20ihome | lastwt20ihomevar | lastwt20iyear | lastwtestaway | lastwtestawayvar | lastwtestdate | lastwtesthome | lastwtesthomevar | lastwtestyear | location | logo_caption | logo_image | logo_size | logosize | map | nickname | onlyodiaway | onlyodiawayvar | onlyodidate | onlyodihome | onlyodihomevar | onlyodiyear | onlyt20iaway | onlyt20iawayvar | onlyt20idate | onlyt20ihome | onlyt20ihomevar | onlyt20iyear | onlytestaway | onlytestawayvar | onlytestdate | onlytesthome | onlytesthomevar | onlytestyear | onlywodiaway | onlywodiawayvar | onlywodidate | onlywodihome | onlywodihomevar | onlywodiyear | onlywt20iaway | onlywt20iawayvar | onlywt20idate | onlywt20ihome | onlywt20ihomevar | onlywt20iyear | onlywtestaway | onlywtestawayvar | onlywtestdate | onlywtesthome | onlywtesthomevar | onlywtestyear | operator | othernames | owner | seating_capacity | source | tenants | website | year | year1 | year2 | year3 | year4 | year5 | year6 | year7 | year8 | year9 | year10 }}<noinclude>{{template doc}}</noinclude>
05626gb5atsr42gdo8bfys2gcprwpg6
ಟೆಂಪ್ಲೇಟ್:Infobox venue/doc
10
29116
373883
2026-10-06T14:37:19Z
en>Jdcomix
0
Reverted edit by [[Special:Contribs/Mohammed Abdi Aliyi|Mohammed Abdi Aliyi]] ([[User talk:Mohammed Abdi Aliyi|talk]]) to last version by ~2026-52167-99
373883
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{High-use}}
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Location map|Module:Check for unknown parameters}}
This templates generates an infobox to summarize information about stadiums, arenas, or other sporting venues, as well as theatres and cinemas.
== Usage ==
<!--Do not preview "{{{pushpin_map}}}" (and associated parameters) since it will cause an error with the module as it looks for the map "{{{pushpin_map}}}" which is invalid-->
{{Parameter names example | acreage | address | architect | architectural_style | groundbreaking | builder | built | capacity | city | closed | coordinates = {{coords|0|0}} | cost | country | current_use | demolished | designation | dimensions | elevation | embedded | event | expanded | facilities | field_shape | former_names | fullname | general_contractor | height | image | image_alt | image_caption | image_map | image_size | image_upright | location | logo_alt | logo_caption | logo_class | logo_image | logo_size | logo_upright | main_contractors | main_venue | main_venue_capacity | map_alt | map_caption | map_size | name | native_name | native_name_lang | nickname | nrhp | opened | operator | owner | parking | production | project_manager | public_transit | pushpin_label | pushpin_label_position | pushpin_map = World | pushpin_caption | pushpin_map_size | pushpin_relief | rebuilt | record_attendance | renovated | reopened | roof | scoreboard | screens | seating_type | services_engineer | structural_engineer | suites | surface | tenants | type | website | years_active }}
=== Full syntax ===
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox venue
| name =
| native_name =
| native_name_lang =
| nickname =
| logo_image =
| logo_size =
| logo_upright =
| logo_alt =
| logo_caption =
| image =
| image_size =
| image_upright =
| image_alt =
| image_caption =
| image_map =
| map_size =
| map_alt =
| map_caption =
| pushpin_map =
| pushpin_map_size =
| pushpin_caption =
| pushpin_label_position =
| pushpin_relief =
| fullname =
| former_names =
| address =
| city =
| country =
| location =
| coordinates = <!-- {{Coord|LAT|LON|type:landmark|display=inline,title}} -->
| height = <!-- {{cvt|...|ft|m}} or {{cvt|...|m|ft}} -->
| public_transit =
| parking =
| owner =
| operator =
| designation =
| type =
| event =
| seating_type =
| suites =
| capacity = 77,193
| record_attendance =
| dimensions =
| field_shape =
| acreage =
| roof =
| surface =
| scoreboard =
| screens =
| current_use =
| production =
| groundbreaking =
| built =
| opened = <!-- {{Start date|YYYY|MM|DD|df=y}} -->
| renovated =
| expanded =
| closed =
| demolished =
| rebuilt =
| years_active =
| cost =
| architectural_style =
| architect =
| builder =
| project_manager =
| structural_engineer =
| services_engineer =
| general_contractor =
| main_contractors =
| tenants =
| website = <!-- {{URL|example.com}} -->
| embedded =
}}
</syntaxhighlight>
== Parameters ==
All attributes are optional.
{| class="wikitable"
! style="text-align: left" | Parameter
! style="text-align: left" | Explanation
|-
| '''name'''
| Name of the sporting venue. Defaults to <nowiki>{{PAGENAME}}</nowiki>
|-
| '''nickname'''
| English nickname(s) of the venue
|-
| '''native_name'''
| Name of the venue in native language/script (e.g. दशरथ रंगशाला)
|-
| '''native_name_lang'''
| If {{Para|native_name}} is present, ISO 639-1 code of language/script of value (e.g. {{mono|ne}})
|-
| '''fullname'''
| Insert the official full name of the venue
|-
| '''former_names'''
| Insert the venue's former name(s). Use the format:
<blockquote>'''FormerName (year–year)'''</blockquote>
|-
| '''logo_image'''
| Insert an image link in the form: <code>'''<nowiki>[[File:MyLogo.jpg|250px|alt=My alt text]]</nowiki>'''</code>. For more on alt text, please see [[WP:ALT]].
|-
| '''logo_upright'''
| Insert a number – see '''[[MOS:UPRIGHT]]''' for more information – default = 1.
|-
| '''logo_caption'''
| Insert a caption for the stadium logo
|-
| '''image'''
| Image name without "File:" or other formatting. e.g. '''MyImage.jpg'''
|-
| '''image_size'''
| Size of the image as a raw number (i.e. without "px"). If not specified, image width defaults to "frameless" (220px).
|-
| '''image_alt'''
| [[MOS:ALT|alt text]] for the image.
|-
| '''image_caption'''
| Insert a caption for the stadium image
|-
| '''pushpin_map'''
| The name of a location map as per [[:Template:Location map]]
|-
| '''pushpin_map_size'''
| The width to display the pushpin map, in pixels. Just the number, without "px". If omitted or left empty, defaults to 250.
|-
| '''pushpin_caption'''
| Caption to display below the pushpin map. If left blank or omitted, a caption will not be displayed.
|-
| '''pushpin_label'''
| Name of the label used on the pushpin map. Defaults to page name but can be used if a longer name causes issue.
|-
| '''pushpin_label_position'''
| The position of the label on the pushpin map relative to the pushpin mark. Valid values are left, right, top and bottom. This defaults to either left or right, depending on the coordinates of the marker and its position relative to the right border of the map image.
|-
| '''location'''
| Insert the venue's location. For "United States" and "United Kingdom", it is preferred that they be abbreviated "U.S." and "UK", but political subdivisions should never be (never "MA" for "Massachusetts", "ON" for "Ontario", etc.). See Notes{{r|location}} for details.
|-
| '''coordinates'''
| Insert the geographical coordinates; use {{tl|Coord}}
|-
| '''elevation'''
| Elevation in meters or feet using {{tl|convert}}
|-
| '''type'''
| Theatre, Stadium, ...
|-
| '''event'''
| music, concerts, sporting events, theatre, dance
|-
| '''groundbreaking'''
| Insert the date when ground was broken to build the venue
|-
| '''built'''
| Insert a date range of when the venue was under construction
|-
| '''opened'''
| Insert the date of when it opened
|-
| '''renovated'''
| Insert the date of when it was renovated
|-
| '''expanded'''
| Insert the date of when it was expanded
|-
| '''closed'''
| Insert the date of when it was closed
|-
| '''demolished'''
| Insert the date of when it was demolished
|-
| '''owner'''
| Insert the name(s) of the venue's owner(s)
|-
| '''operator'''
| Insert the name(s) of the venue's operator(s)
|-
| '''roof'''
| Enter the roof type of the venue if indoors/covered (e.g. retractable, domed, translucent)
|-
| '''surface'''
| Enter the surface of the venue (e.g. grass, sand, artificial turf)
|-
| '''scoreboard'''
| Enter the details of any scoreboard at the venue. If specific details are not known, just enter "Yes" if the venue has a scoreboard or "No" if there is none.
|-
| '''screens'''
| Enter the number of theatre screens.
|-
| '''current_use'''
| Enter the current use of the venue.
|-
| '''production'''
| Enter the theatrical production currently being housed at the venue.
|-
| '''cost'''
| Enter the construction cost, preferably in the currency that the venue is located in (see [[Wikipedia:Manual of Style (dates and numbers)|WP:DATE]] for details) Per its own documentation, the [[:template:inflation|inflation template]] '''must not''' be used.
|-
| '''architectural_style'''
| Insert the name(s) of the venue's architectural style(s)
|-
| '''architect'''
| Insert the name(s) of the venue's architect(s)
|-
| '''builder'''
| Name(s) of the venue's builder(s)
|-
| '''project_manager'''
| Insert the name(s) of the project manager(s) who led the venue's construction
|-
| '''structural_engineer'''
| Insert the name(s) of the venue's structural engineer(s)
|-
| '''services_engineer'''
| Insert the name(s) of the venue's services engineer(s)
|-
| '''general_contractor'''
| Insert the name(s) of the venue's general contractor(s)
|-
| '''main_contractors'''
| Insert the name(s) of the venue's main contractor(s)
|-
| '''seating_type'''
| soft seat, reserved seating
|-
| '''capacity'''
| Insert the seating capacity of the venue. If it is a multi-purpose venue, use the format:
<blockquote>'''Capacity (Purpose)'''</blockquote>
|-
| '''main_venue'''
| Name of the main venue in a complex (use only for complexes, not individual venues)
|-
| '''main_venue_capacity'''
| Capacity of the main venue in a complex (use only for complexes, not individual venues)
|-
| '''facilities'''
| List of facilities in a complex (use only for complexes, not individual venues)
|-
| '''suites'''
| Insert the number of suites
|-
| '''record_attendance'''
| Insert the all-time record attendance of the venue. (include the date and event if you wish) If it is a multi-purpose venue, use the format:
<blockquote>'''Record Attendance (Date & Event)'''</blockquote>
|-
| '''dimensions'''
| Insert the dimensions of the venue:
*For a football (soccer) pitch size, use the format:
<blockquote>'''105 × 68 m'''</blockquote>
*For baseball dimensions, use the format:
<blockquote>'''Left field: 300 ft (91 m)<br/>Center field: 400 ft (122 m)<br/>Right field: 300 ft (91 m)'''</blockquote>
|-
| '''dimensions_label'''
| Override the default label of "Field size". For example if the venue is a pool, can be changed to "Pool size"
|-
| '''field_shape'''
| Oval, rectangular or circular
|-
| '''acreage'''
| Insert the acreage.
|-
| '''tenants'''
| Insert the teams and any other parties who use the venue as their home stadium or arena. Use the format:
<blockquote>'''TeamName (league/organization) year–year'''</blockquote>
Alternatively, you can use the {{tl|infobox venue/tenantlist}} sub-template to automatically line rows up.
|-
| '''embedded'''
| Embed another infobox with such capability like {{tl|designation list}} and {{tl|infobox NRHP}}. See their respective documentation for more information.
|-
| '''website'''
| Insert the website, preferably with {{tl|URL}}
|-
| '''public_transit'''
| The nearest [[public transport]] stop. <br /> <nowiki> Example: [[Roosevelt/State (CTA)|Roosevelt Station]], [[Chicago Transit Authority]]</nowiki>
|}
=== Mapframe parameters ===
{{Infobox mapframe/doc/parameters}}
=== Pushpin map ===
{{Location map/doc/infobox parameters}}
== Notes ==
{{Reflist|refs=
<ref name="location">As per RfC "Naming countries in infoboxes": When identifying a location, city or region in the United States or United Kingdom, the preferred approach is to use the country abbreviations allowed by [[MOS:ACRO]], such as "Portsmouth, New Hampshire, U.S." and "Cardiff, Wales, UK", rather than spelling out the full country name. Avoid using abbreviations for states or provinces in all nations. {{xt|New Hampshire}} rather than {{!xt|NH}}, {{xt|New South Wales}} rather than {{!xt|NSW}}, or {{xt|British Columbia}} rather than {{!xt|BC}} (see [[MOS:POSTABBR]]). Cities such as New York City and London may be rendered as "New York City, U.S." and "London, UK" or simply "New York City" and "London". Also, these should not be linked when the context makes it clear (see [[MOS:OVERLINK]]). If only the country name is included, it may be written out in full.
</ref>
}}
== Example ==
{{Infobox venue
| name = Narendra Modi Stadium
| native_name =
| native_name_lang = 639-2
| nickname = {{unbulleted list|GCA Stadium|Motera Cricket Stadium}}
| logo_image =
| logo_size =
| logo_caption =
| image = Narendra_Modi_Stadium_view_from_the_gallery.jpg
| image_size = 300px
| image_caption = Inside view of the arena
| map_caption = The stadium in India
| pushpin_map = India
| elevation = 84 m
| public_transit = {{rint|Bus}} Narendra Modi Stadium<br />{{rint|Metro}} [[Motera Stadium metro station|Motera Stadium]] {{rcb|Ahmedabad Metro|Red|yes}}
| fullname = Narendra Modi Stadium
| former_names = {{bulleted list| Sardar Patel stadium (former stadium 1982–2021)| Motera Cricket Stadium}}
| address = [[Sardar Vallabhbhai Patel Sports Enclave]], [[Motera]],
| city = [[Ahmedabad]],
| country = India
| location = Ahmedabad, [[Ahmedabad district]], [[Gujarat]], [[India]]
| coordinates = {{Coord|23|05|29|N|72|35|50|E}}
| groundbreaking = {{ubl|1983 (former structure) |December 2016 (New stadium)}}
| built = September 2015- February 2020<ref name=S>{{Cite web |title=Modern Marvel: World's largest stadium |url=https://m.youtube.com/watch?v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |access-date=2023-08-28 |website=YouTube |publisher=[[History TV18]] |archive-date=5 October 2023 |archive-url=https://web.archive.org/web/20231005124506/https://www.youtube.com/watch?app=desktop&v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |url-status=live }}</ref><ref name=India/><br/> 12 November 1983 (former structure)
| opened = 24 February 2020 (New stadium)<ref name=India>{{cite web|website=[[India Today]]|title=World's largest cricket stadium in Motera named Narendra Modi stadium|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref><br/>12 November 1983 (former structure)
| renovated =
| expanded =
| closed = September 2015 (former Sardar Patel stadium)
| demolished = September 2015 (former Saradar Patel stadium)<ref name=S/>
| parking = 13000<ref name=Seating>{{cite web|title=Motera Cricket stadium in Ahmedabad of over one lakh to be largest in the world.|url=https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|website=India times|date=7 January 2019|access-date=12 January 2019|archive-date=12 January 2019|archive-url=https://web.archive.org/web/20190112200545/https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|url-status=live}}</ref>{{Efn|It is said that parking for 10,000 two-wheelers and 3000 cars is available}}
| owner = [[Gujarat Cricket Association]]
| operator = Gujarat Cricket Association
| acreage = {{convert|63|acre|ha|abbr=on}}<ref name= Populous>{{cite web|title= Narendra Modi stadium |website=Populous.com|url=https://populous.com/project/narendra-modi-stadium&ved=2ahUKEwj-pcPL1aSBAxU6bmwGHdTjB5YQFnoECBoQAQ&usg=AOvVaw0wiQYdH-m542tBncBhe5E3}}</ref>
| surface = [[Bermuda grass]]<ref name=S/>
| scoreboard = No
| cost = {{INRConvert|800|c}} (New stadium 2015-2020)<ref>{{cite news |last1=Umarji |first1=Vinay |title=Kem Chho Trump: World's largest cricket stadium gearing up to host US Prez |url=https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |access-date=25 March 2021 |work=Business Standard India |date=12 February 2020 |archive-date=13 February 2020 |archive-url=https://web.archive.org/web/20200213161424/https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |url-status=live }}</ref>
| type = Stadium
| event = {{hlist|Sporting events|concerts}}
| seating_type = [[Stadium seating]]
| suites = 76
| architect = * Andrew James ([[Populous (company)|Populous design firm]]) (Narendra Modi stadium)<ref name=S/>
* [[Shashi Prabhu]] (former Sardar Patel stadium)<ref>{{cite web |url=http://www.spa-aec.com/spaweb/allprojects.html |title=Complete Project List |access-date=1 April 2011 |url-status=dead |archive-url=https://web.archive.org/web/20110823063136/http://www.spa-aec.com/spaweb/allprojects.html |archive-date=23 August 2011}}</ref>
| builder = [[Larsen and Toubro]]<ref name=AA/>
| main_contractors = Larsen and Toubro<ref name=S/>
| capacity = 132,000<ref name=AA>{{cite web|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|website=[[India Today]]|title=World's largest cricket stadium...|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref> (2020–present)<ref name="1.32 lakh">{{cite news |last1=Gupta |first1=Rishabh |title=IND vs ENG: 'Outstanding for Indian cricket,' says Virat Kohli on Narendra Modi Stadium |url=https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |access-date=25 March 2020 |work=India TV News |date=24 February 2021 |language=en |archive-date=7 October 2022 |archive-url=https://web.archive.org/web/20221007124500/https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |url-status=live }})</ref>
*54,000 (2006–2015)<ref name='htold'>{{cite news|title=Why Sardar Patel Stadium in Motera, Ahmedabad will make cricket history|url=https://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|access-date=10 December 2016|newspaper=Hindustan Times|date=10 December 2016|archive-date=10 December 2016|archive-url=https://web.archive.org/web/20161210175135/http://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|url-status=live}}</ref><ref name=Cricinfo>[http://www.espncricinfo.com/ci/content/ground/57851.html Sardar Patel Stadium, Motera, Ahmedabad, India] {{Webarchive|url=https://web.archive.org/web/20181226140409/http://www.espncricinfo.com/ci/content/ground/57851.html |date=26 December 2018 }}. ESPN</ref>
*49,000 (1982–2006)
| record_attendance = 101,566<ref>{{cite tweet |last=Shah |first=Jay |author-link=Jay Shah |user=JayShah |number=1596822586679504897 |date=27 November 2022 |title=Extremely delighted & proud to receive the Guinness World Record for the largest attendance at a T20 match when 101,566 people witnessed the epic @IPL final at @GCAMotera's magnificent Narendra Modi Stadium on 29 May 2022. A big thanks to our fans for making this possible! @BCCI https://t.co/JHilbDLSB2 |language=en |access-date=14 December 2022 |archive-url=https://web.archive.org/web/20221130125825/https://twitter.com/JayShah/status/1596822586679504897 |archive-date=30 November 2022 |url-status=live}}</ref> <br/> ([[2022 Indian Premier League final|2022 IPL Final]])<br/> {{primary source inline|date=September 2023}}
| executive_suites =
| dimensions = {{convert|180|yd|order=flip}} x {{convert|150|yd|order=flip}}<ref name="Motera Stadium PM Modi's Vision">{{cite news |last1=Rao |first1=K. Shriniwas |title=New Motera stadium is Prime Minister Narendra Modi's vision, says Amit Shah |url=https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |access-date=25 March 2021 |work=The Times of India |date=31 August 2019 |language=en |archive-date=1 September 2019 |archive-url=https://web.archive.org/web/20190901053105/https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |url-status=live }}</ref>
| field_shape = Oval <ref name=S/>
| tenants = [[Gujarat cricket team]] (1983–present)<br /> [[Indian national cricket team |India cricket team]] (1983–present)<br/>[[Gujarat women's cricket team]]<br/>[[India women's national cricket team]] (2011–present)<br/>[[Gujarat Titans]] (2022–present)<br />[[Rajasthan Royals]] (2010–2014)
| website = {{URL|gujaratcricketassociation.com|Gujrat cricket association's website}}
| embedded = {{infobox cricket ground
| embed = yes
| country = India
| location = [[Motera]], [[Ahmedabad]], [[Gujarat]]
| establishment =
| operator = Gujarat Cricket Association
| tenants =
| architect =
| end1 = Adani Pavilion End{{citation needed|date=September 2023}}
| end2 = Reliance End{{citation needed|date=September 2023}}
| international = true
| firstodidate = 5 October
| firstodiyear = 1984
| firstodihome = India
| firstodiaway = Australia
| lastodidate = 4 November
| lastodiyear = 2023
| lastodihome = Australia
| lastodiaway = England
| firsttestdate = 12–16 November
| firsttestyear = 1983
| firsttesthome = India
| firsttestaway = West Indies
| lasttestdate = 9–13 March
| lasttestyear = 2023
| lasttesthome = India
| lasttestaway = Australia
| firstt20idate = 28 December
| firstt20iyear = 2012
| firstt20ihome = India
| firstt20iaway = Pakistan
| lastt20idate = 1 February
| lastt20iyear = 2023
| lastt20ihome = India
| lastt20iaway = New Zealand
| firstwodidate = 12 March
| firstwodiyear = 2012
| firstwodihome = India
| firstwodiaway = Australia
| lastwodidate = 12 April
| lastwodiyear = 2013
| lastwodihome = India
| lastwodiaway = Bangladesh
| firstwt20idate = 22 January
| firstwt20iyear = 2011
| firstwt20ihome = India
| firstwt20iaway = West Indies
| lastwt20idate = 24 January
| lastwt20iyear = 2011
| lastwt20ihome = India
| lastwt20iaway = West Indies
| date = 9 March 2023
| source = [http://content-uk.cricinfo.com/ci/content/ground/57851.html Cricinfo]
}}
}}
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Infobox venue
| name = Narendra Modi Stadium
| native_name =
| native_name_lang = 639-2
| nickname = {{unbulleted list|GCA Stadium|Motera Cricket Stadium}}
| logo_image =
| logo_size =
| logo_caption =
| image = Narendra_Modi_Stadium_view_from_the_gallery.jpg
| image_size = 300px
| image_caption = Inside view of the arena
| map_caption = The stadium in India
| pushpin_map = India
| elevation = 84 m
| public_transit = {{rint|Bus}} Narendra Modi Stadium<br />{{rint|Metro}} [[Motera Stadium metro station|Motera Stadium]] {{rcb|Ahmedabad Metro|Red|yes}}
| fullname = Narendra Modi Stadium
| former_names = {{bulleted list| Sardar Patel stadium (former stadium 1982–2021)| Motera Cricket Stadium}}
| address = [[Sardar Vallabhbhai Patel Sports Enclave]], [[Motera]],
| city = [[Ahmedabad]],
| country = India
| location = Ahmedabad, [[Ahmedabad district]], [[Gujarat]], [[India]]
| coordinates = {{Coord|23|05|29|N|72|35|50|E}}
| groundbreaking = {{ubl|1983 (former structure) |December 2016 (New stadium)}}
| built = September 2015- February 2020<ref name=S>{{Cite web |title=Modern Marvel: World's largest stadium |url=https://m.youtube.com/watch?v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |access-date=2023-08-28 |website=YouTube |publisher=[[History TV18]] |archive-date=5 October 2023 |archive-url=https://web.archive.org/web/20231005124506/https://www.youtube.com/watch?app=desktop&v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |url-status=live }}</ref><ref name=India/><br/> 12 November 1983 (former structure)
| opened = 24 February 2020 (New stadium)<ref name=India>{{cite web|website=[[India Today]]|title=World's largest cricket stadium in Motera named Narendra Modi stadium|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref><br/>12 November 1983 (former structure)
| renovated =
| expanded =
| closed = September 2015 (former Sardar Patel stadium)
| demolished = September 2015 (former Saradar Patel stadium)<ref name=S/>
| parking = 13000<ref name=Seating>{{cite web|title=Motera Cricket stadium in Ahmedabad of over one lakh to be largest in the world.|url=https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|website=India times|date=7 January 2019|access-date=12 January 2019|archive-date=12 January 2019|archive-url=https://web.archive.org/web/20190112200545/https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|url-status=live}}</ref>{{Efn|It is said that parking for 10,000 two-wheelers and 3000 cars is available}}
| owner = [[Gujarat Cricket Association]]
| operator = Gujarat Cricket Association
| acreage = {{convert|63|acre|ha|abbr=on}}<ref name= Populous>{{cite web|title= Narendra Modi stadium |website=Populous.com|url=https://populous.com/project/narendra-modi-stadium&ved=2ahUKEwj-pcPL1aSBAxU6bmwGHdTjB5YQFnoECBoQAQ&usg=AOvVaw0wiQYdH-m542tBncBhe5E3}}</ref>
| surface = [[Bermuda grass]]<ref name=S/>
| scoreboard = No
| cost = {{INRConvert|800|c}} (New stadium 2015-2020)<ref>{{cite news |last1=Umarji |first1=Vinay |title=Kem Chho Trump: World's largest cricket stadium gearing up to host US Prez |url=https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |access-date=25 March 2021 |work=Business Standard India |date=12 February 2020 |archive-date=13 February 2020 |archive-url=https://web.archive.org/web/20200213161424/https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |url-status=live }}</ref>
| type = Stadium
| event = {{hlist|Sporting events|concerts}}
| seating_type = [[Stadium seating]]
| suites = 76
| architect = * Andrew James ([[Populous (company)|Populous design firm]]) (Narendra Modi stadium)<ref name=S/>
* [[Shashi Prabhu]] (former Sardar Patel stadium)<ref>{{cite web |url=http://www.spa-aec.com/spaweb/allprojects.html |title=Complete Project List |access-date=1 April 2011 |url-status=dead |archive-url=https://web.archive.org/web/20110823063136/http://www.spa-aec.com/spaweb/allprojects.html |archive-date=23 August 2011}}</ref>
| builder = [[Larsen and Toubro]]<ref name=AA/>
| main_contractors = Larsen and Toubro<ref name=S/>
| capacity = 132,000<ref name=AA>{{cite web|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|website=[[India Today]]|title=World's largest cricket stadium...|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref> (2020–present)<ref name="1.32 lakh">{{cite news |last1=Gupta |first1=Rishabh |title=IND vs ENG: 'Outstanding for Indian cricket,' says Virat Kohli on Narendra Modi Stadium |url=https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |access-date=25 March 2020 |work=India TV News |date=24 February 2021 |language=en |archive-date=7 October 2022 |archive-url=https://web.archive.org/web/20221007124500/https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |url-status=live }})</ref>
*54,000 (2006–2015)<ref name='htold'>{{cite news|title=Why Sardar Patel Stadium in Motera, Ahmedabad will make cricket history|url=https://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|access-date=10 December 2016|newspaper=Hindustan Times|date=10 December 2016|author=HT Correspondent|archive-date=10 December 2016|archive-url=https://web.archive.org/web/20161210175135/http://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|url-status=live}}</ref><ref name=Cricinfo>[http://www.espncricinfo.com/ci/content/ground/57851.html Sardar Patel Stadium, Motera, Ahmedabad, India] {{Webarchive|url=https://web.archive.org/web/20181226140409/http://www.espncricinfo.com/ci/content/ground/57851.html |date=26 December 2018 }}. ESPN</ref>
*49,000 (1982–2006)
| record_attendance = 101,566<ref>{{cite tweet |last=Shah |first=Jay |author-link=Jay Shah |user=JayShah |number=1596822586679504897 |date=27 November 2022 |title=Extremely delighted & proud to receive the Guinness World Record for the largest attendance at a T20 match when 101,566 people witnessed the epic @IPL final at @GCAMotera's magnificent Narendra Modi Stadium on 29 May 2022. A big thanks to our fans for making this possible! @BCCI https://t.co/JHilbDLSB2 |language=en |access-date=14 December 2022 |archive-url=https://web.archive.org/web/20221130125825/https://twitter.com/JayShah/status/1596822586679504897 |archive-date=30 November 2022 |url-status=live}}</ref> <br/> ([[2022 Indian Premier League final|2022 IPL Final]])<br/> {{primary source inline|date=September 2023}}
| executive_suites =
| dimensions = {{convert|180|yd|order=flip}} x {{convert|150|yd|order=flip}}<ref name="Motera Stadium PM Modi's Vision">{{cite news |last1=Rao |first1=K. Shriniwas |title=New Motera stadium is Prime Minister Narendra Modi's vision, says Amit Shah |url=https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |access-date=25 March 2021 |work=The Times of India |date=31 August 2019 |language=en |archive-date=1 September 2019 |archive-url=https://web.archive.org/web/20190901053105/https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |url-status=live }}</ref>
| field_shape = Oval <ref name=S/>
| tenants = [[Gujarat cricket team]] (1983–present)<br /> [[Indian national cricket team |India cricket team]] (1983–present)<br/>[[Gujarat women's cricket team]]<br/>[[India women's national cricket team]] (2011–present)<br/>[[Gujarat Titans]] (2022–present)<br />[[Rajasthan Royals]] (2010–2014)
| website = {{URL|gujaratcricketassociation.com|Gujrat cricket association's website}}
| embedded = {{infobox cricket ground
| embed = yes
| country = India
| location = [[Motera]], [[Ahmedabad]], [[Gujarat]]
| establishment =
| operator = Gujarat Cricket Association
| tenants =
| architect =
| end1 = Adani Pavilion End{{citation needed|date=September 2023}}
| end2 = Reliance End{{citation needed|date=September 2023}}
| international = true
| firstodidate = 5 October
| firstodiyear = 1984
| firstodihome = India
| firstodiaway = Australia
| lastodidate = 4 November
| lastodiyear = 2023
| lastodihome = Australia
| lastodiaway = England
| firsttestdate = 12–16 November
| firsttestyear = 1983
| firsttesthome = India
| firsttestaway = West Indies
| lasttestdate = 9–13 March
| lasttestyear = 2023
| lasttesthome = India
| lasttestaway = Australia
| firstt20idate = 28 December
| firstt20iyear = 2012
| firstt20ihome = India
| firstt20iaway = Pakistan
| lastt20idate = 1 February
| lastt20iyear = 2023
| lastt20ihome = India
| lastt20iaway = New Zealand
| firstwodidate = 12 March
| firstwodiyear = 2012
| firstwodihome = India
| firstwodiaway = Australia
| lastwodidate = 12 April
| lastwodiyear = 2013
| lastwodihome = India
| lastwodiaway = Bangladesh
| firstwt20idate = 22 January
| firstwt20iyear = 2011
| firstwt20ihome = India
| firstwt20iaway = West Indies
| lastwt20idate = 24 January
| lastwt20iyear = 2011
| lastwt20ihome = India
| lastwt20iaway = West Indies
| date = 9 March 2023
| source = [http://content-uk.cricinfo.com/ci/content/ground/57851.html Cricinfo]
}}
}}
</syntaxhighlight>
'''Explanatory note'''
{{reflist|group=lower-alpha}}
'''References'''
{{reflist}}
== Microformat ==
{{#ifeq:{{SUBPAGENAME}}|sandbox|{{tl|UF-hcard-geo}}|{{UF-hcard-geo}}}}
== TemplateData ==
{{Collapse top|title=[[Wikipedia:TemplateData|TemplateData]] used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>{
"description": "This templates generates an infobox to summarize information about stadiums, arenas, or other sporting venues.",
"format": "block",
"paramOrder": [
"name",
"native_name",
"native_name_lang",
"nickname",
"logo_image",
"logo_size",
"logo_upright",
"logo_alt",
"logo_caption",
"image",
"image_size",
"image_upright",
"image_alt",
"image_caption",
"image_map",
"map_size",
"map_alt",
"map_caption",
"pushpin_map",
"pushpin_caption",
"pushpin_label_position",
"pushpin_relief",
"pushpin_label",
"pushpin_map_size",
"mapframe",
"mapframe-caption",
"mapframe-custom",
"mapframe-id",
"mapframe-coord",
"mapframe-wikidata",
"mapframe-point",
"mapframe-shape",
"mapframe-frame-width",
"mapframe-frame-height",
"mapframe-shape-fill",
"mapframe-shape-fill-opacity",
"mapframe-stroke-color",
"mapframe-stroke-width",
"mapframe-marker",
"mapframe-marker-color",
"mapframe-geomask",
"mapframe-geomask-stroke-color",
"mapframe-geomask-stroke-width",
"mapframe-geomask-fill",
"mapframe-geomask-fill-opacity",
"mapframe-zoom",
"mapframe-length_km",
"mapframe-length_mi",
"mapframe-area_km2",
"mapframe-area_mi2",
"mapframe-frame-coordinates",
"mapframe-switcher",
"fullname",
"former_names",
"address",
"city",
"country",
"location",
"coordinates",
"elevation",
"public_transit",
"parking",
"owner",
"operator",
"designation",
"type",
"event",
"seating_type",
"suites",
"capacity",
"record_attendance",
"dimensions",
"dimensions_label",
"acreage",
"field_shape",
"surface",
"scoreboard",
"screens",
"current_use",
"production",
"groundbreaking",
"built",
"opened",
"renovated",
"expanded",
"closed",
"reopened",
"demolished",
"rebuilt",
"years_active",
"cost",
"architectural_style",
"architect",
"builder",
"project_manager",
"structural_engineer",
"services_engineer",
"general_contractor",
"main_contractors",
"tenants",
"website",
"nrhp",
"embedded"
],
"params": {
"name": {
"label": "Official name",
"type": "line",
"required": false,
"description": "Name of the sporting venue",
"default": "{{PAGENAMEBASE}}",
"suggested": true
},
"nickname": {
"label": "Nickname(s)",
"type": "line",
"required": false,
"description": "English alternate names or nickname(s) of the venue"
},
"native_name": {
"label": "Native name",
"type": "string",
"required": false,
"description": "Name of venue in native language/script"
},
"native_name_lang": {
"label": "Native name language",
"type": "string",
"required": false,
"description": "If {{{native_name}}} present, ISO 639-1 language code of language/script of its value"
},
"fullname": {
"label": "Full name",
"type": "string",
"required": false,
"description": "Official full name of the venue"
},
"former_names": {
"label": "Former name(s)",
"type": "string",
"required": false,
"description": "Venue's former name(s) in format \"FormerName (year–year)\"",
"suggested": true
},
"logo_image": {
"label": "Logo image link",
"type": "wiki-file-name",
"required": false,
"description": "Image link to the logo",
"suggested": true
},
"logo_caption": {
"label": "Logo caption",
"type": "string",
"required": false,
"description": "Caption for the stadium logo"
},
"image": {
"label": "Image link",
"type": "wiki-file-name",
"required": false,
"description": "Image link",
"suggested": true
},
"location": {
"label": "Location",
"type": "line",
"required": false
},
"coordinates": {
"label": "Coordinates",
"type": "string",
"required": false,
"description": "Geographical coordinates",
"suggested": true
},
"elevation": {
"label": "Elevation",
"type": "string",
"required": false
},
"built": {
"label": "Build date",
"type": "string",
"required": false,
"description": "Date range of when the venue was under construction"
},
"opened": {
"label": "Date of opening",
"type": "line",
"required": false,
"description": "Date of when it opened",
"suggested": true
},
"renovated": {
"label": "Date of renovation",
"type": "string",
"required": false,
"description": "Date of when it was renovated"
},
"expanded": {
"label": "Date of expansion",
"type": "string",
"required": false,
"description": "Date of when it was expanded"
},
"closed": {
"label": "Date of closing",
"type": "line",
"required": false,
"description": "Date of when it was closed"
},
"demolished": {
"label": "Date of demolishing",
"type": "string",
"required": false,
"description": "Date of when it was demolished"
},
"owner": {
"label": "Owner(s)",
"type": "string",
"required": false,
"description": "Name(s) of the venue's owner(s)"
},
"operator": {
"label": "Operator(s)",
"type": "string",
"required": false,
"description": "Name(s) of the venue's operator(s)"
},
"surface": {
"label": "Surface",
"type": "string",
"required": false,
"description": "Surface of the venue (e.g. grass, sand, artificial turf)"
},
"scoreboard": {
"label": "Scoreboard",
"type": "string",
"required": false,
"description": "Details of scoreboard at the venue. If not known, just enter \"Yes\" if the venue has a scoreboard and \"No\" otherwise."
},
"cost": {
"label": "Cost",
"type": "line",
"required": false,
"description": "Construction cost, preferably in the currency that the venue is located"
},
"architectural_style": {
"label": "Architectural style",
"type": "string",
"required": false,
"description": "Name(s) of venue's architectural style(s)"
},
"architect": {
"label": "Architect(s)",
"type": "string",
"required": false,
"description": "Name(s) of venue's architect(s)"
},
"structural_engineer": {
"label": "Structural engineer(s)",
"type": "string",
"required": false,
"description": "Name(s) of venue's structural engineer(s)"
},
"services_engineer": {
"label": "Services engineer(s)",
"type": "string",
"required": false,
"description": "Name(s) of venue's services engineer(s)"
},
"capacity": {
"label": "Max. legal occupancy",
"type": "number",
"required": false,
"suggested": true
},
"record_attendance": {
"label": "Record attendance",
"type": "string",
"required": false,
"description": "All time record attendance of the venue. If it is a multi-purpose venue, use the format: \"Record Attendance (Date & Event)\""
},
"dimensions": {
"label": "Dimensions",
"type": "string",
"required": false,
"description": "Dimensions of the venue"
},
"tenants": {
"label": "Tenants",
"type": "string",
"required": false,
"description": "The teams and any other parties who use the venue as their home stadium or arena. Use the format: \"TeamName (league/organization) year–year\""
},
"website": {
"label": "Website",
"type": "string",
"required": false,
"suggested": true
},
"public_transit": {
"label": "Public transit",
"type": "string",
"required": false,
"description": "The nearest public transport stop"
},
"parking": {
"label": "Available parking",
"description": "Number of parking spaces available to public",
"example": "2,000 spaces",
"type": "line"
},
"logo_size": {
"label": "Logo image size",
"type": "line"
},
"logo_upright": {
"label": "Logo upright size",
"type": "number",
"default": "1"
},
"logo_alt": {
"label": "Logo image alternative text",
"description": "Accessibility text describing image for screen readers and other assistive technologies",
"type": "string"
},
"image_size": {
"label": "Image size",
"type": "line"
},
"image_upright": {
"label": "Image upright size",
"type": "number",
"default": "1"
},
"image_alt": {
"label": "Image alternative text",
"description": "Accessibility text describing image for screen readers and other assistive technologies",
"type": "string"
},
"image_caption": {
"aliases": [
"caption"
],
"label": "Image caption",
"description": "Caption for the image",
"type": "string"
},
"image_map": {
"label": "Map image",
"type": "wiki-file-name"
},
"map_size": {
"label": "Map size",
"description": "Map image dimensions, defaults to image_size parameter value if not specified",
"type": "line"
},
"map_alt": {
"label": "Map image alternative text",
"description": "Accessibility text describing image for screen readers and other assistive technologies",
"type": "string"
},
"map_caption": {
"label": "Map caption",
"description": "Contextual information to display beneath map image",
"type": "string"
},
"pushpin_map": {},
"pushpin_caption": {},
"pushpin_label_position": {},
"pushpin_relief": {},
"pushpin_label": {},
"pushpin_map_size": {},
"address": {
"suggested": true
},
"city": {
"suggested": true
},
"country": {
"suggested": true
},
"designation": {},
"type": {},
"event": {},
"seating_type": {},
"suites": {
"label": "Suites",
"description": "Number of suites",
"type": "line"
},
"field_shape": {},
"acreage": {
"label": "Acreage",
"type": "line"
},
"screens": {},
"current_use": {},
"production": {},
"groundbreaking": {
"label": "Ground broke date",
"description": "Date when ground was broken to build the venue",
"type": "string"
},
"reopened": {},
"rebuilt": {},
"years_active": {},
"builder": {},
"project_manager": {
"label": "Project manager(s)",
"description": "Name(s) of venue's project manager(s)",
"type": "string"
},
"general_contractor": {
"label": "General contractor(s)",
"description": "Name(s) of venue's general contractor(s)",
"type": "string"
},
"main_contractors": {
"label": "Main contractor(s)",
"description": "Name(s) of venue's main contractor(s)",
"type": "string"
},
"nrhp": {
"label": "NRHP",
"description": "Embed a NRHP infobox",
"type": "string"
},
"embedded": {
"label": "Embedded",
"description": "Embed another infobox",
"type": "string"
},
"mapframe": {},
"mapframe-caption": {},
"mapframe-custom": {},
"mapframe-id": {},
"mapframe-coord": {},
"mapframe-wikidata": {},
"mapframe-point": {},
"mapframe-shape": {},
"mapframe-frame-width": {},
"mapframe-frame-height": {},
"mapframe-shape-fill": {},
"mapframe-shape-fill-opacity": {},
"mapframe-stroke-color": {
"aliases": [
"mapframe-stroke-colour"
]
},
"mapframe-stroke-width": {},
"mapframe-marker": {},
"mapframe-marker-color": {
"aliases": [
"mapframe-marker-colour"
]
},
"mapframe-geomask": {},
"mapframe-geomask-stroke-color": {
"aliases": [
"mapframe-geomask-stroke-colour"
]
},
"mapframe-geomask-stroke-width": {},
"mapframe-geomask-fill": {},
"mapframe-geomask-fill-opacity": {},
"mapframe-zoom": {},
"mapframe-length_km": {},
"mapframe-length_mi": {},
"mapframe-area_km2": {},
"mapframe-area_mi2": {},
"mapframe-frame-coordinates": {
"aliases": [
"mapframe-frame-coord"
]
},
"mapframe-switcher": {},
"dimensions_label": {
"label": "Dimensions label",
"description": "Override the default label of \"Field size\"",
"example": "Pool size",
"type": "string",
"default": "Field size"
}
}
}</templatedata>
{{Collapse bottom}}
== Tracking category ==
{{infobox tracking categories}}
* {{clc|Pages using infobox venue with both map caption and pushpin map}}
* {{clc|Pages using infobox venue with both image map and pushpin map}}
==See also==
{{Buildings and structures infobox templates}}
<includeonly>{{Sandbox other||
<!-- ADD CATEGORIES BELOW THIS LINE AND INTERWIKIS TO WIKIDATA, THANK YOU! -->
[[Category:Buildings and structures infobox templates|Venue]]
[[Category:Music infobox templates|Venue]]
[[Category:Sports infobox templates|Venue]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
4g1go4ibt2ov13egukhu0hlrasixmp0
373884
373883
2026-10-28T05:55:29Z
ChiK
1136
1 revision imported from [[:en:Template:Infobox_venue/doc]]
373883
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Please place categories where indicated at the bottom of this page and interwikis at Wikidata (see [[Wikipedia:Wikidata]]) -->
{{High-use}}
{{Lua|Module:Infobox|Module:InfoboxImage|Module:Location map|Module:Check for unknown parameters}}
This templates generates an infobox to summarize information about stadiums, arenas, or other sporting venues, as well as theatres and cinemas.
== Usage ==
<!--Do not preview "{{{pushpin_map}}}" (and associated parameters) since it will cause an error with the module as it looks for the map "{{{pushpin_map}}}" which is invalid-->
{{Parameter names example | acreage | address | architect | architectural_style | groundbreaking | builder | built | capacity | city | closed | coordinates = {{coords|0|0}} | cost | country | current_use | demolished | designation | dimensions | elevation | embedded | event | expanded | facilities | field_shape | former_names | fullname | general_contractor | height | image | image_alt | image_caption | image_map | image_size | image_upright | location | logo_alt | logo_caption | logo_class | logo_image | logo_size | logo_upright | main_contractors | main_venue | main_venue_capacity | map_alt | map_caption | map_size | name | native_name | native_name_lang | nickname | nrhp | opened | operator | owner | parking | production | project_manager | public_transit | pushpin_label | pushpin_label_position | pushpin_map = World | pushpin_caption | pushpin_map_size | pushpin_relief | rebuilt | record_attendance | renovated | reopened | roof | scoreboard | screens | seating_type | services_engineer | structural_engineer | suites | surface | tenants | type | website | years_active }}
=== Full syntax ===
<syntaxhighlight lang="wikitext" style="overflow:auto;">
{{Infobox venue
| name =
| native_name =
| native_name_lang =
| nickname =
| logo_image =
| logo_size =
| logo_upright =
| logo_alt =
| logo_caption =
| image =
| image_size =
| image_upright =
| image_alt =
| image_caption =
| image_map =
| map_size =
| map_alt =
| map_caption =
| pushpin_map =
| pushpin_map_size =
| pushpin_caption =
| pushpin_label_position =
| pushpin_relief =
| fullname =
| former_names =
| address =
| city =
| country =
| location =
| coordinates = <!-- {{Coord|LAT|LON|type:landmark|display=inline,title}} -->
| height = <!-- {{cvt|...|ft|m}} or {{cvt|...|m|ft}} -->
| public_transit =
| parking =
| owner =
| operator =
| designation =
| type =
| event =
| seating_type =
| suites =
| capacity = 77,193
| record_attendance =
| dimensions =
| field_shape =
| acreage =
| roof =
| surface =
| scoreboard =
| screens =
| current_use =
| production =
| groundbreaking =
| built =
| opened = <!-- {{Start date|YYYY|MM|DD|df=y}} -->
| renovated =
| expanded =
| closed =
| demolished =
| rebuilt =
| years_active =
| cost =
| architectural_style =
| architect =
| builder =
| project_manager =
| structural_engineer =
| services_engineer =
| general_contractor =
| main_contractors =
| tenants =
| website = <!-- {{URL|example.com}} -->
| embedded =
}}
</syntaxhighlight>
== Parameters ==
All attributes are optional.
{| class="wikitable"
! style="text-align: left" | Parameter
! style="text-align: left" | Explanation
|-
| '''name'''
| Name of the sporting venue. Defaults to <nowiki>{{PAGENAME}}</nowiki>
|-
| '''nickname'''
| English nickname(s) of the venue
|-
| '''native_name'''
| Name of the venue in native language/script (e.g. दशरथ रंगशाला)
|-
| '''native_name_lang'''
| If {{Para|native_name}} is present, ISO 639-1 code of language/script of value (e.g. {{mono|ne}})
|-
| '''fullname'''
| Insert the official full name of the venue
|-
| '''former_names'''
| Insert the venue's former name(s). Use the format:
<blockquote>'''FormerName (year–year)'''</blockquote>
|-
| '''logo_image'''
| Insert an image link in the form: <code>'''<nowiki>[[File:MyLogo.jpg|250px|alt=My alt text]]</nowiki>'''</code>. For more on alt text, please see [[WP:ALT]].
|-
| '''logo_upright'''
| Insert a number – see '''[[MOS:UPRIGHT]]''' for more information – default = 1.
|-
| '''logo_caption'''
| Insert a caption for the stadium logo
|-
| '''image'''
| Image name without "File:" or other formatting. e.g. '''MyImage.jpg'''
|-
| '''image_size'''
| Size of the image as a raw number (i.e. without "px"). If not specified, image width defaults to "frameless" (220px).
|-
| '''image_alt'''
| [[MOS:ALT|alt text]] for the image.
|-
| '''image_caption'''
| Insert a caption for the stadium image
|-
| '''pushpin_map'''
| The name of a location map as per [[:Template:Location map]]
|-
| '''pushpin_map_size'''
| The width to display the pushpin map, in pixels. Just the number, without "px". If omitted or left empty, defaults to 250.
|-
| '''pushpin_caption'''
| Caption to display below the pushpin map. If left blank or omitted, a caption will not be displayed.
|-
| '''pushpin_label'''
| Name of the label used on the pushpin map. Defaults to page name but can be used if a longer name causes issue.
|-
| '''pushpin_label_position'''
| The position of the label on the pushpin map relative to the pushpin mark. Valid values are left, right, top and bottom. This defaults to either left or right, depending on the coordinates of the marker and its position relative to the right border of the map image.
|-
| '''location'''
| Insert the venue's location. For "United States" and "United Kingdom", it is preferred that they be abbreviated "U.S." and "UK", but political subdivisions should never be (never "MA" for "Massachusetts", "ON" for "Ontario", etc.). See Notes{{r|location}} for details.
|-
| '''coordinates'''
| Insert the geographical coordinates; use {{tl|Coord}}
|-
| '''elevation'''
| Elevation in meters or feet using {{tl|convert}}
|-
| '''type'''
| Theatre, Stadium, ...
|-
| '''event'''
| music, concerts, sporting events, theatre, dance
|-
| '''groundbreaking'''
| Insert the date when ground was broken to build the venue
|-
| '''built'''
| Insert a date range of when the venue was under construction
|-
| '''opened'''
| Insert the date of when it opened
|-
| '''renovated'''
| Insert the date of when it was renovated
|-
| '''expanded'''
| Insert the date of when it was expanded
|-
| '''closed'''
| Insert the date of when it was closed
|-
| '''demolished'''
| Insert the date of when it was demolished
|-
| '''owner'''
| Insert the name(s) of the venue's owner(s)
|-
| '''operator'''
| Insert the name(s) of the venue's operator(s)
|-
| '''roof'''
| Enter the roof type of the venue if indoors/covered (e.g. retractable, domed, translucent)
|-
| '''surface'''
| Enter the surface of the venue (e.g. grass, sand, artificial turf)
|-
| '''scoreboard'''
| Enter the details of any scoreboard at the venue. If specific details are not known, just enter "Yes" if the venue has a scoreboard or "No" if there is none.
|-
| '''screens'''
| Enter the number of theatre screens.
|-
| '''current_use'''
| Enter the current use of the venue.
|-
| '''production'''
| Enter the theatrical production currently being housed at the venue.
|-
| '''cost'''
| Enter the construction cost, preferably in the currency that the venue is located in (see [[Wikipedia:Manual of Style (dates and numbers)|WP:DATE]] for details) Per its own documentation, the [[:template:inflation|inflation template]] '''must not''' be used.
|-
| '''architectural_style'''
| Insert the name(s) of the venue's architectural style(s)
|-
| '''architect'''
| Insert the name(s) of the venue's architect(s)
|-
| '''builder'''
| Name(s) of the venue's builder(s)
|-
| '''project_manager'''
| Insert the name(s) of the project manager(s) who led the venue's construction
|-
| '''structural_engineer'''
| Insert the name(s) of the venue's structural engineer(s)
|-
| '''services_engineer'''
| Insert the name(s) of the venue's services engineer(s)
|-
| '''general_contractor'''
| Insert the name(s) of the venue's general contractor(s)
|-
| '''main_contractors'''
| Insert the name(s) of the venue's main contractor(s)
|-
| '''seating_type'''
| soft seat, reserved seating
|-
| '''capacity'''
| Insert the seating capacity of the venue. If it is a multi-purpose venue, use the format:
<blockquote>'''Capacity (Purpose)'''</blockquote>
|-
| '''main_venue'''
| Name of the main venue in a complex (use only for complexes, not individual venues)
|-
| '''main_venue_capacity'''
| Capacity of the main venue in a complex (use only for complexes, not individual venues)
|-
| '''facilities'''
| List of facilities in a complex (use only for complexes, not individual venues)
|-
| '''suites'''
| Insert the number of suites
|-
| '''record_attendance'''
| Insert the all-time record attendance of the venue. (include the date and event if you wish) If it is a multi-purpose venue, use the format:
<blockquote>'''Record Attendance (Date & Event)'''</blockquote>
|-
| '''dimensions'''
| Insert the dimensions of the venue:
*For a football (soccer) pitch size, use the format:
<blockquote>'''105 × 68 m'''</blockquote>
*For baseball dimensions, use the format:
<blockquote>'''Left field: 300 ft (91 m)<br/>Center field: 400 ft (122 m)<br/>Right field: 300 ft (91 m)'''</blockquote>
|-
| '''dimensions_label'''
| Override the default label of "Field size". For example if the venue is a pool, can be changed to "Pool size"
|-
| '''field_shape'''
| Oval, rectangular or circular
|-
| '''acreage'''
| Insert the acreage.
|-
| '''tenants'''
| Insert the teams and any other parties who use the venue as their home stadium or arena. Use the format:
<blockquote>'''TeamName (league/organization) year–year'''</blockquote>
Alternatively, you can use the {{tl|infobox venue/tenantlist}} sub-template to automatically line rows up.
|-
| '''embedded'''
| Embed another infobox with such capability like {{tl|designation list}} and {{tl|infobox NRHP}}. See their respective documentation for more information.
|-
| '''website'''
| Insert the website, preferably with {{tl|URL}}
|-
| '''public_transit'''
| The nearest [[public transport]] stop. <br /> <nowiki> Example: [[Roosevelt/State (CTA)|Roosevelt Station]], [[Chicago Transit Authority]]</nowiki>
|}
=== Mapframe parameters ===
{{Infobox mapframe/doc/parameters}}
=== Pushpin map ===
{{Location map/doc/infobox parameters}}
== Notes ==
{{Reflist|refs=
<ref name="location">As per RfC "Naming countries in infoboxes": When identifying a location, city or region in the United States or United Kingdom, the preferred approach is to use the country abbreviations allowed by [[MOS:ACRO]], such as "Portsmouth, New Hampshire, U.S." and "Cardiff, Wales, UK", rather than spelling out the full country name. Avoid using abbreviations for states or provinces in all nations. {{xt|New Hampshire}} rather than {{!xt|NH}}, {{xt|New South Wales}} rather than {{!xt|NSW}}, or {{xt|British Columbia}} rather than {{!xt|BC}} (see [[MOS:POSTABBR]]). Cities such as New York City and London may be rendered as "New York City, U.S." and "London, UK" or simply "New York City" and "London". Also, these should not be linked when the context makes it clear (see [[MOS:OVERLINK]]). If only the country name is included, it may be written out in full.
</ref>
}}
== Example ==
{{Infobox venue
| name = Narendra Modi Stadium
| native_name =
| native_name_lang = 639-2
| nickname = {{unbulleted list|GCA Stadium|Motera Cricket Stadium}}
| logo_image =
| logo_size =
| logo_caption =
| image = Narendra_Modi_Stadium_view_from_the_gallery.jpg
| image_size = 300px
| image_caption = Inside view of the arena
| map_caption = The stadium in India
| pushpin_map = India
| elevation = 84 m
| public_transit = {{rint|Bus}} Narendra Modi Stadium<br />{{rint|Metro}} [[Motera Stadium metro station|Motera Stadium]] {{rcb|Ahmedabad Metro|Red|yes}}
| fullname = Narendra Modi Stadium
| former_names = {{bulleted list| Sardar Patel stadium (former stadium 1982–2021)| Motera Cricket Stadium}}
| address = [[Sardar Vallabhbhai Patel Sports Enclave]], [[Motera]],
| city = [[Ahmedabad]],
| country = India
| location = Ahmedabad, [[Ahmedabad district]], [[Gujarat]], [[India]]
| coordinates = {{Coord|23|05|29|N|72|35|50|E}}
| groundbreaking = {{ubl|1983 (former structure) |December 2016 (New stadium)}}
| built = September 2015- February 2020<ref name=S>{{Cite web |title=Modern Marvel: World's largest stadium |url=https://m.youtube.com/watch?v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |access-date=2023-08-28 |website=YouTube |publisher=[[History TV18]] |archive-date=5 October 2023 |archive-url=https://web.archive.org/web/20231005124506/https://www.youtube.com/watch?app=desktop&v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |url-status=live }}</ref><ref name=India/><br/> 12 November 1983 (former structure)
| opened = 24 February 2020 (New stadium)<ref name=India>{{cite web|website=[[India Today]]|title=World's largest cricket stadium in Motera named Narendra Modi stadium|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref><br/>12 November 1983 (former structure)
| renovated =
| expanded =
| closed = September 2015 (former Sardar Patel stadium)
| demolished = September 2015 (former Saradar Patel stadium)<ref name=S/>
| parking = 13000<ref name=Seating>{{cite web|title=Motera Cricket stadium in Ahmedabad of over one lakh to be largest in the world.|url=https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|website=India times|date=7 January 2019|access-date=12 January 2019|archive-date=12 January 2019|archive-url=https://web.archive.org/web/20190112200545/https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|url-status=live}}</ref>{{Efn|It is said that parking for 10,000 two-wheelers and 3000 cars is available}}
| owner = [[Gujarat Cricket Association]]
| operator = Gujarat Cricket Association
| acreage = {{convert|63|acre|ha|abbr=on}}<ref name= Populous>{{cite web|title= Narendra Modi stadium |website=Populous.com|url=https://populous.com/project/narendra-modi-stadium&ved=2ahUKEwj-pcPL1aSBAxU6bmwGHdTjB5YQFnoECBoQAQ&usg=AOvVaw0wiQYdH-m542tBncBhe5E3}}</ref>
| surface = [[Bermuda grass]]<ref name=S/>
| scoreboard = No
| cost = {{INRConvert|800|c}} (New stadium 2015-2020)<ref>{{cite news |last1=Umarji |first1=Vinay |title=Kem Chho Trump: World's largest cricket stadium gearing up to host US Prez |url=https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |access-date=25 March 2021 |work=Business Standard India |date=12 February 2020 |archive-date=13 February 2020 |archive-url=https://web.archive.org/web/20200213161424/https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |url-status=live }}</ref>
| type = Stadium
| event = {{hlist|Sporting events|concerts}}
| seating_type = [[Stadium seating]]
| suites = 76
| architect = * Andrew James ([[Populous (company)|Populous design firm]]) (Narendra Modi stadium)<ref name=S/>
* [[Shashi Prabhu]] (former Sardar Patel stadium)<ref>{{cite web |url=http://www.spa-aec.com/spaweb/allprojects.html |title=Complete Project List |access-date=1 April 2011 |url-status=dead |archive-url=https://web.archive.org/web/20110823063136/http://www.spa-aec.com/spaweb/allprojects.html |archive-date=23 August 2011}}</ref>
| builder = [[Larsen and Toubro]]<ref name=AA/>
| main_contractors = Larsen and Toubro<ref name=S/>
| capacity = 132,000<ref name=AA>{{cite web|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|website=[[India Today]]|title=World's largest cricket stadium...|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref> (2020–present)<ref name="1.32 lakh">{{cite news |last1=Gupta |first1=Rishabh |title=IND vs ENG: 'Outstanding for Indian cricket,' says Virat Kohli on Narendra Modi Stadium |url=https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |access-date=25 March 2020 |work=India TV News |date=24 February 2021 |language=en |archive-date=7 October 2022 |archive-url=https://web.archive.org/web/20221007124500/https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |url-status=live }})</ref>
*54,000 (2006–2015)<ref name='htold'>{{cite news|title=Why Sardar Patel Stadium in Motera, Ahmedabad will make cricket history|url=https://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|access-date=10 December 2016|newspaper=Hindustan Times|date=10 December 2016|archive-date=10 December 2016|archive-url=https://web.archive.org/web/20161210175135/http://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|url-status=live}}</ref><ref name=Cricinfo>[http://www.espncricinfo.com/ci/content/ground/57851.html Sardar Patel Stadium, Motera, Ahmedabad, India] {{Webarchive|url=https://web.archive.org/web/20181226140409/http://www.espncricinfo.com/ci/content/ground/57851.html |date=26 December 2018 }}. ESPN</ref>
*49,000 (1982–2006)
| record_attendance = 101,566<ref>{{cite tweet |last=Shah |first=Jay |author-link=Jay Shah |user=JayShah |number=1596822586679504897 |date=27 November 2022 |title=Extremely delighted & proud to receive the Guinness World Record for the largest attendance at a T20 match when 101,566 people witnessed the epic @IPL final at @GCAMotera's magnificent Narendra Modi Stadium on 29 May 2022. A big thanks to our fans for making this possible! @BCCI https://t.co/JHilbDLSB2 |language=en |access-date=14 December 2022 |archive-url=https://web.archive.org/web/20221130125825/https://twitter.com/JayShah/status/1596822586679504897 |archive-date=30 November 2022 |url-status=live}}</ref> <br/> ([[2022 Indian Premier League final|2022 IPL Final]])<br/> {{primary source inline|date=September 2023}}
| executive_suites =
| dimensions = {{convert|180|yd|order=flip}} x {{convert|150|yd|order=flip}}<ref name="Motera Stadium PM Modi's Vision">{{cite news |last1=Rao |first1=K. Shriniwas |title=New Motera stadium is Prime Minister Narendra Modi's vision, says Amit Shah |url=https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |access-date=25 March 2021 |work=The Times of India |date=31 August 2019 |language=en |archive-date=1 September 2019 |archive-url=https://web.archive.org/web/20190901053105/https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |url-status=live }}</ref>
| field_shape = Oval <ref name=S/>
| tenants = [[Gujarat cricket team]] (1983–present)<br /> [[Indian national cricket team |India cricket team]] (1983–present)<br/>[[Gujarat women's cricket team]]<br/>[[India women's national cricket team]] (2011–present)<br/>[[Gujarat Titans]] (2022–present)<br />[[Rajasthan Royals]] (2010–2014)
| website = {{URL|gujaratcricketassociation.com|Gujrat cricket association's website}}
| embedded = {{infobox cricket ground
| embed = yes
| country = India
| location = [[Motera]], [[Ahmedabad]], [[Gujarat]]
| establishment =
| operator = Gujarat Cricket Association
| tenants =
| architect =
| end1 = Adani Pavilion End{{citation needed|date=September 2023}}
| end2 = Reliance End{{citation needed|date=September 2023}}
| international = true
| firstodidate = 5 October
| firstodiyear = 1984
| firstodihome = India
| firstodiaway = Australia
| lastodidate = 4 November
| lastodiyear = 2023
| lastodihome = Australia
| lastodiaway = England
| firsttestdate = 12–16 November
| firsttestyear = 1983
| firsttesthome = India
| firsttestaway = West Indies
| lasttestdate = 9–13 March
| lasttestyear = 2023
| lasttesthome = India
| lasttestaway = Australia
| firstt20idate = 28 December
| firstt20iyear = 2012
| firstt20ihome = India
| firstt20iaway = Pakistan
| lastt20idate = 1 February
| lastt20iyear = 2023
| lastt20ihome = India
| lastt20iaway = New Zealand
| firstwodidate = 12 March
| firstwodiyear = 2012
| firstwodihome = India
| firstwodiaway = Australia
| lastwodidate = 12 April
| lastwodiyear = 2013
| lastwodihome = India
| lastwodiaway = Bangladesh
| firstwt20idate = 22 January
| firstwt20iyear = 2011
| firstwt20ihome = India
| firstwt20iaway = West Indies
| lastwt20idate = 24 January
| lastwt20iyear = 2011
| lastwt20ihome = India
| lastwt20iaway = West Indies
| date = 9 March 2023
| source = [http://content-uk.cricinfo.com/ci/content/ground/57851.html Cricinfo]
}}
}}
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Infobox venue
| name = Narendra Modi Stadium
| native_name =
| native_name_lang = 639-2
| nickname = {{unbulleted list|GCA Stadium|Motera Cricket Stadium}}
| logo_image =
| logo_size =
| logo_caption =
| image = Narendra_Modi_Stadium_view_from_the_gallery.jpg
| image_size = 300px
| image_caption = Inside view of the arena
| map_caption = The stadium in India
| pushpin_map = India
| elevation = 84 m
| public_transit = {{rint|Bus}} Narendra Modi Stadium<br />{{rint|Metro}} [[Motera Stadium metro station|Motera Stadium]] {{rcb|Ahmedabad Metro|Red|yes}}
| fullname = Narendra Modi Stadium
| former_names = {{bulleted list| Sardar Patel stadium (former stadium 1982–2021)| Motera Cricket Stadium}}
| address = [[Sardar Vallabhbhai Patel Sports Enclave]], [[Motera]],
| city = [[Ahmedabad]],
| country = India
| location = Ahmedabad, [[Ahmedabad district]], [[Gujarat]], [[India]]
| coordinates = {{Coord|23|05|29|N|72|35|50|E}}
| groundbreaking = {{ubl|1983 (former structure) |December 2016 (New stadium)}}
| built = September 2015- February 2020<ref name=S>{{Cite web |title=Modern Marvel: World's largest stadium |url=https://m.youtube.com/watch?v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |access-date=2023-08-28 |website=YouTube |publisher=[[History TV18]] |archive-date=5 October 2023 |archive-url=https://web.archive.org/web/20231005124506/https://www.youtube.com/watch?app=desktop&v=nMqdtV9QTro&sa=U&ved=2ahUKEwjy1OP1sYKBAxVDON4KHWnlCWIQtwJ6BAgKEAE&usg=AOvVaw1lZ1vkMULw9vtqp0Q_xO9l |url-status=live }}</ref><ref name=India/><br/> 12 November 1983 (former structure)
| opened = 24 February 2020 (New stadium)<ref name=India>{{cite web|website=[[India Today]]|title=World's largest cricket stadium in Motera named Narendra Modi stadium|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref><br/>12 November 1983 (former structure)
| renovated =
| expanded =
| closed = September 2015 (former Sardar Patel stadium)
| demolished = September 2015 (former Saradar Patel stadium)<ref name=S/>
| parking = 13000<ref name=Seating>{{cite web|title=Motera Cricket stadium in Ahmedabad of over one lakh to be largest in the world.|url=https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|website=India times|date=7 January 2019|access-date=12 January 2019|archive-date=12 January 2019|archive-url=https://web.archive.org/web/20190112200545/https://www.indiatimes.com/news/india/motera-cricket-stadium-in-ahmedabad-with-seating-capacity-of-over-a-lakh-to-be-largest-in-the-world-359982.html|url-status=live}}</ref>{{Efn|It is said that parking for 10,000 two-wheelers and 3000 cars is available}}
| owner = [[Gujarat Cricket Association]]
| operator = Gujarat Cricket Association
| acreage = {{convert|63|acre|ha|abbr=on}}<ref name= Populous>{{cite web|title= Narendra Modi stadium |website=Populous.com|url=https://populous.com/project/narendra-modi-stadium&ved=2ahUKEwj-pcPL1aSBAxU6bmwGHdTjB5YQFnoECBoQAQ&usg=AOvVaw0wiQYdH-m542tBncBhe5E3}}</ref>
| surface = [[Bermuda grass]]<ref name=S/>
| scoreboard = No
| cost = {{INRConvert|800|c}} (New stadium 2015-2020)<ref>{{cite news |last1=Umarji |first1=Vinay |title=Kem Chho Trump: World's largest cricket stadium gearing up to host US Prez |url=https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |access-date=25 March 2021 |work=Business Standard India |date=12 February 2020 |archive-date=13 February 2020 |archive-url=https://web.archive.org/web/20200213161424/https://www.business-standard.com/article/current-affairs/world-s-largest-cricket-stadium-gearing-up-to-host-trump-modi-in-gujarat-120021201119_1.html |url-status=live }}</ref>
| type = Stadium
| event = {{hlist|Sporting events|concerts}}
| seating_type = [[Stadium seating]]
| suites = 76
| architect = * Andrew James ([[Populous (company)|Populous design firm]]) (Narendra Modi stadium)<ref name=S/>
* [[Shashi Prabhu]] (former Sardar Patel stadium)<ref>{{cite web |url=http://www.spa-aec.com/spaweb/allprojects.html |title=Complete Project List |access-date=1 April 2011 |url-status=dead |archive-url=https://web.archive.org/web/20110823063136/http://www.spa-aec.com/spaweb/allprojects.html |archive-date=23 August 2011}}</ref>
| builder = [[Larsen and Toubro]]<ref name=AA/>
| main_contractors = Larsen and Toubro<ref name=S/>
| capacity = 132,000<ref name=AA>{{cite web|url=https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|website=[[India Today]]|title=World's largest cricket stadium...|access-date=24 February 2021|archive-date=4 October 2022|archive-url=https://web.archive.org/web/20221004000110/https://www.indiatoday.in/sports/cricket/story/world-s-largest-cricket-stadium-in-motera-named-narendra-modi-stadium-1772484-2021-02-24|url-status=live}}</ref> (2020–present)<ref name="1.32 lakh">{{cite news |last1=Gupta |first1=Rishabh |title=IND vs ENG: 'Outstanding for Indian cricket,' says Virat Kohli on Narendra Modi Stadium |url=https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |access-date=25 March 2020 |work=India TV News |date=24 February 2021 |language=en |archive-date=7 October 2022 |archive-url=https://web.archive.org/web/20221007124500/https://www.indiatvnews.com/sports/cricket/india-vs-england-virat-kohli-narendra-modi-stadium-outstanding-for-indian-cricket-687042 |url-status=live }})</ref>
*54,000 (2006–2015)<ref name='htold'>{{cite news|title=Why Sardar Patel Stadium in Motera, Ahmedabad will make cricket history|url=https://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|access-date=10 December 2016|newspaper=Hindustan Times|date=10 December 2016|author=HT Correspondent|archive-date=10 December 2016|archive-url=https://web.archive.org/web/20161210175135/http://www.hindustantimes.com/cricket/why-sardar-patel-stadium-in-motera-ahmedabad-will-make-cricket-history/story-7b59h4SZG5yHl7BGkg9agK.html|url-status=live}}</ref><ref name=Cricinfo>[http://www.espncricinfo.com/ci/content/ground/57851.html Sardar Patel Stadium, Motera, Ahmedabad, India] {{Webarchive|url=https://web.archive.org/web/20181226140409/http://www.espncricinfo.com/ci/content/ground/57851.html |date=26 December 2018 }}. ESPN</ref>
*49,000 (1982–2006)
| record_attendance = 101,566<ref>{{cite tweet |last=Shah |first=Jay |author-link=Jay Shah |user=JayShah |number=1596822586679504897 |date=27 November 2022 |title=Extremely delighted & proud to receive the Guinness World Record for the largest attendance at a T20 match when 101,566 people witnessed the epic @IPL final at @GCAMotera's magnificent Narendra Modi Stadium on 29 May 2022. A big thanks to our fans for making this possible! @BCCI https://t.co/JHilbDLSB2 |language=en |access-date=14 December 2022 |archive-url=https://web.archive.org/web/20221130125825/https://twitter.com/JayShah/status/1596822586679504897 |archive-date=30 November 2022 |url-status=live}}</ref> <br/> ([[2022 Indian Premier League final|2022 IPL Final]])<br/> {{primary source inline|date=September 2023}}
| executive_suites =
| dimensions = {{convert|180|yd|order=flip}} x {{convert|150|yd|order=flip}}<ref name="Motera Stadium PM Modi's Vision">{{cite news |last1=Rao |first1=K. Shriniwas |title=New Motera stadium is Prime Minister Narendra Modi's vision, says Amit Shah |url=https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |access-date=25 March 2021 |work=The Times of India |date=31 August 2019 |language=en |archive-date=1 September 2019 |archive-url=https://web.archive.org/web/20190901053105/https://timesofindia.indiatimes.com/sports/cricket/news/new-motera-stadium-is-prime-minister-narendra-modis-vision-says-amit-shah/articleshow/70918902.cms |url-status=live }}</ref>
| field_shape = Oval <ref name=S/>
| tenants = [[Gujarat cricket team]] (1983–present)<br /> [[Indian national cricket team |India cricket team]] (1983–present)<br/>[[Gujarat women's cricket team]]<br/>[[India women's national cricket team]] (2011–present)<br/>[[Gujarat Titans]] (2022–present)<br />[[Rajasthan Royals]] (2010–2014)
| website = {{URL|gujaratcricketassociation.com|Gujrat cricket association's website}}
| embedded = {{infobox cricket ground
| embed = yes
| country = India
| location = [[Motera]], [[Ahmedabad]], [[Gujarat]]
| establishment =
| operator = Gujarat Cricket Association
| tenants =
| architect =
| end1 = Adani Pavilion End{{citation needed|date=September 2023}}
| end2 = Reliance End{{citation needed|date=September 2023}}
| international = true
| firstodidate = 5 October
| firstodiyear = 1984
| firstodihome = India
| firstodiaway = Australia
| lastodidate = 4 November
| lastodiyear = 2023
| lastodihome = Australia
| lastodiaway = England
| firsttestdate = 12–16 November
| firsttestyear = 1983
| firsttesthome = India
| firsttestaway = West Indies
| lasttestdate = 9–13 March
| lasttestyear = 2023
| lasttesthome = India
| lasttestaway = Australia
| firstt20idate = 28 December
| firstt20iyear = 2012
| firstt20ihome = India
| firstt20iaway = Pakistan
| lastt20idate = 1 February
| lastt20iyear = 2023
| lastt20ihome = India
| lastt20iaway = New Zealand
| firstwodidate = 12 March
| firstwodiyear = 2012
| firstwodihome = India
| firstwodiaway = Australia
| lastwodidate = 12 April
| lastwodiyear = 2013
| lastwodihome = India
| lastwodiaway = Bangladesh
| firstwt20idate = 22 January
| firstwt20iyear = 2011
| firstwt20ihome = India
| firstwt20iaway = West Indies
| lastwt20idate = 24 January
| lastwt20iyear = 2011
| lastwt20ihome = India
| lastwt20iaway = West Indies
| date = 9 March 2023
| source = [http://content-uk.cricinfo.com/ci/content/ground/57851.html Cricinfo]
}}
}}
</syntaxhighlight>
'''Explanatory note'''
{{reflist|group=lower-alpha}}
'''References'''
{{reflist}}
== Microformat ==
{{#ifeq:{{SUBPAGENAME}}|sandbox|{{tl|UF-hcard-geo}}|{{UF-hcard-geo}}}}
== TemplateData ==
{{Collapse top|title=[[Wikipedia:TemplateData|TemplateData]] used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools}}
{{TemplateData header|noheader=1}}
<templatedata>{
"description": "This templates generates an infobox to summarize information about stadiums, arenas, or other sporting venues.",
"format": "block",
"paramOrder": [
"name",
"native_name",
"native_name_lang",
"nickname",
"logo_image",
"logo_size",
"logo_upright",
"logo_alt",
"logo_caption",
"image",
"image_size",
"image_upright",
"image_alt",
"image_caption",
"image_map",
"map_size",
"map_alt",
"map_caption",
"pushpin_map",
"pushpin_caption",
"pushpin_label_position",
"pushpin_relief",
"pushpin_label",
"pushpin_map_size",
"mapframe",
"mapframe-caption",
"mapframe-custom",
"mapframe-id",
"mapframe-coord",
"mapframe-wikidata",
"mapframe-point",
"mapframe-shape",
"mapframe-frame-width",
"mapframe-frame-height",
"mapframe-shape-fill",
"mapframe-shape-fill-opacity",
"mapframe-stroke-color",
"mapframe-stroke-width",
"mapframe-marker",
"mapframe-marker-color",
"mapframe-geomask",
"mapframe-geomask-stroke-color",
"mapframe-geomask-stroke-width",
"mapframe-geomask-fill",
"mapframe-geomask-fill-opacity",
"mapframe-zoom",
"mapframe-length_km",
"mapframe-length_mi",
"mapframe-area_km2",
"mapframe-area_mi2",
"mapframe-frame-coordinates",
"mapframe-switcher",
"fullname",
"former_names",
"address",
"city",
"country",
"location",
"coordinates",
"elevation",
"public_transit",
"parking",
"owner",
"operator",
"designation",
"type",
"event",
"seating_type",
"suites",
"capacity",
"record_attendance",
"dimensions",
"dimensions_label",
"acreage",
"field_shape",
"surface",
"scoreboard",
"screens",
"current_use",
"production",
"groundbreaking",
"built",
"opened",
"renovated",
"expanded",
"closed",
"reopened",
"demolished",
"rebuilt",
"years_active",
"cost",
"architectural_style",
"architect",
"builder",
"project_manager",
"structural_engineer",
"services_engineer",
"general_contractor",
"main_contractors",
"tenants",
"website",
"nrhp",
"embedded"
],
"params": {
"name": {
"label": "Official name",
"type": "line",
"required": false,
"description": "Name of the sporting venue",
"default": "{{PAGENAMEBASE}}",
"suggested": true
},
"nickname": {
"label": "Nickname(s)",
"type": "line",
"required": false,
"description": "English alternate names or nickname(s) of the venue"
},
"native_name": {
"label": "Native name",
"type": "string",
"required": false,
"description": "Name of venue in native language/script"
},
"native_name_lang": {
"label": "Native name language",
"type": "string",
"required": false,
"description": "If {{{native_name}}} present, ISO 639-1 language code of language/script of its value"
},
"fullname": {
"label": "Full name",
"type": "string",
"required": false,
"description": "Official full name of the venue"
},
"former_names": {
"label": "Former name(s)",
"type": "string",
"required": false,
"description": "Venue's former name(s) in format \"FormerName (year–year)\"",
"suggested": true
},
"logo_image": {
"label": "Logo image link",
"type": "wiki-file-name",
"required": false,
"description": "Image link to the logo",
"suggested": true
},
"logo_caption": {
"label": "Logo caption",
"type": "string",
"required": false,
"description": "Caption for the stadium logo"
},
"image": {
"label": "Image link",
"type": "wiki-file-name",
"required": false,
"description": "Image link",
"suggested": true
},
"location": {
"label": "Location",
"type": "line",
"required": false
},
"coordinates": {
"label": "Coordinates",
"type": "string",
"required": false,
"description": "Geographical coordinates",
"suggested": true
},
"elevation": {
"label": "Elevation",
"type": "string",
"required": false
},
"built": {
"label": "Build date",
"type": "string",
"required": false,
"description": "Date range of when the venue was under construction"
},
"opened": {
"label": "Date of opening",
"type": "line",
"required": false,
"description": "Date of when it opened",
"suggested": true
},
"renovated": {
"label": "Date of renovation",
"type": "string",
"required": false,
"description": "Date of when it was renovated"
},
"expanded": {
"label": "Date of expansion",
"type": "string",
"required": false,
"description": "Date of when it was expanded"
},
"closed": {
"label": "Date of closing",
"type": "line",
"required": false,
"description": "Date of when it was closed"
},
"demolished": {
"label": "Date of demolishing",
"type": "string",
"required": false,
"description": "Date of when it was demolished"
},
"owner": {
"label": "Owner(s)",
"type": "string",
"required": false,
"description": "Name(s) of the venue's owner(s)"
},
"operator": {
"label": "Operator(s)",
"type": "string",
"required": false,
"description": "Name(s) of the venue's operator(s)"
},
"surface": {
"label": "Surface",
"type": "string",
"required": false,
"description": "Surface of the venue (e.g. grass, sand, artificial turf)"
},
"scoreboard": {
"label": "Scoreboard",
"type": "string",
"required": false,
"description": "Details of scoreboard at the venue. If not known, just enter \"Yes\" if the venue has a scoreboard and \"No\" otherwise."
},
"cost": {
"label": "Cost",
"type": "line",
"required": false,
"description": "Construction cost, preferably in the currency that the venue is located"
},
"architectural_style": {
"label": "Architectural style",
"type": "string",
"required": false,
"description": "Name(s) of venue's architectural style(s)"
},
"architect": {
"label": "Architect(s)",
"type": "string",
"required": false,
"description": "Name(s) of venue's architect(s)"
},
"structural_engineer": {
"label": "Structural engineer(s)",
"type": "string",
"required": false,
"description": "Name(s) of venue's structural engineer(s)"
},
"services_engineer": {
"label": "Services engineer(s)",
"type": "string",
"required": false,
"description": "Name(s) of venue's services engineer(s)"
},
"capacity": {
"label": "Max. legal occupancy",
"type": "number",
"required": false,
"suggested": true
},
"record_attendance": {
"label": "Record attendance",
"type": "string",
"required": false,
"description": "All time record attendance of the venue. If it is a multi-purpose venue, use the format: \"Record Attendance (Date & Event)\""
},
"dimensions": {
"label": "Dimensions",
"type": "string",
"required": false,
"description": "Dimensions of the venue"
},
"tenants": {
"label": "Tenants",
"type": "string",
"required": false,
"description": "The teams and any other parties who use the venue as their home stadium or arena. Use the format: \"TeamName (league/organization) year–year\""
},
"website": {
"label": "Website",
"type": "string",
"required": false,
"suggested": true
},
"public_transit": {
"label": "Public transit",
"type": "string",
"required": false,
"description": "The nearest public transport stop"
},
"parking": {
"label": "Available parking",
"description": "Number of parking spaces available to public",
"example": "2,000 spaces",
"type": "line"
},
"logo_size": {
"label": "Logo image size",
"type": "line"
},
"logo_upright": {
"label": "Logo upright size",
"type": "number",
"default": "1"
},
"logo_alt": {
"label": "Logo image alternative text",
"description": "Accessibility text describing image for screen readers and other assistive technologies",
"type": "string"
},
"image_size": {
"label": "Image size",
"type": "line"
},
"image_upright": {
"label": "Image upright size",
"type": "number",
"default": "1"
},
"image_alt": {
"label": "Image alternative text",
"description": "Accessibility text describing image for screen readers and other assistive technologies",
"type": "string"
},
"image_caption": {
"aliases": [
"caption"
],
"label": "Image caption",
"description": "Caption for the image",
"type": "string"
},
"image_map": {
"label": "Map image",
"type": "wiki-file-name"
},
"map_size": {
"label": "Map size",
"description": "Map image dimensions, defaults to image_size parameter value if not specified",
"type": "line"
},
"map_alt": {
"label": "Map image alternative text",
"description": "Accessibility text describing image for screen readers and other assistive technologies",
"type": "string"
},
"map_caption": {
"label": "Map caption",
"description": "Contextual information to display beneath map image",
"type": "string"
},
"pushpin_map": {},
"pushpin_caption": {},
"pushpin_label_position": {},
"pushpin_relief": {},
"pushpin_label": {},
"pushpin_map_size": {},
"address": {
"suggested": true
},
"city": {
"suggested": true
},
"country": {
"suggested": true
},
"designation": {},
"type": {},
"event": {},
"seating_type": {},
"suites": {
"label": "Suites",
"description": "Number of suites",
"type": "line"
},
"field_shape": {},
"acreage": {
"label": "Acreage",
"type": "line"
},
"screens": {},
"current_use": {},
"production": {},
"groundbreaking": {
"label": "Ground broke date",
"description": "Date when ground was broken to build the venue",
"type": "string"
},
"reopened": {},
"rebuilt": {},
"years_active": {},
"builder": {},
"project_manager": {
"label": "Project manager(s)",
"description": "Name(s) of venue's project manager(s)",
"type": "string"
},
"general_contractor": {
"label": "General contractor(s)",
"description": "Name(s) of venue's general contractor(s)",
"type": "string"
},
"main_contractors": {
"label": "Main contractor(s)",
"description": "Name(s) of venue's main contractor(s)",
"type": "string"
},
"nrhp": {
"label": "NRHP",
"description": "Embed a NRHP infobox",
"type": "string"
},
"embedded": {
"label": "Embedded",
"description": "Embed another infobox",
"type": "string"
},
"mapframe": {},
"mapframe-caption": {},
"mapframe-custom": {},
"mapframe-id": {},
"mapframe-coord": {},
"mapframe-wikidata": {},
"mapframe-point": {},
"mapframe-shape": {},
"mapframe-frame-width": {},
"mapframe-frame-height": {},
"mapframe-shape-fill": {},
"mapframe-shape-fill-opacity": {},
"mapframe-stroke-color": {
"aliases": [
"mapframe-stroke-colour"
]
},
"mapframe-stroke-width": {},
"mapframe-marker": {},
"mapframe-marker-color": {
"aliases": [
"mapframe-marker-colour"
]
},
"mapframe-geomask": {},
"mapframe-geomask-stroke-color": {
"aliases": [
"mapframe-geomask-stroke-colour"
]
},
"mapframe-geomask-stroke-width": {},
"mapframe-geomask-fill": {},
"mapframe-geomask-fill-opacity": {},
"mapframe-zoom": {},
"mapframe-length_km": {},
"mapframe-length_mi": {},
"mapframe-area_km2": {},
"mapframe-area_mi2": {},
"mapframe-frame-coordinates": {
"aliases": [
"mapframe-frame-coord"
]
},
"mapframe-switcher": {},
"dimensions_label": {
"label": "Dimensions label",
"description": "Override the default label of \"Field size\"",
"example": "Pool size",
"type": "string",
"default": "Field size"
}
}
}</templatedata>
{{Collapse bottom}}
== Tracking category ==
{{infobox tracking categories}}
* {{clc|Pages using infobox venue with both map caption and pushpin map}}
* {{clc|Pages using infobox venue with both image map and pushpin map}}
==See also==
{{Buildings and structures infobox templates}}
<includeonly>{{Sandbox other||
<!-- ADD CATEGORIES BELOW THIS LINE AND INTERWIKIS TO WIKIDATA, THANK YOU! -->
[[Category:Buildings and structures infobox templates|Venue]]
[[Category:Music infobox templates|Venue]]
[[Category:Sports infobox templates|Venue]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
4g1go4ibt2ov13egukhu0hlrasixmp0
ಮೋಡ್ಯೂಲ್:Adjacent stations/Ahmedabad Metro
828
29117
373885
2026-04-08T00:18:16Z
en>R'n'B
0
articles for Red and Blue lines are at those titles, not North-South and East-West
373885
Scribunto
text/plain
local nag = "%1 metro station (Ahmedabad)"
local p = {
["system title"] = "[[Ahmedabad Metro]]",
["system icon"] = "[[File:GMRC logo.png|22px|link=Ahmedabad Metro|alt=Logo of GMRC]]",
["color box format"] = "title",
["system color"] = "000080",
["name format"] = "font-size: 150%; font-family:Arial, sans; font-weight: bold; line-height: 100%; color: #000080;",
["header background color"] = "293a54",
["header text color"] = "FFFFFF",
["station format"] = {
"%1 metro station",
},
["lines"] = {
["_default"] = {
["title"] = "[[%1 Line (Ahmedabad Metro)|%1 Line]]",
["color"] = "cccccc",
["text color"] = "FFFFFF",
},
["Blue"] = {
["color"] = "0983ce",
["left terminus"] = "Thaltej Gam",
["right terminus"] = "Vastral Gam",
},
["Red"] = {
["color"] = "f52532",
["left terminus"] = "APMC",
["right terminus"] = {"Mahatma Mandir", "GIFT City"},
["types"] = {
["main"] = {
["title"] = "",
["right terminus"] = "Mahatma Mandir"
},
["branch"] = {
["title"] = "",
["right terminus"] = "GIFT City"
}
}
},
["Yellow"] = {
["color"] = "F2CB00",
["text color"] = "000",
["left terminus"] = "Motera Stadium",
["right terminus"] = "Mahatma Mandir",
},
["Violet"] = {
["color"] = "9C27B0",
["left terminus"] = "GNLU",
["right terminus"] = "GIFT City",
}
},
["aliases"] = {
["blue"] = "Blue",
["red"] = "Red",
["yellow"] = "Yellow",
["violet"] = "Violet",
["line 1"] = "Blue",
["line 2"] = "Red",
["line 3"] = "Yellow",
["line 4"] = "Violet",
["Line 1"] = "Blue",
["Line 2"] = "Red",
["Line 3"] = "Yellow",
["Line 4"] = "Violet"
}
}
return p
9ki52mnstcfovmo6xa2ty82rupf8jid
373886
373885
2026-10-28T05:55:30Z
ChiK
1136
1 revision imported from [[:en:Module:Adjacent_stations/Ahmedabad_Metro]]
373885
Scribunto
text/plain
local nag = "%1 metro station (Ahmedabad)"
local p = {
["system title"] = "[[Ahmedabad Metro]]",
["system icon"] = "[[File:GMRC logo.png|22px|link=Ahmedabad Metro|alt=Logo of GMRC]]",
["color box format"] = "title",
["system color"] = "000080",
["name format"] = "font-size: 150%; font-family:Arial, sans; font-weight: bold; line-height: 100%; color: #000080;",
["header background color"] = "293a54",
["header text color"] = "FFFFFF",
["station format"] = {
"%1 metro station",
},
["lines"] = {
["_default"] = {
["title"] = "[[%1 Line (Ahmedabad Metro)|%1 Line]]",
["color"] = "cccccc",
["text color"] = "FFFFFF",
},
["Blue"] = {
["color"] = "0983ce",
["left terminus"] = "Thaltej Gam",
["right terminus"] = "Vastral Gam",
},
["Red"] = {
["color"] = "f52532",
["left terminus"] = "APMC",
["right terminus"] = {"Mahatma Mandir", "GIFT City"},
["types"] = {
["main"] = {
["title"] = "",
["right terminus"] = "Mahatma Mandir"
},
["branch"] = {
["title"] = "",
["right terminus"] = "GIFT City"
}
}
},
["Yellow"] = {
["color"] = "F2CB00",
["text color"] = "000",
["left terminus"] = "Motera Stadium",
["right terminus"] = "Mahatma Mandir",
},
["Violet"] = {
["color"] = "9C27B0",
["left terminus"] = "GNLU",
["right terminus"] = "GIFT City",
}
},
["aliases"] = {
["blue"] = "Blue",
["red"] = "Red",
["yellow"] = "Yellow",
["violet"] = "Violet",
["line 1"] = "Blue",
["line 2"] = "Red",
["line 3"] = "Yellow",
["line 4"] = "Violet",
["Line 1"] = "Blue",
["Line 2"] = "Red",
["Line 3"] = "Yellow",
["Line 4"] = "Violet"
}
}
return p
9ki52mnstcfovmo6xa2ty82rupf8jid
ಟೆಂಪ್ಲೇಟ್:National men's cricket team
10
29118
373889
2026-04-18T13:24:05Z
en>Primefac
0
Primefac moved page [[Template:Cr]] to [[Template:National men's cricket team]]: expand name for clarity
373889
wikitext
text/x-wiki
{{country data {{{1}}}
| flag link/core
| variant = {{{variant|{{{2|}}}}}}
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = national cricket team
| altvar = cricket
}}<noinclude>{{documentation}}</noinclude>
1elw3hd06h5x6hdlmk25ki5ipamrour
373890
373889
2026-10-28T05:55:31Z
ChiK
1136
1 revision imported from [[:en:Template:National_men's_cricket_team]]
373889
wikitext
text/x-wiki
{{country data {{{1}}}
| flag link/core
| variant = {{{variant|{{{2|}}}}}}
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = national cricket team
| altvar = cricket
}}<noinclude>{{documentation}}</noinclude>
1elw3hd06h5x6hdlmk25ki5ipamrour
ಟೆಂಪ್ಲೇಟ್:National women's cricket team
10
29119
373891
2026-04-18T13:28:15Z
en>Primefac
0
Primefac moved page [[Template:Crw]] to [[Template:National women's cricket team]]: expand name for clarity
373891
wikitext
text/x-wiki
{{country data {{{1}}}
| flag link/core
| variant = {{{variant|{{{2|}}}}}}
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = women's national cricket team
| altvar = cricket
| mw = women's
}}<noinclude>{{documentation}}</noinclude>
l5we83q7qbosb24rm4ufm2iz7fpk1cc
373892
373891
2026-10-28T05:55:31Z
ChiK
1136
1 revision imported from [[:en:Template:National_women's_cricket_team]]
373891
wikitext
text/x-wiki
{{country data {{{1}}}
| flag link/core
| variant = {{{variant|{{{2|}}}}}}
| size = {{{size|}}}
| name = {{{name|}}}
| altlink = women's national cricket team
| altvar = cricket
| mw = women's
}}<noinclude>{{documentation}}</noinclude>
l5we83q7qbosb24rm4ufm2iz7fpk1cc
ಪಾತೆರ:ಮಂಗಳಾ ಕ್ರೀಡಾಂಗಣ
1
29120
373899
2026-10-28T06:15:23Z
Mahaveer Indra
1023
https://fountain.toolforge.org/editathons/tlc-tcy
373899
wikitext
text/x-wiki
{{ವಿಕಿಯೋಜನೆ ತುಳುವೆರೆ ಬದ್ಕ್ ಬುಕ್ಕೊ ಸಾಂಸ್ಕೃತಿಕ ಪರಂಪರೆ}}
0tth3l3wvda31az37nu5uozjh7la6bv
ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ
0
29121
373901
2026-10-28T07:16:48Z
Mahaveer Indra
1023
ಪೊಸ ಬರವು
373901
wikitext
text/x-wiki
'''ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ''' (ಸ್ಟೇಷನ್ ಕೋಡ್: MAQ<ref name="stn_code">{{cite web |title=Station Code Index |url=https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |access-date=25 March 2024 |archive-url=https://web.archive.org/web/20240216225807/https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |archive-date=16 February 2024 |page=7 |date=2023–2024}}</ref>)) ನೈಋತ್ಯ ರೈಲ್ವೆ ವಲಯದ ಮೈಸೂರು ರೈಲ್ವೆ ವಿಭಾಗಡ್ ಇಪ್ಪುನ ಒಂಜಿ ರೈಲ್ವೆ ನಿಲ್ದಾಣ.<ref name="sr_stn">{{cite web |title=SOUTHERN RAILWAY LIST OF STATIONS AS ON 01.04.2023 (CATEGORY- WISE) |url=https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |archive-url=https://web.archive.org/web/20240323095403/https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |archive-date=23 March 2024 |page=2 |date=1 April 2023 |access-date=23 March 2024}}</ref> ಅಕ್ಟೋಬರ್ ೧, ೨೦೨೬ರ್ದ್ ಅನ್ವಯ ಆಪಿಲೆಕ ಉಂದೆನ್ ದಕ್ಷಿಣ ರೈಲ್ವೆ ವಲಯದ ಪಾಲಕ್ಕಾಡ್ ವಿಭಾಗೊರ್ದು ಮೈಸೂರು ವಿಭಾಗಗ್ ವರ್ಗಾವಣೆ ಮಲ್ತ್ದೆರ್.<ref>{{cite web|url=https://egazette.gov.in/(S(midxzkf4kp0yi1xrvxicvvxv))/ViewPDF.aspx|title= MINISTRY OF RAILWAYS(Railway Board) NOTIFICATION New Delhi, the 21st August, 2026|publisher=Government of India,Ministry of Railways|access-date=2 September 2026}}</ref> ಉಂದು ಕೊಂಕಣ ರೈಲ್ವೆ ಅಂಚನೆ ನೈಋತ್ಯ ರೈಲ್ವೆಗ್ ಸಂಪರ್ಕನ್ ಕೊರ್ಪುನ ಒಂಜಿ ಮುಕ್ಯವಾಯಿನ ರೈಲ್ವೇ ನಿಲ್ದಾಣ. ನಮ ದೇಸೊಡು ಇಪ್ಪುನ ಐನ್ ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ಸ್ಟೇಷನ್ಲೆಡ್ ಕುಡ್ಲದ ರೈಲ್ವೇ ನಿಲ್ದಾಣಲಾ ಒಂಜಿ ಆದುಂಡು.
nqsg50k0qc7g54g1df5qr1pmr3geuid
373902
373901
2026-10-28T07:21:03Z
Mahaveer Indra
1023
373902
wikitext
text/x-wiki
'''ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ''' (ಸ್ಟೇಷನ್ ಕೋಡ್: MAQ<ref name="stn_code">{{cite web |title=Station Code Index |url=https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |access-date=25 March 2024 |archive-url=https://web.archive.org/web/20240216225807/https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |archive-date=16 February 2024 |page=7 |date=2023–2024}}</ref>)) ನೈಋತ್ಯ ರೈಲ್ವೆ ವಲಯದ ಮೈಸೂರು ರೈಲ್ವೆ ವಿಭಾಗಡ್ ಇಪ್ಪುನ ಒಂಜಿ ರೈಲ್ವೆ ನಿಲ್ದಾಣ.<ref name="sr_stn">{{cite web |title=SOUTHERN RAILWAY LIST OF STATIONS AS ON 01.04.2023 (CATEGORY- WISE) |url=https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |archive-url=https://web.archive.org/web/20240323095403/https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |archive-date=23 March 2024 |page=2 |date=1 April 2023 |access-date=23 March 2024}}</ref> ಅಕ್ಟೋಬರ್ ೧, ೨೦೨೬ರ್ದ್ ಅನ್ವಯ ಆಪಿಲೆಕ ಉಂದೆನ್ ದಕ್ಷಿಣ ರೈಲ್ವೆ ವಲಯದ ಪಾಲಕ್ಕಾಡ್ ವಿಭಾಗೊರ್ದು ಮೈಸೂರು ವಿಭಾಗಗ್ ವರ್ಗಾವಣೆ ಮಲ್ತ್ದೆರ್.<ref>{{cite web|url=https://egazette.gov.in/(S(midxzkf4kp0yi1xrvxicvvxv))/ViewPDF.aspx|title= MINISTRY OF RAILWAYS(Railway Board) NOTIFICATION New Delhi, the 21st August, 2026|publisher=Government of India,Ministry of Railways|access-date=2 September 2026}}</ref> ಉಂದು ಕೊಂಕಣ ರೈಲ್ವೆ ಅಂಚನೆ ನೈಋತ್ಯ ರೈಲ್ವೆಗ್ ಸಂಪರ್ಕನ್ ಕೊರ್ಪುನ ಒಂಜಿ ಮುಕ್ಯವಾಯಿನ ರೈಲ್ವೇ ನಿಲ್ದಾಣ. ನಮ ದೇಸೊಡು ಇಪ್ಪುನ ಐನ್ ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ಸ್ಟೇಷನ್ಲೆಡ್ ಕುಡ್ಲದ ರೈಲ್ವೇ ನಿಲ್ದಾಣಲಾ ಒಂಜಿ ಆದುಂಡು.
==ಇತಿಹಾಸೊ==
==ಸೇವೆಲು==
== ಸಂಪರ್ಕೊ==
6bmhvld904refe3dj151evzdpht2t83
373903
373902
2026-10-28T07:21:31Z
Mahaveer Indra
1023
/* ಸಂಪರ್ಕೊ */
373903
wikitext
text/x-wiki
'''ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ''' (ಸ್ಟೇಷನ್ ಕೋಡ್: MAQ<ref name="stn_code">{{cite web |title=Station Code Index |url=https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |access-date=25 March 2024 |archive-url=https://web.archive.org/web/20240216225807/https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |archive-date=16 February 2024 |page=7 |date=2023–2024}}</ref>)) ನೈಋತ್ಯ ರೈಲ್ವೆ ವಲಯದ ಮೈಸೂರು ರೈಲ್ವೆ ವಿಭಾಗಡ್ ಇಪ್ಪುನ ಒಂಜಿ ರೈಲ್ವೆ ನಿಲ್ದಾಣ.<ref name="sr_stn">{{cite web |title=SOUTHERN RAILWAY LIST OF STATIONS AS ON 01.04.2023 (CATEGORY- WISE) |url=https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |archive-url=https://web.archive.org/web/20240323095403/https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |archive-date=23 March 2024 |page=2 |date=1 April 2023 |access-date=23 March 2024}}</ref> ಅಕ್ಟೋಬರ್ ೧, ೨೦೨೬ರ್ದ್ ಅನ್ವಯ ಆಪಿಲೆಕ ಉಂದೆನ್ ದಕ್ಷಿಣ ರೈಲ್ವೆ ವಲಯದ ಪಾಲಕ್ಕಾಡ್ ವಿಭಾಗೊರ್ದು ಮೈಸೂರು ವಿಭಾಗಗ್ ವರ್ಗಾವಣೆ ಮಲ್ತ್ದೆರ್.<ref>{{cite web|url=https://egazette.gov.in/(S(midxzkf4kp0yi1xrvxicvvxv))/ViewPDF.aspx|title= MINISTRY OF RAILWAYS(Railway Board) NOTIFICATION New Delhi, the 21st August, 2026|publisher=Government of India,Ministry of Railways|access-date=2 September 2026}}</ref> ಉಂದು ಕೊಂಕಣ ರೈಲ್ವೆ ಅಂಚನೆ ನೈಋತ್ಯ ರೈಲ್ವೆಗ್ ಸಂಪರ್ಕನ್ ಕೊರ್ಪುನ ಒಂಜಿ ಮುಕ್ಯವಾಯಿನ ರೈಲ್ವೇ ನಿಲ್ದಾಣ. ನಮ ದೇಸೊಡು ಇಪ್ಪುನ ಐನ್ ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ಸ್ಟೇಷನ್ಲೆಡ್ ಕುಡ್ಲದ ರೈಲ್ವೇ ನಿಲ್ದಾಣಲಾ ಒಂಜಿ ಆದುಂಡು.
==ಇತಿಹಾಸೊ==
==ಸೇವೆಲು==
== ಸಂಪರ್ಕೊ==
==ಉಲ್ಲೇಕ==
{{reflist}}
39r2mqh946hah2jd7r2v3vl0je7mibo
373905
373903
2026-10-28T07:59:37Z
Mahaveer Indra
1023
/* ಇತಿಹಾಸೊ */
373905
wikitext
text/x-wiki
'''ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ''' (ಸ್ಟೇಷನ್ ಕೋಡ್: MAQ<ref name="stn_code">{{cite web |title=Station Code Index |url=https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |access-date=25 March 2024 |archive-url=https://web.archive.org/web/20240216225807/https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |archive-date=16 February 2024 |page=7 |date=2023–2024}}</ref>)) ನೈಋತ್ಯ ರೈಲ್ವೆ ವಲಯದ ಮೈಸೂರು ರೈಲ್ವೆ ವಿಭಾಗಡ್ ಇಪ್ಪುನ ಒಂಜಿ ರೈಲ್ವೆ ನಿಲ್ದಾಣ.<ref name="sr_stn">{{cite web |title=SOUTHERN RAILWAY LIST OF STATIONS AS ON 01.04.2023 (CATEGORY- WISE) |url=https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |archive-url=https://web.archive.org/web/20240323095403/https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |archive-date=23 March 2024 |page=2 |date=1 April 2023 |access-date=23 March 2024}}</ref> ಅಕ್ಟೋಬರ್ ೧, ೨೦೨೬ರ್ದ್ ಅನ್ವಯ ಆಪಿಲೆಕ ಉಂದೆನ್ ದಕ್ಷಿಣ ರೈಲ್ವೆ ವಲಯದ ಪಾಲಕ್ಕಾಡ್ ವಿಭಾಗೊರ್ದು ಮೈಸೂರು ವಿಭಾಗಗ್ ವರ್ಗಾವಣೆ ಮಲ್ತ್ದೆರ್.<ref>{{cite web|url=https://egazette.gov.in/(S(midxzkf4kp0yi1xrvxicvvxv))/ViewPDF.aspx|title= MINISTRY OF RAILWAYS(Railway Board) NOTIFICATION New Delhi, the 21st August, 2026|publisher=Government of India,Ministry of Railways|access-date=2 September 2026}}</ref> ಉಂದು ಕೊಂಕಣ ರೈಲ್ವೆ ಅಂಚನೆ ನೈಋತ್ಯ ರೈಲ್ವೆಗ್ ಸಂಪರ್ಕನ್ ಕೊರ್ಪುನ ಒಂಜಿ ಮುಕ್ಯವಾಯಿನ ರೈಲ್ವೇ ನಿಲ್ದಾಣ. ನಮ ದೇಸೊಡು ಇಪ್ಪುನ ಐನ್ ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ಸ್ಟೇಷನ್ಲೆಡ್ ಕುಡ್ಲದ ರೈಲ್ವೇ ನಿಲ್ದಾಣಲಾ ಒಂಜಿ ಆದುಂಡು.
==ಇತಿಹಾಸೊ==
ಮಂಗಳೂರು ರೈಲ್ವೆ ಸ್ಟೇಷನ್ ೧೯೦೭ಡ್ ಸುರುವಾಂಡ್. ಆಂಡ, ಅವ್ವೇ ವರ್ಷ ಸುರುತ ರೈಲು ಸೇವೆಲು ಸುರುವಾಂಡ್ ಪನ್ಪಿನೆಕ್ ವಾ ಸರಿಯಾಯಿನ ದಾಖಲೆಲು ಇಜ್ಜಿಂಡಲಾ, ನೇತ್ರಾವತಿ ತುದೆಕ್ ಪಾಡ್ದಿನ ರೈಲ್ವೆ ಸಂಕದ ಬಡಕಾಯಿದ ಕೊಡಿಟ್ ಇಪ್ಪುನ ಒಂಜಿ ಗಾರ್ಡ್ನ ಇಲ್ಲದ ಮಿತ್ತ್ ಇಪ್ಪುನ ಶಂಕುಸ್ಥಾಪನೆದ ಕಲ್ಲ್ಡ್ ಇಂಚ ಬರೆತೆರ್.
''ಕಡೆತ ರಿವೆಟ್ (ಮೊಳೆ) ನ್ ಪಾಡ್ದ್, ೪ನೇ ನವೆಂಬರ್ ೧೯೦೭ಡ್ ಮದ್ರಾಸ್ದ ಗವರ್ನರ್ ಎಚ್.ಇ. ಸರ್ ಆರ್ಥರ್ ಲಾಲಿ, KCMG, GCIE, ಈ ಸೇತುವೆ ಪೂರ್ತಿಯಾತ್ಂಡ್ ಪಂಡ್ದ್ ಅಧಿಕೃತವಾದ್ ಘೋಷಣೆ ಮಲ್ತೆರ್''.
ಈ ಬರವುನು ತೂದು, ಕುಡ್ಲಗ್ ೧೯೦೭ನೇ ಇಸವಿಡ್ ಸುರುವಾಂಡ್ ಪಂಡ್ದ್ ತೀರ್ಮಾನ ಮಲ್ಪೊಲಿ.
ನವೆಂಬರ್ ೪, ೧೯೦೭ಡ್ ಪೊಸತಾದ್ ಕಟ್ಟಿನ ನೇತ್ರಾವತಿ ಸೇತುವೆದ ಮಿತ್ತ್ ಬತ್ತಿನ ಸುರುತ ರೈಲು ಕೇರಳದ ಕಲ್ಲಿಕೋಟೆರ್ದ್ ಬತ್ತ್ಂಡ್ ಪಂಡ್ದ್ ಕೆಲವು ದಾಖಲೆಲು ಉಂಡು. ಆಂಡ ದಕ್ಷಿಣ ರೈಲ್ವೆದ ದಾಖಲೆಡ್ ಇತ್ತಿ ಪ್ರಕಾರ, ಈ ವಲಯಡ್ ಸುರು ಮಲ್ತಿನ ಸುರುತ ರೈಲು, ಪಂಡ 'ರೈಲು ನಂಬರ್-೧', ೧೯೧೪ಡ್ ದುಂಬುದ ಮದ್ರಾಸ್ ಬೊಕ್ಕ ಮಂಗಳೂರು ಬಂದರ್ದ ನಡುಟು ತನ್ನ ಸುರುತ ಪ್ರಯಾಣನ್ ಮಲ್ತ್ಂಡ್ ಪಂದ್ ತೆರಿಯುಂಡು.
ಅಂಚ ಪನ್ಪುನಾಂಡ, ಈ ಬ್ರಾಡ್ಗೇಜ್ ರೈಲ್ವೆ ಮಾರ್ಗನ್ ಮುಖ್ಯವಾದ್ ಮಂಗಳೂರು ಮಣ್ಣ್ದ ಒಡಿಲ್ಲೆನ್ ಹಡಗ್ದ ಮುಖಾಂತರ ಪರದೇಸೊಗು ಕಡಪುಡ್ರ ಸಲಾದ್ ಮದ್ರಾಸ್ ಬಂದರ್ಗ್ ಕೊನೊಯೆರೆ ಉಂಡು ಮಲ್ತ್ದಿತ್ತೆರ್. ಅಂಚಾದ್, ಮದ್ರಾಸ್ಗ್ ಪೋಯಿನ ರೈಲು ನಂಬರ್ ೧, ಒಂಜಿ ವಾರದ ಬೊಕ್ಕ 'ರೈಲು ನಂಬರ್ ೨' ಆದ್ ಪಿರ ಬರೊಂದಿತ್ತ್ಂಡ್. ಕುಡ್ಲಡ್ದ್ ಪೋಯಿನ ರೈಲ್ಡ್, ಓಡುಲು ದಿಂಜಿದಿನ ೩ ಬೋಗಿಲು, ಪ್ರಯಾಣಿಕೆರ್ ಅಂಚನೆ ಅಂಚೆ ಚೀಲೊಲು ಇತ್ತಿನ ನಾಲನೇ ಬೋಗಿ ಇತ್ತ್ಂಡ್. ಅವ್ವೇ ರೈಲು ಇತ್ತೆದ ನಂಬರ್ ೬೦೦೧/೬೦೦೨ ಚೆನ್ನೈ ಸೆಂಟ್ರಲ್-ಮಂಗಳೂರು ಮೇಲ್ ಆತ್ಂಡ್. ಈ ಜಾಗೆಡ್ ಸುರು ಆಯಿನ ರೈಲು ಸೇವೆಲು ಈ ಪ್ರದೇಶದ ಇತಿಹಾಸಡ್ ಒಂಜಿ ಪೊಸ ಅಧ್ಯಾಯನ್ ಸುರು ಮಲ್ತ್ಂಡ್. ಅಂಚನೆ ಈ ಜಾಗೆದ ಎಡ್ಡೆ ಬುಲೆಚಿಲ್ಗ್ ಸಾದಿ ಮಲ್ತ್ ಕೊರ್ಂಡ್. ಆ ಪೊರ್ತುಡು ಮಂಗಳೂರು, ಬ್ರಿಟಿಷೆರೆನ ಆಡಳಿತದ ಅಡಿಟ್ ಮದ್ರಾಸ್ ಪ್ರಾಂತ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಉಳ್ಳಾಲಡ್ ತಲಾ ೧೫೦ ಅಡಿ ಉದ್ದದ ೧೬ ಕಂಬೊಲೆನ್ ಗಲಸ್ದ್ ನೇತ್ರಾವತಿ ಸೇತುವೆ ಕಟ್ಟುನ ಬೇಲೆನ್ ಈ ಪೊರ್ತುಡೇ ಸುರು ಮಲ್ತೆರ್. ೧೯೩೦ನೇ ಇಸವಿಡ್, ಮಂಗಳೂರುನು ಪ್ರಾಯೋಗಿಕ ನಿಲ್ದಾಣೊರ್ದು ಕಾಯಂ ನಿಲ್ದಾಣವಾದ್ ಬದಲಾಯಿಸಾಯೆರ್.
===ದೇಸೊದ ಮಸ್ತ್ ಉದ್ದದ ರೈಲ್===
೧೯೨೯ನೇ ಇಸವಿಡ್ ಗ್ರಾಂಡ್ ಟ್ರಂಕ್ ಎಕ್ಸ್ಪ್ರೆಸ್ ಪುದರ್ದ ರೈಲ್ನ್ ಸುರು ಮಲ್ತೆರ್. ಉಂದು ಮಂಗಳೂರುರ್ದು ಪಾಕಿಸ್ತಾನದ ಪೇಶಾವರಗ್ ಪೋವೊಂದಿತ್ತ್ಂಡ್. ಅಂದಾಜಿ ೧೦೪ ಗಂಟೆ ಇಂದೆಟ್ ಪೋವೊಡಿತ್ತ್ಂಡ್. ಆ ದಿನೊಟ್ಟು, ಉಂದು ದೇಶದ ಅತಿ ಉದ್ದದ ರೈಲು ಮಾರ್ಗ ಆದಿತ್ತ್ಂಡ್.
===ಸ್ವಾತಂತ್ರ್ಯಡ್ದ್ ಬೊಕ್ಕ===
೧೯೭೧ಡ್ ಟಿ.ಎ. ಪೈಕುಲು ರೈಲ್ವೆ ಮಂತ್ರಿಯಾದಿತ್ತಿನ ಪೊರ್ತುಡು, ಮಂಗಳೂರುರ್ದು ದೆಹಲಿಗ್ ಸುರುತ ನೇರ ಸಂಪರ್ಕದ 'ರೈಲು ನಂಬರ್ ೧೩೧/೧೩೨ ಜಯಂತಿ ಜನತಾ ಎಕ್ಸ್ಪ್ರೆಸ್' ಮಂಗಳೂರು ರೈಲ್ವೆ ಸ್ಟೇಷನ್ರ್ದ್ ತನ್ನ ಪ್ರಯಾಣನ್ ಸುರು ಮಲ್ತ್ಂಡ್. ಕೊಂಕಣ ರೈಲ್ವೆ ಕಾರ್ಪೊರೇಷನ್ ಮಾತ್ರ ಅತ್ತಂದೆ, ಮಂಗಳೂರು-ಜಮ್ಮು ತಾವಿ ನವಯುಗ್ ಎಕ್ಸ್ಪ್ರೆಸ್ಲಾ ಜಾರ್ಜ್ ಫರ್ನಾಂಡಿಸ್ ಆರ್ ತನ್ನ ಊರಾಯಿನ ಮಂಗಳೂರುಗ್ ಕೊರಿನ ಒಂಜಿ ಉಡುಗೊರೆ ಆತ್ಂಡ್. ಪಶ್ಚಿಮ ಘಟ್ಟೊಲೆದ ಮುಖಾಂತರ ಕಟ್ಟಿನ ಒಂಜಿ ಮೀಟರ್-ಗೇಜ್ ರೈಲ್ವೆ ಮಾರ್ಗ ಮಂಗಳೂರುನು ಹಾಸನದ ಒಟ್ಟುಗು ಸೇರಾವೊಂದಿತ್ತ್ಂಡ್. ಹಾಸನದ ಮುಖಾಂತರ ಮಂಗಳೂರುನು ಬೆಂಗಳೂರುಗ್ ಸೇರಾವುನ ಈ ಮೀಟರ್-ಗೇಜ್ ಮಾರ್ಗನ್ ಬ್ರಾಡ್-ಗೇಜ್ ಮಾರ್ಗವಾದ್ ಬದಲಾಯಿಯೆರ್. ಈ ಬದಲಾಯಿನ (re-gauged) ಮಾರ್ಗನ್ ಮೇ ೨೦೦೬ಡ್ ಸರಕು ಸಾಗಾಟಗ್ ಬೊಕ್ಕ ಡಿಸೆಂಬರ್ ೨೦೦೭ಡ್ ಪ್ರಯಾಣಿಕೆರೆನ ಸಂಚಾರಗ್ ಸುರು ಮಲ್ತೆರ್. ಮಂಗಳೂರು ಜಾಗೆದ ರೈಲ್ವೆ ಮಾರ್ಗದ ಜಾಲ ಒಂಜಿ ತ್ರಿಕೋನ (triangular) ಆಕಾರಡ್ ಉಂಡು, ಬೊಕ್ಕ ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್, ಮಂಗಳೂರು ಜಂಕ್ಷನ್ ಅಂಚನೆ ನೇತ್ರಾವತಿ ತುದೆತ ರೈಲ್ವೆ ಸೇತುವೆ ಈ ತ್ರಿಕೋನದ ಮೂಜಿ ಮೂಲೆಲಾದ್ ಉಂಡು.
ಮಂಗಳೂರು ರೈಲ್ವೆ ಸ್ಟೇಷನ್ಡ್ ಇಪ್ಪುನ ಐತಿಹಾಸಿಕ ನಾಮಫಲಕ, ಮದ್ರಾಸ್ಗ್ (ಇತ್ತೆದ ಚೆನ್ನೈ) ಇಪ್ಪುನ ದೂರೊನು ತೋಜಾವುಂಡು.
ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ರ್ದು ಒಂಜಿ ರೈಲ್ವೆ ಸೈಡಿಂಗ್ (ಮಾರ್ಗ) ಮಂಗಳೂರು ನಗರದ ಪೋರ್ಟ್ (ಬಂದರ್) ಜಾಗೆಡ್ ಇಪ್ಪುನ ಐತಿಹಾಸಿಕ ಪರತ್ತ್ ರೈಲ್ವೆ ಗೂಡ್ಸ್-ಶೆಡ್ಗ್ (ಸರಕು-ಕೊಟ್ಟಿಗೆಗ್) ಪೋಪುಂಡು.
==ಸೇವೆಲು==
== ಸಂಪರ್ಕೊ==
==ಉಲ್ಲೇಕ==
{{reflist}}
4g71an0fan4nl351njns1m463o2lbju
373906
373905
2026-10-28T08:00:46Z
Mahaveer Indra
1023
/* ಸ್ವಾತಂತ್ರ್ಯಡ್ದ್ ಬೊಕ್ಕ */
373906
wikitext
text/x-wiki
'''ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ''' (ಸ್ಟೇಷನ್ ಕೋಡ್: MAQ<ref name="stn_code">{{cite web |title=Station Code Index |url=https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |access-date=25 March 2024 |archive-url=https://web.archive.org/web/20240216225807/https://indianrailways.gov.in/railwayboard/uploads/directorate/coaching/TAG_2023-24/Station_Code_Index.pdf |archive-date=16 February 2024 |page=7 |date=2023–2024}}</ref>)) ನೈಋತ್ಯ ರೈಲ್ವೆ ವಲಯದ ಮೈಸೂರು ರೈಲ್ವೆ ವಿಭಾಗಡ್ ಇಪ್ಪುನ ಒಂಜಿ ರೈಲ್ವೆ ನಿಲ್ದಾಣ.<ref name="sr_stn">{{cite web |title=SOUTHERN RAILWAY LIST OF STATIONS AS ON 01.04.2023 (CATEGORY- WISE) |url=https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |website=Portal of Indian Railways |publisher=Centre For Railway Information Systems |archive-url=https://web.archive.org/web/20240323095403/https://sr.indianrailways.gov.in/cris//uploads/files/1686913242750-SR%20-LIST%20OF%20STATIONS-2023.pdf |archive-date=23 March 2024 |page=2 |date=1 April 2023 |access-date=23 March 2024}}</ref> ಅಕ್ಟೋಬರ್ ೧, ೨೦೨೬ರ್ದ್ ಅನ್ವಯ ಆಪಿಲೆಕ ಉಂದೆನ್ ದಕ್ಷಿಣ ರೈಲ್ವೆ ವಲಯದ ಪಾಲಕ್ಕಾಡ್ ವಿಭಾಗೊರ್ದು ಮೈಸೂರು ವಿಭಾಗಗ್ ವರ್ಗಾವಣೆ ಮಲ್ತ್ದೆರ್.<ref>{{cite web|url=https://egazette.gov.in/(S(midxzkf4kp0yi1xrvxicvvxv))/ViewPDF.aspx|title= MINISTRY OF RAILWAYS(Railway Board) NOTIFICATION New Delhi, the 21st August, 2026|publisher=Government of India,Ministry of Railways|access-date=2 September 2026}}</ref> ಉಂದು ಕೊಂಕಣ ರೈಲ್ವೆ ಅಂಚನೆ ನೈಋತ್ಯ ರೈಲ್ವೆಗ್ ಸಂಪರ್ಕನ್ ಕೊರ್ಪುನ ಒಂಜಿ ಮುಕ್ಯವಾಯಿನ ರೈಲ್ವೇ ನಿಲ್ದಾಣ. ನಮ ದೇಸೊಡು ಇಪ್ಪುನ ಐನ್ ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ಸ್ಟೇಷನ್ಲೆಡ್ ಕುಡ್ಲದ ರೈಲ್ವೇ ನಿಲ್ದಾಣಲಾ ಒಂಜಿ ಆದುಂಡು.
==ಇತಿಹಾಸೊ==
ಮಂಗಳೂರು ರೈಲ್ವೆ ಸ್ಟೇಷನ್ ೧೯೦೭ಡ್ ಸುರುವಾಂಡ್. ಆಂಡ, ಅವ್ವೇ ವರ್ಷ ಸುರುತ ರೈಲು ಸೇವೆಲು ಸುರುವಾಂಡ್ ಪನ್ಪಿನೆಕ್ ವಾ ಸರಿಯಾಯಿನ ದಾಖಲೆಲು ಇಜ್ಜಿಂಡಲಾ, ನೇತ್ರಾವತಿ ತುದೆಕ್ ಪಾಡ್ದಿನ ರೈಲ್ವೆ ಸಂಕದ ಬಡಕಾಯಿದ ಕೊಡಿಟ್ ಇಪ್ಪುನ ಒಂಜಿ ಗಾರ್ಡ್ನ ಇಲ್ಲದ ಮಿತ್ತ್ ಇಪ್ಪುನ ಶಂಕುಸ್ಥಾಪನೆದ ಕಲ್ಲ್ಡ್ ಇಂಚ ಬರೆತೆರ್.
''ಕಡೆತ ರಿವೆಟ್ (ಮೊಳೆ) ನ್ ಪಾಡ್ದ್, ೪ನೇ ನವೆಂಬರ್ ೧೯೦೭ಡ್ ಮದ್ರಾಸ್ದ ಗವರ್ನರ್ ಎಚ್.ಇ. ಸರ್ ಆರ್ಥರ್ ಲಾಲಿ, KCMG, GCIE, ಈ ಸೇತುವೆ ಪೂರ್ತಿಯಾತ್ಂಡ್ ಪಂಡ್ದ್ ಅಧಿಕೃತವಾದ್ ಘೋಷಣೆ ಮಲ್ತೆರ್''.
ಈ ಬರವುನು ತೂದು, ಕುಡ್ಲಗ್ ೧೯೦೭ನೇ ಇಸವಿಡ್ ಸುರುವಾಂಡ್ ಪಂಡ್ದ್ ತೀರ್ಮಾನ ಮಲ್ಪೊಲಿ.
ನವೆಂಬರ್ ೪, ೧೯೦೭ಡ್ ಪೊಸತಾದ್ ಕಟ್ಟಿನ ನೇತ್ರಾವತಿ ಸೇತುವೆದ ಮಿತ್ತ್ ಬತ್ತಿನ ಸುರುತ ರೈಲು ಕೇರಳದ ಕಲ್ಲಿಕೋಟೆರ್ದ್ ಬತ್ತ್ಂಡ್ ಪಂಡ್ದ್ ಕೆಲವು ದಾಖಲೆಲು ಉಂಡು. ಆಂಡ ದಕ್ಷಿಣ ರೈಲ್ವೆದ ದಾಖಲೆಡ್ ಇತ್ತಿ ಪ್ರಕಾರ, ಈ ವಲಯಡ್ ಸುರು ಮಲ್ತಿನ ಸುರುತ ರೈಲು, ಪಂಡ 'ರೈಲು ನಂಬರ್-೧', ೧೯೧೪ಡ್ ದುಂಬುದ ಮದ್ರಾಸ್ ಬೊಕ್ಕ ಮಂಗಳೂರು ಬಂದರ್ದ ನಡುಟು ತನ್ನ ಸುರುತ ಪ್ರಯಾಣನ್ ಮಲ್ತ್ಂಡ್ ಪಂದ್ ತೆರಿಯುಂಡು.
ಅಂಚ ಪನ್ಪುನಾಂಡ, ಈ ಬ್ರಾಡ್ಗೇಜ್ ರೈಲ್ವೆ ಮಾರ್ಗನ್ ಮುಖ್ಯವಾದ್ ಮಂಗಳೂರು ಮಣ್ಣ್ದ ಒಡಿಲ್ಲೆನ್ ಹಡಗ್ದ ಮುಖಾಂತರ ಪರದೇಸೊಗು ಕಡಪುಡ್ರ ಸಲಾದ್ ಮದ್ರಾಸ್ ಬಂದರ್ಗ್ ಕೊನೊಯೆರೆ ಉಂಡು ಮಲ್ತ್ದಿತ್ತೆರ್. ಅಂಚಾದ್, ಮದ್ರಾಸ್ಗ್ ಪೋಯಿನ ರೈಲು ನಂಬರ್ ೧, ಒಂಜಿ ವಾರದ ಬೊಕ್ಕ 'ರೈಲು ನಂಬರ್ ೨' ಆದ್ ಪಿರ ಬರೊಂದಿತ್ತ್ಂಡ್. ಕುಡ್ಲಡ್ದ್ ಪೋಯಿನ ರೈಲ್ಡ್, ಓಡುಲು ದಿಂಜಿದಿನ ೩ ಬೋಗಿಲು, ಪ್ರಯಾಣಿಕೆರ್ ಅಂಚನೆ ಅಂಚೆ ಚೀಲೊಲು ಇತ್ತಿನ ನಾಲನೇ ಬೋಗಿ ಇತ್ತ್ಂಡ್. ಅವ್ವೇ ರೈಲು ಇತ್ತೆದ ನಂಬರ್ ೬೦೦೧/೬೦೦೨ ಚೆನ್ನೈ ಸೆಂಟ್ರಲ್-ಮಂಗಳೂರು ಮೇಲ್ ಆತ್ಂಡ್. ಈ ಜಾಗೆಡ್ ಸುರು ಆಯಿನ ರೈಲು ಸೇವೆಲು ಈ ಪ್ರದೇಶದ ಇತಿಹಾಸಡ್ ಒಂಜಿ ಪೊಸ ಅಧ್ಯಾಯನ್ ಸುರು ಮಲ್ತ್ಂಡ್. ಅಂಚನೆ ಈ ಜಾಗೆದ ಎಡ್ಡೆ ಬುಲೆಚಿಲ್ಗ್ ಸಾದಿ ಮಲ್ತ್ ಕೊರ್ಂಡ್. ಆ ಪೊರ್ತುಡು ಮಂಗಳೂರು, ಬ್ರಿಟಿಷೆರೆನ ಆಡಳಿತದ ಅಡಿಟ್ ಮದ್ರಾಸ್ ಪ್ರಾಂತ್ಯಡ್ ಇತ್ತ್ಂಡ್. ಉಳ್ಳಾಲಡ್ ತಲಾ ೧೫೦ ಅಡಿ ಉದ್ದದ ೧೬ ಕಂಬೊಲೆನ್ ಗಲಸ್ದ್ ನೇತ್ರಾವತಿ ಸೇತುವೆ ಕಟ್ಟುನ ಬೇಲೆನ್ ಈ ಪೊರ್ತುಡೇ ಸುರು ಮಲ್ತೆರ್. ೧೯೩೦ನೇ ಇಸವಿಡ್, ಮಂಗಳೂರುನು ಪ್ರಾಯೋಗಿಕ ನಿಲ್ದಾಣೊರ್ದು ಕಾಯಂ ನಿಲ್ದಾಣವಾದ್ ಬದಲಾಯಿಸಾಯೆರ್.
===ದೇಸೊದ ಮಸ್ತ್ ಉದ್ದದ ರೈಲ್===
೧೯೨೯ನೇ ಇಸವಿಡ್ ಗ್ರಾಂಡ್ ಟ್ರಂಕ್ ಎಕ್ಸ್ಪ್ರೆಸ್ ಪುದರ್ದ ರೈಲ್ನ್ ಸುರು ಮಲ್ತೆರ್. ಉಂದು ಮಂಗಳೂರುರ್ದು ಪಾಕಿಸ್ತಾನದ ಪೇಶಾವರಗ್ ಪೋವೊಂದಿತ್ತ್ಂಡ್. ಅಂದಾಜಿ ೧೦೪ ಗಂಟೆ ಇಂದೆಟ್ ಪೋವೊಡಿತ್ತ್ಂಡ್. ಆ ದಿನೊಟ್ಟು, ಉಂದು ದೇಶದ ಅತಿ ಉದ್ದದ ರೈಲು ಮಾರ್ಗ ಆದಿತ್ತ್ಂಡ್.
===ಸ್ವಾತಂತ್ರ್ಯಡ್ದ್ ಬೊಕ್ಕ===
೧೯೭೧ಡ್ ಟಿ.ಎ. ಪೈಕುಲು ರೈಲ್ವೆ ಮಂತ್ರಿಯಾದಿತ್ತಿನ ಪೊರ್ತುಡು, ಮಂಗಳೂರುರ್ದು ದೆಹಲಿಗ್ ಸುರುತ ನೇರ ಸಂಪರ್ಕದ 'ರೈಲು ನಂಬರ್ ೧೩೧/೧೩೨ ಜಯಂತಿ ಜನತಾ ಎಕ್ಸ್ಪ್ರೆಸ್' ಮಂಗಳೂರು ರೈಲ್ವೆ ಸ್ಟೇಷನ್ರ್ದ್ ತನ್ನ ಪ್ರಯಾಣನ್ ಸುರು ಮಲ್ತ್ಂಡ್. ಕೊಂಕಣ ರೈಲ್ವೆ ಕಾರ್ಪೊರೇಷನ್ ಮಾತ್ರ ಅತ್ತಂದೆ, ಮಂಗಳೂರು-ಜಮ್ಮು ತಾವಿ ನವಯುಗ್ ಎಕ್ಸ್ಪ್ರೆಸ್ಲಾ ಜಾರ್ಜ್ ಫರ್ನಾಂಡಿಸ್ ಆರ್ ತನ್ನ ಊರಾಯಿನ ಮಂಗಳೂರುಗ್ ಕೊರಿನ ಒಂಜಿ ಉಡುಗೊರೆ ಆತ್ಂಡ್. ಪಶ್ಚಿಮ ಘಟ್ಟೊಲೆದ ಮುಖಾಂತರ ಕಟ್ಟಿನ ಒಂಜಿ ಮೀಟರ್-ಗೇಜ್ ರೈಲ್ವೆ ಮಾರ್ಗ ಮಂಗಳೂರುನು ಹಾಸನದ ಒಟ್ಟುಗು ಸೇರಾವೊಂದಿತ್ತ್ಂಡ್. ಹಾಸನದ ಮುಖಾಂತರ ಮಂಗಳೂರುನು ಬೆಂಗಳೂರುಗ್ ಸೇರಾವುನ ಈ ಮೀಟರ್-ಗೇಜ್ ಮಾರ್ಗನ್ ಬ್ರಾಡ್-ಗೇಜ್ ಮಾರ್ಗವಾದ್ ಬದಲಾಯಿಯೆರ್. ಈ ಬದಲಾಯಿನ ಮಾರ್ಗನ್ ಮೇ ೨೦೦೬ಡ್ ಸರಕು ಸಾಗಾಟಗ್ ಬೊಕ್ಕ ಡಿಸೆಂಬರ್ ೨೦೦೭ಡ್ ಪ್ರಯಾಣಿಕೆರೆನ ಸಂಚಾರಗ್ ಸುರು ಮಲ್ತೆರ್.
==ಸೇವೆಲು==
== ಸಂಪರ್ಕೊ==
==ಉಲ್ಲೇಕ==
{{reflist}}
0ut05t1ui3sic0wtwk7qm46u9l9zp9f
ಪಾತೆರ:ಮಂಗಳೂರು ಸೆಂಟ್ರಲ್ ರೈಲ್ವೆ ನಿಲ್ದಾಣ
1
29122
373907
2026-10-28T08:18:17Z
Mahaveer Indra
1023
https://fountain.toolforge.org/editathons/tlc-tcy
373907
wikitext
text/x-wiki
{{ವಿಕಿಯೋಜನೆ ತುಳುವೆರೆ ಬದ್ಕ್ ಬುಕ್ಕೊ ಸಾಂಸ್ಕೃತಿಕ ಪರಂಪರೆ}}
0tth3l3wvda31az37nu5uozjh7la6bv