Wikipidiya
bolwiki
https://bol.wikipedia.org/wiki/Peji_In_Siri
MediaWiki 1.48.0-wmf.3
first-letter
Media
Inmusamman
Mossa
Ruta
Rutta mossa
Wikipidiya
Wikipidiya mossa
Fayil
Fayil mossa
MediaWiki
MediaWiki mossa
Tempilet
Tempilet mossa
Taimako
Taimako mossa
Panni
Panni mossa
TimedText
TimedText talk
Module
Module talk
Event
Event talk
Tempilet:Delete
10
71
15638
11578
2026-11-09T05:57:50Z
RAPTOR7762
18
/* */
15638
wikitext
text/x-wiki
<includeonly>{{ombox
|type = delete
|text = <big><strong> This {{#switch:{{NAMESPACE}}| = article| Category = category| Template = template| #default = page}} has been nominated for deletion</strong></big><br>To discuss it, please visit <strong>[[{{TALKPAGENAME}}|the nomination page]]</strong> and place<br><code><nowiki>{{subst:Deletion header
| reason = (reason)
|1 = ~~~~
}}</nowiki></code><br><br><em>Do not remove this tag until the deletion nomination is closed.</em><hr><strong>Reason for deletion:</strong><br><em>{{{1|No reason given. PLEASE give a reason, or this request will be denied and removed.<br><br><code><nowiki>{{delete|reason=Give a reason here}}</nowiki></code>}}}</em>
}}
[[Panni:Pages nominated for deletion]]</includeonly><noinclude>
{{Documentation}}
</noinclude>
1wxzgct276aln3agofn4vzx2ij81qvp
15641
15638
2026-11-09T06:02:56Z
RAPTOR7762
18
/* */
15641
wikitext
text/x-wiki
<includeonly>{{ombox
|type = delete
|text = <big><strong> This {{#switch:{{NAMESPACE}}| = article| Panni = category| Tempilet = template| #default = page}} has been nominated for deletion</strong></big><br>To discuss it, please visit <strong>[[{{TALKPAGENAME}}|the nomination page]]</strong> and place<br><code><nowiki>{{subst:Deletion header
| reason = (reason)
|1 = ~~~~
}}</nowiki></code><br><br><em>Do not remove this tag until the deletion nomination is closed.</em><hr><strong>Reason for deletion:</strong><br><em>{{{1|No reason given. PLEASE give a reason, or this request will be denied and removed.<br><br><code><nowiki>{{delete|reason=Give a reason here}}</nowiki></code>}}}</em>
}}
[[Panni:Pages nominated for deletion]]</includeonly><noinclude>
{{Documentation}}
</noinclude>
qfdhco62y71x480i1ki8f5uvrswuf30
Tempilet:Delete/doc
10
72
15639
247
2026-11-09T06:00:34Z
RAPTOR7762
18
15639
wikitext
text/x-wiki
{{Template rating|release}}
This templates tags pages to be deleted. Example:
{{Delete}}
with no reason given
ppbm0wr8l54xjg1sb2bel1qnpc3y30k
Tempilet:Deletion header
10
74
15642
255
2026-11-09T06:05:40Z
RAPTOR7762
18
/* */
15642
wikitext
text/x-wiki
{{#switch:{{NAMESPACE}}
| Mossa = {{Tmbox|
| type = delete
| text = <strong>This page has been nominated for deletion by {{{1}}}</strong><hr><strong>Reason given:</strong><br>{{{reason|Please give a reason for your request or else your request will be DENIED}}} {{{1}}}}}
| Tempilet mossa = {{Tmbox|
| type = delete
| text = <strong>This page has been nominated for deletion by {{{1}}}</strong><hr><strong>Reason given:</strong><br>{{{reason|Please give a reason for your request or else your request will be DENIED}}}}}
| Panni mossa = {{Tmbox|
| type = delete
| text = <strong>This page has been nominated for deletion by {{{1}}}</strong><hr><strong>Reason given:</strong><br>{{{reason|Please give a reason for your request or else your request will be DENIED}}}}}
| Ruta mossa = [[Fayil:Information icon4.svg|30px]] The page you have created, {{Tl|{{{template}}}}} has been nominated for deletion.<br>{{Clickable button|{{TALKPAGENAME:{{{template}}}}}|contest the deletion here}} {{{1}}}
| #default = {{Mbox
| type = delete
| text = This is not a talk page! Please move it to the relevant page}}
}}<noinclude>
{{Documentation}}
</noinclude>
qfjossea1wfcn74ly8b4o0e592mlyuf
15643
15642
2026-11-09T06:07:57Z
RAPTOR7762
18
/* */
15643
wikitext
text/x-wiki
{{#switch:{{NAMESPACE}}
| Mossa = {{Tmbox|
| type = delete
| text = <strong>This page has been nominated for deletion by {{{1}}}</strong><hr><strong>Reason given:</strong><br>{{{reason|Please give a reason for your request or else your request will be DENIED}}} {{{1}}}}}
| Tempilet mossa = {{Tmbox|
| type = delete
| text = <strong>This page has been nominated for deletion by {{{1}}}</strong><hr><strong>Reason given:</strong><br>{{{reason|Please give a reason for your request or else your request will be DENIED}}}}}
| Panni mossa = {{Tmbox|
| type = delete
| text = <strong>This page has been nominated for deletion by {{{1}}}</strong><hr><strong>Reason given:</strong><br>{{{reason|Please give a reason for your request or else your request will be DENIED}}}}}
| Ruta mossa = [[Fayil:Information icon4.svg|30px]] The page you have created, {{{page|}}} has been nominated for deletion.<br>{{Clickable button|{{TALKPAGENAME:{{{page}}}}}|Contest the deletion here}} {{{1}}}
| #default = {{Mbox
| type = delete
| text = This is not a talk page! Please move it to the relevant page}}
}}<noinclude>
{{Documentation}}
</noinclude>
j27s6juhv2y2fs887wzisg5q6vjwf3q
Module:Check for unknown parameters
828
224
15652
8919
2026-10-10T08:31:06Z
Johnuniq
670
implement edit request from [[User:Zackmann08]] to remove 'coord' from default in mapframe_params table per [[Special:PermanentLink/1379472561#Protected edit request on 2 October 2026|talk permalink]]
15652
Scribunto
text/plain
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
require ('strict');
local p = {}
local pushpin_map_params = {
'coordinates',
'pushpin_caption',
'pushpin_relief',
'pushpin_label',
'pushpin_label_position',
'pushpin_label_size',
'pushpin_map',
'pushpin_mark',
'pushpin_mark_size',
'pushpin_alt',
'pushpin_background',
'pushpin_map_size'
}
local mapframe_params = {
'coordinates',
'id',
'qid',
'mapframe',
'mapframe-area_km2',
'mapframe-area_mi2',
'mapframe-caption',
'mapframe-coord',
'mapframe-coordinates',
'mapframe-custom',
'mapframe-frame-coord',
'mapframe-frame-coordinates',
'mapframe-frame-height',
'mapframe-frame-width',
'mapframe-geomask',
'mapframe-geomask-fill',
'mapframe-geomask-fill-opacity',
'mapframe-geomask-stroke-color',
'mapframe-geomask-stroke-colour',
'mapframe-geomask-stroke-width',
'mapframe-height',
'mapframe-id',
'mapframe-length_km',
'mapframe-length_mi',
'mapframe-line',
'mapframe-line-stroke-color',
'mapframe-line-stroke-colour',
'mapframe-marker',
'mapframe-marker-color',
'mapframe-marker-colour',
'mapframe-point',
'mapframe-population',
'mapframe-shape',
'mapframe-shape-fill',
'mapframe-shape-fill-opacity',
'mapframe-shape-stroke-color',
'mapframe-shape-stroke-colour',
'mapframe-stroke-color',
'mapframe-stroke-colour',
'mapframe-stroke-width',
'mapframe-switcher',
'mapframe-type',
'mapframe-width',
'mapframe-wikidata',
'mapframe-zoom'
}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
local function clean(text)
-- Return text cleaned for display and truncated if too long.
-- Strip markers are replaced with dummy text representing the original wikitext.
local pos, truncated
local function truncate(text)
if truncated then
return ''
end
if mw.ustring.len(text) > 25 then
truncated = true
text = mw.ustring.sub(text, 1, 25) .. '...'
end
return mw.text.nowiki(text)
end
local parts = {}
for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
pos = remainder
table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
end
table.insert(parts, truncate(text:sub(pos or 1)))
return table.concat(parts)
end
function p._check(args, pargs)
if type(args) ~= "table" or type(pargs) ~= "table" then
-- TODO: error handling
return
end
-- create the list of known args, regular expressions, and the return string
local knownargs = {}
if isnotempty(args['mapframe_args']) then
for _, v in ipairs(mapframe_params) do
knownargs[v] = 1
end
end
if isnotempty(args['pushpin_map_args']) then
for _, v in ipairs(pushpin_map_params) do
knownargs[v] = 1
end
end
local regexps = {}
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
-- loop over the parent args, and make sure they are on the list
local ignoreblank = isnotempty(args['ignoreblank'])
local showblankpos = isnotempty(args['showblankpositional'])
local values = {}
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
table.insert(values, clean(k))
end
elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(tostring(k), regexp) then
knownflag = true
break
end
end
if not knownflag and ( showblankpos or isnotempty(v) ) then
table.insert(values, k .. ' = ' .. clean(v))
end
end
end
-- add results to the output tables
local res = {}
if #values > 0 then
local unknown_text = args['unknown'] or 'Found _VALUE_, '
if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
local preview_text = args['preview']
if isnotempty(preview_text) then
preview_text = require('Module:If preview')._warning({preview_text})
elseif preview_text == nil then
preview_text = unknown_text
end
unknown_text = preview_text
end
for _, v in pairs(values) do
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
if v == '' then v = ' ' end
-- avoid error with v = 'example%2' ("invalid capture index")
local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
table.insert(res, r)
end
end
return table.concat(res)
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
return p._check(args, pargs)
end
return p
pn8nxt3tzckni7xgmqn4wy1q5b5c05s
15653
15652
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Check_for_unknown_parameters]]
15652
Scribunto
text/plain
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
require ('strict');
local p = {}
local pushpin_map_params = {
'coordinates',
'pushpin_caption',
'pushpin_relief',
'pushpin_label',
'pushpin_label_position',
'pushpin_label_size',
'pushpin_map',
'pushpin_mark',
'pushpin_mark_size',
'pushpin_alt',
'pushpin_background',
'pushpin_map_size'
}
local mapframe_params = {
'coordinates',
'id',
'qid',
'mapframe',
'mapframe-area_km2',
'mapframe-area_mi2',
'mapframe-caption',
'mapframe-coord',
'mapframe-coordinates',
'mapframe-custom',
'mapframe-frame-coord',
'mapframe-frame-coordinates',
'mapframe-frame-height',
'mapframe-frame-width',
'mapframe-geomask',
'mapframe-geomask-fill',
'mapframe-geomask-fill-opacity',
'mapframe-geomask-stroke-color',
'mapframe-geomask-stroke-colour',
'mapframe-geomask-stroke-width',
'mapframe-height',
'mapframe-id',
'mapframe-length_km',
'mapframe-length_mi',
'mapframe-line',
'mapframe-line-stroke-color',
'mapframe-line-stroke-colour',
'mapframe-marker',
'mapframe-marker-color',
'mapframe-marker-colour',
'mapframe-point',
'mapframe-population',
'mapframe-shape',
'mapframe-shape-fill',
'mapframe-shape-fill-opacity',
'mapframe-shape-stroke-color',
'mapframe-shape-stroke-colour',
'mapframe-stroke-color',
'mapframe-stroke-colour',
'mapframe-stroke-width',
'mapframe-switcher',
'mapframe-type',
'mapframe-width',
'mapframe-wikidata',
'mapframe-zoom'
}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
local function clean(text)
-- Return text cleaned for display and truncated if too long.
-- Strip markers are replaced with dummy text representing the original wikitext.
local pos, truncated
local function truncate(text)
if truncated then
return ''
end
if mw.ustring.len(text) > 25 then
truncated = true
text = mw.ustring.sub(text, 1, 25) .. '...'
end
return mw.text.nowiki(text)
end
local parts = {}
for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
pos = remainder
table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
end
table.insert(parts, truncate(text:sub(pos or 1)))
return table.concat(parts)
end
function p._check(args, pargs)
if type(args) ~= "table" or type(pargs) ~= "table" then
-- TODO: error handling
return
end
-- create the list of known args, regular expressions, and the return string
local knownargs = {}
if isnotempty(args['mapframe_args']) then
for _, v in ipairs(mapframe_params) do
knownargs[v] = 1
end
end
if isnotempty(args['pushpin_map_args']) then
for _, v in ipairs(pushpin_map_params) do
knownargs[v] = 1
end
end
local regexps = {}
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
-- loop over the parent args, and make sure they are on the list
local ignoreblank = isnotempty(args['ignoreblank'])
local showblankpos = isnotempty(args['showblankpositional'])
local values = {}
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
table.insert(values, clean(k))
end
elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(tostring(k), regexp) then
knownflag = true
break
end
end
if not knownflag and ( showblankpos or isnotempty(v) ) then
table.insert(values, k .. ' = ' .. clean(v))
end
end
end
-- add results to the output tables
local res = {}
if #values > 0 then
local unknown_text = args['unknown'] or 'Found _VALUE_, '
if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
local preview_text = args['preview']
if isnotempty(preview_text) then
preview_text = require('Module:If preview')._warning({preview_text})
elseif preview_text == nil then
preview_text = unknown_text
end
unknown_text = preview_text
end
for _, v in pairs(values) do
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
if v == '' then v = ' ' end
-- avoid error with v = 'example%2' ("invalid capture index")
local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
table.insert(res, r)
end
end
return table.concat(res)
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
return p._check(args, pargs)
end
return p
pn8nxt3tzckni7xgmqn4wy1q5b5c05s
Module:InfoboxImage
828
244
15711
2025-10-18T09:45:47Z
WOSlinker
329
make changes from sandbox requested by [[User:Hike395]] on talk page
15711
Scribunto
text/plain
-- Inputs:
-- image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link
-- page - page to display for multipage images (DjVu)
-- size - size to display the image
-- maxsize - maximum size for image
-- sizedefault - default size to display the image if size param is blank
-- alt - alt text for image
-- title - title text for image
-- border - set to yes if border
-- center - set to yes, if the image has to be centered
-- upright - upright image param
-- suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it
-- link - page to visit when clicking on image
-- class - HTML classes to add to the image
-- Outputs:
-- Formatted image.
-- More details available at the "Module:InfoboxImage/doc" page
local i = {}
-- List of placeholder images and tracking categories stored in [[Module:InfoboxImage/data]]
-- Other constants:
-- the system-wide default thumbnail size (in px)
local defaultThumbnailSize = 250
-- If page is not a user page, return tracking category. Else return empty.
local function trackingCat(cat)
local ns = mw.title.getCurrentTitle().nsText:lower()
local categories = mw.loadData('Module:InfoboxImage/data').categories
return (ns ~= 'user' and ns ~= 'user talk' and categories[cat]) or ""
end
-- Determine whether image is a placeholder
function i.IsPlaceholder(image)
-- change underscores to spaces
image = mw.ustring.gsub(image, "_", " ");
assert(image ~= nil, 'mw.ustring.gsub(image, "_", " ") must not return nil')
-- if image starts with [[ then remove that and anything after |
if mw.ustring.sub(image,1,2) == "[[" then
image = mw.ustring.sub(image,3);
image = mw.ustring.gsub(image, "([^|]*)|.*", "%1");
assert(image ~= nil, 'mw.ustring.gsub(image, "([^|]*)|.*", "%1") must not return nil')
end
-- Trim spaces
image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');
assert(image ~= nil, "mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1') must not return nil")
-- remove prefix if exists
local allNames = mw.site.namespaces[6].aliases
allNames[#allNames + 1] = mw.site.namespaces[6].name
allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
for i, name in ipairs(allNames) do
if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
break
end
end
-- Trim spaces
image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');
-- capitalise first letter
image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);
local placeholder_image = mw.loadData('Module:InfoboxImage/data').placeholder_image
return placeholder_image[image]
end
local function isempty(x)
return (not x) or x == ""
end
-- Main entry point
function i.InfoboxImage(frame)
local image = frame.args["image"];
if isempty(image) then
return "";
end
if image == " " then
return image;
end
if frame.args["suppressplaceholder"] ~= "no" then
if i.IsPlaceholder(image) == true then
return "";
end
end
if string.find(image, "^%[*https?:") then
-- Error category.
return trackingCat("url_image_links")
end
if mw.ustring.sub(image,1,2) == "[[" then
-- search for thumbnail images and add to tracking cat if found
local cat = "";
if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, "|%s*thumb%s*[|%]]") or mw.ustring.find(image, "|%s*thumbnail%s*[|%]]")) then
cat = trackingCat("thumbnail_images")
end
return image .. cat;
elseif mw.ustring.sub(image,1,2) == "{{" and mw.ustring.sub(image,1,3) ~= "{{{" then
return image;
elseif mw.ustring.sub(image,1,1) == "<" then
return image;
elseif mw.ustring.sub(image,1,8) == mw.ustring.char(127).."'\"`UNIQ" then
-- Found strip marker at begining, so pass don't process at all
return image;
else
local result = "";
local page = frame.args["page"];
local upright = frame.args["upright"] or ""
local size = frame.args["size"];
local maxsize = frame.args["maxsize"];
local sizedefault = frame.args["sizedefault"];
local alt = frame.args["alt"];
local link = frame.args["link"];
local title = frame.args["title"];
local border = frame.args["border"];
local thumbtime = frame.args["thumbtime"] or "";
local center = frame.args["center"];
local class = frame.args["class"];
-- remove prefix if exists
local allNames = mw.site.namespaces[6].aliases
allNames[#allNames + 1] = mw.site.namespaces[6].name
allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
for i, name in ipairs(allNames) do
if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
break
end
end
if not isempty(maxsize) then
-- if no sizedefault nor upright, then set to maxsize
if isempty(sizedefault) and isempty(upright) then
sizedefault = maxsize
end
-- check to see if size bigger than maxsize
local maxsizenumber = tonumber(mw.ustring.match(maxsize,"%d*")) or 0;
if not isempty(size) then
local sizenumber = tonumber(mw.ustring.match(size,"%d*")) or 0;
if sizenumber > maxsizenumber and maxsizenumber > 0 then
size = maxsize;
end
end
-- check to see if upright bigger than maxsize (at default preferred size)
if not isempty(upright) then
local uprightnumber = tonumber(upright) or (upright == "yes" and 0.75) or 0
if uprightnumber*defaultThumbnailSize > maxsizenumber and maxsizenumber > 0 then
upright = tostring(maxsizenumber/defaultThumbnailSize)
end
end
end
-- add px to size if just a number
if (tonumber(size) or 0) > 0 then
size = size .. "px";
end
-- add px to sizedefault if just a number
if (tonumber(sizedefault) or 0) > 0 then
sizedefault = sizedefault .. "px";
end
result = "[[File:" .. image;
if not isempty(page) then
result = result .. "|page=" .. page;
end
if not isempty(size) then
result = result .. "|" .. size;
elseif not isempty(sizedefault) and isempty(upright) then
result = result .. "|" .. sizedefault;
else
result = result .. "|frameless";
end
if center == "yes" then
result = result .. "|center"
end
if not isempty(alt) then
result = result .. "|alt=" .. alt;
end
if not isempty(link) then
result = result .. "|link=" .. link;
end
if border == "yes" then
result = result .. "|border";
end
if upright == "yes" then
result = result .. "|upright";
elseif upright ~= "" then
result = result .. "|upright=" .. upright;
end
if thumbtime ~= "" then
result = result .. "|thumbtime=" .. thumbtime;
end
if not isempty(class) then
result = result .. "|class=" .. class;
end
-- if alt value is a keyword then do not use as a description
if alt == "thumbnail" or alt == "thumb" or alt == "frameless" or alt == "left" or alt == "center" or alt == "right" or alt == "upright" or alt == "border" or mw.ustring.match(alt or "", '^[0-9]*px$', 1) ~= nil then
alt = nil;
end
if not isempty(title) then
-- does title param contain any templatestyles? If yes then set to blank.
if mw.ustring.match(frame:preprocess(title), 'UNIQ%-%-templatestyles', 1) ~= nil then
title = nil;
end
end
if not isempty(title) then
result = result .. "|" .. title;
end
result = result .. "]]";
return result;
end
end
return i;
jhks6vfk9v2iehyrc6dp50ju1s294vf
15712
1079
2026-11-09T06:16:44Z
RAPTOR7762
18
1 revision imported from [[:en:Module:InfoboxImage]]
1077
Scribunto
text/plain
-- Inputs:
-- image - Can either be a bare filename (with or without the File:/Image: prefix) or a fully formatted image link
-- page - page to display for multipage images (DjVu)
-- size - size to display the image
-- maxsize - maximum size for image
-- sizedefault - default size to display the image if size param is blank
-- alt - alt text for image
-- title - title text for image
-- border - set to yes if border
-- center - set to yes, if the image has to be centered
-- upright - upright image param
-- suppressplaceholder - if yes then checks to see if image is a placeholder and suppresses it
-- link - page to visit when clicking on image
-- class - HTML classes to add to the image
-- Outputs:
-- Formatted image.
-- More details available at the "Module:InfoboxImage/doc" page
local i = {}
-- List of placeholder images and tracking categories stored in [[Module:InfoboxImage/data]]
-- Other constants:
-- the system-wide default thumbnail size (in px)
local defaultThumbnailSize = 250
-- If page is not a user page, return tracking category. Else return empty.
local function trackingCat(cat)
local ns = mw.title.getCurrentTitle().nsText:lower()
local categories = mw.loadData('Module:InfoboxImage/data').categories
return (ns ~= 'user' and ns ~= 'user talk' and categories[cat]) or ""
end
-- Determine whether image is a placeholder
function i.IsPlaceholder(image)
-- change underscores to spaces
image = mw.ustring.gsub(image, "_", " ");
assert(image ~= nil, 'mw.ustring.gsub(image, "_", " ") must not return nil')
-- if image starts with [[ then remove that and anything after |
if mw.ustring.sub(image,1,2) == "[[" then
image = mw.ustring.sub(image,3);
image = mw.ustring.gsub(image, "([^|]*)|.*", "%1");
assert(image ~= nil, 'mw.ustring.gsub(image, "([^|]*)|.*", "%1") must not return nil')
end
-- Trim spaces
image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');
assert(image ~= nil, "mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1') must not return nil")
-- remove prefix if exists
local allNames = mw.site.namespaces[6].aliases
allNames[#allNames + 1] = mw.site.namespaces[6].name
allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
for i, name in ipairs(allNames) do
if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
break
end
end
-- Trim spaces
image = mw.ustring.gsub(image, '^[ ]*(.-)[ ]*$', '%1');
-- capitalise first letter
image = mw.ustring.upper(mw.ustring.sub(image,1,1)) .. mw.ustring.sub(image,2);
local placeholder_image = mw.loadData('Module:InfoboxImage/data').placeholder_image
return placeholder_image[image]
end
local function isempty(x)
return (not x) or x == ""
end
-- Main entry point
function i.InfoboxImage(frame)
local image = frame.args["image"];
if isempty(image) then
return "";
end
if image == " " then
return image;
end
if frame.args["suppressplaceholder"] ~= "no" then
if i.IsPlaceholder(image) == true then
return "";
end
end
if string.find(image, "^%[*https?:") then
-- Error category.
return trackingCat("url_image_links")
end
if mw.ustring.sub(image,1,2) == "[[" then
-- search for thumbnail images and add to tracking cat if found
local cat = "";
if mw.title.getCurrentTitle().namespace == 0 and (mw.ustring.find(image, "|%s*thumb%s*[|%]]") or mw.ustring.find(image, "|%s*thumbnail%s*[|%]]")) then
cat = trackingCat("thumbnail_images")
end
return image .. cat;
elseif mw.ustring.sub(image,1,2) == "{{" and mw.ustring.sub(image,1,3) ~= "{{{" then
return image;
elseif mw.ustring.sub(image,1,1) == "<" then
return image;
elseif mw.ustring.sub(image,1,8) == mw.ustring.char(127).."'\"`UNIQ" then
-- Found strip marker at begining, so pass don't process at all
return image;
else
local result = "";
local page = frame.args["page"];
local upright = frame.args["upright"] or ""
local size = frame.args["size"];
local maxsize = frame.args["maxsize"];
local sizedefault = frame.args["sizedefault"];
local alt = frame.args["alt"];
local link = frame.args["link"];
local title = frame.args["title"];
local border = frame.args["border"];
local thumbtime = frame.args["thumbtime"] or "";
local center = frame.args["center"];
local class = frame.args["class"];
-- remove prefix if exists
local allNames = mw.site.namespaces[6].aliases
allNames[#allNames + 1] = mw.site.namespaces[6].name
allNames[#allNames + 1] = mw.site.namespaces[6].canonicalName
for i, name in ipairs(allNames) do
if mw.ustring.lower(mw.ustring.sub(image, 1, mw.ustring.len(name) + 1)) == mw.ustring.lower(name .. ":") then
image = mw.ustring.sub(image, mw.ustring.len(name) + 2);
break
end
end
if not isempty(maxsize) then
-- if no sizedefault nor upright, then set to maxsize
if isempty(sizedefault) and isempty(upright) then
sizedefault = maxsize
end
-- check to see if size bigger than maxsize
local maxsizenumber = tonumber(mw.ustring.match(maxsize,"%d*")) or 0;
if not isempty(size) then
local sizenumber = tonumber(mw.ustring.match(size,"%d*")) or 0;
if sizenumber > maxsizenumber and maxsizenumber > 0 then
size = maxsize;
end
end
-- check to see if upright bigger than maxsize (at default preferred size)
if not isempty(upright) then
local uprightnumber = tonumber(upright) or (upright == "yes" and 0.75) or 0
if uprightnumber*defaultThumbnailSize > maxsizenumber and maxsizenumber > 0 then
upright = tostring(maxsizenumber/defaultThumbnailSize)
end
end
end
-- add px to size if just a number
if (tonumber(size) or 0) > 0 then
size = size .. "px";
end
-- add px to sizedefault if just a number
if (tonumber(sizedefault) or 0) > 0 then
sizedefault = sizedefault .. "px";
end
result = "[[Fayil:" .. image;
if not isempty(page) then
result = result .. "|page=" .. page;
end
if not isempty(size) then
result = result .. "|" .. size;
elseif not isempty(sizedefault) and isempty(upright) then
result = result .. "|" .. sizedefault;
else
result = result .. "|frameless";
end
if center == "yes" then
result = result .. "|center"
end
if not isempty(alt) then
result = result .. "|alt=" .. alt;
end
if not isempty(link) then
result = result .. "|link=" .. link;
end
if border == "yes" then
result = result .. "|border";
end
if upright == "yes" then
result = result .. "|upright";
elseif upright ~= "" then
result = result .. "|upright=" .. upright;
end
if thumbtime ~= "" then
result = result .. "|thumbtime=" .. thumbtime;
end
if not isempty(class) then
result = result .. "|class=" .. class;
end
-- if alt value is a keyword then do not use as a description
if alt == "thumbnail" or alt == "thumb" or alt == "frameless" or alt == "left" or alt == "center" or alt == "right" or alt == "upright" or alt == "border" or mw.ustring.match(alt or "", '^[0-9]*px$', 1) ~= nil then
alt = nil;
end
if not isempty(title) then
-- does title param contain any templatestyles? If yes then set to blank.
if mw.ustring.match(frame:preprocess(title), 'UNIQ%-%-templatestyles', 1) ~= nil then
title = nil;
end
end
if not isempty(title) then
result = result .. "|" .. title;
end
result = result .. "]]";
return result;
end
end
return i;
duzj0eiayi9c2ay2dlqq3n7h3cwmms2
Module:InfoboxImage/data
828
245
15741
2025-10-21T23:10:59Z
Pppery
320
Changed protection settings for "[[Module:InfoboxImage/data]]": Match the protection level of the parent ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
15741
Scribunto
text/plain
local placeholderList = {
"Blue - Replace this image female.svg",
"Blue - Replace this image male.svg",
"Flag of None (square).svg",
"Flag of None.svg",
"Flag of.svg",
"Green - Replace this image female.svg",
"Green - Replace this image male.svg",
"Image is needed female.svg",
"Image is needed male.svg",
"Location map of None.svg",
"Male no free image yet.png",
"Missing flag.png",
"No flag.svg",
"No free portrait.svg",
"No portrait (female).svg",
"No portrait (male).svg",
"Red - Replace this image female.svg",
"Red - Replace this image male.svg",
"Replace this image female.svg",
"Replace this image male (blue).svg",
"Replace this image male.svg",
"Silver - Replace this image female.svg",
"Silver - Replace this image male.svg",
"Replace this image.svg",
"Cricket no pic.png",
"CarersLogo.gif",
"Diagram Needed.svg",
"Example.jpg",
"Image placeholder.png",
"No male portrait.svg",
"Nocover-upload.png",
"NoDVDcover copy.png",
"Noribbon.svg",
"No portrait-BFD-test.svg",
"Placeholder barnstar ribbon.png",
"Project Trains no image.png",
"Image-request.png",
"Sin bandera.svg",
"Sin escudo.svg",
"Replace this image - temple.png",
"Replace this image butterfly.png",
"Replace this image.svg",
"Replace this image1.svg",
"Resolution angle.png",
"Image-No portrait-text-BFD-test.svg",
"Insert image here.svg",
"No image available.png",
"NO IMAGE YET square.png",
"NO IMAGE YET.png",
"No Photo Available.svg",
"No Screenshot.svg",
"No-image-available.jpg",
"Null.png",
"PictureNeeded.gif",
"Place holder.jpg",
"Unbenannt.JPG",
"UploadACopyrightFreeImage.svg",
"UploadAnImage.gif",
"UploadAnImage.svg",
"UploadAnImageShort.svg",
"CarersLogo.gif",
"Diagram Needed.svg",
"No male portrait.svg",
"NoDVDcover copy.png",
"Placeholder barnstar ribbon.png",
"Project Trains no image.png",
"Image-request.png",
"Noimage.gif",
}
local placeholder_image = {}
for _, val in ipairs(placeholderList) do
placeholder_image[val] = true
end
local categories = {
url_image_links = "[[Category:Pages using infoboxes with URL in image parameter]]",
thumbnail_images = "[[Category:Pages using infoboxes with thumbnail images]]",
}
return { placeholder_image = placeholder_image, categories = categories }
4h39dpz9m6jxmu0vznaup0kyz6rbh4y
15742
1081
2026-11-09T06:16:46Z
RAPTOR7762
18
1 revision imported from [[:en:Module:InfoboxImage/data]]
1080
Scribunto
text/plain
local placeholderList = {
"Blue - Replace this image female.svg",
"Blue - Replace this image male.svg",
"Flag of None (square).svg",
"Flag of None.svg",
"Flag of.svg",
"Green - Replace this image female.svg",
"Green - Replace this image male.svg",
"Image is needed female.svg",
"Image is needed male.svg",
"Location map of None.svg",
"Male no free image yet.png",
"Missing flag.png",
"No flag.svg",
"No free portrait.svg",
"No portrait (female).svg",
"No portrait (male).svg",
"Red - Replace this image female.svg",
"Red - Replace this image male.svg",
"Replace this image female.svg",
"Replace this image male (blue).svg",
"Replace this image male.svg",
"Silver - Replace this image female.svg",
"Silver - Replace this image male.svg",
"Replace this image.svg",
"Cricket no pic.png",
"CarersLogo.gif",
"Diagram Needed.svg",
"Example.jpg",
"Image placeholder.png",
"No male portrait.svg",
"Nocover-upload.png",
"NoDVDcover copy.png",
"Noribbon.svg",
"No portrait-BFD-test.svg",
"Placeholder barnstar ribbon.png",
"Project Trains no image.png",
"Image-request.png",
"Sin bandera.svg",
"Sin escudo.svg",
"Replace this image - temple.png",
"Replace this image butterfly.png",
"Replace this image.svg",
"Replace this image1.svg",
"Resolution angle.png",
"Image-No portrait-text-BFD-test.svg",
"Insert image here.svg",
"No image available.png",
"NO IMAGE YET square.png",
"NO IMAGE YET.png",
"No Photo Available.svg",
"No Screenshot.svg",
"No-image-available.jpg",
"Null.png",
"PictureNeeded.gif",
"Place holder.jpg",
"Unbenannt.JPG",
"UploadACopyrightFreeImage.svg",
"UploadAnImage.gif",
"UploadAnImage.svg",
"UploadAnImageShort.svg",
"CarersLogo.gif",
"Diagram Needed.svg",
"No male portrait.svg",
"NoDVDcover copy.png",
"Placeholder barnstar ribbon.png",
"Project Trains no image.png",
"Image-request.png",
"Noimage.gif",
}
local placeholder_image = {}
for _, val in ipairs(placeholderList) do
placeholder_image[val] = true
end
local categories = {
url_image_links = "[[Panni:Pages using infoboxes with URL in image parameter]]",
thumbnail_images = "[[Panni:Pages using infoboxes with thumbnail images]]",
}
return { placeholder_image = placeholder_image, categories = categories }
sap6jnr4igz0zs0k7fdznyiwlti4mjr
Module:List
828
247
15654
11630
2026-09-12T00:43:13Z
JJMC89
441
move was reverted
11629
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
return list
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
frameOnly = ((frame and frame.args and frame.args.frameonly or '') ~= ''),
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
lyheh2t5yqhjixmg8vlktt3t9sq2ewi
15655
15654
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:List]]
11629
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
return list
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
frameOnly = ((frame and frame.args and frame.args.frameonly or '') ~= ''),
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
lyheh2t5yqhjixmg8vlktt3t9sq2ewi
Module:Message box/fmbox.css
828
255
15735
11022
2026-10-23T19:13:59Z
Izno
318
[[Template talk:Editnotice#Unreadable in dark mode]] IDd this as a potential change.
15735
sanitized-css
text/css
/* {{pp|small=y}} */
.fmbox {
clear: both; /* this sheet does not require overflow-x because of this clear */
margin: 0.2em 0;
border: 1px solid var(--border-color-base, #a2a9b1);
box-sizing: border-box;
color: var(--color-base, #202122);
}
.fmbox:not(.fmbox-editnotice) {
background-color: var(--background-color-interactive-subtle, #f8f9fa);
}
.fmbox-warning {
border: 1px solid #bb7070; /* Dark pink */
background-color: #ffdbdb; /* Pink */
}
.fmbox .mbox-text {
padding: 0.35em 1em;
flex: 1 1 100%;
}
.fmbox .mbox-image,
.fmbox .mbox-imageright {
padding: 4px 2px;
text-align: center;
flex: none;
}
/* keep synced with each other type of message box as this isn't qualified */
.mbox-invalid-type {
text-align: center;
}
@media (min-width: 480px) {
.fmbox {
display: flex;
align-items: center;
}
.fmbox .mbox-image {
/* @noflip */
padding-left: 1em;
}
.fmbox .mbox-imageright {
/* @noflip */
padding-right: 1em;
}
}
@media screen {
html.skin-theme-clientpref-night .fmbox-warning {
background-color: #300; /* Reddish, same hue/saturation as light */
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .fmbox-warning {
background-color: #300; /* Reddish, same hue/saturation as light */
}
}
oog4emrke2xhw2vzw7xpt3wmic9t8pd
15736
15735
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Message_box/fmbox.css]]
15735
sanitized-css
text/css
/* {{pp|small=y}} */
.fmbox {
clear: both; /* this sheet does not require overflow-x because of this clear */
margin: 0.2em 0;
border: 1px solid var(--border-color-base, #a2a9b1);
box-sizing: border-box;
color: var(--color-base, #202122);
}
.fmbox:not(.fmbox-editnotice) {
background-color: var(--background-color-interactive-subtle, #f8f9fa);
}
.fmbox-warning {
border: 1px solid #bb7070; /* Dark pink */
background-color: #ffdbdb; /* Pink */
}
.fmbox .mbox-text {
padding: 0.35em 1em;
flex: 1 1 100%;
}
.fmbox .mbox-image,
.fmbox .mbox-imageright {
padding: 4px 2px;
text-align: center;
flex: none;
}
/* keep synced with each other type of message box as this isn't qualified */
.mbox-invalid-type {
text-align: center;
}
@media (min-width: 480px) {
.fmbox {
display: flex;
align-items: center;
}
.fmbox .mbox-image {
/* @noflip */
padding-left: 1em;
}
.fmbox .mbox-imageright {
/* @noflip */
padding-right: 1em;
}
}
@media screen {
html.skin-theme-clientpref-night .fmbox-warning {
background-color: #300; /* Reddish, same hue/saturation as light */
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .fmbox-warning {
background-color: #300; /* Reddish, same hue/saturation as light */
}
}
oog4emrke2xhw2vzw7xpt3wmic9t8pd
Tempilet:Collapse top
10
971
15676
9312
2026-11-02T09:09:24Z
MSGJ
321
adjust border colour to support dark mode, requested by [[User: Axolitl]]
15676
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Template:Collapse top/styles.css"/>}}
<div style="margin-left:{{{indent|0}}}"><!-- NOTE: width renders incorrectly if added to main STYLE section -->
{| role="presentation" <!-- Template:Collapse top --> class="mw-collapsible mw-archivedtalk {{<includeonly>safesubst:</includeonly>#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}} {{{class|}}}" style="color:inherit; background: {{{bg1|transparent}}}; text-align: left; border: {{{border|1px}}} solid {{{b-color|var(--border-color-subtle, #c8ccd1)}}}; margin: 0.2em auto auto; width:{{<includeonly>safesubst:</includeonly>#if:{{{width|}}}|{{{width}}}|100%}}; clear: {{{clear|both}}}; padding: 1px;"
|-
! class="{{main other|cot-header-mainspace|cot-header-other}}" style="{{<includeonly>safesubst:</includeonly>#if:{{{bg|}}}|background:{{{bg}}}|{{ safesubst:<noinclude/>ifsubst|{{main other|background:#F0F2F5|background:#CCFFCC}}|}}}}; font-size:87%; padding:0.2em 0.3em; text-align:{{<includeonly>safesubst:</includeonly>#if:{{{left|}}}|left|{{<includeonly>safesubst:</includeonly>#if:{{{align|}}}|left|center}}}}; {{<includeonly>safesubst:</includeonly>#if:{{{fc|}}}|color: {{{fc}}};|{{<includeonly>safesubst:</includeonly>#if:{{{bg|}}}|color:#202122|{{ safesubst:<noinclude/>ifsubst|color:black;|}}}}}}" | <div style="font-size:115%;{{<includeonly>safesubst:</includeonly>#if:{{{left|}}}||margin:0 4em}}">{{{1|{{{title|{{{reason|{{{header|{{{heading|{{{result|Extended content}}}}}}}}}}}}}}}}}}</div>
{{<includeonly>safesubst:</includeonly>#if:{{{warning|{{{2|}}}}}}
|{{<includeonly>safesubst:</includeonly>!}}-
{{<includeonly>safesubst:</includeonly>!}} style="text-align:center; font-style:italic;" {{<includeonly>safesubst:</includeonly>!}} {{{2|The following is a closed discussion. {{strongbad|Please do not modify it.}} }}} }}
|-
| style="color:inherit; border: solid {{{border2|1px var(--border-color-subtle, #c8ccd1)}}}; padding: {{{padding|0.6em}}}; background: {{{bg2|var(--background-color-base, #fff)}}};" {{<includeonly>safesubst:</includeonly>!}}<noinclude>
{{lorem ipsum|3}}
{{Collapse bottom}}
{{Documentation}}
</noinclude>
06xs5ichmb6hawliz2r2c2rd6nw89il
15677
15676
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Collapse_top]]
15676
wikitext
text/x-wiki
{{ safesubst:<noinclude/>ifsubst||<templatestyles src="Template:Collapse top/styles.css"/>}}
<div style="margin-left:{{{indent|0}}}"><!-- NOTE: width renders incorrectly if added to main STYLE section -->
{| role="presentation" <!-- Template:Collapse top --> class="mw-collapsible mw-archivedtalk {{<includeonly>safesubst:</includeonly>#if:{{{expand|{{{collapse|}}}}}}||mw-collapsed}} {{{class|}}}" style="color:inherit; background: {{{bg1|transparent}}}; text-align: left; border: {{{border|1px}}} solid {{{b-color|var(--border-color-subtle, #c8ccd1)}}}; margin: 0.2em auto auto; width:{{<includeonly>safesubst:</includeonly>#if:{{{width|}}}|{{{width}}}|100%}}; clear: {{{clear|both}}}; padding: 1px;"
|-
! class="{{main other|cot-header-mainspace|cot-header-other}}" style="{{<includeonly>safesubst:</includeonly>#if:{{{bg|}}}|background:{{{bg}}}|{{ safesubst:<noinclude/>ifsubst|{{main other|background:#F0F2F5|background:#CCFFCC}}|}}}}; font-size:87%; padding:0.2em 0.3em; text-align:{{<includeonly>safesubst:</includeonly>#if:{{{left|}}}|left|{{<includeonly>safesubst:</includeonly>#if:{{{align|}}}|left|center}}}}; {{<includeonly>safesubst:</includeonly>#if:{{{fc|}}}|color: {{{fc}}};|{{<includeonly>safesubst:</includeonly>#if:{{{bg|}}}|color:#202122|{{ safesubst:<noinclude/>ifsubst|color:black;|}}}}}}" | <div style="font-size:115%;{{<includeonly>safesubst:</includeonly>#if:{{{left|}}}||margin:0 4em}}">{{{1|{{{title|{{{reason|{{{header|{{{heading|{{{result|Extended content}}}}}}}}}}}}}}}}}}</div>
{{<includeonly>safesubst:</includeonly>#if:{{{warning|{{{2|}}}}}}
|{{<includeonly>safesubst:</includeonly>!}}-
{{<includeonly>safesubst:</includeonly>!}} style="text-align:center; font-style:italic;" {{<includeonly>safesubst:</includeonly>!}} {{{2|The following is a closed discussion. {{strongbad|Please do not modify it.}} }}} }}
|-
| style="color:inherit; border: solid {{{border2|1px var(--border-color-subtle, #c8ccd1)}}}; padding: {{{padding|0.6em}}}; background: {{{bg2|var(--background-color-base, #fff)}}};" {{<includeonly>safesubst:</includeonly>!}}<noinclude>
{{lorem ipsum|3}}
{{Collapse bottom}}
{{Documentation}}
</noinclude>
06xs5ichmb6hawliz2r2c2rd6nw89il
Module:Navbox/styles.css
828
1010
15664
10394
2026-09-27T20:46:50Z
Izno
318
please test and verify your changes before adding to a page deployed this far. notably, your large copy-paste error here
8936
sanitized-css
text/css
/* {{pp|small=y}} */
.navbox {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
font-size: 88%;
text-align: center;
padding: 1px;
margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */
}
.navbox .navbox {
margin-top: 0; /* No top margin for nested navboxes */
}
.navbox + .navbox-styles + .navbox,
/* category positions are wrapped in an "empty" span in Parsoid [[phab:T378906]] */
.navbox + span.mw-empty-elt + .navbox-styles + .navbox {
margin-top: -1px; /* Single pixel border between adjacent navboxes */
}
.navbox-inner,
.navbox-subgroup {
width: 100%;
}
.navbox-group,
.navbox-title,
.navbox-abovebelow {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
}
.navbox-group {
white-space: nowrap;
/* @noflip */
text-align: right;
}
.navbox,
.navbox-subgroup {
background-color: #fdfdfd;
color:inherit;
}
.navbox-list {
line-height: 1.5em;
border-color: #fdfdfd; /* Must match background color */
}
.navbox-list-with-group {
text-align: left;
border-left-width: 2px;
border-left-style: solid;
}
/* cell spacing for navbox cells */
/* Borders above 2nd, 3rd, etc. rows */
/* TODO: figure out how to replace tr as structure;
* with div structure it should be just a matter of first-child */
tr + tr > .navbox-abovebelow,
tr + tr > .navbox-group,
tr + tr > .navbox-image,
tr + tr > .navbox-list {
border-top: 2px solid #fdfdfd; /* Must match background color */
}
.navbox-title {
background-color: #ccf; /* Level 1 color */
color:inherit;
}
.navbox-abovebelow,
.navbox-group,
.navbox-subgroup .navbox-title {
background-color: #ddf; /* Level 2 color */
color:inherit;
}
.navbox-subgroup .navbox-group,
.navbox-subgroup .navbox-abovebelow {
background-color: #e6e6ff; /* Level 3 color */
color:inherit;
}
.navbox-even {
background-color: #f7f7f7;
color:inherit;
}
.navbox-odd {
background-color: transparent;
color:inherit;
}
/* TODO: figure out how to remove reliance on td as structure */
.navbox .hlist td dl,
.navbox .hlist td ol,
.navbox .hlist td ul,
.navbox td.hlist dl,
.navbox td.hlist ol,
.navbox td.hlist ul {
padding: 0.125em 0;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
/** T367463 */
body.skin--responsive .navbox-image img {
max-width: none !important;
}
@media print {
body.ns-0 .navbox {
display: none !important;
}
}
ku94g873nj9xaasowc6yies69ls74c5
15665
15664
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Navbox/styles.css]]
8936
sanitized-css
text/css
/* {{pp|small=y}} */
.navbox {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
font-size: 88%;
text-align: center;
padding: 1px;
margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */
}
.navbox .navbox {
margin-top: 0; /* No top margin for nested navboxes */
}
.navbox + .navbox-styles + .navbox,
/* category positions are wrapped in an "empty" span in Parsoid [[phab:T378906]] */
.navbox + span.mw-empty-elt + .navbox-styles + .navbox {
margin-top: -1px; /* Single pixel border between adjacent navboxes */
}
.navbox-inner,
.navbox-subgroup {
width: 100%;
}
.navbox-group,
.navbox-title,
.navbox-abovebelow {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
}
.navbox-group {
white-space: nowrap;
/* @noflip */
text-align: right;
}
.navbox,
.navbox-subgroup {
background-color: #fdfdfd;
color:inherit;
}
.navbox-list {
line-height: 1.5em;
border-color: #fdfdfd; /* Must match background color */
}
.navbox-list-with-group {
text-align: left;
border-left-width: 2px;
border-left-style: solid;
}
/* cell spacing for navbox cells */
/* Borders above 2nd, 3rd, etc. rows */
/* TODO: figure out how to replace tr as structure;
* with div structure it should be just a matter of first-child */
tr + tr > .navbox-abovebelow,
tr + tr > .navbox-group,
tr + tr > .navbox-image,
tr + tr > .navbox-list {
border-top: 2px solid #fdfdfd; /* Must match background color */
}
.navbox-title {
background-color: #ccf; /* Level 1 color */
color:inherit;
}
.navbox-abovebelow,
.navbox-group,
.navbox-subgroup .navbox-title {
background-color: #ddf; /* Level 2 color */
color:inherit;
}
.navbox-subgroup .navbox-group,
.navbox-subgroup .navbox-abovebelow {
background-color: #e6e6ff; /* Level 3 color */
color:inherit;
}
.navbox-even {
background-color: #f7f7f7;
color:inherit;
}
.navbox-odd {
background-color: transparent;
color:inherit;
}
/* TODO: figure out how to remove reliance on td as structure */
.navbox .hlist td dl,
.navbox .hlist td ol,
.navbox .hlist td ul,
.navbox td.hlist dl,
.navbox td.hlist ol,
.navbox td.hlist ul {
padding: 0.125em 0;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
/** T367463 */
body.skin--responsive .navbox-image img {
max-width: none !important;
}
@media print {
body.ns-0 .navbox {
display: none !important;
}
}
ku94g873nj9xaasowc6yies69ls74c5
Module:High-use
828
1018
15684
8953
2026-10-18T08:06:09Z
Paine Ellsworth
330
per edit request on talk page - update preview text
15684
Scribunto
text/plain
require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local _fetch = require('Module:Transclusion_count')._fetch -- _fetch looks at the 'demo' argument
local yesno = require('Module:Yesno')
local lang_obj = mw.getContentLanguage() -- this here because the language object is used multiple places in the module
local large_count_cutoff = 100000
local approx_num_total_pages = 66000000
local user_subpage_info_page = 'Wikipedia:User pages#SUB'
local sandbox_module_page = 'Module:Sandbox'
local system_messages_cat = 'Pages used in system messages needing protection'
local sandbox_word = 'sandbox'
local testcases_word = 'testcases'
local doc_word = 'doc'
local function count_from_args(args)
if tonumber(args.count) then -- check if function has already been used
return tonumber(args.count) -- early exit if so
end
local count
if yesno(args['fetch']) ~= false then
count = _fetch(args) -- fetch transclusion count
end
-- use explicitly-provided count when fetch fails
if count == nil and args[1] ~= nil and args[1] ~= '' then
-- convert local language number string to a number understandable by Lua
count = mw.ustring.gsub(args[1], '+$', '')
count = lang_obj:parseFormattedNumber(args[1])
end
-- in case someone writes a non-positive number
if count and count > 0 then
return count
end
return nil
end
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
local function risk_boolean(args)
if args.risk == true or args.risk == false then
return args.risk
elseif args[1] == 'risk' then
return true
else
local count = count_from_args(args)
if count and count >= large_count_cutoff then
return true
end
end
return false
end
-- function retained for backwards compatibility
function p._risk(args)
return risk_boolean(args) and 'risk' or ''
end
-- function retained for backwards compatibility
function p.risk(frame)
return p._risk(getArgs(frame))
end
-- count and no_percent arguments retained for backwards compatibility
function p._num(args, count, no_percent)
if count == nil then
count = count_from_args(args)
end
args.count = count
args.risk = risk_boolean(args)
-- Build output string
local return_value = ''
if args.count == nil and args.risk then
return 'a very large number of'
elseif args.count == nil then
return 'many'
else
-- Use 2 significant figures for smaller numbers and 3 for larger ones
local sigfig = 2
if args.count >= large_count_cutoff then
sigfig = 3
end
-- Prepare to round to appropriate number of sigfigs
local f = math.floor(math.log10(args.count)) - sigfig + 1
-- Round and insert 'approximately' or '+' when appropriate
if yesno(args[2]) == true or (type(args[1]) == 'string' and (mw.ustring.sub(args[1], -1) == '+')) then
-- Round down
return_value = string.format('%s+', lang_obj:formatNum(math.floor( (args.count / 10^(f)) ) * (10^(f))) )
else
-- Round to nearest
return_value = string.format('approximately %s', lang_obj:formatNum(math.floor( (args.count / 10^(f)) + 0.5) * (10^(f))) )
end
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
no_percent = yesno(no_percent or args['no-percent'])
if args.count and args.count >= approx_num_total_pages/100 and not no_percent then
local num_total_pages = mw.getCurrentFrame():callParserFunction('NUMBEROFPAGES', 'R')
local total_percent = math.floor( ( ( args.count/num_total_pages ) * 100) + 0.5)
if total_percent >= 1 then
return_value = string.format('%s pages, or roughly %s%% of all', return_value, total_percent)
end
end
end
return return_value
end
-- used by [[Template:Stub documentation]] and other pages
-- count argument retained for backwards compatibility
function p.num(frame, count)
return p._num(getArgs(frame), count)
end
-- count argument retained for backwards compatibility
function p._text(args, count)
--[=[
Only show the information about how this template gets updated
if someone is actually editing the page and maybe trying to update the count.
]=]
local bot_text = (mw.getCurrentFrame():preprocess('{{REVISIONID}}') == '') and ("\n\n----\n'''Preview info''':" .. ' The number of transclusions [[Template:High-use/doc#Technical details|is updated automatically]].') or ''
if count == nil then
count = count_from_args(args)
end
args.count = count
args.risk = risk_boolean(args)
-- trim /doc, /sandbox and /testcases
local title = args.title or (args.demo and args.demo ~= '' and mw.title.new(args.demo, 'Template')) or mw.title.getCurrentTitle()
if title.subpageText == doc_word or title.subpageText == sandbox_word or title.subpageText == testcases_word then
title = title.basePageTitle
end
-- use /testcases of base template
local testcases_page = mw.title.new(title.prefixedText .. '/' .. testcases_word)
-- exists is expensive
while testcases_page.basePageTitle.isSubpage and not testcases_page.exists do
testcases_page = mw.title.new(testcases_page.basePageTitle.basePageTitle.prefixedText .. '/' .. testcases_word)
end
local systemMessages = (args['system'] or '') ~= ''
-- This retrieves the project URL automatically to simplify localization.
local templateCount = ('on [https://linkcount.toolforge.org/?project=%s&page=%s#transclusions %s pages]'):format(
title:fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p._num(args))
local used_on_text = "'''This " .. (title:inNamespace('Module') and 'Lua module' or 'template') .. ' is used '
if systemMessages then
used_on_text = used_on_text .. args['system'] ..
((args.count and args.count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
used_on_text = used_on_text .. templateCount .. "'''"
end
local sandbox_text = ('%s\'s [[%s/sandbox|/sandbox]] or [[%s|/testcases]] subpages, or in your own [[%s]]. '):format(
title:inNamespace('Module') and 'module' or 'template',
title.fullText,
testcases_page.fullText,
title:inNamespace('Module') and (sandbox_module_page .. '|module sandbox') or (user_subpage_info_page .. '|user subpage')
)
local infoArg = args['info'] ~= '' and args['info']
if (systemMessages or args.risk) then
local info = '.'
if systemMessages then
info = info .. '<br />Changes to it can cause immediate changes to the ' .. mw.site.namespaces.Project.name .. ' user interface.'
end
if infoArg then
info = info .. '<br />' .. infoArg
end
sandbox_text = info .. '<br /> To avoid major disruption' ..
(args.count and args.count >= large_count_cutoff and ' and server load' or '') .. -- should this use args.risk?
', any changes should be tested in the ' .. sandbox_text ..
'The tested changes can be added to this page in a single edit. '
else
sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') ..
'hanges may be widely noticed. Test changes in the ' .. sandbox_text
end
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
if args[2] ~= nil and args[2] ~= '' and yesno(args[2]) == nil then
discussion_text = string.format('%sat [[%s]]', discussion_text, args[2])
else
discussion_text = string.format('%son the [[%s|talk page]]', discussion_text, title.talkPageTitle.fullText)
end
return used_on_text .. sandbox_text .. discussion_text .. ' before implementing them.' .. bot_text
end
-- used by [[Template:R from high-use template]]
-- count argument retained for backwards compatibility
function p.text(frame, count)
return p._text(getArgs(frame), count)
end
-- nocat argument retained for backwards compatibility
function p._main(args, nocat)
args.count = count_from_args(args)
args.risk = risk_boolean(args)
args.title = (args.demo and args.demo ~= '' and mw.title.new(args.demo, 'Template')) or mw.title.getCurrentTitle()
local image = 'Ambox warning yellow.svg'
local type_param = 'style'
local epilogue = ''
if args['system'] and args['system'] ~= '' then
image = 'Ambox important.svg'
type_param = 'content'
if yesno(nocat or args['nocat']) ~= true and not args.title.isRedirect then
local protection_action = (args.title:inNamespace('File') and 'upload') or 'edit'
local protection_level = require('Module:Effective protection level')._main(protection_action, args.title.fullText)
if protection_level ~= 'sysop' and protection_level ~= 'templateeditor' and protection_level ~= 'interfaceadmin' then
epilogue = mw.getCurrentFrame():expandTemplate {
title = 'sandbox other',
args = {
[2] = '[[Category:' .. system_messages_cat .. ']]'
}
}
end
end
elseif args.risk then
image = 'Ambox warning orange.svg'
type_param = 'content'
end
image = '[[File:' .. image .. '|40px|alt=Warning|link=]]'
if args['form'] == 'editnotice' then
return mw.getCurrentFrame():expandTemplate{
title = 'editnotice',
args = {
['image'] = image,
['text'] = p._text(args),
['expiry'] = (args['expiry'] or '')
}
} .. epilogue
else
return require('Module:Message box').main('ombox', {
type = type_param,
image = image,
text = p._text(args),
expiry = (args['expiry'] or '')
}) .. epilogue
end
end
function p.main(frame)
return p._main(getArgs(frame))
end
return p
5obsps34wvcavn864brncey49uuo8l1
15685
15684
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Module:High-use]]
15684
Scribunto
text/plain
require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local _fetch = require('Module:Transclusion_count')._fetch -- _fetch looks at the 'demo' argument
local yesno = require('Module:Yesno')
local lang_obj = mw.getContentLanguage() -- this here because the language object is used multiple places in the module
local large_count_cutoff = 100000
local approx_num_total_pages = 66000000
local user_subpage_info_page = 'Wikipedia:User pages#SUB'
local sandbox_module_page = 'Module:Sandbox'
local system_messages_cat = 'Pages used in system messages needing protection'
local sandbox_word = 'sandbox'
local testcases_word = 'testcases'
local doc_word = 'doc'
local function count_from_args(args)
if tonumber(args.count) then -- check if function has already been used
return tonumber(args.count) -- early exit if so
end
local count
if yesno(args['fetch']) ~= false then
count = _fetch(args) -- fetch transclusion count
end
-- use explicitly-provided count when fetch fails
if count == nil and args[1] ~= nil and args[1] ~= '' then
-- convert local language number string to a number understandable by Lua
count = mw.ustring.gsub(args[1], '+$', '')
count = lang_obj:parseFormattedNumber(args[1])
end
-- in case someone writes a non-positive number
if count and count > 0 then
return count
end
return nil
end
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
local function risk_boolean(args)
if args.risk == true or args.risk == false then
return args.risk
elseif args[1] == 'risk' then
return true
else
local count = count_from_args(args)
if count and count >= large_count_cutoff then
return true
end
end
return false
end
-- function retained for backwards compatibility
function p._risk(args)
return risk_boolean(args) and 'risk' or ''
end
-- function retained for backwards compatibility
function p.risk(frame)
return p._risk(getArgs(frame))
end
-- count and no_percent arguments retained for backwards compatibility
function p._num(args, count, no_percent)
if count == nil then
count = count_from_args(args)
end
args.count = count
args.risk = risk_boolean(args)
-- Build output string
local return_value = ''
if args.count == nil and args.risk then
return 'a very large number of'
elseif args.count == nil then
return 'many'
else
-- Use 2 significant figures for smaller numbers and 3 for larger ones
local sigfig = 2
if args.count >= large_count_cutoff then
sigfig = 3
end
-- Prepare to round to appropriate number of sigfigs
local f = math.floor(math.log10(args.count)) - sigfig + 1
-- Round and insert 'approximately' or '+' when appropriate
if yesno(args[2]) == true or (type(args[1]) == 'string' and (mw.ustring.sub(args[1], -1) == '+')) then
-- Round down
return_value = string.format('%s+', lang_obj:formatNum(math.floor( (args.count / 10^(f)) ) * (10^(f))) )
else
-- Round to nearest
return_value = string.format('approximately %s', lang_obj:formatNum(math.floor( (args.count / 10^(f)) + 0.5) * (10^(f))) )
end
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
no_percent = yesno(no_percent or args['no-percent'])
if args.count and args.count >= approx_num_total_pages/100 and not no_percent then
local num_total_pages = mw.getCurrentFrame():callParserFunction('NUMBEROFPAGES', 'R')
local total_percent = math.floor( ( ( args.count/num_total_pages ) * 100) + 0.5)
if total_percent >= 1 then
return_value = string.format('%s pages, or roughly %s%% of all', return_value, total_percent)
end
end
end
return return_value
end
-- used by [[Template:Stub documentation]] and other pages
-- count argument retained for backwards compatibility
function p.num(frame, count)
return p._num(getArgs(frame), count)
end
-- count argument retained for backwards compatibility
function p._text(args, count)
--[=[
Only show the information about how this template gets updated
if someone is actually editing the page and maybe trying to update the count.
]=]
local bot_text = (mw.getCurrentFrame():preprocess('{{REVISIONID}}') == '') and ("\n\n----\n'''Preview info''':" .. ' The number of transclusions [[Template:High-use/doc#Technical details|is updated automatically]].') or ''
if count == nil then
count = count_from_args(args)
end
args.count = count
args.risk = risk_boolean(args)
-- trim /doc, /sandbox and /testcases
local title = args.title or (args.demo and args.demo ~= '' and mw.title.new(args.demo, 'Template')) or mw.title.getCurrentTitle()
if title.subpageText == doc_word or title.subpageText == sandbox_word or title.subpageText == testcases_word then
title = title.basePageTitle
end
-- use /testcases of base template
local testcases_page = mw.title.new(title.prefixedText .. '/' .. testcases_word)
-- exists is expensive
while testcases_page.basePageTitle.isSubpage and not testcases_page.exists do
testcases_page = mw.title.new(testcases_page.basePageTitle.basePageTitle.prefixedText .. '/' .. testcases_word)
end
local systemMessages = (args['system'] or '') ~= ''
-- This retrieves the project URL automatically to simplify localization.
local templateCount = ('on [https://linkcount.toolforge.org/?project=%s&page=%s#transclusions %s pages]'):format(
title:fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p._num(args))
local used_on_text = "'''This " .. (title:inNamespace('Module') and 'Lua module' or 'template') .. ' is used '
if systemMessages then
used_on_text = used_on_text .. args['system'] ..
((args.count and args.count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
used_on_text = used_on_text .. templateCount .. "'''"
end
local sandbox_text = ('%s\'s [[%s/sandbox|/sandbox]] or [[%s|/testcases]] subpages, or in your own [[%s]]. '):format(
title:inNamespace('Module') and 'module' or 'template',
title.fullText,
testcases_page.fullText,
title:inNamespace('Module') and (sandbox_module_page .. '|module sandbox') or (user_subpage_info_page .. '|user subpage')
)
local infoArg = args['info'] ~= '' and args['info']
if (systemMessages or args.risk) then
local info = '.'
if systemMessages then
info = info .. '<br />Changes to it can cause immediate changes to the ' .. mw.site.namespaces.Project.name .. ' user interface.'
end
if infoArg then
info = info .. '<br />' .. infoArg
end
sandbox_text = info .. '<br /> To avoid major disruption' ..
(args.count and args.count >= large_count_cutoff and ' and server load' or '') .. -- should this use args.risk?
', any changes should be tested in the ' .. sandbox_text ..
'The tested changes can be added to this page in a single edit. '
else
sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') ..
'hanges may be widely noticed. Test changes in the ' .. sandbox_text
end
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
if args[2] ~= nil and args[2] ~= '' and yesno(args[2]) == nil then
discussion_text = string.format('%sat [[%s]]', discussion_text, args[2])
else
discussion_text = string.format('%son the [[%s|talk page]]', discussion_text, title.talkPageTitle.fullText)
end
return used_on_text .. sandbox_text .. discussion_text .. ' before implementing them.' .. bot_text
end
-- used by [[Template:R from high-use template]]
-- count argument retained for backwards compatibility
function p.text(frame, count)
return p._text(getArgs(frame), count)
end
-- nocat argument retained for backwards compatibility
function p._main(args, nocat)
args.count = count_from_args(args)
args.risk = risk_boolean(args)
args.title = (args.demo and args.demo ~= '' and mw.title.new(args.demo, 'Template')) or mw.title.getCurrentTitle()
local image = 'Ambox warning yellow.svg'
local type_param = 'style'
local epilogue = ''
if args['system'] and args['system'] ~= '' then
image = 'Ambox important.svg'
type_param = 'content'
if yesno(nocat or args['nocat']) ~= true and not args.title.isRedirect then
local protection_action = (args.title:inNamespace('File') and 'upload') or 'edit'
local protection_level = require('Module:Effective protection level')._main(protection_action, args.title.fullText)
if protection_level ~= 'sysop' and protection_level ~= 'templateeditor' and protection_level ~= 'interfaceadmin' then
epilogue = mw.getCurrentFrame():expandTemplate {
title = 'sandbox other',
args = {
[2] = '[[Category:' .. system_messages_cat .. ']]'
}
}
end
end
elseif args.risk then
image = 'Ambox warning orange.svg'
type_param = 'content'
end
image = '[[File:' .. image .. '|40px|alt=Warning|link=]]'
if args['form'] == 'editnotice' then
return mw.getCurrentFrame():expandTemplate{
title = 'editnotice',
args = {
['image'] = image,
['text'] = p._text(args),
['expiry'] = (args['expiry'] or '')
}
} .. epilogue
else
return require('Module:Message box').main('ombox', {
type = type_param,
image = image,
text = p._text(args),
expiry = (args['expiry'] or '')
}) .. epilogue
end
end
function p.main(frame)
return p._main(getArgs(frame))
end
return p
5obsps34wvcavn864brncey49uuo8l1
Module:Color contrast
828
1051
15672
10031
2026-11-08T01:35:37Z
Axolitl
296
Implement edit request, for real this time
15672
Scribunto
text/plain
--
-- This module implements
-- {{Color contrast ratio}}
-- {{Greater color contrast ratio}}
-- {{ColorToLum}}
-- {{RGBColorToLum}}
--
local p = {}
local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' )
local function sRGB (v)
if (v <= 0.03928) then
v = v / 12.92
else
v = math.pow((v+0.055)/1.055, 2.4)
end
return v
end
local function rgbdec2lum(R, G, B)
if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then
return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)
else
return ''
end
end
local function hsl2lum(h, s, l)
if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
local c = (1 - math.abs(2*l - 1))*s
local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )
local m = l - c/2
local r, g, b = m, m, m
if( 0 <= h and h < 60 ) then
r = r + c
g = g + x
elseif( 60 <= h and h < 120 ) then
r = r + x
g = g + c
elseif( 120 <= h and h < 180 ) then
g = g + c
b = b + x
elseif( 180 <= h and h < 240 ) then
g = g + x
b = b + c
elseif( 240 <= h and h < 300 ) then
r = r + x
b = b + c
elseif( 300 <= h and h < 360 ) then
r = r + c
b = b + x
end
return rgbdec2lum(255*r, 255*g, 255*b)
else
return ''
end
end
local function color2lum(c)
if (c == nil) then
return ''
end
-- html '#' entity
c = c:gsub("#", "#")
-- whitespace
c = c:match( '^%s*(.-)[%s;]*$' )
-- unstrip nowiki strip markers
c = mw.text.unstripNoWiki(c)
-- lowercase
c = c:lower()
-- first try to look it up
local L = HTMLcolor[c]
if (L ~= nil) then
return L
end
-- convert from hsl / hsla (accepts comma or space delimiters)
if mw.ustring.match(c,'^hsla?%([%s]*[0-9][0-9%.]*[%s]*[,%s][%s]*[0-9][0-9%.]*%%[%s]*[,%s][%s]*[0-9][0-9%.]*%%.*%)$') then
local h, s, l = mw.ustring.match(c,'^hsla?%([%s]*([0-9][0-9%.]*)[%s]*[,%s][%s]*([0-9][0-9%.]*)%%[%s]*[,%s][%s]*([0-9][0-9%.]*)%%.*%)$')
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
end
-- convert from rgb / rgba (numeric values 0 to 255)
if mw.ustring.match(c,'^rgba?%([%s]*[0-9][0-9]*[%s]*[,%s][%s]*[0-9][0-9]*[%s]*[,%s][%s]*[0-9][0-9]*.*%)$') then
local R, G, B = mw.ustring.match(c,'^rgba?%([%s]*([0-9][0-9]*)[%s]*[,%s][%s]*([0-9][0-9]*)[%s]*[,%s][%s]*([0-9][0-9]*).*%)$')
return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))
end
-- convert from rgb / rgba percent
if mw.ustring.match(c,'^rgba?%([%s]*[0-9][0-9%.]*%%[%s]*[,%s][%s]*[0-9][0-9%.]*%%[%s]*[,%s][%s]*[0-9][0-9%.]*%%.*%)$') then
local R, G, B = mw.ustring.match(c,'^rgba?%([%s]*([0-9][0-9%.]*)%%[%s]*[,%s][%s]*([0-9][0-9%.]*)%%[%s]*[,%s][%s]*([0-9][0-9%.]*)%%.*%)$')
return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)
end
-- remove leading # (if there is one) and whitespace
c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$')
-- split into rgb
local cs = mw.text.split(c or '', '')
if( #cs == 6 or #cs == 8 ) then -- Accepts 6 digits (#RRGGBB) or 8 digits (#RRGGBBAA)
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])
return rgbdec2lum(R, G, B)
elseif ( #cs == 3 or #cs == 4 ) then -- Accepts 3 digits (#RGB) or 4 digits (#RGBA)
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1])
local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2])
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3])
return rgbdec2lum(R, G, B)
end
-- failure, return blank
return ''
end
-- This exports the function for use in other modules.
-- The colour is passed as a string.
function p._lum(color)
return color2lum(color)
end
function p._greatercontrast(args)
local bias = tonumber(args['bias'] or '0') or 0
local css = (args['css'] and args['css'] ~= '') and true or false
local v1 = color2lum(args[1] or '')
local c2 = args[2] or 'white'
local v2 = color2lum(c2)
local c3 = args[3] or 'black'
local v3 = color2lum(c3)
local ratio1 = -1;
local ratio2 = -1;
if (type(v1) == 'number' and type(v2) == 'number') then
ratio1 = (v2 + 0.05)/(v1 + 0.05)
ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1
end
if (type(v1) == 'number' and type(v3) == 'number') then
ratio2 = (v3 + 0.05)/(v1 + 0.05)
ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2
end
if css then
local c1 = args[1] or ''
if string.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?$') or
string.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?[A-Fa-f0-9]?$') then
c1 = '#' .. c1
end
if string.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?$') or
string.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?[A-Fa-f0-9]?$') then
c2 = '#' .. c2
end
if string.match(c3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?$') or
string.match(c3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?[A-Fa-f0-9]?$') then
c3 = '#' .. c3
end
return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';'
end
return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or ''
end
function p._ratio(args)
local v1 = color2lum(args[1])
local v2 = color2lum(args[2])
if (type(v1) == 'number' and type(v2) == 'number') then
-- v1 should be the brighter of the two.
if v2 > v1 then
v1, v2 = v2, v1
end
return (v1 + 0.05)/(v2 + 0.05)
else
return args['error'] or '?'
end
end
function p._styleratio(args)
local style = (args[1] or ''):lower()
local lum_bg, lum_fg = 1, 0
if args[2] then
local lum = color2lum(args[2])
if lum ~= '' then lum_bg = lum end
end
if args[3] then
local lum = color2lum(args[3])
if lum ~= '' then lum_fg = lum end
end
local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '#', '#'), ';')
for k = 1,#slist do
local s = slist[k]
local prop, val = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' )
prop = prop or ''
val = val or ''
if (prop:match('^[%s]*(background)[%s]*$') or prop:match('^[%s]*(background%-color)[%s]*$')) then
local lum = color2lum(val)
if( lum ~= '' ) then lum_bg = lum end
elseif (prop:match('^[%s]*(color)[%s]*$')) then
local lum = color2lum(val)
if( lum ~= '' ) then lum_fg = lum end
end
end
if lum_bg > lum_fg then
return (lum_bg + 0.05)/(lum_fg + 0.05)
else
return (lum_fg + 0.05)/(lum_bg + 0.05)
end
end
--[[
Use {{#invoke:Color contrast|somecolor}} directly or
{{#invoke:Color contrast}} from a wrapper template.
Parameters:
-- |1= — required; A color to check.
--]]
function p.lum(frame)
local color = frame.args[1] or frame:getParent().args[1]
return p._lum(color)
end
function p.ratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._ratio(args)
end
function p.styleratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._styleratio(args)
end
function p.greatercontrast(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._greatercontrast(args)
end
return p
jrev1t70buhql0oqscuor2vyuctzl7u
15673
15672
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Color_contrast]]
15672
Scribunto
text/plain
--
-- This module implements
-- {{Color contrast ratio}}
-- {{Greater color contrast ratio}}
-- {{ColorToLum}}
-- {{RGBColorToLum}}
--
local p = {}
local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' )
local function sRGB (v)
if (v <= 0.03928) then
v = v / 12.92
else
v = math.pow((v+0.055)/1.055, 2.4)
end
return v
end
local function rgbdec2lum(R, G, B)
if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then
return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)
else
return ''
end
end
local function hsl2lum(h, s, l)
if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
local c = (1 - math.abs(2*l - 1))*s
local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )
local m = l - c/2
local r, g, b = m, m, m
if( 0 <= h and h < 60 ) then
r = r + c
g = g + x
elseif( 60 <= h and h < 120 ) then
r = r + x
g = g + c
elseif( 120 <= h and h < 180 ) then
g = g + c
b = b + x
elseif( 180 <= h and h < 240 ) then
g = g + x
b = b + c
elseif( 240 <= h and h < 300 ) then
r = r + x
b = b + c
elseif( 300 <= h and h < 360 ) then
r = r + c
b = b + x
end
return rgbdec2lum(255*r, 255*g, 255*b)
else
return ''
end
end
local function color2lum(c)
if (c == nil) then
return ''
end
-- html '#' entity
c = c:gsub("#", "#")
-- whitespace
c = c:match( '^%s*(.-)[%s;]*$' )
-- unstrip nowiki strip markers
c = mw.text.unstripNoWiki(c)
-- lowercase
c = c:lower()
-- first try to look it up
local L = HTMLcolor[c]
if (L ~= nil) then
return L
end
-- convert from hsl / hsla (accepts comma or space delimiters)
if mw.ustring.match(c,'^hsla?%([%s]*[0-9][0-9%.]*[%s]*[,%s][%s]*[0-9][0-9%.]*%%[%s]*[,%s][%s]*[0-9][0-9%.]*%%.*%)$') then
local h, s, l = mw.ustring.match(c,'^hsla?%([%s]*([0-9][0-9%.]*)[%s]*[,%s][%s]*([0-9][0-9%.]*)%%[%s]*[,%s][%s]*([0-9][0-9%.]*)%%.*%)$')
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
end
-- convert from rgb / rgba (numeric values 0 to 255)
if mw.ustring.match(c,'^rgba?%([%s]*[0-9][0-9]*[%s]*[,%s][%s]*[0-9][0-9]*[%s]*[,%s][%s]*[0-9][0-9]*.*%)$') then
local R, G, B = mw.ustring.match(c,'^rgba?%([%s]*([0-9][0-9]*)[%s]*[,%s][%s]*([0-9][0-9]*)[%s]*[,%s][%s]*([0-9][0-9]*).*%)$')
return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))
end
-- convert from rgb / rgba percent
if mw.ustring.match(c,'^rgba?%([%s]*[0-9][0-9%.]*%%[%s]*[,%s][%s]*[0-9][0-9%.]*%%[%s]*[,%s][%s]*[0-9][0-9%.]*%%.*%)$') then
local R, G, B = mw.ustring.match(c,'^rgba?%([%s]*([0-9][0-9%.]*)%%[%s]*[,%s][%s]*([0-9][0-9%.]*)%%[%s]*[,%s][%s]*([0-9][0-9%.]*)%%.*%)$')
return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)
end
-- remove leading # (if there is one) and whitespace
c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$')
-- split into rgb
local cs = mw.text.split(c or '', '')
if( #cs == 6 or #cs == 8 ) then -- Accepts 6 digits (#RRGGBB) or 8 digits (#RRGGBBAA)
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])
return rgbdec2lum(R, G, B)
elseif ( #cs == 3 or #cs == 4 ) then -- Accepts 3 digits (#RGB) or 4 digits (#RGBA)
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1])
local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2])
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3])
return rgbdec2lum(R, G, B)
end
-- failure, return blank
return ''
end
-- This exports the function for use in other modules.
-- The colour is passed as a string.
function p._lum(color)
return color2lum(color)
end
function p._greatercontrast(args)
local bias = tonumber(args['bias'] or '0') or 0
local css = (args['css'] and args['css'] ~= '') and true or false
local v1 = color2lum(args[1] or '')
local c2 = args[2] or 'white'
local v2 = color2lum(c2)
local c3 = args[3] or 'black'
local v3 = color2lum(c3)
local ratio1 = -1;
local ratio2 = -1;
if (type(v1) == 'number' and type(v2) == 'number') then
ratio1 = (v2 + 0.05)/(v1 + 0.05)
ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1
end
if (type(v1) == 'number' and type(v3) == 'number') then
ratio2 = (v3 + 0.05)/(v1 + 0.05)
ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2
end
if css then
local c1 = args[1] or ''
if string.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?$') or
string.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?[A-Fa-f0-9]?$') then
c1 = '#' .. c1
end
if string.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?$') or
string.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?[A-Fa-f0-9]?$') then
c2 = '#' .. c2
end
if string.match(c3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?$') or
string.match(c3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]?[A-Fa-f0-9]?$') then
c3 = '#' .. c3
end
return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';'
end
return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or ''
end
function p._ratio(args)
local v1 = color2lum(args[1])
local v2 = color2lum(args[2])
if (type(v1) == 'number' and type(v2) == 'number') then
-- v1 should be the brighter of the two.
if v2 > v1 then
v1, v2 = v2, v1
end
return (v1 + 0.05)/(v2 + 0.05)
else
return args['error'] or '?'
end
end
function p._styleratio(args)
local style = (args[1] or ''):lower()
local lum_bg, lum_fg = 1, 0
if args[2] then
local lum = color2lum(args[2])
if lum ~= '' then lum_bg = lum end
end
if args[3] then
local lum = color2lum(args[3])
if lum ~= '' then lum_fg = lum end
end
local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '#', '#'), ';')
for k = 1,#slist do
local s = slist[k]
local prop, val = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' )
prop = prop or ''
val = val or ''
if (prop:match('^[%s]*(background)[%s]*$') or prop:match('^[%s]*(background%-color)[%s]*$')) then
local lum = color2lum(val)
if( lum ~= '' ) then lum_bg = lum end
elseif (prop:match('^[%s]*(color)[%s]*$')) then
local lum = color2lum(val)
if( lum ~= '' ) then lum_fg = lum end
end
end
if lum_bg > lum_fg then
return (lum_bg + 0.05)/(lum_fg + 0.05)
else
return (lum_fg + 0.05)/(lum_bg + 0.05)
end
end
--[[
Use {{#invoke:Color contrast|somecolor}} directly or
{{#invoke:Color contrast}} from a wrapper template.
Parameters:
-- |1= — required; A color to check.
--]]
function p.lum(frame)
local color = frame.args[1] or frame:getParent().args[1]
return p._lum(color)
end
function p.ratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._ratio(args)
end
function p.styleratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._styleratio(args)
end
function p.greatercontrast(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._greatercontrast(args)
end
return p
jrev1t70buhql0oqscuor2vyuctzl7u
Module:Transclusion count/data/H
828
1235
15729
9505
2026-10-18T05:09:46Z
Ahechtbot
346
[[Wikipedia:BOT|Bot]]: Updated page.
15729
Scribunto
text/plain
return {
["H-phrases"] = 4400,
["HABS"] = 2700,
["HAER"] = 2500,
["HDS"] = 5000,
["HD_Radio"] = 2200,
["HD_color"] = 2900,
["HKG"] = 3600,
["HMAS"] = 6700,
["HMCS"] = 5300,
["HMS"] = 38000,
["HNLMS"] = 3300,
["HOUR"] = 2300,
["HRV"] = 7100,
["HUN"] = 12000,
["HWYACR"] = 59000,
["Hab"] = 14000,
["Hair_space"] = 8100,
["HanCinema_person"] = 2000,
["Handbook_of_Texas"] = 2100,
["Hansard-contribs"] = 9400,
["Harv"] = 6000,
["Harvard_citation"] = 6300,
["Harvard_citation_no_brackets"] = 55000,
["Harvard_citation_text"] = 7900,
["Harvard_citation_year_brackets"] = 6300,
["Harvid"] = 78000,
["Harvnb"] = 54000,
["Harvp"] = 6200,
["Harvtxt"] = 7200,
["HasTemplate"] = 116000,
["Has_short_description"] = 806000,
["Hat"] = 14000,
["Hatnote"] = 811000,
["Hatnote_group"] = 2400,
["Hatnote_inline"] = 3000,
["Height"] = 88000,
["Help_me-helped"] = 16000,
["Helpbox"] = 3500,
["Helpbox/styles.css"] = 3500,
["Helpme-helped"] = 2100,
["Hex2dec"] = 2300,
["Hidden"] = 291000,
["Hidden/FC"] = 3700,
["Hidden_archive_bottom"] = 14000,
["Hidden_archive_top"] = 14000,
["Hidden_archive_top/styles.css"] = 14000,
["Hidden_begin"] = 337000,
["Hidden_begin/styles.css"] = 337000,
["Hidden_category"] = 6800,
["Hidden_end"] = 337000,
["Hidden_ping"] = 5500,
["Hidden_sort_key"] = 22000,
["Hide"] = 2000,
["High-Class"] = 15000,
["High-importance"] = 16000,
["High-use"] = 13000,
["Highlight"] = 8200,
["Highlight/core"] = 8400,
["Highlight_round"] = 4400,
["Highlight_round/styles.css"] = 4400,
["Hilite"] = 2300,
["Historic_Environment_Scotland"] = 3900,
["Historical"] = 25000,
["Historical_Dictionary_of_Switzerland"] = 5500,
["Historical_populations"] = 62000,
["History"] = 7600,
["History_icon"] = 8500,
["History_icon2"] = 8500,
["Hlist"] = 310000,
["Hlist/styles.css"] = 9340000,
["Hmbox"] = 31000,
["Hmbox/styles.css"] = 31000,
["Hndis"] = 78000,
["Hong_Kong_English"] = 3600,
["Horizontal_TOC"] = 7500,
["Horizontal_TOC/styles.css"] = 7500,
["Horizontal_list"] = 282000,
["HoursElapsed"] = 32000,
["Hours_elapsed"] = 32000,
["How_to_request_photo_in"] = 3000,
["Howtoreqphotoin"] = 2800,
["Hr"] = 6300,
["Hs"] = 22000,
["Hsp"] = 5100,
["Huge"] = 2300,
["Hugman"] = 7600,
["Human_name_disambiguation"] = 83000,
["Human_readable_duration"] = 36000,
["Humor"] = 4400,
["Hurricane_season_bar"] = 2500,
["Hurricane_season_bar/button"] = 2500,
["Hurricane_season_bar/styles.css"] = 2500,
["Hurricane_status_small"] = 2500,
["Höhe"] = 2000,
["Module:HTMLDecode"] = 867000,
["Module:Hatnote"] = 2210000,
["Module:Hatnote/styles.css"] = 2210000,
["Module:Hatnote_group"] = 2400,
["Module:Hatnote_inline"] = 3100,
["Module:Hatnote_list"] = 1290000,
["Module:Hidden_ping"] = 5500,
["Module:High-use"] = 64000,
["Module:Highest_archive_number"] = 349000,
["Module:Historical_populations"] = 62000,
["Module:Historical_populations/styles.css"] = 62000,
["Module:Hms"] = 253000,
}
njwyj32xi8iz5ywctf14tvgf0pydwcx
15730
15729
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/H]]
15729
Scribunto
text/plain
return {
["H-phrases"] = 4400,
["HABS"] = 2700,
["HAER"] = 2500,
["HDS"] = 5000,
["HD_Radio"] = 2200,
["HD_color"] = 2900,
["HKG"] = 3600,
["HMAS"] = 6700,
["HMCS"] = 5300,
["HMS"] = 38000,
["HNLMS"] = 3300,
["HOUR"] = 2300,
["HRV"] = 7100,
["HUN"] = 12000,
["HWYACR"] = 59000,
["Hab"] = 14000,
["Hair_space"] = 8100,
["HanCinema_person"] = 2000,
["Handbook_of_Texas"] = 2100,
["Hansard-contribs"] = 9400,
["Harv"] = 6000,
["Harvard_citation"] = 6300,
["Harvard_citation_no_brackets"] = 55000,
["Harvard_citation_text"] = 7900,
["Harvard_citation_year_brackets"] = 6300,
["Harvid"] = 78000,
["Harvnb"] = 54000,
["Harvp"] = 6200,
["Harvtxt"] = 7200,
["HasTemplate"] = 116000,
["Has_short_description"] = 806000,
["Hat"] = 14000,
["Hatnote"] = 811000,
["Hatnote_group"] = 2400,
["Hatnote_inline"] = 3000,
["Height"] = 88000,
["Help_me-helped"] = 16000,
["Helpbox"] = 3500,
["Helpbox/styles.css"] = 3500,
["Helpme-helped"] = 2100,
["Hex2dec"] = 2300,
["Hidden"] = 291000,
["Hidden/FC"] = 3700,
["Hidden_archive_bottom"] = 14000,
["Hidden_archive_top"] = 14000,
["Hidden_archive_top/styles.css"] = 14000,
["Hidden_begin"] = 337000,
["Hidden_begin/styles.css"] = 337000,
["Hidden_category"] = 6800,
["Hidden_end"] = 337000,
["Hidden_ping"] = 5500,
["Hidden_sort_key"] = 22000,
["Hide"] = 2000,
["High-Class"] = 15000,
["High-importance"] = 16000,
["High-use"] = 13000,
["Highlight"] = 8200,
["Highlight/core"] = 8400,
["Highlight_round"] = 4400,
["Highlight_round/styles.css"] = 4400,
["Hilite"] = 2300,
["Historic_Environment_Scotland"] = 3900,
["Historical"] = 25000,
["Historical_Dictionary_of_Switzerland"] = 5500,
["Historical_populations"] = 62000,
["History"] = 7600,
["History_icon"] = 8500,
["History_icon2"] = 8500,
["Hlist"] = 310000,
["Hlist/styles.css"] = 9340000,
["Hmbox"] = 31000,
["Hmbox/styles.css"] = 31000,
["Hndis"] = 78000,
["Hong_Kong_English"] = 3600,
["Horizontal_TOC"] = 7500,
["Horizontal_TOC/styles.css"] = 7500,
["Horizontal_list"] = 282000,
["HoursElapsed"] = 32000,
["Hours_elapsed"] = 32000,
["How_to_request_photo_in"] = 3000,
["Howtoreqphotoin"] = 2800,
["Hr"] = 6300,
["Hs"] = 22000,
["Hsp"] = 5100,
["Huge"] = 2300,
["Hugman"] = 7600,
["Human_name_disambiguation"] = 83000,
["Human_readable_duration"] = 36000,
["Humor"] = 4400,
["Hurricane_season_bar"] = 2500,
["Hurricane_season_bar/button"] = 2500,
["Hurricane_season_bar/styles.css"] = 2500,
["Hurricane_status_small"] = 2500,
["Höhe"] = 2000,
["Module:HTMLDecode"] = 867000,
["Module:Hatnote"] = 2210000,
["Module:Hatnote/styles.css"] = 2210000,
["Module:Hatnote_group"] = 2400,
["Module:Hatnote_inline"] = 3100,
["Module:Hatnote_list"] = 1290000,
["Module:Hidden_ping"] = 5500,
["Module:High-use"] = 64000,
["Module:Highest_archive_number"] = 349000,
["Module:Historical_populations"] = 62000,
["Module:Historical_populations/styles.css"] = 62000,
["Module:Hms"] = 253000,
}
njwyj32xi8iz5ywctf14tvgf0pydwcx
Module:Transclusion count/data/I
828
1509
15688
11355
2026-10-18T05:09:56Z
Ahechtbot
346
[[Wikipedia:BOT|Bot]]: Updated page.
15688
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
15689
15688
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/I]]
15688
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
Module:Protected page
828
1588
15704
11658
2026-10-29T01:57:49Z
Axolitl
296
Implement fix from sandbox which unlinks the images as they must be PD, per [[Module talk:Protected page|talk page]]
15704
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protected page/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
if not self:shouldHaveProtectionCategory() then
return true
end
if type(self.expiry) ~= 'number' then
return false
end
local expiry = os.date('*t', self.expiry)
-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616
local today = os.date('*t')
return (expiry.year < today.year)
or (expiry.year == today.year and expiry.month < today.month)
or (expiry.year == today.year and expiry.month == today.month and expiry.day < today.day)
or (expiry.year == today.year and expiry.month == today.month and expiry.day == today.day and self.expiry < os.time())
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink or "",
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
2l9tbl06cepi1tkxnuv28whatem2k19
15705
15704
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Protected_page]]
15704
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protected page/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
if not self:shouldHaveProtectionCategory() then
return true
end
if type(self.expiry) ~= 'number' then
return false
end
local expiry = os.date('*t', self.expiry)
-- Avoid checking today.day or os.time(), unless close. https://phabricator.wikimedia.org/T416616
local today = os.date('*t')
return (expiry.year < today.year)
or (expiry.year == today.year and expiry.month < today.month)
or (expiry.year == today.year and expiry.month == today.month and expiry.day < today.day)
or (expiry.year == today.year and expiry.month == today.month and expiry.day == today.day and self.expiry < os.time())
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink or "",
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
2l9tbl06cepi1tkxnuv28whatem2k19
Module:Protected page/config
828
1589
15706
11660
2026-11-05T15:15:23Z
Axolitl
296
Fix wrapper name
15706
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
deceased = {
description = 'For user pages of Wikipedia users who are deceased',
text = '${INTROFRAGMENT} to prevent vandalism of a deceased'
.. ' Wikipedian\'s user page.'
.. ' A family member who wishes to edit this user page can use this'
.. ' user\'s ${TALKPAGE} or submit a request to [[Wikipedia:VRT|the'
.. ' Volunteer Response Team]].',
tooltip = '${TOOLTIPFRAGMENT} because this Wikipedian is deceased'
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Wikipedia:Protection policy|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#full|'
.. 'protected]] from editing',
templateeditor = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#template'
.. '|protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Wikipedia:Protection'
.. ' policy#semi|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under [[Wikipedia:Protection'
.. ' policy#extended|extended confirmed protection]]',
},
move = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#Move'
.. ' protection|protected]] from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-confirmed-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|extendedconfirmed|move'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Protected page'] = {},
['Template:Extended confirmed–protected'] = {'ecp'},
['Template:Protected biography of a living person'] = {'blp'},
['Template:Protected due to a dispute'] = {'dispute'},
['Template:Move-protected'] = {action = 'move', catonly = 'yes'},
['Template:Move-protected due to a dispute'] = {'dispute', action = 'move', catonly = 'yes'},
['Template:Move-protected due to vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Office-protected'] = {'office'},
['Template:Pending changes–protected'] = {action = 'autoreview', small = true},
['Template:Semi-protected indefinitely'] = {small = true},
['Template:Protected due to sockpuppetry'] = {'sock'},
['Template:Protected template'] = {'template', small = true},
['Template:Upload-protected'] = {action = 'upload'},
['Template:Protected talk page of a blocked user'] = {'usertalk'},
['Template:Protected due to vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
k108n3hntzssp9cyjanrmu01ygggcb9
15707
15706
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Protected_page/config]]
15706
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
deceased = {
description = 'For user pages of Wikipedia users who are deceased',
text = '${INTROFRAGMENT} to prevent vandalism of a deceased'
.. ' Wikipedian\'s user page.'
.. ' A family member who wishes to edit this user page can use this'
.. ' user\'s ${TALKPAGE} or submit a request to [[Wikipedia:VRT|the'
.. ' Volunteer Response Team]].',
tooltip = '${TOOLTIPFRAGMENT} because this Wikipedian is deceased'
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
link = 'Wikipedia:Protection policy#office',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Wikipedia:Protection policy|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#full|'
.. 'protected]] from editing',
templateeditor = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#template'
.. '|protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Wikipedia:Protection'
.. ' policy#semi|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under [[Wikipedia:Protection'
.. ' policy#extended|extended confirmed protection]]',
},
move = {
default = 'This ${PAGETYPE} is currently [[Wikipedia:Protection policy#Move'
.. ' protection|protected]] from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-confirmed-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|extendedconfirmed|move'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Protected page'] = {},
['Template:Extended confirmed–protected'] = {'ecp'},
['Template:Protected biography of a living person'] = {'blp'},
['Template:Protected due to a dispute'] = {'dispute'},
['Template:Move-protected'] = {action = 'move', catonly = 'yes'},
['Template:Move-protected due to a dispute'] = {'dispute', action = 'move', catonly = 'yes'},
['Template:Move-protected due to vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Office-protected'] = {'office'},
['Template:Pending changes–protected'] = {action = 'autoreview', small = true},
['Template:Semi-protected indefinitely'] = {small = true},
['Template:Protected due to sockpuppetry'] = {'sock'},
['Template:Protected template'] = {'template', small = true},
['Template:Upload-protected'] = {action = 'upload'},
['Template:Protected talk page of a blocked user'] = {'usertalk'},
['Template:Protected due to vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
k108n3hntzssp9cyjanrmu01ygggcb9
Tempilet:Delete/nocat
10
2299
15640
2026-11-09T06:02:08Z
RAPTOR7762
18
/* */
15640
wikitext
text/x-wiki
{{ombox
|type = delete
|text = <big><strong> This {{#switch:{{NAMESPACE}}| = article| Category = category| Template = template| #default = page}} has been nominated for deletion</strong></big><br>To discuss it, please visit <strong>[[{{TALKPAGENAME}}|the nomination page]]</strong> and place<br><code><nowiki>{{subst:Deletion header
| reason = (reason)
|1 = ~~~~
}}</nowiki></code><br><br><em>Do not remove this tag until the deletion nomination is closed.</em><hr><strong>Reason for deletion:</strong><br><em>{{{1|No reason given. PLEASE give a reason, or this request will be denied and removed.<br><br><code><nowiki>{{delete|reason=Give a reason here}}</nowiki></code>}}}</em>
}}
4jt0tfzn0pjug4nd57cwp9ddutu0wri
Tempilet:IPAc-en
10
2300
15644
2017-06-22T21:12:36Z
en>Nardog
0
<includeonly>
15644
wikitext
text/x-wiki
<includeonly>{{#invoke:IPAc-en|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
szcbk6ow194d0m1qh49i8w22cdi4kis
15645
15644
2026-11-09T06:13:31Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPAc-en]]
15644
wikitext
text/x-wiki
<includeonly>{{#invoke:IPAc-en|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
szcbk6ow194d0m1qh49i8w22cdi4kis
Tempilet:IPA
10
2301
15646
2023-09-15T04:33:29Z
Nardog
667
deploying new module, rv in case of a wide problem
15646
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
7tvkwznxaigtvux43hoc1ooe0mnwkzw
15647
15646
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPA]]
15646
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA|main}}</includeonly><noinclude>
{{documentation}}
</noinclude>
7tvkwznxaigtvux43hoc1ooe0mnwkzw
Tempilet:IPA audio link
10
2302
15648
2023-09-02T19:41:41Z
Nardog
667
restore space
15648
wikitext
text/x-wiki
 {{Audio|{{{1|}}}||help=no}}<noinclude>
{{documentation}}
</noinclude>
igny8ptij7w6rb6epgzsg7k8gqbrrog
15649
15648
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPA_audio_link]]
15648
wikitext
text/x-wiki
 {{Audio|{{{1|}}}||help=no}}<noinclude>
{{documentation}}
</noinclude>
igny8ptij7w6rb6epgzsg7k8gqbrrog
Tempilet:Audio
10
2303
15650
2024-12-26T04:38:15Z
Nardog
667
printworthy text is frequently inside this template
15650
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}|{{#ifexist:Media:{{{1}}}|{{#tag:phonos|{{{2|{{{1|}}}}}}|file={{{1}}}}}|{{error{{main other||-small}}|Audio file "{{{1}}}" not found}}<!-- tracking category begin -->{{Category handler|[[Category:Pages linking to missing files]]}}<!-- tracking category end -->}}}}</includeonly><noinclude>
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
{{documentation}}
</noinclude>
oqdt4t5ydsy30slowq9fdqhajtrje6z
15651
15650
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Audio]]
15650
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}|{{#ifexist:Media:{{{1}}}|{{#tag:phonos|{{{2|{{{1|}}}}}}|file={{{1}}}}}|{{error{{main other||-small}}|Audio file "{{{1}}}" not found}}<!-- tracking category begin -->{{Category handler|[[Category:Pages linking to missing files]]}}<!-- tracking category end -->}}}}</includeonly><noinclude>
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
{{documentation}}
</noinclude>
oqdt4t5ydsy30slowq9fdqhajtrje6z
Module:IPAc-en
828
2304
15656
2024-07-08T08:19:47Z
Nardog
667
rv per talk
15656
Scribunto
text/plain
-- This module implements [[Template:IPAc-en]].
local data = mw.loadData('Module:IPAc-en/data')
local p = {}
-- Global container for tracking categories
local categoryHandler = require('Module:Category handler').main
local categories = {}
-- Trims whitespace from a string
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
-- This implements [[Template:Nowrap]].
local function makeNowrapSpan(s)
local span = mw.html.create('span')
:addClass('rt-commentedText') -- Works with [[MediaWiki:Gadget-ReferenceTooltips.js]]
:addClass('nowrap')
:wikitext(s)
return tostring(span)
end
local function makePronunciationText(id)
id = id and string.lower(trim(id))
if id and id ~= '' and data.pronunciation[id] then
return data.pronunciation[id].text
end
end
-- This adds a tooltip icon to a label. It implements [[Template:H:title]].
local function makeTooltip(label, tooltip)
-- mw.html doesn't properly escape '|'
return string.format(
'<span title="%s">%s</span>',
mw.text.encode(tooltip, '|'),
label
)
end
local function formatPhonemeGroup(phonemes)
if #phonemes > 0 then
local span = mw.html.create('span')
:css('border-bottom', '1px dotted')
:wikitext(table.concat(phonemes))
return tostring(span)
else
return ''
end
end
local function renderCategories()
local ret = ''
if categoryHandler{ true } then
ret = {}
for cat in pairs(categories) do
table.insert(ret, string.format('[[Category:%s]]', cat))
end
table.sort(ret)
ret = table.concat(ret)
else
ret = ''
end
return ret
end
function p._main(args)
local ret = {}
local i = 0 -- Keeps track of numbered args
-- Pronunciation
do
local pron = {}
while true do
i = i + 1
local pronItem = makePronunciationText(args[i])
if pronItem then
pron[#pron + 1] = pronItem
pron[#pron + 1] = ' '
else
break
end
end
if #pron > 0 then
ret[#ret + 1] = mw.getCurrentFrame():extensionTag({
name = 'templatestyles',
args = { src = 'Module:IPA/styles.css' }
})
ret[#ret + 1] = string.format(
'<span class="IPA-label IPA-label-small">%s</span>',
table.concat(pron)
)
end
end
-- Phonemes
do
-- Loop through the numbered args, separating them into phoneme groups
-- and separator strings (both called "words" for convenience). We only
-- underline the phoneme groups, not the separators.
local words = {}
words[#words + 1] = '/' -- Opening slash
i = i - 1 -- Set up i again as it was changed in the pronunciation loop
local id
repeat
local phonemes = {}
local isWordEnd = false
while not isWordEnd do
i = i + 1
id = args[i]
id = id and trim(id)
if not id then
isWordEnd = true
words[#words + 1] = formatPhonemeGroup(phonemes)
elseif id ~= '' then
local t = data.phonemes[id]
if not t then
-- We were passed an invalid id.
isWordEnd = true
categories["Ill-formatted IPAc-en transclusions"] = true
words[#words + 1] = formatPhonemeGroup(phonemes)
words[#words + 1] = makeTooltip(
string.format(
"<strong class=\"error\">[invalid input: '%s']</strong>",
id
),
'Unrecognized symbol'
)
elseif not t.label then
-- The data module contains bad data, so throw an error.
error(string.format(
"no label was found for id '%s'",
tostring(id)
))
elseif t.tooltip then
-- We are dealing with a regular phoneme.
phonemes[#phonemes + 1] = makeTooltip(
t.label,
t.tooltip
)
else
-- We are dealing with a separator.
isWordEnd = true
words[#words + 1] = formatPhonemeGroup(phonemes)
words[#words + 1] = t.label
end
end
end
until not id
words[#words + 1] = '/' -- Closing slash
-- Wrap the words in a link to IPA help.
local span = mw.html.create('span')
-- Suppress Navigation popups and Page Previews (aka Hovercards)
:addClass('IPA nopopups noexcerpt')
:attr('lang', 'en-fonipa')
:wikitext(string.format(
'[[Help:IPA/English|%s]]',
table.concat(words)
))
ret[#ret + 1] = tostring(span)
end
-- Audio link
do
local file = args.audio and trim(args.audio)
if file and file ~= '' then
categories["Pages including recorded pronunciations"] = true
ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{
title = 'Template:IPA audio link', args = { file } }
end
end
-- Nowrap and categories
ret = makeNowrapSpan(table.concat(ret)) .. renderCategories()
-- Reset the categories table in case we are run again.
categories = {}
return ret
end
function p.main(frame)
return p._main(frame:getParent().args)
end
return p
n18dhnoav7mce9k6g2cxv8uk1aacnlc
15657
15656
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPAc-en]]
15656
Scribunto
text/plain
-- This module implements [[Template:IPAc-en]].
local data = mw.loadData('Module:IPAc-en/data')
local p = {}
-- Global container for tracking categories
local categoryHandler = require('Module:Category handler').main
local categories = {}
-- Trims whitespace from a string
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
-- This implements [[Template:Nowrap]].
local function makeNowrapSpan(s)
local span = mw.html.create('span')
:addClass('rt-commentedText') -- Works with [[MediaWiki:Gadget-ReferenceTooltips.js]]
:addClass('nowrap')
:wikitext(s)
return tostring(span)
end
local function makePronunciationText(id)
id = id and string.lower(trim(id))
if id and id ~= '' and data.pronunciation[id] then
return data.pronunciation[id].text
end
end
-- This adds a tooltip icon to a label. It implements [[Template:H:title]].
local function makeTooltip(label, tooltip)
-- mw.html doesn't properly escape '|'
return string.format(
'<span title="%s">%s</span>',
mw.text.encode(tooltip, '|'),
label
)
end
local function formatPhonemeGroup(phonemes)
if #phonemes > 0 then
local span = mw.html.create('span')
:css('border-bottom', '1px dotted')
:wikitext(table.concat(phonemes))
return tostring(span)
else
return ''
end
end
local function renderCategories()
local ret = ''
if categoryHandler{ true } then
ret = {}
for cat in pairs(categories) do
table.insert(ret, string.format('[[Category:%s]]', cat))
end
table.sort(ret)
ret = table.concat(ret)
else
ret = ''
end
return ret
end
function p._main(args)
local ret = {}
local i = 0 -- Keeps track of numbered args
-- Pronunciation
do
local pron = {}
while true do
i = i + 1
local pronItem = makePronunciationText(args[i])
if pronItem then
pron[#pron + 1] = pronItem
pron[#pron + 1] = ' '
else
break
end
end
if #pron > 0 then
ret[#ret + 1] = mw.getCurrentFrame():extensionTag({
name = 'templatestyles',
args = { src = 'Module:IPA/styles.css' }
})
ret[#ret + 1] = string.format(
'<span class="IPA-label IPA-label-small">%s</span>',
table.concat(pron)
)
end
end
-- Phonemes
do
-- Loop through the numbered args, separating them into phoneme groups
-- and separator strings (both called "words" for convenience). We only
-- underline the phoneme groups, not the separators.
local words = {}
words[#words + 1] = '/' -- Opening slash
i = i - 1 -- Set up i again as it was changed in the pronunciation loop
local id
repeat
local phonemes = {}
local isWordEnd = false
while not isWordEnd do
i = i + 1
id = args[i]
id = id and trim(id)
if not id then
isWordEnd = true
words[#words + 1] = formatPhonemeGroup(phonemes)
elseif id ~= '' then
local t = data.phonemes[id]
if not t then
-- We were passed an invalid id.
isWordEnd = true
categories["Ill-formatted IPAc-en transclusions"] = true
words[#words + 1] = formatPhonemeGroup(phonemes)
words[#words + 1] = makeTooltip(
string.format(
"<strong class=\"error\">[invalid input: '%s']</strong>",
id
),
'Unrecognized symbol'
)
elseif not t.label then
-- The data module contains bad data, so throw an error.
error(string.format(
"no label was found for id '%s'",
tostring(id)
))
elseif t.tooltip then
-- We are dealing with a regular phoneme.
phonemes[#phonemes + 1] = makeTooltip(
t.label,
t.tooltip
)
else
-- We are dealing with a separator.
isWordEnd = true
words[#words + 1] = formatPhonemeGroup(phonemes)
words[#words + 1] = t.label
end
end
end
until not id
words[#words + 1] = '/' -- Closing slash
-- Wrap the words in a link to IPA help.
local span = mw.html.create('span')
-- Suppress Navigation popups and Page Previews (aka Hovercards)
:addClass('IPA nopopups noexcerpt')
:attr('lang', 'en-fonipa')
:wikitext(string.format(
'[[Help:IPA/English|%s]]',
table.concat(words)
))
ret[#ret + 1] = tostring(span)
end
-- Audio link
do
local file = args.audio and trim(args.audio)
if file and file ~= '' then
categories["Pages including recorded pronunciations"] = true
ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{
title = 'Template:IPA audio link', args = { file } }
end
end
-- Nowrap and categories
ret = makeNowrapSpan(table.concat(ret)) .. renderCategories()
-- Reset the categories table in case we are run again.
categories = {}
return ret
end
function p.main(frame)
return p._main(frame:getParent().args)
end
return p
n18dhnoav7mce9k6g2cxv8uk1aacnlc
Module:IPAc-en/data
828
2305
15658
2015-06-19T11:38:13Z
Mr. Stradivarius
672
switch to main data modules
15658
Scribunto
text/plain
-- This module processes data for [[Module:IPAc-en]]. It is intended to be
-- loaded with mw.loadData.
local PRONUNCIATION_MODULE = 'Module:IPAc-en/pronunciation'
local PHONEME_MODULE = 'Module:IPAc-en/phonemes'
local function makeData(oldData)
local newData = {}
for i, old in ipairs(oldData) do
local new = {}
for k, v in pairs(old) do
if k ~= 'aliases' and k ~= 'code' then
new[k] = v
end
end
newData[old.code] = new
if old.aliases then
for i, alias in ipairs(old.aliases) do
newData[alias] = new
end
end
end
return newData
end
local function main()
local pronunciation = makeData(require(PRONUNCIATION_MODULE))
local phonemes = makeData(require(PHONEME_MODULE))
-- Check that no pronunciation keys are also contained in the phonemes
-- data. This would cause silent, hard-to-debug errors if it went
-- unchecked, so make it cause a big red error message instead.
for id in pairs(pronunciation) do
if phonemes[id] then
error(string.format(
"duplicate ID '%s' found in %s and %s",
id,
PRONUNCIATION_MODULE,
PHONEME_MODULE
))
end
end
return {
pronunciation = pronunciation,
phonemes = phonemes,
}
end
return main()
63ca8m7vp9oj803ii5e38i1pq69wf9e
15659
15658
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPAc-en/data]]
15658
Scribunto
text/plain
-- This module processes data for [[Module:IPAc-en]]. It is intended to be
-- loaded with mw.loadData.
local PRONUNCIATION_MODULE = 'Module:IPAc-en/pronunciation'
local PHONEME_MODULE = 'Module:IPAc-en/phonemes'
local function makeData(oldData)
local newData = {}
for i, old in ipairs(oldData) do
local new = {}
for k, v in pairs(old) do
if k ~= 'aliases' and k ~= 'code' then
new[k] = v
end
end
newData[old.code] = new
if old.aliases then
for i, alias in ipairs(old.aliases) do
newData[alias] = new
end
end
end
return newData
end
local function main()
local pronunciation = makeData(require(PRONUNCIATION_MODULE))
local phonemes = makeData(require(PHONEME_MODULE))
-- Check that no pronunciation keys are also contained in the phonemes
-- data. This would cause silent, hard-to-debug errors if it went
-- unchecked, so make it cause a big red error message instead.
for id in pairs(pronunciation) do
if phonemes[id] then
error(string.format(
"duplicate ID '%s' found in %s and %s",
id,
PRONUNCIATION_MODULE,
PHONEME_MODULE
))
end
end
return {
pronunciation = pronunciation,
phonemes = phonemes,
}
end
return main()
63ca8m7vp9oj803ii5e38i1pq69wf9e
Module:IPAc-en/pronunciation
828
2306
15660
2019-09-26T09:16:18Z
Nardog
667
add "also" etc.
15660
Scribunto
text/plain
-- This module contains pronunciation-key data for [[Module:IPAc-en]].
return {
{
code = 'lang',
text = 'English:'
},
{
code = 'pron',
text = ''
},
{
code = 'local',
text = 'locally'
},
{
code = 'ipa',
text = '[[International Phonetic Alphabet|IPA]]:'
},
{
code = 'also',
text = 'also'
},
{
code = 'uk',
text = '[[British English|UK]]:'
},
{
code = 'us',
text = '[[American English|US]]:'
},
{
code = 'uklang',
text = '[[British English]]:'
},
{
code = 'uslang',
text = '[[American English]]:'
},
{
code = 'ukalso',
text = '[[British English|UK]] also'
},
{
code = 'usalso',
text = '[[American English|US]] also'
},
{
code = 'alsouk',
text = 'also [[British English|UK]]:'
},
{
code = 'alsous',
text = 'also [[American English|US]]:'
},
}
skyneclm3gt9868iop1vpqel8zboas5
15661
15660
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPAc-en/pronunciation]]
15660
Scribunto
text/plain
-- This module contains pronunciation-key data for [[Module:IPAc-en]].
return {
{
code = 'lang',
text = 'English:'
},
{
code = 'pron',
text = ''
},
{
code = 'local',
text = 'locally'
},
{
code = 'ipa',
text = '[[International Phonetic Alphabet|IPA]]:'
},
{
code = 'also',
text = 'also'
},
{
code = 'uk',
text = '[[British English|UK]]:'
},
{
code = 'us',
text = '[[American English|US]]:'
},
{
code = 'uklang',
text = '[[British English]]:'
},
{
code = 'uslang',
text = '[[American English]]:'
},
{
code = 'ukalso',
text = '[[British English|UK]] also'
},
{
code = 'usalso',
text = '[[American English|US]] also'
},
{
code = 'alsouk',
text = 'also [[British English|UK]]:'
},
{
code = 'alsous',
text = 'also [[American English|US]]:'
},
}
skyneclm3gt9868iop1vpqel8zboas5
Module:IPAc-en/phonemes
828
2307
15662
2026-02-18T12:40:40Z
Nardog
667
Reverted 1 edit by [[Special:Contributions/Kwamikagami|Kwamikagami]] ([[User talk:Kwamikagami|talk]]): Per [[WP:TPEDISPUTE]]
15662
Scribunto
text/plain
-- This module contains phoneme data for [[Module:IPAc-en]].
return {
-- CONSONANTS
{
code = "b",
label = "b",
tooltip = "'b' in 'buy'",
},
{
code = "d",
label = "d",
tooltip = "'d' in 'dye'",
},
{
code = "dj",
aliases = {"dy", "dʲ"},
label = "dj",
tooltip = "/dj/: 'd' in 'dew'",
},
{
code = "dʒ",
aliases = {"dZ", "ʤ"},
label = "dʒ",
tooltip = "/dʒ/: 'j' in 'jam'",
},
{
code = "ð",
aliases = {"D"},
label = "ð",
tooltip = "/ð/: 'th' in 'this'",
},
{
code = "f",
label = "f",
tooltip = "'f' in 'find'",
},
{
code = "ɡ",
aliases = {"g"},
label = "ɡ",
tooltip = "/ɡ/: 'g' in 'guy'",
},
{
code = "h",
label = "h",
tooltip = "'h' in 'hi'",
},
{
code = "hw",
aliases = {"ʍ"},
label = "hw",
tooltip = "/hw/: 'wh' in 'why'",
},
{
code = "j",
aliases = {"y"},
label = "j",
tooltip = "/j/: 'y' in 'yes'",
},
{
code = "k",
label = "k",
tooltip = "'k' in 'kind'",
},
{
code = "l",
label = "l",
tooltip = "'l' in 'lie'",
},
{
code = "lj",
aliases = {"ly", "lʲ"},
label = "lj",
tooltip = "/lj/: 'l' in 'lute'",
},
{
code = "m",
label = "m",
tooltip = "'m' in 'my'",
},
{
code = "n",
label = "n",
tooltip = "'n' in 'nigh'",
},
{
code = "nj",
aliases = {"ny", "nʲ"},
label = "nj",
tooltip = "/nj/: 'n' in 'new'",
},
{
code = "ŋ",
aliases = {"N", "ng"},
label = "ŋ",
tooltip = "/ŋ/: 'ng' in 'sing'",
},
{
code = "p",
label = "p",
tooltip = "'p' in 'pie'",
},
{
code = "r",
aliases = {"ɹ", "ɻ"},
label = "r",
tooltip = "'r' in 'rye'",
},
{
code = "s",
label = "s",
tooltip = "'s' in 'sigh'",
},
{
code = "sj",
aliases = {"sy", "sʲ"},
label = "sj",
tooltip = "/sj/: 's' in 'consume'",
},
{
code = "ʃ",
aliases = {"S", "sh"},
label = "ʃ",
tooltip = "/ʃ/: 'sh' in 'shy'",
},
{
code = "t",
label = "t",
tooltip = "'t' in 'tie'",
},
{
code = "tj",
aliases = {"ty", "tʲ"},
label = "tj",
tooltip = "/tj/: 't' in 'tune'",
},
{
code = "tʃ",
aliases = {"tS", "ʧ", "ch"},
label = "tʃ",
tooltip = "/tʃ/: 'ch' in 'China'",
},
{
code = "θ",
aliases = {"T"},
label = "θ",
tooltip = "/θ/: 'th' in 'thigh'",
},
{
code = "θj",
aliases = {"θy", "θʲ"},
label = "θj",
tooltip = "/θj/: 'th' in 'enthuse'",
},
{
code = "v",
label = "v",
tooltip = "'v' in 'vie'",
},
{
code = "w",
label = "w",
tooltip = "'w' in 'wind'",
},
{
code = "z",
label = "z",
tooltip = "'z' in 'zoom'",
},
{
code = "zj",
aliases = {"zy", "zʲ"},
label = "zj",
tooltip = "/zj/: 'Z' in 'Zeus'",
},
{
code = "ʒ",
aliases = {"Z", "zh"},
label = "ʒ",
tooltip = "/ʒ/: 's' in 'pleasure'",
},
-- VOWELS
{
code = "ɑː",
aliases = {"A:", "ɑ:", "aː", "a:"},
label = "ɑː",
tooltip = "/ɑː/: 'a' in 'father'",
},
{
code = "ɑːr",
aliases = {"ɑɹ", "aːr", "a:r", "ɑ:r", "ɑr"},
label = "ɑːr",
tooltip = "/ɑːr/: 'ar' in 'far'",
},
{
code = "ɒ",
aliases = {"Q"},
label = "ɒ",
tooltip = "/ɒ/: 'o' in 'body'",
},
{
code = "ɒr",
aliases = {"Qr"},
label = "ɒr",
tooltip = "/ɒr/: 'or' in 'moral'",
},
{
code = "æ",
aliases = {"ae", "{"},
label = "æ",
tooltip = "/æ/: 'a' in 'bad'",
},
{
code = "ær",
aliases = {"aer", "&r", "æɹ"},
label = "ær",
tooltip = "/ær/: 'arr' in 'marry'",
},
{
code = "aɪ",
aliases = {"ai", "aI"},
label = "aɪ",
tooltip = "/aɪ/: 'i' in 'tide'",
},
{
code = "aɪər",
aliases = {"aɪr", "aIr", "aɪə"},
label = "aɪər",
tooltip = "/aɪər/: 'ire' in 'fire'",
},
{
code = "aʊ",
aliases = {"au", "aU"},
label = "aʊ",
tooltip = "/aʊ/: 'ou' in 'mouth'",
},
{
code = "aʊər",
aliases = {"aʊr", "aUr", "aʊə", "aur"},
label = "aʊər",
tooltip = "/aʊər/: 'our' in 'hour'",
},
{
code = "ɛ",
aliases = {"E"},
label = "ɛ",
tooltip = "/ɛ/: 'e' in 'dress'",
},
{
code = "ɛr",
aliases = {"Er"},
label = "ɛr",
tooltip = "/ɛr/: 'err' in 'merry'",
},
{
code = "eɪ",
aliases = {"ei", "eI", "eː", "e:"},
label = "eɪ",
tooltip = "/eɪ/: 'a' in 'face'",
},
{
code = "ɛər",
aliases = {"eir", "eIr", "e@r", "E@r", "ɛɪɹ", "eɪr", "eːr", "e:r", "ɛəɹ", "ɛə", "ɛːr", "ɛ:r", "ɛː", "ɛ:", "E:", "E:r"},
label = "ɛər",
tooltip = "/ɛər/: 'are' in 'bare'",
},
{
code = "ɛəˈr",
aliases = {"ɛə'r", "eəˈr", "eə'r", "e@'r", "E@'r", "ɛːˈr", "E:'r"},
label = "ɛəˈr",
tooltip = "/ɛəˈr/: 'ere' in 'thereof'",
},
{
code = "ɛəˌr",
aliases = {"ɛə,r", "eəˌr", "eə,r", "E@,r", "E@%r", "e@,r", "e@%r", "ɛːˌr", "E:,r", "E:%r"},
label = "ɛəˌr",
tooltip = "/ɛəˌr/: 'ere' in 'thereof'",
},
{
code = "ɪ",
aliases = {"I", "ᵻ"},
label = "ɪ",
tooltip = "/ɪ/: 'i' in 'kit'",
},
{
code = "ɪr",
label = "ɪr",
tooltip = "/ɪr/: 'irr' in 'mirror'",
},
{
code = "iː",
aliases = {"i:"},
label = "iː",
tooltip = "/iː/: 'ee' in 'fleece'",
},
{
code = "ɪər",
aliases = {"i:r", "iːr", "I@r", "i@r", "ɪəɹ", "iːɹ", "ɪə"},
label = "ɪər",
tooltip = "/ɪər/: 'ear' in 'near'",
},
{
code = "ɪəˈr",
aliases = {"ɪə'r", "I@'r"},
label = "ɪəˈr",
tooltip = "/ɪəˈr/: 'er' in 'spheroidal'",
},
{
code = "ɪəˌr",
aliases = {"ɪə,r", "I@,r", "I@%r"},
label = "ɪəˌr",
tooltip = "/ɪəˌr/: 'er' in 'spheroidal'",
},
{
code = "oʊ",
aliases = {"o:", "oː", "ou", "oU", "@u", "@U", "əʊ", "əu", "oʊ-"},
label = "oʊ",
tooltip = "/oʊ/: 'o' in 'code'",
},
{
code = "ɔː",
aliases = {"O", "O:", "ɔ:", "ɒː", "Q:"},
label = "ɔː",
tooltip = "/ɔː/: 'au' in 'fraud'",
},
{
code = "ɔːr",
aliases = {"Or", "ɔɹ", "ɔ(r)", "ɔr", "ɔər", "oUr", "ɔəɹ", "ɔʊɹ", "oʊɹ", "oʊr", "oːr", "o:r", "ɔə", "ɔə(r)"},
label = "ɔːr",
tooltip = "/ɔːr/: 'ar' in 'war'",
},
{
code = "ɔɪ",
aliases = {"oj", "ɔj", "oi", "oɪ", "ɔi", "OI", "oy"},
label = "ɔɪ",
tooltip = "/ɔɪ/: 'oi' in 'choice'",
},
{
code = "ɔɪər",
aliases = {"ɔɪr", "oyr", "ɔɪə"},
label = "ɔɪər",
tooltip = "/ɔɪər/: 'oir' in 'coir'",
},
{
code = "ʊ",
aliases = {"U", "ᵿ"},
label = "ʊ",
tooltip = "/ʊ/: 'u' in 'push'",
},
{
code = "ʊr",
aliases = {"Ur"},
label = "ʊr",
tooltip = "/ʊr/: 'our' in 'courier'",
},
{
code = "uː",
aliases = {"u:"},
label = "uː",
tooltip = "/uː/: 'oo' in 'goose'",
},
{
code = "ʊər",
aliases = {"u:r", "uːr", "u@r", "U@r", "ʊəɹ", "ʊə"},
label = "ʊər",
tooltip = "/ʊər/: 'our' in 'tour'",
},
{
code = "ʊəˈr",
aliases = {"ʊə'r", "U@'r"},
label = "ʊəˈr",
tooltip = "/ʊəˈr/: 'ur' in 'plurality'",
},
{
code = "ʊəˌr",
aliases = {"ʊə,r", "U@,r", "U@%r"},
label = "ʊəˌr",
tooltip = "/ʊəˌr/: 'ur' in 'plurality'",
},
{
code = "ʌ",
aliases = {"V"},
label = "ʌ",
tooltip = "/ʌ/: 'u' in 'cut'",
},
{
code = "ʌr",
aliases = {"Vr", "ʌɹ"},
label = "ʌr",
tooltip = "/ʌr/: 'urr' in 'hurry'",
},
{
code = "ɜːr",
aliases = {"ɝː", "ɝ", "3r", "3:r", "əːr", "@:r", "ɜɹ", "ɜ(r)", "ɜr"},
label = "ɜːr",
tooltip = "/ɜːr/: 'ur' in 'fur'",
},
{
code = "ə",
aliases = {"@"},
label = "ə",
tooltip = "/ə/: 'a' in 'about'",
},
-- SYLLABIC CONSONANTS
{
code = "ər",
aliases = {"ɚ", "@r", "əɹ", "ə(r)"},
label = "ər",
tooltip = "/ər/: 'er' in 'letter'",
},
{
code = "əl",
aliases = {"@l", "ᵊl", "l̩"},
label = "əl",
tooltip = "/əl/: 'le' in 'bottle'",
},
{
code = "ən",
aliases = {"@n", "ᵊn", "n̩"},
label = "ən",
tooltip = "/ən/: 'on' in 'button'",
},
{
code = "əm",
aliases = {"@m", "ᵊm", "m̩"},
label = "əm",
tooltip = "/əm/: 'm' in 'rhythm'",
},
-- ARCHIPHONEMES
{
code = "i",
label = "i",
tooltip = "/i/: 'y' in 'happy'",
},
{
code = "u",
label = "u",
tooltip = "/u/: 'u' in 'influence'",
},
-- MARGINAL SEGMENTS
{
code = "x",
label = "x",
aliases = {"kh"},
tooltip = "/x/: 'ch' in 'loch'",
},
{
code = "ʔ",
aliases = {"?"},
label = "ʔ",
tooltip = "/ʔ/: the catch in 'uh-oh'",
},
{
code = "ɒ̃",
aliases = {"ɑ̃", "ɒ~", "ɑ~", "Q~"},
label = "ɒ̃",
tooltip = "/ɒ̃/: nasal 'an' in 'vin blanc'",
},
{
code = "æ̃",
aliases = {"ae~", "{~", "ã", "a~"},
label = "æ̃",
tooltip = "/æ̃/: nasal 'in' in 'vin blanc'",
},
{
code = "ɜː",
aliases = {"3", "3:", "ɜ:", "ɜ", "əː", "@:"},
label = "ɜː",
tooltip = "/ɜː/: r-less 'ur' in 'nurse'",
},
-- SUPRASEGMENTALS
{
code = "ˈ",
aliases = {"'", '"'},
label = "ˈ",
tooltip = "/ˈ/: primary stress follows",
},
{
code = "ˌ",
aliases = {",", "%"},
label = "ˌ",
tooltip = "/ˌ/: secondary stress follows",
},
{
code = ".",
aliases = {"·"},
label = ".",
tooltip = "/./: syllable break",
},
{
code = "#",
label = "#",
tooltip = "/#/: morpheme break",
},
{
code = "!",
label = "|",
tooltip = "/|/: prosodic break (minor)",
},
{
code = "!!",
aliases = {"‖"},
label = "‖",
tooltip = "/‖/: prosodic break (major)",
},
-- SEPARATORS
-- Tables without tooltip text are used as word separators. In addition to
-- not having any tooltip text in the template output, they are not
-- underlined.
{
code = "_",
label = "<span class=\"wrap\"> </span>",
},
{
code = "nbsp",
aliases = {" "},
label = " ",
},
{
code = ",_",
label = ",<span class=\"wrap\"> </span>",
},
{
code = "-",
aliases = {"–"},
label = "-",
},
{
code = "(",
label = "(",
},
{
code = ")",
label = ")",
},
-- This is useful for highly variable words in place names, which are not
-- important to transcribe.
{
code = "...",
label = " ...<span class=\"wrap\"> </span>",
},
-- Obsolete combinations, kept for compatibility
{
code = "juː",
label = "juː",
tooltip = "/juː/: 'u' in 'cute'",
},
{
code = "jʊər",
label = "jʊər",
tooltip = "/jʊər/: 'ure' in 'cure'",
},
}
rrm0atjuiucipgueuaoozhqg94awcpv
15663
15662
2026-11-09T06:13:49Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPAc-en/phonemes]]
15662
Scribunto
text/plain
-- This module contains phoneme data for [[Module:IPAc-en]].
return {
-- CONSONANTS
{
code = "b",
label = "b",
tooltip = "'b' in 'buy'",
},
{
code = "d",
label = "d",
tooltip = "'d' in 'dye'",
},
{
code = "dj",
aliases = {"dy", "dʲ"},
label = "dj",
tooltip = "/dj/: 'd' in 'dew'",
},
{
code = "dʒ",
aliases = {"dZ", "ʤ"},
label = "dʒ",
tooltip = "/dʒ/: 'j' in 'jam'",
},
{
code = "ð",
aliases = {"D"},
label = "ð",
tooltip = "/ð/: 'th' in 'this'",
},
{
code = "f",
label = "f",
tooltip = "'f' in 'find'",
},
{
code = "ɡ",
aliases = {"g"},
label = "ɡ",
tooltip = "/ɡ/: 'g' in 'guy'",
},
{
code = "h",
label = "h",
tooltip = "'h' in 'hi'",
},
{
code = "hw",
aliases = {"ʍ"},
label = "hw",
tooltip = "/hw/: 'wh' in 'why'",
},
{
code = "j",
aliases = {"y"},
label = "j",
tooltip = "/j/: 'y' in 'yes'",
},
{
code = "k",
label = "k",
tooltip = "'k' in 'kind'",
},
{
code = "l",
label = "l",
tooltip = "'l' in 'lie'",
},
{
code = "lj",
aliases = {"ly", "lʲ"},
label = "lj",
tooltip = "/lj/: 'l' in 'lute'",
},
{
code = "m",
label = "m",
tooltip = "'m' in 'my'",
},
{
code = "n",
label = "n",
tooltip = "'n' in 'nigh'",
},
{
code = "nj",
aliases = {"ny", "nʲ"},
label = "nj",
tooltip = "/nj/: 'n' in 'new'",
},
{
code = "ŋ",
aliases = {"N", "ng"},
label = "ŋ",
tooltip = "/ŋ/: 'ng' in 'sing'",
},
{
code = "p",
label = "p",
tooltip = "'p' in 'pie'",
},
{
code = "r",
aliases = {"ɹ", "ɻ"},
label = "r",
tooltip = "'r' in 'rye'",
},
{
code = "s",
label = "s",
tooltip = "'s' in 'sigh'",
},
{
code = "sj",
aliases = {"sy", "sʲ"},
label = "sj",
tooltip = "/sj/: 's' in 'consume'",
},
{
code = "ʃ",
aliases = {"S", "sh"},
label = "ʃ",
tooltip = "/ʃ/: 'sh' in 'shy'",
},
{
code = "t",
label = "t",
tooltip = "'t' in 'tie'",
},
{
code = "tj",
aliases = {"ty", "tʲ"},
label = "tj",
tooltip = "/tj/: 't' in 'tune'",
},
{
code = "tʃ",
aliases = {"tS", "ʧ", "ch"},
label = "tʃ",
tooltip = "/tʃ/: 'ch' in 'China'",
},
{
code = "θ",
aliases = {"T"},
label = "θ",
tooltip = "/θ/: 'th' in 'thigh'",
},
{
code = "θj",
aliases = {"θy", "θʲ"},
label = "θj",
tooltip = "/θj/: 'th' in 'enthuse'",
},
{
code = "v",
label = "v",
tooltip = "'v' in 'vie'",
},
{
code = "w",
label = "w",
tooltip = "'w' in 'wind'",
},
{
code = "z",
label = "z",
tooltip = "'z' in 'zoom'",
},
{
code = "zj",
aliases = {"zy", "zʲ"},
label = "zj",
tooltip = "/zj/: 'Z' in 'Zeus'",
},
{
code = "ʒ",
aliases = {"Z", "zh"},
label = "ʒ",
tooltip = "/ʒ/: 's' in 'pleasure'",
},
-- VOWELS
{
code = "ɑː",
aliases = {"A:", "ɑ:", "aː", "a:"},
label = "ɑː",
tooltip = "/ɑː/: 'a' in 'father'",
},
{
code = "ɑːr",
aliases = {"ɑɹ", "aːr", "a:r", "ɑ:r", "ɑr"},
label = "ɑːr",
tooltip = "/ɑːr/: 'ar' in 'far'",
},
{
code = "ɒ",
aliases = {"Q"},
label = "ɒ",
tooltip = "/ɒ/: 'o' in 'body'",
},
{
code = "ɒr",
aliases = {"Qr"},
label = "ɒr",
tooltip = "/ɒr/: 'or' in 'moral'",
},
{
code = "æ",
aliases = {"ae", "{"},
label = "æ",
tooltip = "/æ/: 'a' in 'bad'",
},
{
code = "ær",
aliases = {"aer", "&r", "æɹ"},
label = "ær",
tooltip = "/ær/: 'arr' in 'marry'",
},
{
code = "aɪ",
aliases = {"ai", "aI"},
label = "aɪ",
tooltip = "/aɪ/: 'i' in 'tide'",
},
{
code = "aɪər",
aliases = {"aɪr", "aIr", "aɪə"},
label = "aɪər",
tooltip = "/aɪər/: 'ire' in 'fire'",
},
{
code = "aʊ",
aliases = {"au", "aU"},
label = "aʊ",
tooltip = "/aʊ/: 'ou' in 'mouth'",
},
{
code = "aʊər",
aliases = {"aʊr", "aUr", "aʊə", "aur"},
label = "aʊər",
tooltip = "/aʊər/: 'our' in 'hour'",
},
{
code = "ɛ",
aliases = {"E"},
label = "ɛ",
tooltip = "/ɛ/: 'e' in 'dress'",
},
{
code = "ɛr",
aliases = {"Er"},
label = "ɛr",
tooltip = "/ɛr/: 'err' in 'merry'",
},
{
code = "eɪ",
aliases = {"ei", "eI", "eː", "e:"},
label = "eɪ",
tooltip = "/eɪ/: 'a' in 'face'",
},
{
code = "ɛər",
aliases = {"eir", "eIr", "e@r", "E@r", "ɛɪɹ", "eɪr", "eːr", "e:r", "ɛəɹ", "ɛə", "ɛːr", "ɛ:r", "ɛː", "ɛ:", "E:", "E:r"},
label = "ɛər",
tooltip = "/ɛər/: 'are' in 'bare'",
},
{
code = "ɛəˈr",
aliases = {"ɛə'r", "eəˈr", "eə'r", "e@'r", "E@'r", "ɛːˈr", "E:'r"},
label = "ɛəˈr",
tooltip = "/ɛəˈr/: 'ere' in 'thereof'",
},
{
code = "ɛəˌr",
aliases = {"ɛə,r", "eəˌr", "eə,r", "E@,r", "E@%r", "e@,r", "e@%r", "ɛːˌr", "E:,r", "E:%r"},
label = "ɛəˌr",
tooltip = "/ɛəˌr/: 'ere' in 'thereof'",
},
{
code = "ɪ",
aliases = {"I", "ᵻ"},
label = "ɪ",
tooltip = "/ɪ/: 'i' in 'kit'",
},
{
code = "ɪr",
label = "ɪr",
tooltip = "/ɪr/: 'irr' in 'mirror'",
},
{
code = "iː",
aliases = {"i:"},
label = "iː",
tooltip = "/iː/: 'ee' in 'fleece'",
},
{
code = "ɪər",
aliases = {"i:r", "iːr", "I@r", "i@r", "ɪəɹ", "iːɹ", "ɪə"},
label = "ɪər",
tooltip = "/ɪər/: 'ear' in 'near'",
},
{
code = "ɪəˈr",
aliases = {"ɪə'r", "I@'r"},
label = "ɪəˈr",
tooltip = "/ɪəˈr/: 'er' in 'spheroidal'",
},
{
code = "ɪəˌr",
aliases = {"ɪə,r", "I@,r", "I@%r"},
label = "ɪəˌr",
tooltip = "/ɪəˌr/: 'er' in 'spheroidal'",
},
{
code = "oʊ",
aliases = {"o:", "oː", "ou", "oU", "@u", "@U", "əʊ", "əu", "oʊ-"},
label = "oʊ",
tooltip = "/oʊ/: 'o' in 'code'",
},
{
code = "ɔː",
aliases = {"O", "O:", "ɔ:", "ɒː", "Q:"},
label = "ɔː",
tooltip = "/ɔː/: 'au' in 'fraud'",
},
{
code = "ɔːr",
aliases = {"Or", "ɔɹ", "ɔ(r)", "ɔr", "ɔər", "oUr", "ɔəɹ", "ɔʊɹ", "oʊɹ", "oʊr", "oːr", "o:r", "ɔə", "ɔə(r)"},
label = "ɔːr",
tooltip = "/ɔːr/: 'ar' in 'war'",
},
{
code = "ɔɪ",
aliases = {"oj", "ɔj", "oi", "oɪ", "ɔi", "OI", "oy"},
label = "ɔɪ",
tooltip = "/ɔɪ/: 'oi' in 'choice'",
},
{
code = "ɔɪər",
aliases = {"ɔɪr", "oyr", "ɔɪə"},
label = "ɔɪər",
tooltip = "/ɔɪər/: 'oir' in 'coir'",
},
{
code = "ʊ",
aliases = {"U", "ᵿ"},
label = "ʊ",
tooltip = "/ʊ/: 'u' in 'push'",
},
{
code = "ʊr",
aliases = {"Ur"},
label = "ʊr",
tooltip = "/ʊr/: 'our' in 'courier'",
},
{
code = "uː",
aliases = {"u:"},
label = "uː",
tooltip = "/uː/: 'oo' in 'goose'",
},
{
code = "ʊər",
aliases = {"u:r", "uːr", "u@r", "U@r", "ʊəɹ", "ʊə"},
label = "ʊər",
tooltip = "/ʊər/: 'our' in 'tour'",
},
{
code = "ʊəˈr",
aliases = {"ʊə'r", "U@'r"},
label = "ʊəˈr",
tooltip = "/ʊəˈr/: 'ur' in 'plurality'",
},
{
code = "ʊəˌr",
aliases = {"ʊə,r", "U@,r", "U@%r"},
label = "ʊəˌr",
tooltip = "/ʊəˌr/: 'ur' in 'plurality'",
},
{
code = "ʌ",
aliases = {"V"},
label = "ʌ",
tooltip = "/ʌ/: 'u' in 'cut'",
},
{
code = "ʌr",
aliases = {"Vr", "ʌɹ"},
label = "ʌr",
tooltip = "/ʌr/: 'urr' in 'hurry'",
},
{
code = "ɜːr",
aliases = {"ɝː", "ɝ", "3r", "3:r", "əːr", "@:r", "ɜɹ", "ɜ(r)", "ɜr"},
label = "ɜːr",
tooltip = "/ɜːr/: 'ur' in 'fur'",
},
{
code = "ə",
aliases = {"@"},
label = "ə",
tooltip = "/ə/: 'a' in 'about'",
},
-- SYLLABIC CONSONANTS
{
code = "ər",
aliases = {"ɚ", "@r", "əɹ", "ə(r)"},
label = "ər",
tooltip = "/ər/: 'er' in 'letter'",
},
{
code = "əl",
aliases = {"@l", "ᵊl", "l̩"},
label = "əl",
tooltip = "/əl/: 'le' in 'bottle'",
},
{
code = "ən",
aliases = {"@n", "ᵊn", "n̩"},
label = "ən",
tooltip = "/ən/: 'on' in 'button'",
},
{
code = "əm",
aliases = {"@m", "ᵊm", "m̩"},
label = "əm",
tooltip = "/əm/: 'm' in 'rhythm'",
},
-- ARCHIPHONEMES
{
code = "i",
label = "i",
tooltip = "/i/: 'y' in 'happy'",
},
{
code = "u",
label = "u",
tooltip = "/u/: 'u' in 'influence'",
},
-- MARGINAL SEGMENTS
{
code = "x",
label = "x",
aliases = {"kh"},
tooltip = "/x/: 'ch' in 'loch'",
},
{
code = "ʔ",
aliases = {"?"},
label = "ʔ",
tooltip = "/ʔ/: the catch in 'uh-oh'",
},
{
code = "ɒ̃",
aliases = {"ɑ̃", "ɒ~", "ɑ~", "Q~"},
label = "ɒ̃",
tooltip = "/ɒ̃/: nasal 'an' in 'vin blanc'",
},
{
code = "æ̃",
aliases = {"ae~", "{~", "ã", "a~"},
label = "æ̃",
tooltip = "/æ̃/: nasal 'in' in 'vin blanc'",
},
{
code = "ɜː",
aliases = {"3", "3:", "ɜ:", "ɜ", "əː", "@:"},
label = "ɜː",
tooltip = "/ɜː/: r-less 'ur' in 'nurse'",
},
-- SUPRASEGMENTALS
{
code = "ˈ",
aliases = {"'", '"'},
label = "ˈ",
tooltip = "/ˈ/: primary stress follows",
},
{
code = "ˌ",
aliases = {",", "%"},
label = "ˌ",
tooltip = "/ˌ/: secondary stress follows",
},
{
code = ".",
aliases = {"·"},
label = ".",
tooltip = "/./: syllable break",
},
{
code = "#",
label = "#",
tooltip = "/#/: morpheme break",
},
{
code = "!",
label = "|",
tooltip = "/|/: prosodic break (minor)",
},
{
code = "!!",
aliases = {"‖"},
label = "‖",
tooltip = "/‖/: prosodic break (major)",
},
-- SEPARATORS
-- Tables without tooltip text are used as word separators. In addition to
-- not having any tooltip text in the template output, they are not
-- underlined.
{
code = "_",
label = "<span class=\"wrap\"> </span>",
},
{
code = "nbsp",
aliases = {" "},
label = " ",
},
{
code = ",_",
label = ",<span class=\"wrap\"> </span>",
},
{
code = "-",
aliases = {"–"},
label = "-",
},
{
code = "(",
label = "(",
},
{
code = ")",
label = ")",
},
-- This is useful for highly variable words in place names, which are not
-- important to transcribe.
{
code = "...",
label = " ...<span class=\"wrap\"> </span>",
},
-- Obsolete combinations, kept for compatibility
{
code = "juː",
label = "juː",
tooltip = "/juː/: 'u' in 'cute'",
},
{
code = "jʊər",
label = "jʊər",
tooltip = "/jʊər/: 'ure' in 'cure'",
},
}
rrm0atjuiucipgueuaoozhqg94awcpv
Tempilet:IPAblink
10
2308
15666
2026-03-06T18:00:23Z
MusikBot II
347
Changed protection settings for "[[Template:IPAblink]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 2503 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require administrator access] (indefinite))
15666
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|prefix=[|suffix=]|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
1anzyqmgvf3cz4ea8lut74ea8fj3zvu
15667
15666
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPAblink]]
15666
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|prefix=[|suffix=]|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
1anzyqmgvf3cz4ea8lut74ea8fj3zvu
Module:IPA symbol
828
2309
15668
2026-04-18T03:49:58Z
Pppery
320
Changed protection settings for "[[Module:IPA symbol]]" ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
15668
Scribunto
text/plain
local data = mw.loadData('Module:IPA symbol/data').data
local p = {}
local gsub = mw.ustring.gsub
local len = mw.ustring.len
local sub = mw.ustring.sub
local function reverseLook(t, s)
local ret
for i = 1, len(s) - 1 do
-- Look for 2-char matches first
ret = t[sub(s, i, i + 1)] or t[sub(s, i, i)]
if ret then
return ret
end
end
ret = t[sub(s, -1)] -- Last character
if ret then
return ret
end
end
local function returnData(s, dataType)
for _, v in ipairs(data.univPatterns) do
s = gsub(s, v.pat, v.rep)
end
local key = s
for _, v in ipairs(data.keyPatterns) do
key = gsub(key, v.pat, v.rep)
end
local ret = data.sounds[key] or data.diacritics[key]
or reverseLook(data.diacritics, s)
if ret and dataType then
if ret[dataType] then
ret = ret[dataType]
else
error(string.format('Invalid data type "%s"', dataType))
end
end
return ret
end
local function returnErrorCat()
return require('Module:Category handler').main({ true }) and
'[[Category:International Phonetic Alphabet pages needing attention]]' or
''
end
local function returnError(s)
return string.format(
'<span class="error">Error using {{[[Template:IPA symbol|IPA symbol]]}}: "%s" not found in list</span>%s',
s, returnErrorCat())
end
function p._main(s, errorText, output)
return returnData(s, output or 'article') or errorText or returnError(s)
end
function p.main(frame)
local args = {}
for k, v in pairs(frame.args) do
args[k] = v ~= '' and v
end
if not args.symbol then
return '' -- Exit early
end
if args.errortext == 'blank' then
args.errortext = ''
end
return p._main(args.symbol, args.errortext, args.output)
end
function p._link(s, displayText, prefix, suffix, audio, addSpan, errorText)
local t = returnData(s)
if t then
s = string.format('%s[[:%s|%s]]%s',
prefix or '', t.article, displayText or s, suffix or '')
if addSpan ~= 'no' then
local span = mw.html.create('span'):addClass('IPA'):attr('lang', 'und-Latn-fonipa')
if prefix or suffix then
span:addClass('nowrap'):attr('title',
'Representation in the International Phonetic Alphabet (IPA)')
end
s = tostring(span:wikitext(s))
end
if audio then
audio = require('Module:Yesno')(audio, audio)
audio = audio == true and t.audio or audio
if audio ~= '' then
audio = ' ' .. mw.getCurrentFrame():expandTemplate{
title = 'Template:Audio',
args = { audio, '', help = 'no' }
}
end
else
audio = ''
end
return s .. audio
else
return errorText or returnError(s)
end
end
function p.link(frame)
local args = {}
for k, v in pairs(frame.args) do
args[k] = v ~= '' and v
end
if not args.symbol then
return '' -- Exit early
end
if args.errortext == 'blank' then
args.errortext = ''
end
return p._link(args.symbol, args.text, args.prefix, args.suffix, args.audio,
args.span, args.errortext)
end
return p
gb8hatz11otj9sad852ri3vf35ucx3c
15669
15668
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPA_symbol]]
15668
Scribunto
text/plain
local data = mw.loadData('Module:IPA symbol/data').data
local p = {}
local gsub = mw.ustring.gsub
local len = mw.ustring.len
local sub = mw.ustring.sub
local function reverseLook(t, s)
local ret
for i = 1, len(s) - 1 do
-- Look for 2-char matches first
ret = t[sub(s, i, i + 1)] or t[sub(s, i, i)]
if ret then
return ret
end
end
ret = t[sub(s, -1)] -- Last character
if ret then
return ret
end
end
local function returnData(s, dataType)
for _, v in ipairs(data.univPatterns) do
s = gsub(s, v.pat, v.rep)
end
local key = s
for _, v in ipairs(data.keyPatterns) do
key = gsub(key, v.pat, v.rep)
end
local ret = data.sounds[key] or data.diacritics[key]
or reverseLook(data.diacritics, s)
if ret and dataType then
if ret[dataType] then
ret = ret[dataType]
else
error(string.format('Invalid data type "%s"', dataType))
end
end
return ret
end
local function returnErrorCat()
return require('Module:Category handler').main({ true }) and
'[[Category:International Phonetic Alphabet pages needing attention]]' or
''
end
local function returnError(s)
return string.format(
'<span class="error">Error using {{[[Template:IPA symbol|IPA symbol]]}}: "%s" not found in list</span>%s',
s, returnErrorCat())
end
function p._main(s, errorText, output)
return returnData(s, output or 'article') or errorText or returnError(s)
end
function p.main(frame)
local args = {}
for k, v in pairs(frame.args) do
args[k] = v ~= '' and v
end
if not args.symbol then
return '' -- Exit early
end
if args.errortext == 'blank' then
args.errortext = ''
end
return p._main(args.symbol, args.errortext, args.output)
end
function p._link(s, displayText, prefix, suffix, audio, addSpan, errorText)
local t = returnData(s)
if t then
s = string.format('%s[[:%s|%s]]%s',
prefix or '', t.article, displayText or s, suffix or '')
if addSpan ~= 'no' then
local span = mw.html.create('span'):addClass('IPA'):attr('lang', 'und-Latn-fonipa')
if prefix or suffix then
span:addClass('nowrap'):attr('title',
'Representation in the International Phonetic Alphabet (IPA)')
end
s = tostring(span:wikitext(s))
end
if audio then
audio = require('Module:Yesno')(audio, audio)
audio = audio == true and t.audio or audio
if audio ~= '' then
audio = ' ' .. mw.getCurrentFrame():expandTemplate{
title = 'Template:Audio',
args = { audio, '', help = 'no' }
}
end
else
audio = ''
end
return s .. audio
else
return errorText or returnError(s)
end
end
function p.link(frame)
local args = {}
for k, v in pairs(frame.args) do
args[k] = v ~= '' and v
end
if not args.symbol then
return '' -- Exit early
end
if args.errortext == 'blank' then
args.errortext = ''
end
return p._link(args.symbol, args.text, args.prefix, args.suffix, args.audio,
args.span, args.errortext)
end
return p
gb8hatz11otj9sad852ri3vf35ucx3c
Module:IPA symbol/data
828
2310
15670
2026-10-18T19:54:59Z
Oklopfer
675
now has section
15670
Scribunto
text/plain
local data = {
sounds = {},
diacritics = {},
univPatterns = {
{
pat = "g", -- Latin Small Letter G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵍ", -- Modifier Letter Small G
rep = "ᶢ" -- Modifier Letter Small Script G
},
{
pat = "l̴", -- 'l' + Combining Tilde Overlay
rep = "ɫ" -- Latin Small Letter L with Middle Tilde
},
{
pat = "ˁ", -- Modifier Letter Reversed Glottal Stop
rep = "ˤ" -- Modifier Letter Small Reversed Glottal Stop
},
{
pat = "’", -- Right Single Quotation Mark
rep = "ʼ" -- Modifier Letter Apostrophe
},
{
pat = "ı", -- Latin Small Letter Dotless I
rep = "i" -- Latin Small Letter I
},
{
pat = "ȷ", -- Latin Small Letter Dotless J
rep = "j" -- Latin Small Letter J
},
{
pat = "ʇ", -- Latin Small Letter Turned T
rep = "ǀ" -- Latin Letter Dental Click
},
{
pat = "[!ʗ]", -- Exclamation Mark / Latin Letter Stretched C
rep = "ǃ" -- Latin Letter Retroflex Click
},
{
pat = "𝼋", --
rep = "ǂ" --
},
{
pat = "ψ", -- Greek Letter Psi
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "‼", -- Double exclamation mark
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ǃǃ", -- Latin Letter Retroflex Click x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "!!", -- Exclamation mark x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ʖ", -- Latin Letter Inverted Glottal Stop
rep = "ǁ" -- Latin Letter Lateral Click
},
{
pat = "ɋ", --
rep = "ʘ" --
},
{
pat = "ꞵ", -- Latin Small Letter Beta
rep = "β" -- Greek Small Letter Beta
},
{
pat = "γ", -- Greek Small Letter Gamma
rep = "ɣ" -- Latin Small Letter Gamma
},
{
pat = "φ", -- Greek Small Letter Phi
rep = "ɸ" -- Latin Small Letter Phi
},
{
pat = "ꭓ", -- Latin Small Letter Chi
rep = "χ" -- Greek Small Letter Chi
},
{
pat = "̮", -- Combining Breve Below
rep = "̆" -- Combining Breve
},
},
keyPatterns = {
-- These do not affect the reverse look for diacritics
{
pat = "[͜͡ːˑ◌]", -- Tie bars, length marks, dotted circle
rep = ""
},
{
pat = "ᵏ", -- Modifier Letter Small K
rep = "k" -- Latin Small Letter K
},
{
pat = "ᶢ", -- Modifier Letter Small Script G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵑ", -- Modifier Letter Small Eng
rep = "ŋ" -- Latin Small Letter Eng
},
}
}
local rawData = {
sounds = {
-- PULMONIC CONSONANTS
-- Nasals
{
name = "Voiceless bilabial nasal",
symbols = { "m̥" },
audio = "Voiceless Bilabial Nasal.ogg"
},
{
name = "Voiced bilabial nasal",
symbols = { "m" },
audio = "Bilabial nasal.ogg"
},
{
name = "Voiceless labiodental nasal",
symbols = { "ɱ̊", "ɱ̥" },
audio = "Voiceless labiodental nasal.ogg"
},
{
name = "Voiced labiodental nasal",
symbols = { "ɱ" },
audio = "Labiodental nasal.ogg"
},
{
name = "Voiced linguolabial nasal",
symbols = { "n̼", "m̺", "m̼" },
audio = "Linguolabial nasal.ogg"
},
{
name = "Voiceless dental nasal",
symbols = { "n̪̊" }
},
{
name = "Voiced dental nasal",
symbols = { "n̪" },
audio = "Voiced Dental Nasal.ogg"
},
{
name = "Voiceless alveolar nasal",
symbols = { "n̥" },
audio = "Voiceless Alveolar Nasal.ogg"
},
{
name = "Voiced alveolar nasal",
symbols = { "n" },
audio = "Alveolar nasal.ogg"
},
{
name = "Voiceless postalveolar nasal",
symbols = { "n̠̊" },
},
{
name = "Voiced postalveolar nasal",
symbols = { "n̠" },
audio = "Voiced postalveolar nasal.ogg"
},
{
name = "Voiceless retroflex nasal",
symbols = { "ɳ̊", "ɳ̥" },
audio = "Voiceless retroflex nasal.wav"
},
{
name = "Voiced retroflex nasal",
symbols = { "ɳ" },
audio = "Retroflex nasal.ogg"
},
{
name = "Voiceless alveolo-palatal nasal",
symbols = { "n̠̊ʲ", "ɲ̊˖", "ɲ̟̊", "ȵ̊" },
},
{
name = "Voiced alveolo-palatal nasal",
symbols = { "n̠ʲ", "ɲ˖", "ɲ̟", "ȵ" },
},
{
name = "Voiceless palatal nasal",
symbols = { "ɲ̊", "ɲ̥" },
audio = "Voiceless palatal nasal.ogg"
},
{
name = "Voiced palatal nasal",
symbols = { "ɲ" },
audio = "Palatal nasal.ogg"
},
{
name = "Voiced post-palatal or pre-velar nasal",
symbols = { "ɲ˗", "ɲ̠", "ɲ", "ŋ˖", "ŋ᫈", "ŋ̟" },
article = "Voiced post-palatal nasal"
},
{
name = "Voiceless velar nasal",
symbols = { "ŋ̊", "ŋ̥" },
audio = "Voiceless velar nasal.wav"
},
{
name = "Voiced velar nasal",
symbols = { "ŋ" },
audio = "Velar nasal.ogg"
},
{
name = "Voiced pre-uvular nasal",
symbols = { "ɴ̟", "ŋ˗", "ŋ", "ŋ̠" },
},
{
name = "Voiceless uvular nasal",
symbols = { "ɴ̥", "ɴ̊" },
audio = "Voiceless uvular nasal.ogg"
},
{
name = "Voiced uvular nasal",
symbols = { "ɴ" },
audio = "Uvular nasal.ogg"
},
-- Plosives
{
name = "Voiceless bilabial plosive",
symbols = { "p" },
audio = "Voiceless bilabial plosive.ogg"
},
{
name = "Voiced bilabial plosive",
symbols = { "b" },
audio = "Voiced bilabial plosive.ogg"
},
{
name = "Voiceless labiodental plosive",
symbols = { "p̪" },
audio = "Voiceless labiodental plosive.ogg"
},
{
name = "Voiced labiodental plosive",
symbols = { "b̪" },
audio = "Voiced labiodental plosive.wav"
},
{
name = "Voiceless linguolabial plosive",
symbols = { "t̼", "p̺", "p̼" },
audio = "Voiceless linguolabial stop.ogg"
},
{
name = "Voiced linguolabial plosive",
symbols = { "d̼", "b̺", "b̼" },
audio = "Voiced linguolabial stop.ogg"
},
{
name = "Voiceless dental plosive",
symbols = { "t̪", "θ̝" },
audio = "Voiceless dental stop.ogg"
},
{
name = "Voiced dental plosive",
symbols = { "d̪", "ð̝" },
audio = "Voiced dental stop.ogg"
},
{
name = "Voiceless alveolar plosive",
symbols = { "t" },
audio = "Voiceless alveolar plosive.ogg"
},
{
name = "Voiced alveolar plosive",
symbols = { "d" },
audio = "Voiced alveolar plosive.ogg"
},
{
name = "Voiceless postalveolar plosive",
symbols = { "t̠" },
audio = "Voiceless postalveolar stop.ogg"
},
{
name = "Voiced postalveolar plosive",
symbols = { "d̠" },
audio = "Voiced postalveolar stop.ogg"
},
{
name = "Voiceless retroflex plosive",
symbols = { "ʈ" },
audio = "Voiceless retroflex stop.oga"
},
{
name = "Voiced retroflex plosive",
symbols = { "ɖ" },
audio = "Voiced retroflex stop.oga"
},
{
name = "Voiceless alveolo-palatal plosive",
symbols = { "t̠ʲ", "c̟", "ȶ" },
audio = "IPA sound - ȶ.ogg"
},
{
name = "Voiced alveolo-palatal plosive",
symbols = { "d̠ʲ", "ɟ˖", "ɟ᫈", "ɟ̟", "ȡ" },
audio = "Voiced alveolo-palatal plosive.ogg"
},
{
name = "Voiceless palatal plosive",
symbols = { "c" },
audio = "Voiceless palatal plosive.ogg"
},
{
name = "Voiced palatal plosive",
symbols = { "ɟ" },
audio = "Voiced palatal plosive.ogg"
},
{
name = "Voiceless post-palatal or pre-velar plosive",
symbols = { "c̠", "k̟" },
article = "Voiceless post-palatal plosive"
},
{
name = "Voiced post-palatal or pre-velar plosive",
symbols = { "ɟ˗", "ɟ", "ɟ̠", "ɡ˖", "ɡ᫈", "ɡ̟" },
article = "Voiced post-palatal plosive"
},
{
name = "Voiceless velar plosive",
symbols = { "k" },
audio = "Voiceless velar plosive.ogg"
},
{
name = "Voiced velar plosive",
symbols = { "ɡ" },
audio = "Voiced velar plosive 02.ogg"
},
{
name = "Voiceless pre-uvular plosive",
symbols = { "q˖", "q᫈", "q̟", "k̠" },
},
{
name = "Voiced pre-uvular plosive",
symbols = { "ɢ̟", "ɡ˗", "ɡ", "ɡ̠" },
audio = "Voiced velar-uvular plosive.ogg"
},
{
name = "Voiceless uvular plosive",
symbols = { "q" },
audio = "Voiceless uvular plosive.ogg"
},
{
name = "Voiced uvular plosive",
symbols = { "ɢ" },
audio = "Voiced uvular stop.oga"
},
{
name = "Voiceless upper-pharyngeal plosive",
symbols = { "ꞯ", "q˗", "q", "ʡ̟̥", "ʡ̥˖" },
audio = "Voiceless pharyngeal stop.ogg"
},
{
name = "Voiced upper-pharyngeal plosive",
symbols = { "𝼂", "ɢ̠", "ʡ̟̬", "ʡ̬˖" },
audio = "Voiced pharyngeal stop.ogg"
},
{
name = "Epiglottal plosive",
symbols = { "ʡ" },
audio = "Epiglottal stop.ogg"
},
{
name = "Voiceless epiglottal plosive",
symbols = { "ʡ̥" },
},
{
name = "Voiced epiglottal plosive",
symbols = { "ʡ̬" },
},
{
name = "Glottal stop",
symbols = { "ʔ" },
audio = "Glottal stop.ogg"
},
-- Affricates
{
name = "Voiceless bilabial affricate",
symbols = { "pɸ" },
audio = "Voiceless bilabial affricate.ogg"
},
{
name = "Voiced bilabial affricate",
symbols = { "bβ" },
audio = "Voiced bilabial affricate.wav"
},
{
name = "Voiceless bilabial trilled affricate",
symbols = { "t̪ʙ̥", "tʙ̥", "tʙ̥ʰ", "pʙ̥", "pʙ̥ʰ", "kʙ̥" },
article = "Voiceless bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiced bilabial trilled affricate",
symbols = { "t̪ʙ", "tʙ", "d̪ʙ", "dʙ", "pʙ", "bʙ", "ɡʙ" },
article = "Voiced bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiceless labiodental affricate",
symbols = { "p̪f", "pf" },
audio = "Voiceless labiodental affricate.ogg"
},
{
name = "Voiced labiodental affricate",
symbols = { "b̪v", "bv" },
audio = "Voiced labiodental affricate.ogg"
},
{
name = "Voiceless dental sibilant affricate",
symbols = { "t̪s̪", "ts̪", "t̟s̟", "ts̟" },
audio = "Voiceless dental sibilant affricate.oga"
},
{
name = "Voiced dental sibilant affricate",
symbols = { "d̪z̪", "dz̪", "d̟z̟", "dz̟" },
audio = "Voiced dental sibilant affricate.oga"
},
{
name = "Voiceless dental affricate",
symbols = { "t̪θ", "t̟θ", "tθ" },
audio = "Voiceless dental non-sibilant affricate.oga"
},
{
name = "Voiced dental affricate",
symbols = { "d̪ð", "d̟ð", "dð" },
audio = "Voiced dental non-sibilant affricate.oga"
},
{
name = "Voiceless alveolar affricate",
symbols = { "ts", "ʦ" },
audio = "Voiceless alveolar sibilant affricate.oga"
},
{
name = "Voiced alveolar affricate",
symbols = { "dz", "ʣ" },
audio = "Voiced alveolar sibilant affricate.oga"
},
{
name = "Voiceless apico-alveolar affricate",
symbols = { "t̺s̺", "ts̺", "t̠s̠", "ts̠" },
},
{
name = "Voiced apico-alveolar affricate",
symbols = { "d̺z̺", "dz̺", "d̠z̠", "dz̠" },
},
{
name = "Voiceless alveolar non-sibilant affricate",
symbols = { "tɹ̝̊", "tɹ̥", "tθ̠", "tθ͇" },
},
{
name = "Voiced alveolar non-sibilant affricate",
symbols = { "dɹ̝", "dɹ", "dð̠", "dð͇" },
},
{
name = "Voiceless postalveolar affricate",
symbols = { "t̠ʃ", "tʃ", "ʧ" },
audio = "Voiceless palato-alveolar affricate.ogg"
},
{
name = "Voiced postalveolar affricate",
symbols = { "d̠ʒ", "dʒ", "ʤ" },
audio = "Voiced palato-alveolar affricate.ogg"
},
{
name = "Voiceless postalveolar non-sibilant affricate",
symbols = { "t̠ɹ̠̊˔", "tɹ̠̊˔", "tɹ̝̊˗", "t̠ɹ̝̊˗", "t̠ɹ̠̊", "tɹ̠̊" },
audio = "Voiceless postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiced postalveolar non-sibilant affricate",
symbols = { "d̠ɹ̠˔", "d̠ɹ̠᷵", "dɹ̠˔", "dɹ̝˗", "d̠ɹ̝˗", "d̠ɹ̠", "dɹ̠" },
audio = "Voiced postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiceless retroflex affricate",
symbols = { "ʈʂ", "tʂ", "ꭧ" },
audio = "Voiceless retroflex affricate.ogg"
},
{
name = "Voiced retroflex affricate",
symbols = { "ɖʐ", "dʐ", "ꭦ" },
audio = "Voiced retroflex affricate.ogg"
},
{
name = "Voiced retroflex non-sibilant affricate",
symbols = { "dɻ˔", "ɖɻ᷵", "d̠ɻ̝", "ɖɻ˔" },
audio = "Voiced retroflex non-sibilant affricate.ogg"
},
{
name = "Voiceless alveolo-palatal affricate",
symbols = { "tɕ", "cɕ", "t̠ʃʲ", "tʃʲ", "t̺s̺ʲ", "ts̺ʲ", "t̠s̠ʲ", "ts̠ʲ", "ʨ" },
audio = "Voiceless alveolo-palatal affricate.ogg"
},
{
name = "Voiced alveolo-palatal affricate",
symbols = { "dʑ", "ɟʑ", "d̠ʒʲ", "dʒʲ", "d̺z̺ʲ", "dz̺ʲ", "d̠z̠ʲ", "dz̠ʲ", "ʥ" },
audio = "Voiced alveolo-palatal affricate.ogg"
},
{
name = "Voiceless palatal affricate",
symbols = { "cç" },
audio = "Voiceless palatal affricate.ogg"
},
{
name = "Voiced palatal affricate",
symbols = { "ɟʝ" },
audio = "Voiced palatal affricate.ogg"
},
{
name = "Voiceless post-palatal or pre-velar affricate",
symbols = { "c̠ç˗", "cç˗", "c̠ç̠", "cç̠", "k̟x̟", "kx̟" },
article = "Voiceless post-palatal affricate"
},
{
name = "Voiceless velar affricate",
symbols = { "kx" },
audio = "Voiceless velar affricate.ogg"
},
{
name = "Voiced velar affricate",
symbols = { "ɡɣ" },
audio = "Voiced velar affricate.ogg"
},
{
name = "Voiceless pre-uvular affricate",
symbols = { "q˖χ˖", "qχ˖", "q̟χ̟", "qχ̟", "k̠x̠", "kx̠" },
},
{
name = "Voiceless uvular affricate",
symbols = { "qχ" },
audio = "Voiceless uvular affricate.ogg"
},
{
name = "Voiced uvular affricate",
symbols = { "ɢʁ" },
audio = "Voiced uvular affricate.ogg"
},
{
name = "Voiceless pharyngeal affricate",
symbols = { "ʡħ", "ʡ̥ħ" },
},
{
name = "Voiced pharyngeal affricate",
symbols = { "ʡʕ", "ʡ̬ʕ" },
},
{
name = "Voiceless epiglottal affricate",
symbols = { "ʡʜ", "ʡ̥ʜ" },
audio = "Voiceless epiglottal affricate.ogg"
},
{
name = "Voiced epiglottal affricate",
symbols = { "ʡʢ", "ʡ̬ʢ" },
audio = "Voiced epiglottal affricate.ogg"
},
{
name = "Voiceless glottal affricate",
symbols = { "ʔh" },
audio = "Voiceless glottal affricate.ogg"
},
-- Fricatives
{
name = "Voiceless bilabial fricative",
symbols = { "ɸ" },
audio = "Voiceless bilabial fricative.ogg"
},
{
name = "Voiced bilabial fricative",
symbols = { "β" },
audio = "Voiced bilabial fricative.ogg"
},
{
name = "Voiceless labiodental fricative",
symbols = { "f" },
audio = "Voiceless labio-dental fricative.ogg"
},
{
name = "Voiced labiodental fricative",
symbols = { "v" },
audio = "Voiced labio-dental fricative.ogg"
},
{
name = "Voiceless linguolabial fricative",
symbols = { "θ̼", "ɸ̺", "f̼", "ɸ̼" },
audio = "Voiceless linguolabial fricative.ogg"
},
{
name = "Voiced linguolabial fricative",
symbols = { "ð̼", "β̺", "v̼", "β̼" },
audio = "Voiced linguolabial fricative.wav"
},
{
name = "Voiceless dental fricative",
symbols = { "θ" },
audio = "Voiceless dental fricative.ogg"
},
{
name = "Voiced dental fricative",
symbols = { "ð" },
audio = "Voiced dental fricative.ogg"
},
{
name = "Voiceless dental sibilant fricative",
symbols = { "s̪" },
audio = "Voiceless dental sibilant fricative.ogg"
},
{
name = "Voiced dental sibilant fricative",
symbols = { "z̪" },
},
{
name = "Voiceless denti-alveolar fricative",
symbols = { "s̻̪", "s̪̻", "s̻͆", "s̟" },
},
{
name = "Voiceless alveolar fricative",
symbols = { "s" },
audio = "Voiceless alveolar sibilant.ogg"
},
{
name = "Voiced alveolar fricative",
symbols = { "z" },
audio = "Voiced alveolar sibilant.ogg"
},
{
name = "Voiceless apico-alveolar fricative",
symbols = { "s̺" },
},
{
name = "Voiced apico-alveolar fricative",
symbols = { "z̺" },
},
{
name = "Voiceless alveolar retracted fricative",
symbols = { "s̠" },
audio = "Voiceless alveolar retracted sibilant.ogg"
},
{
name = "Voiced alveolar retracted fricative",
symbols = { "z̠" },
},
{
name = "Voiceless alveolar non-sibilant fricative",
symbols = { "θ̠", "θ͇", "t̞", "ɹ̝̊" },
},
{
name = "Voiced alveolar non-sibilant fricative",
symbols = { "ð̠", "ð͇", "d̞", "ɹ̝" },
},
{
name = "Voiceless alveolar tapped fricative",
symbols = { "ɾ̞̊" },
},
{
name = "Voiced alveolar tapped fricative",
symbols = { "ɾ̞" },
},
{
name = "Voiceless postalveolar fricative",
symbols = { "ʃ" },
audio = "Voiceless palato-alveolar sibilant.ogg"
},
{
name = "Voiced postalveolar fricative",
symbols = { "ʒ" },
audio = "Voiced palato-alveolar sibilant.ogg"
},
{
name = "Voiceless postalveolar non-sibilant fricative",
symbols = { "ɹ̠̊˔", "ɹ̝̊˗" },
audio = "Voiceless postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiced postalveolar non-sibilant fricative",
symbols = { "ɹ̠˔", "ɹ̠᷵", "ɹ̝˗" },
audio = "Voiced postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiceless retroflex fricative",
symbols = { "ʂ" },
audio = "Voiceless retroflex sibilant.ogg"
},
{
name = "Voiced retroflex fricative",
symbols = { "ʐ" },
audio = "Voiced retroflex sibilant.ogg"
},
{
name = "Voiceless retroflex non-sibilant fricative",
symbols = { "ɻ̝̊", "ɻ̊˔", "ʈ̞", "ʈ˕" },
audio = "Voiceless retroflex non-sibilant fricative.ogg"
},
{
name = "Voiced retroflex non-sibilant fricative",
symbols = { "ɻ̝", "ɻ˔", "ɻ᷵", "ɖ̞", "ɖ˕" },
audio = "Voiced retroflex non-sibilant fricative.ogg"
},
{
name = "Voiceless alveolo-palatal fricative",
symbols = { "ɕ", "ʃʲ", "s̺ʲ", "s̠ʲ"},
audio = "Voiceless alveolo-palatal sibilant.ogg"
},
{
name = "Voiced alveolo-palatal fricative",
symbols = { "ʑ", "ʒʲ", "z̺ʲ", "z̠ʲ"},
audio = "Voiced alveolo-palatal sibilant.ogg"
},
{
name = "Voiceless palatal fricative",
symbols = { "ç" },
audio = "Voiceless palatal fricative.ogg"
},
{
name = "Voiced palatal fricative",
symbols = { "ʝ" },
audio = "Voiced palatal fricative.ogg"
},
{
name = "Voiceless post-palatal or pre-velar fricative",
symbols = { "ç˗", "ç̠", "ç", "x̟" },
article = "Voiceless post-palatal fricative",
audio = "Voiceless post-palatal fricative.ogg"
},
{
name = "Voiced post-palatal or pre-velar fricative",
symbols = { "ʝ", "ʝ̠", "ɣ᫈", "ɣ̟" },
article = "Voiced post-palatal fricative",
audio = "Voiced post-palatal fricative.ogg"
},
{
name = "Voiceless velar fricative",
symbols = { "x" },
audio = "Voiceless velar fricative.ogg"
},
{
name = "Voiced velar fricative",
symbols = { "ɣ" },
audio = "Voiced velar fricative.ogg"
},
{
name = "Voiceless pre-uvular fricative",
symbols = { "χ˖", "χ̟", "x̠" },
},
{
name = "Voiced pre-uvular fricative",
symbols = { "ʁ̟", "ɣ˗", "ɣ̠" },
},
{
name = "Voiceless uvular fricative",
symbols = { "χ" },
audio = "Voiceless uvular fricative.ogg"
},
{
name = "Voiced uvular fricative",
symbols = { "ʁ" },
audio = "Voiced uvular fricative.ogg"
},
{
name = "Voiceless pharyngeal fricative",
symbols = { "ħ" },
audio = "Voiceless pharyngeal fricative.ogg"
},
{
name = "Voiced pharyngeal fricative",
symbols = { "ʕ", "ʕ̝" },
audio = "Voiced pharyngeal fricative.ogg"
},
{
name = "Voiceless glottal fricative",
symbols = { "h" },
audio = "Voiceless glottal fricative.ogg"
},
{
name = "Voiced glottal fricative",
symbols = { "ɦ" },
audio = "Voiced glottal fricative.ogg"
},
{
name = "Voiceless bidental fricative",
symbols = { "h̪͆" },
audio = "Voiceless bidental fricative.ogg"
},
{
name = "Voiceless dentolabial fricative",
symbols = { "f͆" },
audio = "Voiceless dentolabial fricative.ogg"
},
-- Approximants
{
name = "Voiceless bilabial approximant",
symbols = { "ɸ̞", "ɸ˕" },
audio = "Voiceless bilabial approximant.ogg"
},
{
name = "Voiced bilabial approximant",
symbols = { "β̞", "ʋ̟" },
audio = "Bilabial approximant.ogg"
},
{
name = "Voiceless labiodental approximant",
symbols = { "ʋ̥" },
audio = "Voiceless labiodental approximant.ogg"
},
{
name = "Voiced labiodental approximant",
symbols = { "ʋ" },
audio = "Labiodental approximant.ogg"
},
{
name = "Voiceless dental approximant",
symbols = { "θ̞", "θ̞᫈", "ɹ̪̊" },
},
{
name = "Voiced dental approximant",
symbols = { "ð̞", "ɹ̪" },
},
{
name = "Voiceless alveolar approximant",
symbols = { "ɹ̥", "s̞" },
audio = "Voiceless alveolar approximant.ogg"
},
{
name = "Voiced alveolar approximant",
symbols = { "ɹ" },
audio = "Alveolar approximant.ogg"
},
{
name = "Voiced non-rhotic alveolar approximant",
symbols = { "z̞", "ð̠˕" },
},
{
name = "Voiceless postalveolar approximant",
symbols = { "ɹ̠̊" },
},
{
name = "Voiced postalveolar approximant",
symbols = { "ɹ̠" },
audio = "Postalveolar approximant.ogg"
},
{
name = "Voiceless retroflex approximant",
symbols = { "ɻ̊" },
},
{
name = "Voiced retroflex approximant",
symbols = { "ɻ" },
audio = "Retroflex Approximant2.oga"
},
{
name = "Voiceless palatal approximant",
symbols = { "j̊", "ç˕", "ç̞"},
audio = "Voiceless palatal approximant.wav"
},
{
name = "Voiced palatal approximant",
symbols = { "j", "ʝ˕", "ʝ̞" },
audio = "Palatal approximant.ogg"
},
{
name = "Voiced post-palatal or pre-velar approximant",
symbols = { "j", "j̠", "j˗", "j̈", "ʝ̞˗", "ʝ̞", "ɰ̈", "ɰ̟", "ɰ˖", "ɣ̞˖", "ɣ̞᫈" },
article = "Voiced post-palatal approximant",
audio = "Post-palatal approximant.ogg"
},
{
name = "Protruded post-palatal or pre-velar approximant",
symbols = { "j˗ʷ", "jʷ", "j̈ʷ", "ɥ̫̈", "ẅ", "w̟" },
audio = "Voiced labialized post-palatal approximant.ogg",
article = "Protruded post-palatal approximant"
},
{
name = "Compressed post-palatal or pre-velar approximant",
symbols = { "ɥ̈", "ɥ˗", "ɥ", "j̈ᵝ", "j˗ᵝ", "jᵝ" },
article = "Compressed post-palatal approximant"
},
{
name = "Voiced velar approximant",
symbols = { "ɰ", "ɣ˕", "ɣ", "ɣ̞" },
audio = "Voiced velar approximant.ogg"
},
{
name = "Voiced velar bunched approximant",
symbols = { "ɹ̈ "},
},
{
name = "Voiced uvular approximant",
symbols = { "ʁ̞" },
audio = "Voiced Uvular Approximant.ogg"
},
{
name = "Voiced pharyngeal approximant",
symbols = { "ʕ̞" },
audio = "Voiced pharyngeal approximant.ogg"
},
{
name = "Voiced epiglottal approximant",
symbols = { "ʢ̞", "ʕ̞˗" },
audio = "Voiced epiglottal trill.ogg"
},
{
name = "Creaky-voiced glottal approximant",
symbols = { "ʔ̬", "ʔ̞", "ʔ̰", "˷" },
audio = "Creaky-voiced glottal approximant.wav"
},
-- Taps/flaps
{
name = "Voiced bilabial flap",
symbols = { "ⱱ̟", "b̆", "w̆" },
audio = "Voiced bilabial flap.wav"
},
{
name = "Voiced labiodental flap",
symbols = { "ⱱ", "v̆" },
audio = "Labiodental flap.ogg"
},
{
name = "Voiceless dental tap or flap",
symbols = { "ɾ̪̊", "t̪̆" },
article = "Voiceless dental tap"
},
{
name = "Voiced dental tap or flap",
symbols = { "ɾ̪", "d̪̆" },
article = "Dental tap",
},
{
name = "Voiceless alveolar tap or flap",
symbols = { "ɾ̥", "t̆" },
article = "Voiceless alveolar tap",
audio = "Voiceless alveolar tap.wav"
},
{
name = "Voiced alveolar tap or flap",
symbols = { "ɾ", "d̆" },
audio = "Alveolar tap.ogg"
},
{
name = "Voiced postalveolar flap",
symbols = { "ɾ̠", "d̠̆"},
},
{
name = "Voiced alveolar nasal tap or flap",
symbols = { "ɾ̃", "n̆" },
article = "Alveolar nasal tap",
},
{
name = "Voiceless retroflex flap",
symbols = { "ɽ̊", "ʈ̆" },
--audio = "Voiceless retroflex tap.wav"
},
{
name = "Voiced retroflex flap",
symbols = { "ɽ", "ɖ̆" },
audio = "Retroflex flap.ogg"
},
{
name = "Voiced retroflex nasal flap",
symbols = { "ɽ̃", "ɳ̆" },
},
{
name = "Voiced velar tap",
symbols = { "ɡ̆" },
audio = "Voiced velar tap.wav"
},
{
name = "Voiced uvular tap or flap",
symbols = { "ɢ̆", "ʀ̆" },
article = "Voiced uvular tap and flap",
audio = "Voiced uvular tap.wav"
},
{
name = "Voiced epiglottal tap",
symbols = { "ʡ̆", "ʢ̆", "ʕ̆" },
audio = "Epiglottal flap.oga"
},
-- Trills
{
name = "Voiceless bilabial trill",
symbols = { "ʙ̥" },
audio = "Voiceless bilabial trill with aspiration.ogg"
},
{
name = "Voiced bilabial trill",
symbols = { "ʙ" },
audio = "Bilabial trill.ogg"
},
{
name = "Voiceless labiolingual trill",
symbols = { "r̼̊", "ʙ̺̊", "ʙ̼̊" },
audio = "Voiceless linguolabial trill.wav"
},
{
name = "Voiced labiolingual trill",
symbols = { "r̼", "ʙ̺", "ʙ̼" },
audio = "Voiced linguolabial trill.wav"
},
{
name = "Voiceless dental trill",
symbols = { "r̪̊" }
},
{
name = "Voiced dental trill",
symbols = { "r̪" },
},
{
name = "Voiceless alveolar trill",
symbols = { "r̥" },
audio = "Voiceless alveolar trill.ogg"
},
{
name = "Voiced alveolar trill",
symbols = { "r" },
audio = "Alveolar trill.ogg"
},
{
name = "Voiceless alveolar fricative trill",
symbols = { "r̝̊" },
audio = "Voiceless alveolar raised non-sonorant trill.ogg"
},
{
name = "Voiced alveolar fricative trill",
symbols = { "r̝" },
audio = "Raised alveolar non-sonorant trill.ogg"
},
{
name = "Voiceless postalveolar trill",
symbols = { "r̠̊" }
},
{
name = "Voiced postalveolar trill",
symbols = { "r̠" },
audio = "Voiced postalveolar trill.ogg"
},
{
name = "Voiceless retroflex trill",
symbols = { "ɽ̊r̥", "ɽr̥", "ɽ̊ʳ" },
audio = "Voiceless retroflex trill.ogg"
},
{
name = "Voiced retroflex trill",
symbols = { "ɽr", "ɽʳ" },
audio = "Voiced retroflex trill.ogg"
},
{
name = "Voiceless pre-uvular fricative trill",
symbols = { "ʀ̝̊˖", "ʀ̟̊˔" },
},
{
name = "Voiced pre-uvular fricative trill",
symbols = { "ʀ̝˖", "ʀ̟˔" },
},
{
name = "Voiceless uvular trill",
symbols = { "ʀ̥" },
audio = "Voiceless uvular trill.ogg"
},
{
name = "Voiced uvular trill",
symbols = { "ʀ" },
audio = "Uvular trill.ogg"
},
{
name = "Voiceless uvular fricative trill",
symbols = { "ʀ̝̊" },
audio = "Voiceless uvular fricative trill.ogg"
},
{
name = "Voiced uvular fricative trill",
symbols = { "ʀ̝" },
audio = "Voiced uvular fricative trill.wav"
},
{
name = "Voiceless epiglottal trill",
symbols = { "ʜ" },
audio = "Voiceless epiglottal trill.ogg"
},
{
name = "Voiced epiglottal trill",
symbols = { "ʢ" },
audio = "Voiced epiglottal trill 2.ogg"
},
-- Lateral affricates
{
name = "Voiceless alveolar lateral affricate",
symbols = { "tɬ" },
audio = "Voiceless alveolar lateral affricate.ogg"
},
{
name = "Voiced alveolar lateral affricate",
symbols = { "dɮ" },
audio = "Voiced alveolar lateral affricate.ogg"
},
{
name = "Voiceless retroflex lateral affricate",
symbols = { "ʈꞎ", "tꞎ", "ʈɭ̊˔", "tɭ̊˔", "ʈɭ̊", "tɭ̊" },
audio = "Voiceless retroflex lateral affricate.ogg"
},
{
name = "Voiced retroflex lateral affricate",
symbols = { "ɖ𝼅", "d𝼅", "ɖɭ˔", "dɭ˔", "ɖɭ", "dɭ" },
audio = "Voiced retroflex lateral affricate.ogg"
},
{
name = "Voiceless palatal lateral affricate",
symbols = { "cʎ̝̊", "cʎ̥", "c𝼆", "t𝼆" },
audio = "Voiceless palatal lateral affricate.ogg"
},
{
name = "Voiced palatal lateral affricate",
symbols = { "ɟʎ̝", "ɟʎ", "ɟ𝼆̬", "d𝼆̬" },
audio = "Voiced palatal lateral affricate.ogg"
},
{
name = "Voiceless post-palatal lateral affricate",
symbols = { "c𝼆˗" },
article = "Voiceless velar lateral affricate"
},
{
name = "Voiceless velar lateral affricate",
symbols = { "kʟ̝̊", "kʟ̥", "k𝼄" },
audio = "Voiceless velar lateral affricate.ogg"
},
{
name = "Voiced velar lateral affricate",
symbols = { "ɡʟ̝", "ɡʟ", "ɡ𝼄̬" },
audio = "Voiced velar lateral affricate.ogg"
},
-- Lateral fricatives
{
name = "Voiceless dental lateral fricative",
symbols = { "ɬ̪" },
},
{
name = "Voiced dental lateral fricative",
symbols = { "ɮ̪", "ɮ͆" },
},
{
name = "Voiceless alveolar lateral fricative",
symbols = { "ɬ" },
audio = "Voiceless alveolar lateral fricative.ogg"
},
{
name = "Voiced alveolar lateral fricative",
symbols = { "ɮ" },
audio = "Voiced alveolar lateral fricative.ogg"
},
{
name = "Voiceless postalveolar lateral fricative",
symbols = { "ɬ̠" }
},
{
name = "Voiced postalveolar lateral fricative",
symbols = { "ɮ̠" },
audio = "Voiced postalveolar lateral fricative.ogg"
},
{
name = "Voiceless retroflex lateral fricative",
symbols = { "ɭ̊˔", "ꞎ"},
audio = "Voiceless retroflex lateral fricative.ogg"
},
{
name = "Voiced retroflex lateral fricative",
symbols = { "ɭ˔", "𝼅" },
audio = "Voiced retroflex lateral fricative.wav"
},
{
name = "Voiceless alveolo-palatal lateral fricative",
symbols = { "ɬ̠ʲ", "ʎ̝̊˖", "ȴ̊˔", "l̠̊ʲ", "ʎ̟̊", "ȴ̊" },
},
{
name = "Voiceless palatal lateral fricative",
symbols = { "ʎ̝̊", "𝼆" },
audio = "Voiceless palatal lateral fricative.ogg"
},
{
name = "Voiced palatal lateral fricative",
symbols = { "ʎ̝", "𝼆̬" },
audio = "ʎ̝ IPA sound.opus"
},
{
name = "Voiceless post-palatal lateral fricative",
symbols = { "𝼆̠" },
},
{
name = "Voiced post-palatal or pre-velar lateral fricative",
symbols = { "ʎ̝˗", "ʟ̟᷵" },
article = "Voiced pre-velar lateral fricative"
},
{
name = "Voiceless velar lateral fricative",
symbols = { "ʟ̝̊", "𝼄" },
audio = "Voiceless velar lateral fricative.ogg"
},
{
name = "Voiced velar lateral fricative",
symbols = { "ʟ̝", "𝼄̬" },
audio = "Voiced velar lateral fricative.ogg"
},
-- Lateral approximants
{
name = "Voiced dental lateral approximant",
symbols = { "l̪" },
audio = "Voiced dental lateral approximant.ogg"
},
{
name = "Voiceless alveolar lateral approximant",
symbols = { "l̥" },
audio = "Voiceless alveolar lateral approximant.ogg"
},
{
name = "Voiced alveolar lateral approximant",
symbols = { "l" },
audio = "Alveolar lateral approximant.ogg"
},
{
name = "Voiced postalveolar lateral approximant",
symbols = { "l̠" },
audio = "Voiced postalveolar lateral approximant.ogg"
},
{
name = "Voiceless retroflex lateral approximant",
symbols = { "ɭ̊" },
},
{
name = "Voiced retroflex lateral approximant",
symbols = { "ɭ" },
audio = "Retroflex lateral approximant.ogg"
},
{
name = "Voiced alveolo-palatal lateral approximant",
symbols = { "l̠ʲ", "ʎ̟", "ȴ" },
audio = "Alveolo-palatal lateral approximant.ogg"
},
{
name = "Voiceless palatal lateral approximant",
symbols = { "ʎ̥" },
},
{
name = "Voiced palatal lateral approximant",
symbols = { "ʎ" },
audio = "Palatal lateral approximant.ogg"
},
{
name = "Voiceless velar lateral approximant",
symbols = { "ʟ̥" },
},
{
name = "Voiced velar lateral approximant",
symbols = { "ʟ" },
audio = "Velar lateral approximant.ogg"
},
{
name = "Voiced uvular lateral approximant",
symbols = { "ʟ̠" },
audio = "Uvular lateral approximant.ogg"
},
-- Lateral taps/flaps
{
name = "Voiced linguolabial lateral flap",
symbols = { "ɺ̼", "l̼̆"}
},
{
name = "Voiced dental lateral flap",
symbols = { "ɺ̪", "l̪̆" }
},
{
name = "Voiceless alveolar lateral flap",
symbols = { "ɺ̥", "l̥̆" },
audio = "Voiceless alveolar lateral flap.wav"
},
{
name = "Voiced alveolar lateral flap",
symbols = { "ɺ", "l̆"},
audio = "Voiced alveolar lateral flap.wav"
},
{
name = "Voiced postalveolar lateral flap",
symbols = { "ɺ̠", "l̠̆" },
audio = "Voiced postalveolar lateral flap.ogg"
},
{
name = "Voiceless retroflex lateral flap",
symbols = { "𝼈̊", "𝼈̥", "ɭ̥̆" },
audio = "Voiceless retroflex lateral flap.wav"
},
{
name = "Voiced retroflex lateral flap",
symbols = { "𝼈", "ɭ̆" },
audio = "Voiced retroflex lateral flap (correct).wav"
},
{
name = "Voiced palatal lateral flap",
symbols = { "ʎ̆" },
audio = "Voiced palatal lateral flap.wav"
},
{
name = "Voiced velar lateral tap",
symbols = { "ʟ̆" }
},
-- NON-PULMONIC CONSONANTS
-- Ejective stops
{
name = "Bilabial ejective stop",
symbols = { "pʼ" },
audio = "Bilabial ejective plosive.ogg"
},
{
name = "Dental ejective stop",
symbols = { "t̪ʼ" },
audio = "Dental ejective stop.ogg"
},
{
name = "Alveolar ejective stop",
symbols = { "tʼ" },
audio = "Alveolar ejective plosive.ogg"
},
{
name = "Retroflex ejective stop",
symbols = { "ʈʼ" },
audio = "Retroflex ejective.ogg"
},
{
name = "Palatal ejective stop",
symbols = { "cʼ" },
audio = "Palatal ejective.ogg"
},
{
name = "Velar ejective stop",
symbols = { "kʼ" },
audio = "Velar ejective plosive.ogg"
},
{
name = "Uvular ejective stop",
symbols = { "qʼ" },
audio = "Uvular ejective plosive.ogg"
},
-- Ejective affricates
{
name = "Labiodental ejective affricate",
symbols = { "p̪fʼ" },
},
{
name = "Dental ejective affricate",
symbols = { "t̪θʼ", "t̟θʼ", "tθʼ" },
audio = "Dental ejective affricate.ogg"
},
{
name = "Alveolar ejective affricate",
symbols = { "tsʼ" },
audio = "Alveolar ejective affricate.ogg"
},
{
name = "Postalveolar ejective affricate",
symbols = { "t̠ʃʼ", "tʃʼ" },
audio = "Palato-alveolar ejective affricate.ogg"
},
{
name = "Retroflex ejective affricate",
symbols = { "ʈʂʼ", "tʂʼ" },
audio = "Retroflex ejective affricate.ogg"
},
{
name = "Alveolo-palatal ejective affricate",
symbols = { "t̠ɕʼ", "tɕʼ", "t̠ʃʲʼ", "tʃʲʼ", "t̠s̠ʲʼ", "cɕʼ" },
},
{
name = "Palatal ejective affricate",
symbols = { "cçʼ" },
audio = "Palatal ejective affricate.ogg"
},
{
name = "Velar ejective affricate",
symbols = { "kxʼ" },
audio = "Velar ejective affricate.ogg"
},
{
name = "Uvular ejective affricate",
symbols = { "qχʼ" },
audio = "Uvular ejective affricate.ogg"
},
-- Ejective fricatives
{
name = "Bilabial ejective fricative",
symbols = { "ɸʼ" },
audio = "Bilabial ejective fricative.ogg"
},
{
name = "Labiodental ejective fricative",
symbols = { "fʼ" },
audio = "Labiodental ejective fricative.ogg"
},
{
name = "Dental ejective fricative",
symbols = { "θʼ" },
audio = "Dental ejective fricative.ogg"
},
{
name = "Alveolar ejective fricative",
symbols = { "sʼ" },
audio = "Alveolar ejective fricative.ogg"
},
{
name = "Postalveolar ejective fricative",
symbols = { "ʃʼ" },
audio = "Palato-alveolar ejective fricative.ogg"
},
{
name = "Retroflex ejective fricative",
symbols = { "ʂʼ" },
audio = "Retroflex ejective fricative.ogg"
},
{
name = "Alveolo-palatal ejective fricative",
symbols = { "ɕʼ" , "ʃʲʼ", "s̠ʲʼ"},
audio = "Alveolo-palatal ejective fricative.ogg"
},
{
name = "Palatal ejective fricative",
symbols = { "çʼ" },
audio = "Palatal ejective fricative.ogg"
},
{
name = "Velar ejective fricative",
symbols = { "xʼ" },
audio = "Velar ejective fricative.ogg"
},
{
name = "Uvular ejective fricative",
symbols = { "χʼ" },
audio = "Uvular ejective fricative.ogg"
},
-- Lateral ejective affricates
{
name = "Alveolar lateral ejective affricate",
symbols = { "tɬʼ", "ƛʼ" },
audio = "Alveolar lateral ejective affricate.ogg"
},
{
name = "Palatal lateral ejective affricate",
symbols = { "cʎ̝̊ʼ", "cʎ̥ʼ", "c𝼆ʼ" },
audio = "Palatal lateral ejective affricate.ogg"
},
{
name = "Velar lateral ejective affricate",
symbols = { "kʟ̝̊ʼ", "kʟ̥ʼ", "k𝼄ʼ" },
audio = "Velar lateral ejective affricate.ogg"
},
{
name = "Uvular lateral ejective affricate",
symbols = { "q𝼄ʼ", "q𝼄̠ʼ", "qʟ̝̊ʼ" },
},
-- Lateral ejective fricatives
{
name = "Alveolar lateral ejective fricative",
symbols = { "ɬʼ" },
audio = "Alveolar lateral ejective fricative.ogg"
},
-- Ejective trills
{
name = "Ejective trill",
symbols = { "ʙ̥ʼ", "r̼̊ʼ", "ʙ̺̊ʼ", "ʙ̼̊ʼ", "r̪̊ʼ", "r̥ʼ", "r̠̊ʼ", "ɽr̥ʼ", "ʀ̥ʼ" },
article = "Ejective consonant"
},
-- Tenuis clicks
{
name = "Tenuis bilabial click",
symbols = { "ʘ", "kʘ" },
audio = "Clic bilabial sourd.ogg"
},
{
name = "Tenuis dental click",
symbols = { "ǀ", "kǀ" },
audio = "Dental click.ogg"
},
{
name = "Tenuis alveolar click",
symbols = { "ǃ", "kǃ" },
audio = "Postalveolar click.ogg"
},
{
name = "Tenuis palatal click",
symbols = { "ǂ", "kǂ" },
audio = "Palatoalveolar click.ogg"
},
{
name = "Tenuis retroflex click",
symbols = { "𝼊", "k𝼊" },
audio = "Retrflx click.wav"
},
{
name = "Back-released click",
symbols = { "ʞ" },
},
-- Voiced clicks
{
name = "Voiced bilabial click",
symbols = { "ʘ̬", "ɡʘ" },
},
{
name = "Voiced dental click",
symbols = { "ǀ̬", "ɡǀ" },
},
{
name = "Voiced alveolar click",
symbols = { "ǃ̬", "ɡǃ" },
},
{
name = "Voiced palatal click",
symbols = { "ǂ̬", "ɡǂ" },
},
{
name = "Voiced retroflex click",
symbols = { "𝼊̬", "ɡ𝼊" },
},
-- Nasal clicks
{
name = "Bilabial nasal click",
symbols = { "ʘ̃", "ŋʘ", "ⁿʘ" },
audio = "Bilabial nasal click.ogg"
},
{
name = "Dental nasal click",
symbols = { "ǀ̃", "ŋǀ", "ⁿǀ", "ŋǀʱ" },
},
{
name = "Alveolar nasal click",
symbols = { "ǃ̃", "ŋǃ", "ⁿǃ" },
audio = "Intervocalic nasal alveolar clicks.ogg"
},
{
name = "Palatal nasal click",
symbols = { "ǂ̃", "ŋǂ", "ⁿǂ" },
},
{
name = "Retroflex nasal click",
symbols = { "𝼊̃", "ŋ𝼊", "ⁿ𝼊" },
},
-- Lateral clicks
{
name = "Tenuis alveolar lateral click",
symbols = { "ǁ", "kǁ" },
audio = "Alveolar lateral click.ogg"
},
{
name = "Voiced alveolar lateral click",
symbols = { "ǁ̬", "ɡǁ" },
},
-- Lateral nasal clicks
{
name = "Alveolar lateral nasal click",
symbols = { "ǁ̃", "ŋǁ", "ⁿǁ" },
},
-- Glottalized clicks
{
name = "Glottalized bilabial nasal click",
symbols = { "ʘ̃ˀ", "ʘˀ", "ŋ̊ʘˀ", "ŋʘˀ" },
},
{
name = "Glottalized dental nasal click",
symbols = { "ǀ̃ˀ", "ǀˀ", "ŋ̊ǀˀ", "ŋǀˀ" },
},
{
name = "Glottalized alveolar nasal click",
symbols = { "ǃ̃ˀ", "ǃˀ", "ŋ̊ǃˀ", "ŋǃˀ" },
},
{
name = "Glottalized retroflex nasal click",
symbols = { "𝼊̃ˀ", "𝼊ˀ", "ŋ𝼊ˀ", "ŋ̊𝼊ˀ" },
},
{
name = "Glottalized palatal nasal click",
symbols = { "ǂ̃ˀ", "ǂˀ", "ŋ̊ǂˀ", "ŋǂˀ" },
},
{
name = "Glottalized alveolar lateral nasal click",
symbols = { "ǁ̃ˀ", "ǁˀ", "ŋ̊ǁˀ", "ŋǁˀ" },
},
-- Egressive clicks (for Damin)
{
name = "Egressive bilabial click",
symbols = { "ʘ↑" },
},
-- Implosives
{
name = "Voiceless bilabial implosive",
symbols = { "ɓ̥", "ƥ", "pʼ↓" },
audio = "Voiceless-bilabial-implosive.ogg",
},
{
name = "Voiced bilabial implosive",
symbols = { "ɓ" },
audio = "Voiced bilabial implosive.ogg"
},
{
name = "Voiceless dental implosive",
symbols = { "ɗ̪̥", "ɗ̪̊", "ƭ̪", "t̪ʼ↓" },
},
{
name = "Voiced dental implosive",
symbols = { "ɗ̪" },
},
{
name = "Voiceless alveolar implosive",
symbols = { "ɗ̥", "ƭ", "tʼ↓" },
audio = "Voiceless-alveolar-implosive.ogg",
},
{
name = "Voiced alveolar implosive",
symbols = { "ɗ" },
audio = "Voiced alveolar implosive.ogg"
},
{
name = "Voiceless retroflex implosive",
symbols = { "ᶑ̊", "ᶑ̥", "𝼉", "ʈʼ↓" },
audio = "Voiceless-retroflex-implosive.ogg",
},
{
name = "Voiced retroflex implosive",
symbols = { "ᶑ" },
audio = "Voiced-retroflex-implosive.ogg",
},
{
name = "Voiceless palatal implosive",
symbols = { "ʄ̊", "ʄ̥", "ƈ", "cʼ↓" },
audio = "Voiceless palatal implosive.ogg",
},
{
name = "Voiced palatal implosive",
symbols = { "ʄ" },
audio = "Voiced palatal implosive.ogg"
},
{
name = "Voiced post-palatal or pre-velar implosive",
symbols = { "ʄ̠", "ʄ˗", "ɠ̟", "ɠ˖" },
audio = "Voiced post palatal and pre velar implosives.ogg",
article = "Voiced pre-velar implosive"
},
{
name = "Voiceless velar implosive",
symbols = { "ɠ̊", "ƙ", "kʼ↓" },
audio = "Voiceless-velar-implosive.ogg",
},
{
name = "Voiced velar implosive",
symbols = { "ɠ" },
audio = "Voiced velar implosive.ogg"
},
{
name = "Voiceless uvular implosive",
symbols = { "ʛ̥", "ʠ", "qʼ↓" },
audio = "Voiceless-uvular-implosive.ogg",
},
{
name = "Voiced uvular implosive",
symbols = { "ʛ" },
audio = "Voiced uvular implosive.ogg"
},
-- CO-ARTICULATED CONSONANTS
-- Co-articulated nasals
{
name = "Voiced labial–alveolar nasal",
symbols = { "nm" },
},
{
name = "Voiced labial–retroflex nasal",
symbols = { "ɳm" },
},
{
name = "Voiced labial–velar nasal",
symbols = { "ŋm" },
audio = "Labial-velar nasal stop.ogg"
},
-- Co-articulated plosives
{
name = "Voiceless labial–alveolar plosive",
symbols = { "tp" },
audio = "Voiceless labial-alveolar plosive.ogg"
},
{
name = "Voiced labial–alveolar plosive",
symbols = { "db" },
},
{
name = "Voiceless labial–retroflex plosive",
symbols = { "ʈp" },
},
{
name = "Voiced labial–retroflex plosive",
symbols = { "ɖb" },
},
{
name = "Voiceless labial–velar plosive",
symbols = { "kp" },
audio = "Voiceless labial-velar plosive.ogg"
},
{
name = "Voiced labial–velar plosive",
symbols = { "ɡb" },
audio = "Voiced labial-velar plosive.ogg"
},
{
name = "Voiceless labial–uvular plosive",
symbols = { "qp" },
audio = "Voiceless labial–uvular plosive.ogg"
},
{
name = "Voiceless uvular–epiglottal plosive",
symbols = { "qʡ" },
},
-- Co-articulated implosives
{
name = "Voiceless labial–velar implosive",
symbols = { "ɠ̊ɓ̥", "kɓ̥", "ƙƥ", "kpʼ↓", "kƥ" },
audio = "Voiceless-labial–velar-implosive.ogg",
},
{
name = "Voiced labial–velar implosive",
symbols = { "ɠɓ", "ɡɓ" },
audio = "Voiced-labial-velar-implosive.ogg"
},
-- Co-articulated ejectives
{
name = "Labial–alveolar ejective stop",
symbols = { "tpʼ" },
},
-- Co-articulated continuants
{
name = "Voiceless labial–palatal fricative",
symbols = { "ɥ̊˔", "ɥ̝̊", "çᶣ", "çᵝ", "çʷ" },
},
{
name = "Voiceless labial–palatal approximant",
symbols = { "ɥ̊", "ç̞ᶣ", "ç̞ᵝ", "ç̞ʷ" },
},
{
name = "Voiced labial–palatal approximant",
symbols = { "ɥ" },
audio = "LL-Q150 (fra)-WikiLucas00-IPA ɥ.wav"
},
{
name = "Voiceless labial–velar fricative",
symbols = { "ʍ", "xʷ" },
audio = "Voiceless labio-velar fricative.ogg"
},
{
name = "Voiceless labial–velar approximant",
symbols = { "w̥", "ẘ", "ʍ̞" },
},
{
name = "Voiced labial–velar approximant",
symbols = { "w", "ɰʷ", "ɣ̞ʷ", "ɣʷ"},
audio = "Voiced labio-velar approximant.ogg"
},
{
name = "Compressed voiced labial–velar approximant",
symbols = { "wᵝ", "ɰᵝ", "ɣ̞ᵝ", "ɣᵝ"},
article = "Voiced labial–velar approximant",
},
{
name = "Sj-sound",
symbols = { "ɧ" },
audio = "Voiceless dorso-palatal velar fricative.ogg"
},
-- Co-articulated lateral approximants
{
name = "Velarized dental lateral approximant",
symbols = { "ɫ̪", "l̪ˠ" },
},
{
name = "Velarized alveolar lateral approximant",
symbols = { "ɫ", "lˠ" },
audio = "Velarized alveolar lateral approximant.ogg"
},
{
name = "Pharyngealized dental lateral approximant",
symbols = { "l̪ˤ" },
},
{
name = "Pharyngealized alveolar lateral approximant",
symbols = { "lˤ" },
},
-- Nasalized approximants
{
name = "Nasalized voiced alveolar lateral approximant",
symbols = { "l̃" },
},
{
name = "Nasalized voiced palatal approximant",
symbols = { "j̃" },
audio = "Nasal palatal approximant.ogg"
},
{
name = "Nasalized voiced velar approximant",
symbols = { "ɰ̃", "ɣ̞̃", "ɣ̃˕" },
audio = "Nasal velar approximant.ogg"
},
{
name = "Nasalized voiced labial–velar approximant",
symbols = { "w̃" },
audio = "Voiced labialized velar nasal approximant.ogg"
},
{
name = "Nasalized voiceless glottal approximant",
symbols = { "h̃" },
audio = "IPA h̃.ogg"
},
{
name = "Nasalized voiced glottal approximant",
symbols = { "ɦ̃" },
},
-- VOWELS
-- Close vowels
{
name = "Close front unrounded vowel",
symbols = { "i" },
audio = "Close front unrounded vowel.ogg"
},
{
name = "Close front rounded vowel",
symbols = { "y" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front compressed vowel",
symbols = { "y͍", "iᵝ" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front protruded vowel",
symbols = { "y̫", "yʷ", "iʷ", "y᫇" },
audio = "Close front protruded vowel.ogg"
},
{
name = "Close central unrounded vowel",
symbols = { "ɨ", "ï", "ɯ̈" },
audio = "Close central unrounded vowel.ogg"
},
{
name = "Close central rounded vowel",
symbols = { "ʉ", "ü" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central protruded vowel",
symbols = { "ʉ̫", "ʉʷ", "ɨʷ" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central compressed vowel",
symbols = { "ÿ", "ɨᵝ" },
},
{
name = "Close back unrounded vowel",
symbols = { "ɯ" },
audio = "Close back unrounded vowel.ogg"
},
{
name = "Close back rounded vowel",
symbols = { "u" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back protruded vowel",
symbols = { "u̫", "uʷ", "ɯʷ" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back compressed vowel",
symbols = { "u͍", "ɯᵝ" },
audio = "Ja-U.oga"
},
-- Near-close vowels
{
name = "Near-close front unrounded vowel",
symbols = { "ɪ̟", "i̞", "e̝" },
},
{
name = "Near-close front rounded vowel",
symbols = { "ʏ̟", "y̞", "y˕", "ø̝" },
},
{
name = "Near-close near-front unrounded vowel",
symbols = { "ɪ", "i̽", "ï̞", "ë̝" },
audio = "Near-close near-front unrounded vowel.ogg"
},
{
name = "Near-close near-front rounded vowel",
symbols = { "ʏ", "y̽", "ÿ̞", "ÿ˕", "ø̝̈" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front compressed vowel",
symbols = { "ʏ͍", "ɪᵝ" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front protruded vowel",
symbols = { "ʏ̫", "ʏʷ", "ɪʷ" },
},
{
name = "Near-close central unrounded vowel",
symbols = { "ɪ̈", "ɪ̠", "ɨ̞", "ɘ̝" },
audio = "Near-close central unrounded vowel.ogg"
},
{
name = "Near-close central rounded vowel",
symbols = { "ʊ̈", "ʊ̟", "ʉ̞", "ɵ̝" },
audio = "Near-close central rounded vowel2.ogg"
},
{
name = "Near-close central protruded vowel",
symbols = { "ʊ̫̈", "ʉ̫˕", "ʊ̈ʷ", "ʉ̞ʷ", "ɪ̈ʷ", "ɨ̞ʷ" },
},
{
name = "Near-close central compressed vowel",
symbols = { "ʏ̈", "ɨ̞ᵝ" },
},
{
name = "Near-close near-back unrounded vowel",
symbols = { "ɯ̽", "ɯ̞̈", "ɤ̝̈" },
audio = "Near-close near-back unrounded vowel.ogg"
},
{
name = "Near-close near-back rounded vowel",
symbols = { "ʊ", "u̽", "ü̞", "ö̝" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back protruded vowel",
symbols = { "ʊ̫", "ʊʷ", "ɯ̽ʷ", "ɤ̝̈ʷ", "u̫˕", "u̞ʷ", "ɯ̞ʷ", "ɤ̝ʷ" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back compressed vowel",
symbols = { "ʊ͍", "ɯ̽ᵝ", "ɯ̞̈ᵝ", "ɯ̞ᵝ" },
},
{
name = "Near-close back unrounded vowel",
symbols = { "ɯ̞", "ɤ̝" },
},
{
name = "Near-close back rounded vowel",
symbols = { "ʊ̠", "u̞", "o̝" },
},
-- Close-mid vowels
{
name = "Close-mid front unrounded vowel",
symbols = { "e" },
audio = "Close-mid front unrounded vowel.ogg"
},
{
name = "Close-mid front rounded vowel",
symbols = { "ø" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front compressed vowel",
symbols = { "ø͍", "eᵝ" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front protruded vowel",
symbols = { "ø̫", "øʷ", "eʷ" },
},
{
name = "Close-mid near-front unrounded vowel",
symbols = { "ɪ̞", "e̠", "ɘ̟" },
},
{
name = "Close-mid near-front rounded vowel",
symbols = { "ʏ̞", "ø̠", "ɵ̟" },
},
{
name = "Close-mid central unrounded vowel",
symbols = { "ɘ", "ë", "ɤ̈" },
audio = "Close-mid central unrounded vowel.ogg"
},
{
name = "Close-mid central rounded vowel",
symbols = { "ɵ", "ɵ̫", "ɵʷ", "ö", "ɘʷ" },
audio = "Close-mid central rounded vowel.ogg"
},
{
name = "Close-mid central compressed vowel",
symbols = { "ø̈", "ɘᵝ" },
},
{
name = "Close-mid near-back unrounded vowel",
symbols = { "ɘ̠", "ɤ̟", "ɯ̞̽" },
},
{
name = "Close-mid near-back rounded vowel",
symbols = { "ʊ̞", "ɵ̠", "o̟" },
},
{
name = "Close-mid back unrounded vowel",
symbols = { "ɤ" },
audio = "Close-mid back unrounded vowel.ogg"
},
{
name = "Close-mid back rounded vowel",
symbols = { "o", "o̫", "oʷ", "ɤʷ" },
audio = "Close-mid back rounded vowel.ogg"
},
{
name = "Close-mid back compressed vowel",
symbols = { "o͍", "ɤᵝ" },
},
-- Mid vowels
{
name = "Mid front unrounded vowel",
symbols = { "e̞", "ɛ̝" },
audio = "Mid front unrounded vowel.ogg"
},
{
name = "Mid front rounded vowel",
symbols = { "ø̞", "œ̝" },
audio = "Mid front rounded vowel (trimmed).ogg"
},
{
name = "Mid front compressed vowel",
symbols = { "ø͍˕", "œ͍˔", "e̞ᵝ", "ɛ̝ᵝ" },
},
{
name = "Mid front protruded vowel",
symbols = { "ø̫˕", "œ̫˔", "ø̞ʷ", "œ̝ʷ", "e̞ʷ", "ɛ̝ʷ" },
},
{
name = "Mid near-front unrounded vowel",
symbols = { "e̽", "ɛ̽", "ë̞", "ɛ̝̈" },
},
{
name = "Mid near-front rounded vowel",
symbols = { "ø̽", "œ̽", "ø̞̈", "œ̝̈" },
},
{
name = "Mid central vowel",
symbols = { "ə" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central unrounded vowel",
symbols = { "ə̜", "ɘ̞", "ɜ̝" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central rounded vowel",
symbols = { "ə̹", "ɵ̞", "ɞ̝" },
audio = "Mid central rounded vowel.ogg"
},
{
name = "Mid near-back unrounded vowel",
symbols = { "ɤ̽", "ʌ̽", "ɤ̞̈", "ʌ̝̈" },
},
{
name = "Mid near-back rounded vowel",
symbols = { "o̽", "ɔ̽", "ö̞", "ɔ̝̈" },
},
{
name = "Mid back unrounded vowel",
symbols = { "ɤ̞", "ʌ̝" },
audio = "ɤ̞ IPA sound.opus"
},
{
name = "Mid back rounded vowel",
symbols = { "o̞", "ɔ̝" },
audio = "Mid back rounded vowel.ogg"
},
-- Open-mid vowels
{
name = "Open-mid front unrounded vowel",
symbols = { "ɛ" , "æ̝"},
audio = "Open-mid front unrounded vowel.ogg"
},
{
name = "Open-mid front rounded vowel",
symbols = { "œ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front compressed vowel",
symbols = { "œ͍", "ɛᵝ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front protruded vowel",
symbols = { "œ̫", "œʷ", "ɛʷ" },
},
{
name = "Open-mid central unrounded vowel",
symbols = { "ɜ", "ɛ̈", "ʌ̈" },
audio = "Open-mid central unrounded vowel.ogg"
},
{
name = "Open-mid central rounded vowel",
symbols = { "ɞ", "œ̈", "ɔ̈" },
audio = "Open-mid central rounded vowel.ogg"
},
{
name = "Open-mid back unrounded vowel",
symbols = { "ʌ" },
audio = "PR-open-mid back unrounded vowel2.ogg"
},
{
name = "Open-mid back rounded vowel",
symbols = { "ɔ" },
audio = "PR-open-mid back rounded vowel.ogg"
},
-- Near-open vowels
{
name = "Near-open front unrounded vowel",
symbols = { "æ", "ɛ̞", "a̝" },
audio = "Near-open front unrounded vowel.ogg"
},
{
name = "Near-open front rounded vowel",
symbols = { "œ̞", "ɶ̝" },
},
{
name = "Near-open near-front unrounded vowel",
symbols = { "æ̈", "æ̠", "ä̝", "a̽", "ɛ̞̈" },
},
{
name = "Near-open near-front rounded vowel",
symbols = { "ɶ̝̈", "ɶ̽", "œ̞̈" },
},
{
name = "Near-open central vowel",
symbols = { "ɐ" },
audio = "Near-open central unrounded vowel.ogg"
},
{
name = "Near-open central unrounded vowel",
symbols = { "ɐ̜", "ɜ̞" },
audio = "PR-near-open central unrounded vowel.ogg"
},
{
name = "Near-open central rounded vowel",
symbols = { "ɐ̹", "ɞ̞" },
audio = "Near-open central rounded vowel.ogg"
},
{
name = "Near-open near-back unrounded vowel",
symbols = { "ɑ̽", "ɑ̝̈", "ʌ̞̈" },
},
{
name = "Near-open near-back rounded vowel",
symbols = { "ɒ̽", "ɒ̝̈", "ɔ̞̈" },
},
{
name = "Near-open back unrounded vowel",
symbols = { "ʌ̞", "ɑ̝" },
},
{
name = "Near-open back rounded vowel",
symbols = { "ɔ̞", "ɒ̝" },
},
-- Open vowels
{
name = "Open front unrounded vowel",
symbols = { "a", "æ̞" },
audio = "PR-open front unrounded vowel.ogg"
},
{
name = "Open front rounded vowel",
symbols = { "ɶ" },
audio = "Open front rounded vowel.ogg"
},
{
name = "Open central unrounded vowel",
symbols = { "ä", "a̠", "ɑ̈", "ɑ̟" },
audio = "Open central unrounded vowel.ogg"
},
{
name = "Open central rounded vowel",
symbols = { "ɒ̈", "ɒ̟", "ɶ̈", "ɶ̠" },
audio = "Open central rounded vowel.ogg"
},
{
name = "Open back unrounded vowel",
symbols = { "ɑ" },
audio = "Open back unrounded vowel.ogg"
},
{
name = "Open back rounded vowel",
symbols = { "ɒ" },
audio = "PR-open back rounded vowel.ogg"
},
{
name = "R-colored vowel",
symbols = { "ɚ", "ɝ", "ɹ̩", "ɻ̍" },
audio = "En-us-er.ogg"
},
-- SUPRASEGMENTALS
{
name = "Primary stress",
symbols = { "ˈ" },
article = "Stress (linguistics)",
},
{
name = "Secondary stress",
symbols = { "ˌ" },
},
{
name = "Minor (foot) group",
symbols = { "|" },
article = "Prosodic unit",
},
{
name = "Major (intonation) group",
symbols = { "‖" },
article = "Prosodic unit",
},
{
name = "Syllable break",
symbols = { "." },
article = "Syllable",
},
{
name = "Linking (absence of a break)",
symbols = { "‿" },
article = "Connected speech",
},
-- TONES AND WORD ACCENTS
{
name = "Downstep",
symbols = { "ꜜ" },
},
{
name = "Upstep",
symbols = { "ꜛ" },
},
{
name = "Global rise",
symbols = { "↗" },
article = "Intonation (linguistics)",
},
{
name = "Global fall",
symbols = { "↘" },
article = "Intonation (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Bilabial percussive",
symbols = { "ʬ" },
audio = "Voiceless bilabial percussive.wav"
},
{
name = "Bidental percussive",
symbols = { "ʭ" },
audio = "Voiceless bidental percussive.wav"
},
{
name = "Velopharyngeal fricative",
symbols = { "ʩ" },
},
{
name = "Voiceless velopharyngeal trill",
symbols = { "𝼀", "ʩ𐞪" },
article = "Velopharyngeal consonant"
},
{
name = "Voiced velopharyngeal trill",
symbols = { "𝼀̬" },
article = "Velopharyngeal consonant"
},
{
name = "Voiceless dental lateral–median fricative",
symbols = { "ʪ̪" },
},
{
name = "Voiced dental lateral–median fricative",
symbols = { "ʫ̪" },
},
{
name = "Voiceless alveolar lateral–median fricative",
symbols = { "ʪ" },
audio = "Voiceless alveolar lateral lisp fricative.ogg"
},
{
name = "Voiced alveolar lateral–median fricative",
symbols = { "ʫ" },
audio = "Voiced alveolar lateral lisp fricative.ogg"
},
{
name = "Ingressive airflow",
symbols = { "↓" },
article = "Ingressive sound",
},
{
name = "Egressive airflow",
symbols = { "↑" },
article = "Egressive sound",
},
{
name = "Apical r",
symbols = { "ɹ̺" },
article = "Voiced alveolar approximant",
},
{
name = "Bunched r",
symbols = { "ɹ̈" },
article = "Voiced velar bunched approximant",
},
{
name = "Sublaminal lower alveolar percussive",
symbols = { "¡" },
article = "Sublingual percussive",
},
{
name = "Percussive alveolar click",
symbols = { "ǃ¡" },
audio = "Percussive alveolar click.ogg"
},
{
name = "Buccal interdental trill",
symbols = { "ↀr̪͆" },
article = "Blowing a raspberry",
},
-- NON-IPA
{
name = "Morphological boundary",
symbols = { "#" },
article = "Word stem",
},
{
name = "Zero",
symbols = { "∅" },
article = "Zero (linguistics)",
},
},
diacritics = {
-- DIACRITICS
{
name = "Voiceless",
symbols = { "̥", "̊", "ḁ", "å", "ů", "ẙ" },
},
{
name = "Voiced",
symbols = { "̬" },
article = "Voice (phonetics)",
},
{
name = "Aspirated",
symbols = { "ʰ" },
article = "Aspirated consonant",
},
{
name = "More rounded",
symbols = { "̹", "͗", "˒" },
article = "Relative articulation#More rounded",
},
{
name = "Less rounded",
symbols = { "̜", "͑", "˓", "͍" },
article = "Relative articulation#Less rounded",
},
{
name = "Advanced",
symbols = { "̟", "᫈", "˖" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Retracted",
symbols = { "̠", "", "˗" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Centralized",
symbols = { "̈" },
article = "Relative articulation#Centralized vowels",
},
{
name = "Mid-centralized",
symbols = { "̽", "͓" },
article = "Relative articulation#Mid-centralized vowel",
},
{
name = "Syllabic",
symbols = { "̩", "̍" },
article = "Syllabic consonant",
},
{
name = "Non-syllabic",
symbols = { "̯", "̑" },
article = "Semivowel",
},
{
name = "Rhoticity",
symbols = { "˞" },
article = "R-colored vowel",
audio = "En-us-er.ogg"
},
{
name = "Breathy voiced",
symbols = { "̤", "ṳ", "ʱ" },
article = "Breathy voice",
},
{
name = "Creaky voiced",
symbols = { "̰", "ḛ", "ḭ", "ṵ" },
article = "Creaky voice",
},
{
name = "Nasalized and glottalized",
symbols = { "̰̃", "ã̰", "ḛ̃", "ḭ̃", "õ̰", "ṵ̃" },
article = "Rhinoglottophilia",
},
{
name = "Linguolabial",
symbols = { "̼", "" },
article = "Linguolabial consonant",
},
{
name = "Labialized",
symbols = { "ʷ", "ᵝ", "̫", "᫇", "", "" },
article = "Labialization",
},
{
name = "Open-labialized",
symbols = { "ꟹ" },
article = "Labialization",
},
{
name = "Labiodentalized",
symbols = { "ᶹ" },
article = "Labialization",
},
{
name = "Labio-palatalized",
symbols = { "ᶣ" },
article = "Labio-palatalization",
},
{
name = "Palatalized",
symbols = { "ʲ" },
article = "Palatalization (phonetics)",
},
{
name = "Velarized",
symbols = { "ˠ" },
article = "Velarization",
},
{
name = "Uvularized",
symbols = { "ʶ", "ᵡ" },
article = "Uvularization",
},
{
name = "Pharyngealized",
symbols = { "ˤ", "𐞕" },
article = "Pharyngealization",
},
{
name = "Velarized or pharyngealized",
symbols = { "̴", "ᵯ", "ᵰ", "ᵱ", "ᵬ", "ᵮ", "ᵵ", "ᵭ", "ᵴ", "ᵶ", "ᵳ", "ᵲ", "ꭨ" },
article = "Pharyngealization",
},
{
name = "Epiglottalized",
symbols = { "𐞴", "ᵸ" },
article = "Pharyngealization",
},
{
name = "Raised",
symbols = { "̝", "᷵", "˔" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Lowered",
symbols = { "̞", "", "˕" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Advanced tongue root",
symbols = { "̘", "", "꭪" },
},
{
name = "Retracted tongue root",
symbols = { "̙", "", "꭫" },
},
{
name = "Dental",
symbols = { "̪", "͆" },
article = "Dental consonant",
},
{
name = "Interdental",
symbols = { "̪͆" },
article = "Interdental consonant",
},
{
name = "Apical",
symbols = { "̺" },
article = "Apical consonant",
},
{
name = "Laminal",
symbols = { "̻" },
article = "Laminal consonant",
},
{
name = "Nasalized",
symbols = { "̃", "ṽ" },
article = "Nasalization",
},
{
name = "Nasal vowel",
symbols = { "ĩ", "ỹ", "ɨ̃", "ʉ̃", "ɯ̃", "ũ", "ɪ̃", "ʏ̃", "ʊ̃", "ẽ", "ø̃", "ɘ̃", "ɵ̃", "ɤ̃", "õ", "ə̃", "ɛ̃", "œ̃", "ɜ̃", "ɞ̃", "ʌ̃", "ɔ̃", "æ̃", "ɐ̃", "ã", "ɶ̃", "ä̃", "ɑ̃", "ɒ̃" },
},
{
name = "Nasal release",
symbols = { "ⁿ" },
},
{
name = "Lateral release",
symbols = { "ˡ" },
article = "Lateral release (phonetics)",
},
{
name = "No audible release",
symbols = { "̚" },
},
{
name = "Ejective",
symbols = { "ʼ" },
article = "Ejective consonant",
},
{
name = "Glottalized",
symbols = { "ˀ" },
article = "Glottalization",
},
{
name = "Buccal speech",
symbols = { "ↀ" },
},
{
name = "Esophageal speech",
symbols = { "Œ" },
},
{
name = "Electrolaryngeal speech",
symbols = { "И" },
},
{
name = "Tracheo-esophageal speech",
symbols = { "Ю" },
},
-- SUPRASEGMENTALS
{
name = "Long",
symbols = { "ː" },
article = "Length (phonetics)",
},
{
name = "Half-long",
symbols = { "ˑ" },
article = "Length (phonetics)",
},
{
name = "Extra-short",
symbols = { "̆", "ŏ", "ӗ", "ă", "ĭ", "ŭ" },
article = "Extra-shortness",
},
-- TONES AND WORD ACCENTS
{
name = "Accent",
symbols = { "̋", "ű", "ӳ", "ő", "́", "í", "ý", "ú", "é", "ǿ", "ó", "ǽ", "á", "̄", "ī", "ȳ", "ū", "ē", "ō", "ǣ", "ā", "̀", "ì", "ỳ", "ù", "è", "ò", "à", "̏", "ȉ", "ȕ", "ȅ", "ȍ", "ȁ" },
article = "Pitch-accent language",
},
{
name = "Tone",
symbols = { "̌", "̂", "᷄", "᷅", "᷇", "᷆", "᷈", "᷉", "˥", "˦", "˧", "˨", "˩" },
article = "Tone (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Alveolar",
symbols = { "͇" },
article = "Alveolar consonant",
},
{
name = "Strong articulation",
symbols = { "͈", "̎" },
article = "Fortis and lenis",
},
{
name = "Weak articulation",
symbols = { "͉", "᷂" },
article = "Fortis and lenis",
},
{
name = "Denasalized",
symbols = { "͊" },
article = "Denasalization",
},
{
name = "Velopharyngeal friction",
symbols = { "͌", "𐞐" },
article = "Velopharyngeal consonant",
},
{
name = "Whistled articulation",
symbols = { "͎" },
article = "Whistled sibilant",
},
{
name = "Unaspirated",
symbols = { "˭" },
article = "Tenuis consonant",
},
{
name = "Pre-aspiration",
symbols = { "ʰp", "ʰt", "ʰʈ", "ʰc", "ʰk", "ʰq", "ʰn" },
article = "Preaspiration",
},
-- NON-IPA
{
name = "Retroflex",
symbols = { "̣", "̢" },
article = "Retroflex consonant",
},
{
name = "Prenasalized consonant",
symbols = { "ᵐ", "ᶬ", "ⁿ̼d̼", "ᵐ̺b̺", "ⁿt", "ⁿd", "ⁿθ", "ⁿð", "ⁿs", "ⁿz", "ⁿʃ", "ⁿʒ", "ⁿɕ", "ⁿʑ", "ⁿr", "ⁿɬ", "ⁿɮ", "ⁿl", "ᶯ", "ᶮ", "ᵑ", "ᶰ" },
},
{
name = "Pre-stopped consonant",
symbols = { "ᵖ", "ᵇ", "ᵗ", "ᵈ", "𐞯", "𐞋", "ᶜ", "ᶡ", "ᵏ", "ᶢ", "𐞥", "𐞒", "𐞳" },
},
{
name = "Post-stopped nasal",
symbols = { "mᵇ", "nᵈ", "ɳ𐞋", "ɲᶡ", "ŋᶢ", "ɴ𐞒" },
},
{
name = "Trilled affricate",
symbols = { "ʳ", "𐞄", "𐞪", "tr̥", "dr" },
},
}
}
for k, group in pairs(rawData) do
for _, v in ipairs(group) do
local t = {
name = v.name,
symbol = v.symbols[1],
article = v.article or v.name,
audio = v.audio or ""
}
for _, s in ipairs(v.symbols) do
data[k][s] = t
end
end
end
return { data = data, rawData = rawData }
8eiku9nssbqt53dt03zxyjy16t5vbs4
15671
15670
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPA_symbol/data]]
15670
Scribunto
text/plain
local data = {
sounds = {},
diacritics = {},
univPatterns = {
{
pat = "g", -- Latin Small Letter G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵍ", -- Modifier Letter Small G
rep = "ᶢ" -- Modifier Letter Small Script G
},
{
pat = "l̴", -- 'l' + Combining Tilde Overlay
rep = "ɫ" -- Latin Small Letter L with Middle Tilde
},
{
pat = "ˁ", -- Modifier Letter Reversed Glottal Stop
rep = "ˤ" -- Modifier Letter Small Reversed Glottal Stop
},
{
pat = "’", -- Right Single Quotation Mark
rep = "ʼ" -- Modifier Letter Apostrophe
},
{
pat = "ı", -- Latin Small Letter Dotless I
rep = "i" -- Latin Small Letter I
},
{
pat = "ȷ", -- Latin Small Letter Dotless J
rep = "j" -- Latin Small Letter J
},
{
pat = "ʇ", -- Latin Small Letter Turned T
rep = "ǀ" -- Latin Letter Dental Click
},
{
pat = "[!ʗ]", -- Exclamation Mark / Latin Letter Stretched C
rep = "ǃ" -- Latin Letter Retroflex Click
},
{
pat = "𝼋", --
rep = "ǂ" --
},
{
pat = "ψ", -- Greek Letter Psi
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "‼", -- Double exclamation mark
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ǃǃ", -- Latin Letter Retroflex Click x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "!!", -- Exclamation mark x 2
rep = "𝼊" -- Latin Letter Retroflex Click With Retroflex Hook
},
{
pat = "ʖ", -- Latin Letter Inverted Glottal Stop
rep = "ǁ" -- Latin Letter Lateral Click
},
{
pat = "ɋ", --
rep = "ʘ" --
},
{
pat = "ꞵ", -- Latin Small Letter Beta
rep = "β" -- Greek Small Letter Beta
},
{
pat = "γ", -- Greek Small Letter Gamma
rep = "ɣ" -- Latin Small Letter Gamma
},
{
pat = "φ", -- Greek Small Letter Phi
rep = "ɸ" -- Latin Small Letter Phi
},
{
pat = "ꭓ", -- Latin Small Letter Chi
rep = "χ" -- Greek Small Letter Chi
},
{
pat = "̮", -- Combining Breve Below
rep = "̆" -- Combining Breve
},
},
keyPatterns = {
-- These do not affect the reverse look for diacritics
{
pat = "[͜͡ːˑ◌]", -- Tie bars, length marks, dotted circle
rep = ""
},
{
pat = "ᵏ", -- Modifier Letter Small K
rep = "k" -- Latin Small Letter K
},
{
pat = "ᶢ", -- Modifier Letter Small Script G
rep = "ɡ" -- Latin Small Letter Script G
},
{
pat = "ᵑ", -- Modifier Letter Small Eng
rep = "ŋ" -- Latin Small Letter Eng
},
}
}
local rawData = {
sounds = {
-- PULMONIC CONSONANTS
-- Nasals
{
name = "Voiceless bilabial nasal",
symbols = { "m̥" },
audio = "Voiceless Bilabial Nasal.ogg"
},
{
name = "Voiced bilabial nasal",
symbols = { "m" },
audio = "Bilabial nasal.ogg"
},
{
name = "Voiceless labiodental nasal",
symbols = { "ɱ̊", "ɱ̥" },
audio = "Voiceless labiodental nasal.ogg"
},
{
name = "Voiced labiodental nasal",
symbols = { "ɱ" },
audio = "Labiodental nasal.ogg"
},
{
name = "Voiced linguolabial nasal",
symbols = { "n̼", "m̺", "m̼" },
audio = "Linguolabial nasal.ogg"
},
{
name = "Voiceless dental nasal",
symbols = { "n̪̊" }
},
{
name = "Voiced dental nasal",
symbols = { "n̪" },
audio = "Voiced Dental Nasal.ogg"
},
{
name = "Voiceless alveolar nasal",
symbols = { "n̥" },
audio = "Voiceless Alveolar Nasal.ogg"
},
{
name = "Voiced alveolar nasal",
symbols = { "n" },
audio = "Alveolar nasal.ogg"
},
{
name = "Voiceless postalveolar nasal",
symbols = { "n̠̊" },
},
{
name = "Voiced postalveolar nasal",
symbols = { "n̠" },
audio = "Voiced postalveolar nasal.ogg"
},
{
name = "Voiceless retroflex nasal",
symbols = { "ɳ̊", "ɳ̥" },
audio = "Voiceless retroflex nasal.wav"
},
{
name = "Voiced retroflex nasal",
symbols = { "ɳ" },
audio = "Retroflex nasal.ogg"
},
{
name = "Voiceless alveolo-palatal nasal",
symbols = { "n̠̊ʲ", "ɲ̊˖", "ɲ̟̊", "ȵ̊" },
},
{
name = "Voiced alveolo-palatal nasal",
symbols = { "n̠ʲ", "ɲ˖", "ɲ̟", "ȵ" },
},
{
name = "Voiceless palatal nasal",
symbols = { "ɲ̊", "ɲ̥" },
audio = "Voiceless palatal nasal.ogg"
},
{
name = "Voiced palatal nasal",
symbols = { "ɲ" },
audio = "Palatal nasal.ogg"
},
{
name = "Voiced post-palatal or pre-velar nasal",
symbols = { "ɲ˗", "ɲ̠", "ɲ", "ŋ˖", "ŋ᫈", "ŋ̟" },
article = "Voiced post-palatal nasal"
},
{
name = "Voiceless velar nasal",
symbols = { "ŋ̊", "ŋ̥" },
audio = "Voiceless velar nasal.wav"
},
{
name = "Voiced velar nasal",
symbols = { "ŋ" },
audio = "Velar nasal.ogg"
},
{
name = "Voiced pre-uvular nasal",
symbols = { "ɴ̟", "ŋ˗", "ŋ", "ŋ̠" },
},
{
name = "Voiceless uvular nasal",
symbols = { "ɴ̥", "ɴ̊" },
audio = "Voiceless uvular nasal.ogg"
},
{
name = "Voiced uvular nasal",
symbols = { "ɴ" },
audio = "Uvular nasal.ogg"
},
-- Plosives
{
name = "Voiceless bilabial plosive",
symbols = { "p" },
audio = "Voiceless bilabial plosive.ogg"
},
{
name = "Voiced bilabial plosive",
symbols = { "b" },
audio = "Voiced bilabial plosive.ogg"
},
{
name = "Voiceless labiodental plosive",
symbols = { "p̪" },
audio = "Voiceless labiodental plosive.ogg"
},
{
name = "Voiced labiodental plosive",
symbols = { "b̪" },
audio = "Voiced labiodental plosive.wav"
},
{
name = "Voiceless linguolabial plosive",
symbols = { "t̼", "p̺", "p̼" },
audio = "Voiceless linguolabial stop.ogg"
},
{
name = "Voiced linguolabial plosive",
symbols = { "d̼", "b̺", "b̼" },
audio = "Voiced linguolabial stop.ogg"
},
{
name = "Voiceless dental plosive",
symbols = { "t̪", "θ̝" },
audio = "Voiceless dental stop.ogg"
},
{
name = "Voiced dental plosive",
symbols = { "d̪", "ð̝" },
audio = "Voiced dental stop.ogg"
},
{
name = "Voiceless alveolar plosive",
symbols = { "t" },
audio = "Voiceless alveolar plosive.ogg"
},
{
name = "Voiced alveolar plosive",
symbols = { "d" },
audio = "Voiced alveolar plosive.ogg"
},
{
name = "Voiceless postalveolar plosive",
symbols = { "t̠" },
audio = "Voiceless postalveolar stop.ogg"
},
{
name = "Voiced postalveolar plosive",
symbols = { "d̠" },
audio = "Voiced postalveolar stop.ogg"
},
{
name = "Voiceless retroflex plosive",
symbols = { "ʈ" },
audio = "Voiceless retroflex stop.oga"
},
{
name = "Voiced retroflex plosive",
symbols = { "ɖ" },
audio = "Voiced retroflex stop.oga"
},
{
name = "Voiceless alveolo-palatal plosive",
symbols = { "t̠ʲ", "c̟", "ȶ" },
audio = "IPA sound - ȶ.ogg"
},
{
name = "Voiced alveolo-palatal plosive",
symbols = { "d̠ʲ", "ɟ˖", "ɟ᫈", "ɟ̟", "ȡ" },
audio = "Voiced alveolo-palatal plosive.ogg"
},
{
name = "Voiceless palatal plosive",
symbols = { "c" },
audio = "Voiceless palatal plosive.ogg"
},
{
name = "Voiced palatal plosive",
symbols = { "ɟ" },
audio = "Voiced palatal plosive.ogg"
},
{
name = "Voiceless post-palatal or pre-velar plosive",
symbols = { "c̠", "k̟" },
article = "Voiceless post-palatal plosive"
},
{
name = "Voiced post-palatal or pre-velar plosive",
symbols = { "ɟ˗", "ɟ", "ɟ̠", "ɡ˖", "ɡ᫈", "ɡ̟" },
article = "Voiced post-palatal plosive"
},
{
name = "Voiceless velar plosive",
symbols = { "k" },
audio = "Voiceless velar plosive.ogg"
},
{
name = "Voiced velar plosive",
symbols = { "ɡ" },
audio = "Voiced velar plosive 02.ogg"
},
{
name = "Voiceless pre-uvular plosive",
symbols = { "q˖", "q᫈", "q̟", "k̠" },
},
{
name = "Voiced pre-uvular plosive",
symbols = { "ɢ̟", "ɡ˗", "ɡ", "ɡ̠" },
audio = "Voiced velar-uvular plosive.ogg"
},
{
name = "Voiceless uvular plosive",
symbols = { "q" },
audio = "Voiceless uvular plosive.ogg"
},
{
name = "Voiced uvular plosive",
symbols = { "ɢ" },
audio = "Voiced uvular stop.oga"
},
{
name = "Voiceless upper-pharyngeal plosive",
symbols = { "ꞯ", "q˗", "q", "ʡ̟̥", "ʡ̥˖" },
audio = "Voiceless pharyngeal stop.ogg"
},
{
name = "Voiced upper-pharyngeal plosive",
symbols = { "𝼂", "ɢ̠", "ʡ̟̬", "ʡ̬˖" },
audio = "Voiced pharyngeal stop.ogg"
},
{
name = "Epiglottal plosive",
symbols = { "ʡ" },
audio = "Epiglottal stop.ogg"
},
{
name = "Voiceless epiglottal plosive",
symbols = { "ʡ̥" },
},
{
name = "Voiced epiglottal plosive",
symbols = { "ʡ̬" },
},
{
name = "Glottal stop",
symbols = { "ʔ" },
audio = "Glottal stop.ogg"
},
-- Affricates
{
name = "Voiceless bilabial affricate",
symbols = { "pɸ" },
audio = "Voiceless bilabial affricate.ogg"
},
{
name = "Voiced bilabial affricate",
symbols = { "bβ" },
audio = "Voiced bilabial affricate.wav"
},
{
name = "Voiceless bilabial trilled affricate",
symbols = { "t̪ʙ̥", "tʙ̥", "tʙ̥ʰ", "pʙ̥", "pʙ̥ʰ", "kʙ̥" },
article = "Voiceless bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiced bilabial trilled affricate",
symbols = { "t̪ʙ", "tʙ", "d̪ʙ", "dʙ", "pʙ", "bʙ", "ɡʙ" },
article = "Voiced bilabial trill#Prestopped trills and stops with trill release"
},
{
name = "Voiceless labiodental affricate",
symbols = { "p̪f", "pf" },
audio = "Voiceless labiodental affricate.ogg"
},
{
name = "Voiced labiodental affricate",
symbols = { "b̪v", "bv" },
audio = "Voiced labiodental affricate.ogg"
},
{
name = "Voiceless dental sibilant affricate",
symbols = { "t̪s̪", "ts̪", "t̟s̟", "ts̟" },
audio = "Voiceless dental sibilant affricate.oga"
},
{
name = "Voiced dental sibilant affricate",
symbols = { "d̪z̪", "dz̪", "d̟z̟", "dz̟" },
audio = "Voiced dental sibilant affricate.oga"
},
{
name = "Voiceless dental affricate",
symbols = { "t̪θ", "t̟θ", "tθ" },
audio = "Voiceless dental non-sibilant affricate.oga"
},
{
name = "Voiced dental affricate",
symbols = { "d̪ð", "d̟ð", "dð" },
audio = "Voiced dental non-sibilant affricate.oga"
},
{
name = "Voiceless alveolar affricate",
symbols = { "ts", "ʦ" },
audio = "Voiceless alveolar sibilant affricate.oga"
},
{
name = "Voiced alveolar affricate",
symbols = { "dz", "ʣ" },
audio = "Voiced alveolar sibilant affricate.oga"
},
{
name = "Voiceless apico-alveolar affricate",
symbols = { "t̺s̺", "ts̺", "t̠s̠", "ts̠" },
},
{
name = "Voiced apico-alveolar affricate",
symbols = { "d̺z̺", "dz̺", "d̠z̠", "dz̠" },
},
{
name = "Voiceless alveolar non-sibilant affricate",
symbols = { "tɹ̝̊", "tɹ̥", "tθ̠", "tθ͇" },
},
{
name = "Voiced alveolar non-sibilant affricate",
symbols = { "dɹ̝", "dɹ", "dð̠", "dð͇" },
},
{
name = "Voiceless postalveolar affricate",
symbols = { "t̠ʃ", "tʃ", "ʧ" },
audio = "Voiceless palato-alveolar affricate.ogg"
},
{
name = "Voiced postalveolar affricate",
symbols = { "d̠ʒ", "dʒ", "ʤ" },
audio = "Voiced palato-alveolar affricate.ogg"
},
{
name = "Voiceless postalveolar non-sibilant affricate",
symbols = { "t̠ɹ̠̊˔", "tɹ̠̊˔", "tɹ̝̊˗", "t̠ɹ̝̊˗", "t̠ɹ̠̊", "tɹ̠̊" },
audio = "Voiceless postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiced postalveolar non-sibilant affricate",
symbols = { "d̠ɹ̠˔", "d̠ɹ̠᷵", "dɹ̠˔", "dɹ̝˗", "d̠ɹ̝˗", "d̠ɹ̠", "dɹ̠" },
audio = "Voiced postalveolar non-sibilant affricate.ogg"
},
{
name = "Voiceless retroflex affricate",
symbols = { "ʈʂ", "tʂ", "ꭧ" },
audio = "Voiceless retroflex affricate.ogg"
},
{
name = "Voiced retroflex affricate",
symbols = { "ɖʐ", "dʐ", "ꭦ" },
audio = "Voiced retroflex affricate.ogg"
},
{
name = "Voiced retroflex non-sibilant affricate",
symbols = { "dɻ˔", "ɖɻ᷵", "d̠ɻ̝", "ɖɻ˔" },
audio = "Voiced retroflex non-sibilant affricate.ogg"
},
{
name = "Voiceless alveolo-palatal affricate",
symbols = { "tɕ", "cɕ", "t̠ʃʲ", "tʃʲ", "t̺s̺ʲ", "ts̺ʲ", "t̠s̠ʲ", "ts̠ʲ", "ʨ" },
audio = "Voiceless alveolo-palatal affricate.ogg"
},
{
name = "Voiced alveolo-palatal affricate",
symbols = { "dʑ", "ɟʑ", "d̠ʒʲ", "dʒʲ", "d̺z̺ʲ", "dz̺ʲ", "d̠z̠ʲ", "dz̠ʲ", "ʥ" },
audio = "Voiced alveolo-palatal affricate.ogg"
},
{
name = "Voiceless palatal affricate",
symbols = { "cç" },
audio = "Voiceless palatal affricate.ogg"
},
{
name = "Voiced palatal affricate",
symbols = { "ɟʝ" },
audio = "Voiced palatal affricate.ogg"
},
{
name = "Voiceless post-palatal or pre-velar affricate",
symbols = { "c̠ç˗", "cç˗", "c̠ç̠", "cç̠", "k̟x̟", "kx̟" },
article = "Voiceless post-palatal affricate"
},
{
name = "Voiceless velar affricate",
symbols = { "kx" },
audio = "Voiceless velar affricate.ogg"
},
{
name = "Voiced velar affricate",
symbols = { "ɡɣ" },
audio = "Voiced velar affricate.ogg"
},
{
name = "Voiceless pre-uvular affricate",
symbols = { "q˖χ˖", "qχ˖", "q̟χ̟", "qχ̟", "k̠x̠", "kx̠" },
},
{
name = "Voiceless uvular affricate",
symbols = { "qχ" },
audio = "Voiceless uvular affricate.ogg"
},
{
name = "Voiced uvular affricate",
symbols = { "ɢʁ" },
audio = "Voiced uvular affricate.ogg"
},
{
name = "Voiceless pharyngeal affricate",
symbols = { "ʡħ", "ʡ̥ħ" },
},
{
name = "Voiced pharyngeal affricate",
symbols = { "ʡʕ", "ʡ̬ʕ" },
},
{
name = "Voiceless epiglottal affricate",
symbols = { "ʡʜ", "ʡ̥ʜ" },
audio = "Voiceless epiglottal affricate.ogg"
},
{
name = "Voiced epiglottal affricate",
symbols = { "ʡʢ", "ʡ̬ʢ" },
audio = "Voiced epiglottal affricate.ogg"
},
{
name = "Voiceless glottal affricate",
symbols = { "ʔh" },
audio = "Voiceless glottal affricate.ogg"
},
-- Fricatives
{
name = "Voiceless bilabial fricative",
symbols = { "ɸ" },
audio = "Voiceless bilabial fricative.ogg"
},
{
name = "Voiced bilabial fricative",
symbols = { "β" },
audio = "Voiced bilabial fricative.ogg"
},
{
name = "Voiceless labiodental fricative",
symbols = { "f" },
audio = "Voiceless labio-dental fricative.ogg"
},
{
name = "Voiced labiodental fricative",
symbols = { "v" },
audio = "Voiced labio-dental fricative.ogg"
},
{
name = "Voiceless linguolabial fricative",
symbols = { "θ̼", "ɸ̺", "f̼", "ɸ̼" },
audio = "Voiceless linguolabial fricative.ogg"
},
{
name = "Voiced linguolabial fricative",
symbols = { "ð̼", "β̺", "v̼", "β̼" },
audio = "Voiced linguolabial fricative.wav"
},
{
name = "Voiceless dental fricative",
symbols = { "θ" },
audio = "Voiceless dental fricative.ogg"
},
{
name = "Voiced dental fricative",
symbols = { "ð" },
audio = "Voiced dental fricative.ogg"
},
{
name = "Voiceless dental sibilant fricative",
symbols = { "s̪" },
audio = "Voiceless dental sibilant fricative.ogg"
},
{
name = "Voiced dental sibilant fricative",
symbols = { "z̪" },
},
{
name = "Voiceless denti-alveolar fricative",
symbols = { "s̻̪", "s̪̻", "s̻͆", "s̟" },
},
{
name = "Voiceless alveolar fricative",
symbols = { "s" },
audio = "Voiceless alveolar sibilant.ogg"
},
{
name = "Voiced alveolar fricative",
symbols = { "z" },
audio = "Voiced alveolar sibilant.ogg"
},
{
name = "Voiceless apico-alveolar fricative",
symbols = { "s̺" },
},
{
name = "Voiced apico-alveolar fricative",
symbols = { "z̺" },
},
{
name = "Voiceless alveolar retracted fricative",
symbols = { "s̠" },
audio = "Voiceless alveolar retracted sibilant.ogg"
},
{
name = "Voiced alveolar retracted fricative",
symbols = { "z̠" },
},
{
name = "Voiceless alveolar non-sibilant fricative",
symbols = { "θ̠", "θ͇", "t̞", "ɹ̝̊" },
},
{
name = "Voiced alveolar non-sibilant fricative",
symbols = { "ð̠", "ð͇", "d̞", "ɹ̝" },
},
{
name = "Voiceless alveolar tapped fricative",
symbols = { "ɾ̞̊" },
},
{
name = "Voiced alveolar tapped fricative",
symbols = { "ɾ̞" },
},
{
name = "Voiceless postalveolar fricative",
symbols = { "ʃ" },
audio = "Voiceless palato-alveolar sibilant.ogg"
},
{
name = "Voiced postalveolar fricative",
symbols = { "ʒ" },
audio = "Voiced palato-alveolar sibilant.ogg"
},
{
name = "Voiceless postalveolar non-sibilant fricative",
symbols = { "ɹ̠̊˔", "ɹ̝̊˗" },
audio = "Voiceless postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiced postalveolar non-sibilant fricative",
symbols = { "ɹ̠˔", "ɹ̠᷵", "ɹ̝˗" },
audio = "Voiced postalveolar non-sibilant fricative.ogg"
},
{
name = "Voiceless retroflex fricative",
symbols = { "ʂ" },
audio = "Voiceless retroflex sibilant.ogg"
},
{
name = "Voiced retroflex fricative",
symbols = { "ʐ" },
audio = "Voiced retroflex sibilant.ogg"
},
{
name = "Voiceless retroflex non-sibilant fricative",
symbols = { "ɻ̝̊", "ɻ̊˔", "ʈ̞", "ʈ˕" },
audio = "Voiceless retroflex non-sibilant fricative.ogg"
},
{
name = "Voiced retroflex non-sibilant fricative",
symbols = { "ɻ̝", "ɻ˔", "ɻ᷵", "ɖ̞", "ɖ˕" },
audio = "Voiced retroflex non-sibilant fricative.ogg"
},
{
name = "Voiceless alveolo-palatal fricative",
symbols = { "ɕ", "ʃʲ", "s̺ʲ", "s̠ʲ"},
audio = "Voiceless alveolo-palatal sibilant.ogg"
},
{
name = "Voiced alveolo-palatal fricative",
symbols = { "ʑ", "ʒʲ", "z̺ʲ", "z̠ʲ"},
audio = "Voiced alveolo-palatal sibilant.ogg"
},
{
name = "Voiceless palatal fricative",
symbols = { "ç" },
audio = "Voiceless palatal fricative.ogg"
},
{
name = "Voiced palatal fricative",
symbols = { "ʝ" },
audio = "Voiced palatal fricative.ogg"
},
{
name = "Voiceless post-palatal or pre-velar fricative",
symbols = { "ç˗", "ç̠", "ç", "x̟" },
article = "Voiceless post-palatal fricative",
audio = "Voiceless post-palatal fricative.ogg"
},
{
name = "Voiced post-palatal or pre-velar fricative",
symbols = { "ʝ", "ʝ̠", "ɣ᫈", "ɣ̟" },
article = "Voiced post-palatal fricative",
audio = "Voiced post-palatal fricative.ogg"
},
{
name = "Voiceless velar fricative",
symbols = { "x" },
audio = "Voiceless velar fricative.ogg"
},
{
name = "Voiced velar fricative",
symbols = { "ɣ" },
audio = "Voiced velar fricative.ogg"
},
{
name = "Voiceless pre-uvular fricative",
symbols = { "χ˖", "χ̟", "x̠" },
},
{
name = "Voiced pre-uvular fricative",
symbols = { "ʁ̟", "ɣ˗", "ɣ̠" },
},
{
name = "Voiceless uvular fricative",
symbols = { "χ" },
audio = "Voiceless uvular fricative.ogg"
},
{
name = "Voiced uvular fricative",
symbols = { "ʁ" },
audio = "Voiced uvular fricative.ogg"
},
{
name = "Voiceless pharyngeal fricative",
symbols = { "ħ" },
audio = "Voiceless pharyngeal fricative.ogg"
},
{
name = "Voiced pharyngeal fricative",
symbols = { "ʕ", "ʕ̝" },
audio = "Voiced pharyngeal fricative.ogg"
},
{
name = "Voiceless glottal fricative",
symbols = { "h" },
audio = "Voiceless glottal fricative.ogg"
},
{
name = "Voiced glottal fricative",
symbols = { "ɦ" },
audio = "Voiced glottal fricative.ogg"
},
{
name = "Voiceless bidental fricative",
symbols = { "h̪͆" },
audio = "Voiceless bidental fricative.ogg"
},
{
name = "Voiceless dentolabial fricative",
symbols = { "f͆" },
audio = "Voiceless dentolabial fricative.ogg"
},
-- Approximants
{
name = "Voiceless bilabial approximant",
symbols = { "ɸ̞", "ɸ˕" },
audio = "Voiceless bilabial approximant.ogg"
},
{
name = "Voiced bilabial approximant",
symbols = { "β̞", "ʋ̟" },
audio = "Bilabial approximant.ogg"
},
{
name = "Voiceless labiodental approximant",
symbols = { "ʋ̥" },
audio = "Voiceless labiodental approximant.ogg"
},
{
name = "Voiced labiodental approximant",
symbols = { "ʋ" },
audio = "Labiodental approximant.ogg"
},
{
name = "Voiceless dental approximant",
symbols = { "θ̞", "θ̞᫈", "ɹ̪̊" },
},
{
name = "Voiced dental approximant",
symbols = { "ð̞", "ɹ̪" },
},
{
name = "Voiceless alveolar approximant",
symbols = { "ɹ̥", "s̞" },
audio = "Voiceless alveolar approximant.ogg"
},
{
name = "Voiced alveolar approximant",
symbols = { "ɹ" },
audio = "Alveolar approximant.ogg"
},
{
name = "Voiced non-rhotic alveolar approximant",
symbols = { "z̞", "ð̠˕" },
},
{
name = "Voiceless postalveolar approximant",
symbols = { "ɹ̠̊" },
},
{
name = "Voiced postalveolar approximant",
symbols = { "ɹ̠" },
audio = "Postalveolar approximant.ogg"
},
{
name = "Voiceless retroflex approximant",
symbols = { "ɻ̊" },
},
{
name = "Voiced retroflex approximant",
symbols = { "ɻ" },
audio = "Retroflex Approximant2.oga"
},
{
name = "Voiceless palatal approximant",
symbols = { "j̊", "ç˕", "ç̞"},
audio = "Voiceless palatal approximant.wav"
},
{
name = "Voiced palatal approximant",
symbols = { "j", "ʝ˕", "ʝ̞" },
audio = "Palatal approximant.ogg"
},
{
name = "Voiced post-palatal or pre-velar approximant",
symbols = { "j", "j̠", "j˗", "j̈", "ʝ̞˗", "ʝ̞", "ɰ̈", "ɰ̟", "ɰ˖", "ɣ̞˖", "ɣ̞᫈" },
article = "Voiced post-palatal approximant",
audio = "Post-palatal approximant.ogg"
},
{
name = "Protruded post-palatal or pre-velar approximant",
symbols = { "j˗ʷ", "jʷ", "j̈ʷ", "ɥ̫̈", "ẅ", "w̟" },
audio = "Voiced labialized post-palatal approximant.ogg",
article = "Protruded post-palatal approximant"
},
{
name = "Compressed post-palatal or pre-velar approximant",
symbols = { "ɥ̈", "ɥ˗", "ɥ", "j̈ᵝ", "j˗ᵝ", "jᵝ" },
article = "Compressed post-palatal approximant"
},
{
name = "Voiced velar approximant",
symbols = { "ɰ", "ɣ˕", "ɣ", "ɣ̞" },
audio = "Voiced velar approximant.ogg"
},
{
name = "Voiced velar bunched approximant",
symbols = { "ɹ̈ "},
},
{
name = "Voiced uvular approximant",
symbols = { "ʁ̞" },
audio = "Voiced Uvular Approximant.ogg"
},
{
name = "Voiced pharyngeal approximant",
symbols = { "ʕ̞" },
audio = "Voiced pharyngeal approximant.ogg"
},
{
name = "Voiced epiglottal approximant",
symbols = { "ʢ̞", "ʕ̞˗" },
audio = "Voiced epiglottal trill.ogg"
},
{
name = "Creaky-voiced glottal approximant",
symbols = { "ʔ̬", "ʔ̞", "ʔ̰", "˷" },
audio = "Creaky-voiced glottal approximant.wav"
},
-- Taps/flaps
{
name = "Voiced bilabial flap",
symbols = { "ⱱ̟", "b̆", "w̆" },
audio = "Voiced bilabial flap.wav"
},
{
name = "Voiced labiodental flap",
symbols = { "ⱱ", "v̆" },
audio = "Labiodental flap.ogg"
},
{
name = "Voiceless dental tap or flap",
symbols = { "ɾ̪̊", "t̪̆" },
article = "Voiceless dental tap"
},
{
name = "Voiced dental tap or flap",
symbols = { "ɾ̪", "d̪̆" },
article = "Dental tap",
},
{
name = "Voiceless alveolar tap or flap",
symbols = { "ɾ̥", "t̆" },
article = "Voiceless alveolar tap",
audio = "Voiceless alveolar tap.wav"
},
{
name = "Voiced alveolar tap or flap",
symbols = { "ɾ", "d̆" },
audio = "Alveolar tap.ogg"
},
{
name = "Voiced postalveolar flap",
symbols = { "ɾ̠", "d̠̆"},
},
{
name = "Voiced alveolar nasal tap or flap",
symbols = { "ɾ̃", "n̆" },
article = "Alveolar nasal tap",
},
{
name = "Voiceless retroflex flap",
symbols = { "ɽ̊", "ʈ̆" },
--audio = "Voiceless retroflex tap.wav"
},
{
name = "Voiced retroflex flap",
symbols = { "ɽ", "ɖ̆" },
audio = "Retroflex flap.ogg"
},
{
name = "Voiced retroflex nasal flap",
symbols = { "ɽ̃", "ɳ̆" },
},
{
name = "Voiced velar tap",
symbols = { "ɡ̆" },
audio = "Voiced velar tap.wav"
},
{
name = "Voiced uvular tap or flap",
symbols = { "ɢ̆", "ʀ̆" },
article = "Voiced uvular tap and flap",
audio = "Voiced uvular tap.wav"
},
{
name = "Voiced epiglottal tap",
symbols = { "ʡ̆", "ʢ̆", "ʕ̆" },
audio = "Epiglottal flap.oga"
},
-- Trills
{
name = "Voiceless bilabial trill",
symbols = { "ʙ̥" },
audio = "Voiceless bilabial trill with aspiration.ogg"
},
{
name = "Voiced bilabial trill",
symbols = { "ʙ" },
audio = "Bilabial trill.ogg"
},
{
name = "Voiceless labiolingual trill",
symbols = { "r̼̊", "ʙ̺̊", "ʙ̼̊" },
audio = "Voiceless linguolabial trill.wav"
},
{
name = "Voiced labiolingual trill",
symbols = { "r̼", "ʙ̺", "ʙ̼" },
audio = "Voiced linguolabial trill.wav"
},
{
name = "Voiceless dental trill",
symbols = { "r̪̊" }
},
{
name = "Voiced dental trill",
symbols = { "r̪" },
},
{
name = "Voiceless alveolar trill",
symbols = { "r̥" },
audio = "Voiceless alveolar trill.ogg"
},
{
name = "Voiced alveolar trill",
symbols = { "r" },
audio = "Alveolar trill.ogg"
},
{
name = "Voiceless alveolar fricative trill",
symbols = { "r̝̊" },
audio = "Voiceless alveolar raised non-sonorant trill.ogg"
},
{
name = "Voiced alveolar fricative trill",
symbols = { "r̝" },
audio = "Raised alveolar non-sonorant trill.ogg"
},
{
name = "Voiceless postalveolar trill",
symbols = { "r̠̊" }
},
{
name = "Voiced postalveolar trill",
symbols = { "r̠" },
audio = "Voiced postalveolar trill.ogg"
},
{
name = "Voiceless retroflex trill",
symbols = { "ɽ̊r̥", "ɽr̥", "ɽ̊ʳ" },
audio = "Voiceless retroflex trill.ogg"
},
{
name = "Voiced retroflex trill",
symbols = { "ɽr", "ɽʳ" },
audio = "Voiced retroflex trill.ogg"
},
{
name = "Voiceless pre-uvular fricative trill",
symbols = { "ʀ̝̊˖", "ʀ̟̊˔" },
},
{
name = "Voiced pre-uvular fricative trill",
symbols = { "ʀ̝˖", "ʀ̟˔" },
},
{
name = "Voiceless uvular trill",
symbols = { "ʀ̥" },
audio = "Voiceless uvular trill.ogg"
},
{
name = "Voiced uvular trill",
symbols = { "ʀ" },
audio = "Uvular trill.ogg"
},
{
name = "Voiceless uvular fricative trill",
symbols = { "ʀ̝̊" },
audio = "Voiceless uvular fricative trill.ogg"
},
{
name = "Voiced uvular fricative trill",
symbols = { "ʀ̝" },
audio = "Voiced uvular fricative trill.wav"
},
{
name = "Voiceless epiglottal trill",
symbols = { "ʜ" },
audio = "Voiceless epiglottal trill.ogg"
},
{
name = "Voiced epiglottal trill",
symbols = { "ʢ" },
audio = "Voiced epiglottal trill 2.ogg"
},
-- Lateral affricates
{
name = "Voiceless alveolar lateral affricate",
symbols = { "tɬ" },
audio = "Voiceless alveolar lateral affricate.ogg"
},
{
name = "Voiced alveolar lateral affricate",
symbols = { "dɮ" },
audio = "Voiced alveolar lateral affricate.ogg"
},
{
name = "Voiceless retroflex lateral affricate",
symbols = { "ʈꞎ", "tꞎ", "ʈɭ̊˔", "tɭ̊˔", "ʈɭ̊", "tɭ̊" },
audio = "Voiceless retroflex lateral affricate.ogg"
},
{
name = "Voiced retroflex lateral affricate",
symbols = { "ɖ𝼅", "d𝼅", "ɖɭ˔", "dɭ˔", "ɖɭ", "dɭ" },
audio = "Voiced retroflex lateral affricate.ogg"
},
{
name = "Voiceless palatal lateral affricate",
symbols = { "cʎ̝̊", "cʎ̥", "c𝼆", "t𝼆" },
audio = "Voiceless palatal lateral affricate.ogg"
},
{
name = "Voiced palatal lateral affricate",
symbols = { "ɟʎ̝", "ɟʎ", "ɟ𝼆̬", "d𝼆̬" },
audio = "Voiced palatal lateral affricate.ogg"
},
{
name = "Voiceless post-palatal lateral affricate",
symbols = { "c𝼆˗" },
article = "Voiceless velar lateral affricate"
},
{
name = "Voiceless velar lateral affricate",
symbols = { "kʟ̝̊", "kʟ̥", "k𝼄" },
audio = "Voiceless velar lateral affricate.ogg"
},
{
name = "Voiced velar lateral affricate",
symbols = { "ɡʟ̝", "ɡʟ", "ɡ𝼄̬" },
audio = "Voiced velar lateral affricate.ogg"
},
-- Lateral fricatives
{
name = "Voiceless dental lateral fricative",
symbols = { "ɬ̪" },
},
{
name = "Voiced dental lateral fricative",
symbols = { "ɮ̪", "ɮ͆" },
},
{
name = "Voiceless alveolar lateral fricative",
symbols = { "ɬ" },
audio = "Voiceless alveolar lateral fricative.ogg"
},
{
name = "Voiced alveolar lateral fricative",
symbols = { "ɮ" },
audio = "Voiced alveolar lateral fricative.ogg"
},
{
name = "Voiceless postalveolar lateral fricative",
symbols = { "ɬ̠" }
},
{
name = "Voiced postalveolar lateral fricative",
symbols = { "ɮ̠" },
audio = "Voiced postalveolar lateral fricative.ogg"
},
{
name = "Voiceless retroflex lateral fricative",
symbols = { "ɭ̊˔", "ꞎ"},
audio = "Voiceless retroflex lateral fricative.ogg"
},
{
name = "Voiced retroflex lateral fricative",
symbols = { "ɭ˔", "𝼅" },
audio = "Voiced retroflex lateral fricative.wav"
},
{
name = "Voiceless alveolo-palatal lateral fricative",
symbols = { "ɬ̠ʲ", "ʎ̝̊˖", "ȴ̊˔", "l̠̊ʲ", "ʎ̟̊", "ȴ̊" },
},
{
name = "Voiceless palatal lateral fricative",
symbols = { "ʎ̝̊", "𝼆" },
audio = "Voiceless palatal lateral fricative.ogg"
},
{
name = "Voiced palatal lateral fricative",
symbols = { "ʎ̝", "𝼆̬" },
audio = "ʎ̝ IPA sound.opus"
},
{
name = "Voiceless post-palatal lateral fricative",
symbols = { "𝼆̠" },
},
{
name = "Voiced post-palatal or pre-velar lateral fricative",
symbols = { "ʎ̝˗", "ʟ̟᷵" },
article = "Voiced pre-velar lateral fricative"
},
{
name = "Voiceless velar lateral fricative",
symbols = { "ʟ̝̊", "𝼄" },
audio = "Voiceless velar lateral fricative.ogg"
},
{
name = "Voiced velar lateral fricative",
symbols = { "ʟ̝", "𝼄̬" },
audio = "Voiced velar lateral fricative.ogg"
},
-- Lateral approximants
{
name = "Voiced dental lateral approximant",
symbols = { "l̪" },
audio = "Voiced dental lateral approximant.ogg"
},
{
name = "Voiceless alveolar lateral approximant",
symbols = { "l̥" },
audio = "Voiceless alveolar lateral approximant.ogg"
},
{
name = "Voiced alveolar lateral approximant",
symbols = { "l" },
audio = "Alveolar lateral approximant.ogg"
},
{
name = "Voiced postalveolar lateral approximant",
symbols = { "l̠" },
audio = "Voiced postalveolar lateral approximant.ogg"
},
{
name = "Voiceless retroflex lateral approximant",
symbols = { "ɭ̊" },
},
{
name = "Voiced retroflex lateral approximant",
symbols = { "ɭ" },
audio = "Retroflex lateral approximant.ogg"
},
{
name = "Voiced alveolo-palatal lateral approximant",
symbols = { "l̠ʲ", "ʎ̟", "ȴ" },
audio = "Alveolo-palatal lateral approximant.ogg"
},
{
name = "Voiceless palatal lateral approximant",
symbols = { "ʎ̥" },
},
{
name = "Voiced palatal lateral approximant",
symbols = { "ʎ" },
audio = "Palatal lateral approximant.ogg"
},
{
name = "Voiceless velar lateral approximant",
symbols = { "ʟ̥" },
},
{
name = "Voiced velar lateral approximant",
symbols = { "ʟ" },
audio = "Velar lateral approximant.ogg"
},
{
name = "Voiced uvular lateral approximant",
symbols = { "ʟ̠" },
audio = "Uvular lateral approximant.ogg"
},
-- Lateral taps/flaps
{
name = "Voiced linguolabial lateral flap",
symbols = { "ɺ̼", "l̼̆"}
},
{
name = "Voiced dental lateral flap",
symbols = { "ɺ̪", "l̪̆" }
},
{
name = "Voiceless alveolar lateral flap",
symbols = { "ɺ̥", "l̥̆" },
audio = "Voiceless alveolar lateral flap.wav"
},
{
name = "Voiced alveolar lateral flap",
symbols = { "ɺ", "l̆"},
audio = "Voiced alveolar lateral flap.wav"
},
{
name = "Voiced postalveolar lateral flap",
symbols = { "ɺ̠", "l̠̆" },
audio = "Voiced postalveolar lateral flap.ogg"
},
{
name = "Voiceless retroflex lateral flap",
symbols = { "𝼈̊", "𝼈̥", "ɭ̥̆" },
audio = "Voiceless retroflex lateral flap.wav"
},
{
name = "Voiced retroflex lateral flap",
symbols = { "𝼈", "ɭ̆" },
audio = "Voiced retroflex lateral flap (correct).wav"
},
{
name = "Voiced palatal lateral flap",
symbols = { "ʎ̆" },
audio = "Voiced palatal lateral flap.wav"
},
{
name = "Voiced velar lateral tap",
symbols = { "ʟ̆" }
},
-- NON-PULMONIC CONSONANTS
-- Ejective stops
{
name = "Bilabial ejective stop",
symbols = { "pʼ" },
audio = "Bilabial ejective plosive.ogg"
},
{
name = "Dental ejective stop",
symbols = { "t̪ʼ" },
audio = "Dental ejective stop.ogg"
},
{
name = "Alveolar ejective stop",
symbols = { "tʼ" },
audio = "Alveolar ejective plosive.ogg"
},
{
name = "Retroflex ejective stop",
symbols = { "ʈʼ" },
audio = "Retroflex ejective.ogg"
},
{
name = "Palatal ejective stop",
symbols = { "cʼ" },
audio = "Palatal ejective.ogg"
},
{
name = "Velar ejective stop",
symbols = { "kʼ" },
audio = "Velar ejective plosive.ogg"
},
{
name = "Uvular ejective stop",
symbols = { "qʼ" },
audio = "Uvular ejective plosive.ogg"
},
-- Ejective affricates
{
name = "Labiodental ejective affricate",
symbols = { "p̪fʼ" },
},
{
name = "Dental ejective affricate",
symbols = { "t̪θʼ", "t̟θʼ", "tθʼ" },
audio = "Dental ejective affricate.ogg"
},
{
name = "Alveolar ejective affricate",
symbols = { "tsʼ" },
audio = "Alveolar ejective affricate.ogg"
},
{
name = "Postalveolar ejective affricate",
symbols = { "t̠ʃʼ", "tʃʼ" },
audio = "Palato-alveolar ejective affricate.ogg"
},
{
name = "Retroflex ejective affricate",
symbols = { "ʈʂʼ", "tʂʼ" },
audio = "Retroflex ejective affricate.ogg"
},
{
name = "Alveolo-palatal ejective affricate",
symbols = { "t̠ɕʼ", "tɕʼ", "t̠ʃʲʼ", "tʃʲʼ", "t̠s̠ʲʼ", "cɕʼ" },
},
{
name = "Palatal ejective affricate",
symbols = { "cçʼ" },
audio = "Palatal ejective affricate.ogg"
},
{
name = "Velar ejective affricate",
symbols = { "kxʼ" },
audio = "Velar ejective affricate.ogg"
},
{
name = "Uvular ejective affricate",
symbols = { "qχʼ" },
audio = "Uvular ejective affricate.ogg"
},
-- Ejective fricatives
{
name = "Bilabial ejective fricative",
symbols = { "ɸʼ" },
audio = "Bilabial ejective fricative.ogg"
},
{
name = "Labiodental ejective fricative",
symbols = { "fʼ" },
audio = "Labiodental ejective fricative.ogg"
},
{
name = "Dental ejective fricative",
symbols = { "θʼ" },
audio = "Dental ejective fricative.ogg"
},
{
name = "Alveolar ejective fricative",
symbols = { "sʼ" },
audio = "Alveolar ejective fricative.ogg"
},
{
name = "Postalveolar ejective fricative",
symbols = { "ʃʼ" },
audio = "Palato-alveolar ejective fricative.ogg"
},
{
name = "Retroflex ejective fricative",
symbols = { "ʂʼ" },
audio = "Retroflex ejective fricative.ogg"
},
{
name = "Alveolo-palatal ejective fricative",
symbols = { "ɕʼ" , "ʃʲʼ", "s̠ʲʼ"},
audio = "Alveolo-palatal ejective fricative.ogg"
},
{
name = "Palatal ejective fricative",
symbols = { "çʼ" },
audio = "Palatal ejective fricative.ogg"
},
{
name = "Velar ejective fricative",
symbols = { "xʼ" },
audio = "Velar ejective fricative.ogg"
},
{
name = "Uvular ejective fricative",
symbols = { "χʼ" },
audio = "Uvular ejective fricative.ogg"
},
-- Lateral ejective affricates
{
name = "Alveolar lateral ejective affricate",
symbols = { "tɬʼ", "ƛʼ" },
audio = "Alveolar lateral ejective affricate.ogg"
},
{
name = "Palatal lateral ejective affricate",
symbols = { "cʎ̝̊ʼ", "cʎ̥ʼ", "c𝼆ʼ" },
audio = "Palatal lateral ejective affricate.ogg"
},
{
name = "Velar lateral ejective affricate",
symbols = { "kʟ̝̊ʼ", "kʟ̥ʼ", "k𝼄ʼ" },
audio = "Velar lateral ejective affricate.ogg"
},
{
name = "Uvular lateral ejective affricate",
symbols = { "q𝼄ʼ", "q𝼄̠ʼ", "qʟ̝̊ʼ" },
},
-- Lateral ejective fricatives
{
name = "Alveolar lateral ejective fricative",
symbols = { "ɬʼ" },
audio = "Alveolar lateral ejective fricative.ogg"
},
-- Ejective trills
{
name = "Ejective trill",
symbols = { "ʙ̥ʼ", "r̼̊ʼ", "ʙ̺̊ʼ", "ʙ̼̊ʼ", "r̪̊ʼ", "r̥ʼ", "r̠̊ʼ", "ɽr̥ʼ", "ʀ̥ʼ" },
article = "Ejective consonant"
},
-- Tenuis clicks
{
name = "Tenuis bilabial click",
symbols = { "ʘ", "kʘ" },
audio = "Clic bilabial sourd.ogg"
},
{
name = "Tenuis dental click",
symbols = { "ǀ", "kǀ" },
audio = "Dental click.ogg"
},
{
name = "Tenuis alveolar click",
symbols = { "ǃ", "kǃ" },
audio = "Postalveolar click.ogg"
},
{
name = "Tenuis palatal click",
symbols = { "ǂ", "kǂ" },
audio = "Palatoalveolar click.ogg"
},
{
name = "Tenuis retroflex click",
symbols = { "𝼊", "k𝼊" },
audio = "Retrflx click.wav"
},
{
name = "Back-released click",
symbols = { "ʞ" },
},
-- Voiced clicks
{
name = "Voiced bilabial click",
symbols = { "ʘ̬", "ɡʘ" },
},
{
name = "Voiced dental click",
symbols = { "ǀ̬", "ɡǀ" },
},
{
name = "Voiced alveolar click",
symbols = { "ǃ̬", "ɡǃ" },
},
{
name = "Voiced palatal click",
symbols = { "ǂ̬", "ɡǂ" },
},
{
name = "Voiced retroflex click",
symbols = { "𝼊̬", "ɡ𝼊" },
},
-- Nasal clicks
{
name = "Bilabial nasal click",
symbols = { "ʘ̃", "ŋʘ", "ⁿʘ" },
audio = "Bilabial nasal click.ogg"
},
{
name = "Dental nasal click",
symbols = { "ǀ̃", "ŋǀ", "ⁿǀ", "ŋǀʱ" },
},
{
name = "Alveolar nasal click",
symbols = { "ǃ̃", "ŋǃ", "ⁿǃ" },
audio = "Intervocalic nasal alveolar clicks.ogg"
},
{
name = "Palatal nasal click",
symbols = { "ǂ̃", "ŋǂ", "ⁿǂ" },
},
{
name = "Retroflex nasal click",
symbols = { "𝼊̃", "ŋ𝼊", "ⁿ𝼊" },
},
-- Lateral clicks
{
name = "Tenuis alveolar lateral click",
symbols = { "ǁ", "kǁ" },
audio = "Alveolar lateral click.ogg"
},
{
name = "Voiced alveolar lateral click",
symbols = { "ǁ̬", "ɡǁ" },
},
-- Lateral nasal clicks
{
name = "Alveolar lateral nasal click",
symbols = { "ǁ̃", "ŋǁ", "ⁿǁ" },
},
-- Glottalized clicks
{
name = "Glottalized bilabial nasal click",
symbols = { "ʘ̃ˀ", "ʘˀ", "ŋ̊ʘˀ", "ŋʘˀ" },
},
{
name = "Glottalized dental nasal click",
symbols = { "ǀ̃ˀ", "ǀˀ", "ŋ̊ǀˀ", "ŋǀˀ" },
},
{
name = "Glottalized alveolar nasal click",
symbols = { "ǃ̃ˀ", "ǃˀ", "ŋ̊ǃˀ", "ŋǃˀ" },
},
{
name = "Glottalized retroflex nasal click",
symbols = { "𝼊̃ˀ", "𝼊ˀ", "ŋ𝼊ˀ", "ŋ̊𝼊ˀ" },
},
{
name = "Glottalized palatal nasal click",
symbols = { "ǂ̃ˀ", "ǂˀ", "ŋ̊ǂˀ", "ŋǂˀ" },
},
{
name = "Glottalized alveolar lateral nasal click",
symbols = { "ǁ̃ˀ", "ǁˀ", "ŋ̊ǁˀ", "ŋǁˀ" },
},
-- Egressive clicks (for Damin)
{
name = "Egressive bilabial click",
symbols = { "ʘ↑" },
},
-- Implosives
{
name = "Voiceless bilabial implosive",
symbols = { "ɓ̥", "ƥ", "pʼ↓" },
audio = "Voiceless-bilabial-implosive.ogg",
},
{
name = "Voiced bilabial implosive",
symbols = { "ɓ" },
audio = "Voiced bilabial implosive.ogg"
},
{
name = "Voiceless dental implosive",
symbols = { "ɗ̪̥", "ɗ̪̊", "ƭ̪", "t̪ʼ↓" },
},
{
name = "Voiced dental implosive",
symbols = { "ɗ̪" },
},
{
name = "Voiceless alveolar implosive",
symbols = { "ɗ̥", "ƭ", "tʼ↓" },
audio = "Voiceless-alveolar-implosive.ogg",
},
{
name = "Voiced alveolar implosive",
symbols = { "ɗ" },
audio = "Voiced alveolar implosive.ogg"
},
{
name = "Voiceless retroflex implosive",
symbols = { "ᶑ̊", "ᶑ̥", "𝼉", "ʈʼ↓" },
audio = "Voiceless-retroflex-implosive.ogg",
},
{
name = "Voiced retroflex implosive",
symbols = { "ᶑ" },
audio = "Voiced-retroflex-implosive.ogg",
},
{
name = "Voiceless palatal implosive",
symbols = { "ʄ̊", "ʄ̥", "ƈ", "cʼ↓" },
audio = "Voiceless palatal implosive.ogg",
},
{
name = "Voiced palatal implosive",
symbols = { "ʄ" },
audio = "Voiced palatal implosive.ogg"
},
{
name = "Voiced post-palatal or pre-velar implosive",
symbols = { "ʄ̠", "ʄ˗", "ɠ̟", "ɠ˖" },
audio = "Voiced post palatal and pre velar implosives.ogg",
article = "Voiced pre-velar implosive"
},
{
name = "Voiceless velar implosive",
symbols = { "ɠ̊", "ƙ", "kʼ↓" },
audio = "Voiceless-velar-implosive.ogg",
},
{
name = "Voiced velar implosive",
symbols = { "ɠ" },
audio = "Voiced velar implosive.ogg"
},
{
name = "Voiceless uvular implosive",
symbols = { "ʛ̥", "ʠ", "qʼ↓" },
audio = "Voiceless-uvular-implosive.ogg",
},
{
name = "Voiced uvular implosive",
symbols = { "ʛ" },
audio = "Voiced uvular implosive.ogg"
},
-- CO-ARTICULATED CONSONANTS
-- Co-articulated nasals
{
name = "Voiced labial–alveolar nasal",
symbols = { "nm" },
},
{
name = "Voiced labial–retroflex nasal",
symbols = { "ɳm" },
},
{
name = "Voiced labial–velar nasal",
symbols = { "ŋm" },
audio = "Labial-velar nasal stop.ogg"
},
-- Co-articulated plosives
{
name = "Voiceless labial–alveolar plosive",
symbols = { "tp" },
audio = "Voiceless labial-alveolar plosive.ogg"
},
{
name = "Voiced labial–alveolar plosive",
symbols = { "db" },
},
{
name = "Voiceless labial–retroflex plosive",
symbols = { "ʈp" },
},
{
name = "Voiced labial–retroflex plosive",
symbols = { "ɖb" },
},
{
name = "Voiceless labial–velar plosive",
symbols = { "kp" },
audio = "Voiceless labial-velar plosive.ogg"
},
{
name = "Voiced labial–velar plosive",
symbols = { "ɡb" },
audio = "Voiced labial-velar plosive.ogg"
},
{
name = "Voiceless labial–uvular plosive",
symbols = { "qp" },
audio = "Voiceless labial–uvular plosive.ogg"
},
{
name = "Voiceless uvular–epiglottal plosive",
symbols = { "qʡ" },
},
-- Co-articulated implosives
{
name = "Voiceless labial–velar implosive",
symbols = { "ɠ̊ɓ̥", "kɓ̥", "ƙƥ", "kpʼ↓", "kƥ" },
audio = "Voiceless-labial–velar-implosive.ogg",
},
{
name = "Voiced labial–velar implosive",
symbols = { "ɠɓ", "ɡɓ" },
audio = "Voiced-labial-velar-implosive.ogg"
},
-- Co-articulated ejectives
{
name = "Labial–alveolar ejective stop",
symbols = { "tpʼ" },
},
-- Co-articulated continuants
{
name = "Voiceless labial–palatal fricative",
symbols = { "ɥ̊˔", "ɥ̝̊", "çᶣ", "çᵝ", "çʷ" },
},
{
name = "Voiceless labial–palatal approximant",
symbols = { "ɥ̊", "ç̞ᶣ", "ç̞ᵝ", "ç̞ʷ" },
},
{
name = "Voiced labial–palatal approximant",
symbols = { "ɥ" },
audio = "LL-Q150 (fra)-WikiLucas00-IPA ɥ.wav"
},
{
name = "Voiceless labial–velar fricative",
symbols = { "ʍ", "xʷ" },
audio = "Voiceless labio-velar fricative.ogg"
},
{
name = "Voiceless labial–velar approximant",
symbols = { "w̥", "ẘ", "ʍ̞" },
},
{
name = "Voiced labial–velar approximant",
symbols = { "w", "ɰʷ", "ɣ̞ʷ", "ɣʷ"},
audio = "Voiced labio-velar approximant.ogg"
},
{
name = "Compressed voiced labial–velar approximant",
symbols = { "wᵝ", "ɰᵝ", "ɣ̞ᵝ", "ɣᵝ"},
article = "Voiced labial–velar approximant",
},
{
name = "Sj-sound",
symbols = { "ɧ" },
audio = "Voiceless dorso-palatal velar fricative.ogg"
},
-- Co-articulated lateral approximants
{
name = "Velarized dental lateral approximant",
symbols = { "ɫ̪", "l̪ˠ" },
},
{
name = "Velarized alveolar lateral approximant",
symbols = { "ɫ", "lˠ" },
audio = "Velarized alveolar lateral approximant.ogg"
},
{
name = "Pharyngealized dental lateral approximant",
symbols = { "l̪ˤ" },
},
{
name = "Pharyngealized alveolar lateral approximant",
symbols = { "lˤ" },
},
-- Nasalized approximants
{
name = "Nasalized voiced alveolar lateral approximant",
symbols = { "l̃" },
},
{
name = "Nasalized voiced palatal approximant",
symbols = { "j̃" },
audio = "Nasal palatal approximant.ogg"
},
{
name = "Nasalized voiced velar approximant",
symbols = { "ɰ̃", "ɣ̞̃", "ɣ̃˕" },
audio = "Nasal velar approximant.ogg"
},
{
name = "Nasalized voiced labial–velar approximant",
symbols = { "w̃" },
audio = "Voiced labialized velar nasal approximant.ogg"
},
{
name = "Nasalized voiceless glottal approximant",
symbols = { "h̃" },
audio = "IPA h̃.ogg"
},
{
name = "Nasalized voiced glottal approximant",
symbols = { "ɦ̃" },
},
-- VOWELS
-- Close vowels
{
name = "Close front unrounded vowel",
symbols = { "i" },
audio = "Close front unrounded vowel.ogg"
},
{
name = "Close front rounded vowel",
symbols = { "y" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front compressed vowel",
symbols = { "y͍", "iᵝ" },
audio = "Close front rounded vowel.ogg"
},
{
name = "Close front protruded vowel",
symbols = { "y̫", "yʷ", "iʷ", "y᫇" },
audio = "Close front protruded vowel.ogg"
},
{
name = "Close central unrounded vowel",
symbols = { "ɨ", "ï", "ɯ̈" },
audio = "Close central unrounded vowel.ogg"
},
{
name = "Close central rounded vowel",
symbols = { "ʉ", "ü" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central protruded vowel",
symbols = { "ʉ̫", "ʉʷ", "ɨʷ" },
audio = "Close central rounded vowel.ogg"
},
{
name = "Close central compressed vowel",
symbols = { "ÿ", "ɨᵝ" },
},
{
name = "Close back unrounded vowel",
symbols = { "ɯ" },
audio = "Close back unrounded vowel.ogg"
},
{
name = "Close back rounded vowel",
symbols = { "u" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back protruded vowel",
symbols = { "u̫", "uʷ", "ɯʷ" },
audio = "Close back rounded vowel.ogg"
},
{
name = "Close back compressed vowel",
symbols = { "u͍", "ɯᵝ" },
audio = "Ja-U.oga"
},
-- Near-close vowels
{
name = "Near-close front unrounded vowel",
symbols = { "ɪ̟", "i̞", "e̝" },
},
{
name = "Near-close front rounded vowel",
symbols = { "ʏ̟", "y̞", "y˕", "ø̝" },
},
{
name = "Near-close near-front unrounded vowel",
symbols = { "ɪ", "i̽", "ï̞", "ë̝" },
audio = "Near-close near-front unrounded vowel.ogg"
},
{
name = "Near-close near-front rounded vowel",
symbols = { "ʏ", "y̽", "ÿ̞", "ÿ˕", "ø̝̈" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front compressed vowel",
symbols = { "ʏ͍", "ɪᵝ" },
audio = "Near-close near-front rounded vowel.ogg"
},
{
name = "Near-close near-front protruded vowel",
symbols = { "ʏ̫", "ʏʷ", "ɪʷ" },
},
{
name = "Near-close central unrounded vowel",
symbols = { "ɪ̈", "ɪ̠", "ɨ̞", "ɘ̝" },
audio = "Near-close central unrounded vowel.ogg"
},
{
name = "Near-close central rounded vowel",
symbols = { "ʊ̈", "ʊ̟", "ʉ̞", "ɵ̝" },
audio = "Near-close central rounded vowel2.ogg"
},
{
name = "Near-close central protruded vowel",
symbols = { "ʊ̫̈", "ʉ̫˕", "ʊ̈ʷ", "ʉ̞ʷ", "ɪ̈ʷ", "ɨ̞ʷ" },
},
{
name = "Near-close central compressed vowel",
symbols = { "ʏ̈", "ɨ̞ᵝ" },
},
{
name = "Near-close near-back unrounded vowel",
symbols = { "ɯ̽", "ɯ̞̈", "ɤ̝̈" },
audio = "Near-close near-back unrounded vowel.ogg"
},
{
name = "Near-close near-back rounded vowel",
symbols = { "ʊ", "u̽", "ü̞", "ö̝" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back protruded vowel",
symbols = { "ʊ̫", "ʊʷ", "ɯ̽ʷ", "ɤ̝̈ʷ", "u̫˕", "u̞ʷ", "ɯ̞ʷ", "ɤ̝ʷ" },
audio = "Near-close near-back rounded vowel.ogg"
},
{
name = "Near-close near-back compressed vowel",
symbols = { "ʊ͍", "ɯ̽ᵝ", "ɯ̞̈ᵝ", "ɯ̞ᵝ" },
},
{
name = "Near-close back unrounded vowel",
symbols = { "ɯ̞", "ɤ̝" },
},
{
name = "Near-close back rounded vowel",
symbols = { "ʊ̠", "u̞", "o̝" },
},
-- Close-mid vowels
{
name = "Close-mid front unrounded vowel",
symbols = { "e" },
audio = "Close-mid front unrounded vowel.ogg"
},
{
name = "Close-mid front rounded vowel",
symbols = { "ø" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front compressed vowel",
symbols = { "ø͍", "eᵝ" },
audio = "Close-mid front rounded vowel.ogg"
},
{
name = "Close-mid front protruded vowel",
symbols = { "ø̫", "øʷ", "eʷ" },
},
{
name = "Close-mid near-front unrounded vowel",
symbols = { "ɪ̞", "e̠", "ɘ̟" },
},
{
name = "Close-mid near-front rounded vowel",
symbols = { "ʏ̞", "ø̠", "ɵ̟" },
},
{
name = "Close-mid central unrounded vowel",
symbols = { "ɘ", "ë", "ɤ̈" },
audio = "Close-mid central unrounded vowel.ogg"
},
{
name = "Close-mid central rounded vowel",
symbols = { "ɵ", "ɵ̫", "ɵʷ", "ö", "ɘʷ" },
audio = "Close-mid central rounded vowel.ogg"
},
{
name = "Close-mid central compressed vowel",
symbols = { "ø̈", "ɘᵝ" },
},
{
name = "Close-mid near-back unrounded vowel",
symbols = { "ɘ̠", "ɤ̟", "ɯ̞̽" },
},
{
name = "Close-mid near-back rounded vowel",
symbols = { "ʊ̞", "ɵ̠", "o̟" },
},
{
name = "Close-mid back unrounded vowel",
symbols = { "ɤ" },
audio = "Close-mid back unrounded vowel.ogg"
},
{
name = "Close-mid back rounded vowel",
symbols = { "o", "o̫", "oʷ", "ɤʷ" },
audio = "Close-mid back rounded vowel.ogg"
},
{
name = "Close-mid back compressed vowel",
symbols = { "o͍", "ɤᵝ" },
},
-- Mid vowels
{
name = "Mid front unrounded vowel",
symbols = { "e̞", "ɛ̝" },
audio = "Mid front unrounded vowel.ogg"
},
{
name = "Mid front rounded vowel",
symbols = { "ø̞", "œ̝" },
audio = "Mid front rounded vowel (trimmed).ogg"
},
{
name = "Mid front compressed vowel",
symbols = { "ø͍˕", "œ͍˔", "e̞ᵝ", "ɛ̝ᵝ" },
},
{
name = "Mid front protruded vowel",
symbols = { "ø̫˕", "œ̫˔", "ø̞ʷ", "œ̝ʷ", "e̞ʷ", "ɛ̝ʷ" },
},
{
name = "Mid near-front unrounded vowel",
symbols = { "e̽", "ɛ̽", "ë̞", "ɛ̝̈" },
},
{
name = "Mid near-front rounded vowel",
symbols = { "ø̽", "œ̽", "ø̞̈", "œ̝̈" },
},
{
name = "Mid central vowel",
symbols = { "ə" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central unrounded vowel",
symbols = { "ə̜", "ɘ̞", "ɜ̝" },
audio = "Mid-central vowel.ogg"
},
{
name = "Mid central rounded vowel",
symbols = { "ə̹", "ɵ̞", "ɞ̝" },
audio = "Mid central rounded vowel.ogg"
},
{
name = "Mid near-back unrounded vowel",
symbols = { "ɤ̽", "ʌ̽", "ɤ̞̈", "ʌ̝̈" },
},
{
name = "Mid near-back rounded vowel",
symbols = { "o̽", "ɔ̽", "ö̞", "ɔ̝̈" },
},
{
name = "Mid back unrounded vowel",
symbols = { "ɤ̞", "ʌ̝" },
audio = "ɤ̞ IPA sound.opus"
},
{
name = "Mid back rounded vowel",
symbols = { "o̞", "ɔ̝" },
audio = "Mid back rounded vowel.ogg"
},
-- Open-mid vowels
{
name = "Open-mid front unrounded vowel",
symbols = { "ɛ" , "æ̝"},
audio = "Open-mid front unrounded vowel.ogg"
},
{
name = "Open-mid front rounded vowel",
symbols = { "œ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front compressed vowel",
symbols = { "œ͍", "ɛᵝ" },
audio = "Open-mid front rounded vowel (2).ogg"
},
{
name = "Open-mid front protruded vowel",
symbols = { "œ̫", "œʷ", "ɛʷ" },
},
{
name = "Open-mid central unrounded vowel",
symbols = { "ɜ", "ɛ̈", "ʌ̈" },
audio = "Open-mid central unrounded vowel.ogg"
},
{
name = "Open-mid central rounded vowel",
symbols = { "ɞ", "œ̈", "ɔ̈" },
audio = "Open-mid central rounded vowel.ogg"
},
{
name = "Open-mid back unrounded vowel",
symbols = { "ʌ" },
audio = "PR-open-mid back unrounded vowel2.ogg"
},
{
name = "Open-mid back rounded vowel",
symbols = { "ɔ" },
audio = "PR-open-mid back rounded vowel.ogg"
},
-- Near-open vowels
{
name = "Near-open front unrounded vowel",
symbols = { "æ", "ɛ̞", "a̝" },
audio = "Near-open front unrounded vowel.ogg"
},
{
name = "Near-open front rounded vowel",
symbols = { "œ̞", "ɶ̝" },
},
{
name = "Near-open near-front unrounded vowel",
symbols = { "æ̈", "æ̠", "ä̝", "a̽", "ɛ̞̈" },
},
{
name = "Near-open near-front rounded vowel",
symbols = { "ɶ̝̈", "ɶ̽", "œ̞̈" },
},
{
name = "Near-open central vowel",
symbols = { "ɐ" },
audio = "Near-open central unrounded vowel.ogg"
},
{
name = "Near-open central unrounded vowel",
symbols = { "ɐ̜", "ɜ̞" },
audio = "PR-near-open central unrounded vowel.ogg"
},
{
name = "Near-open central rounded vowel",
symbols = { "ɐ̹", "ɞ̞" },
audio = "Near-open central rounded vowel.ogg"
},
{
name = "Near-open near-back unrounded vowel",
symbols = { "ɑ̽", "ɑ̝̈", "ʌ̞̈" },
},
{
name = "Near-open near-back rounded vowel",
symbols = { "ɒ̽", "ɒ̝̈", "ɔ̞̈" },
},
{
name = "Near-open back unrounded vowel",
symbols = { "ʌ̞", "ɑ̝" },
},
{
name = "Near-open back rounded vowel",
symbols = { "ɔ̞", "ɒ̝" },
},
-- Open vowels
{
name = "Open front unrounded vowel",
symbols = { "a", "æ̞" },
audio = "PR-open front unrounded vowel.ogg"
},
{
name = "Open front rounded vowel",
symbols = { "ɶ" },
audio = "Open front rounded vowel.ogg"
},
{
name = "Open central unrounded vowel",
symbols = { "ä", "a̠", "ɑ̈", "ɑ̟" },
audio = "Open central unrounded vowel.ogg"
},
{
name = "Open central rounded vowel",
symbols = { "ɒ̈", "ɒ̟", "ɶ̈", "ɶ̠" },
audio = "Open central rounded vowel.ogg"
},
{
name = "Open back unrounded vowel",
symbols = { "ɑ" },
audio = "Open back unrounded vowel.ogg"
},
{
name = "Open back rounded vowel",
symbols = { "ɒ" },
audio = "PR-open back rounded vowel.ogg"
},
{
name = "R-colored vowel",
symbols = { "ɚ", "ɝ", "ɹ̩", "ɻ̍" },
audio = "En-us-er.ogg"
},
-- SUPRASEGMENTALS
{
name = "Primary stress",
symbols = { "ˈ" },
article = "Stress (linguistics)",
},
{
name = "Secondary stress",
symbols = { "ˌ" },
},
{
name = "Minor (foot) group",
symbols = { "|" },
article = "Prosodic unit",
},
{
name = "Major (intonation) group",
symbols = { "‖" },
article = "Prosodic unit",
},
{
name = "Syllable break",
symbols = { "." },
article = "Syllable",
},
{
name = "Linking (absence of a break)",
symbols = { "‿" },
article = "Connected speech",
},
-- TONES AND WORD ACCENTS
{
name = "Downstep",
symbols = { "ꜜ" },
},
{
name = "Upstep",
symbols = { "ꜛ" },
},
{
name = "Global rise",
symbols = { "↗" },
article = "Intonation (linguistics)",
},
{
name = "Global fall",
symbols = { "↘" },
article = "Intonation (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Bilabial percussive",
symbols = { "ʬ" },
audio = "Voiceless bilabial percussive.wav"
},
{
name = "Bidental percussive",
symbols = { "ʭ" },
audio = "Voiceless bidental percussive.wav"
},
{
name = "Velopharyngeal fricative",
symbols = { "ʩ" },
},
{
name = "Voiceless velopharyngeal trill",
symbols = { "𝼀", "ʩ𐞪" },
article = "Velopharyngeal consonant"
},
{
name = "Voiced velopharyngeal trill",
symbols = { "𝼀̬" },
article = "Velopharyngeal consonant"
},
{
name = "Voiceless dental lateral–median fricative",
symbols = { "ʪ̪" },
},
{
name = "Voiced dental lateral–median fricative",
symbols = { "ʫ̪" },
},
{
name = "Voiceless alveolar lateral–median fricative",
symbols = { "ʪ" },
audio = "Voiceless alveolar lateral lisp fricative.ogg"
},
{
name = "Voiced alveolar lateral–median fricative",
symbols = { "ʫ" },
audio = "Voiced alveolar lateral lisp fricative.ogg"
},
{
name = "Ingressive airflow",
symbols = { "↓" },
article = "Ingressive sound",
},
{
name = "Egressive airflow",
symbols = { "↑" },
article = "Egressive sound",
},
{
name = "Apical r",
symbols = { "ɹ̺" },
article = "Voiced alveolar approximant",
},
{
name = "Bunched r",
symbols = { "ɹ̈" },
article = "Voiced velar bunched approximant",
},
{
name = "Sublaminal lower alveolar percussive",
symbols = { "¡" },
article = "Sublingual percussive",
},
{
name = "Percussive alveolar click",
symbols = { "ǃ¡" },
audio = "Percussive alveolar click.ogg"
},
{
name = "Buccal interdental trill",
symbols = { "ↀr̪͆" },
article = "Blowing a raspberry",
},
-- NON-IPA
{
name = "Morphological boundary",
symbols = { "#" },
article = "Word stem",
},
{
name = "Zero",
symbols = { "∅" },
article = "Zero (linguistics)",
},
},
diacritics = {
-- DIACRITICS
{
name = "Voiceless",
symbols = { "̥", "̊", "ḁ", "å", "ů", "ẙ" },
},
{
name = "Voiced",
symbols = { "̬" },
article = "Voice (phonetics)",
},
{
name = "Aspirated",
symbols = { "ʰ" },
article = "Aspirated consonant",
},
{
name = "More rounded",
symbols = { "̹", "͗", "˒" },
article = "Relative articulation#More rounded",
},
{
name = "Less rounded",
symbols = { "̜", "͑", "˓", "͍" },
article = "Relative articulation#Less rounded",
},
{
name = "Advanced",
symbols = { "̟", "᫈", "˖" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Retracted",
symbols = { "̠", "", "˗" },
article = "Relative articulation#Advanced and retracted",
},
{
name = "Centralized",
symbols = { "̈" },
article = "Relative articulation#Centralized vowels",
},
{
name = "Mid-centralized",
symbols = { "̽", "͓" },
article = "Relative articulation#Mid-centralized vowel",
},
{
name = "Syllabic",
symbols = { "̩", "̍" },
article = "Syllabic consonant",
},
{
name = "Non-syllabic",
symbols = { "̯", "̑" },
article = "Semivowel",
},
{
name = "Rhoticity",
symbols = { "˞" },
article = "R-colored vowel",
audio = "En-us-er.ogg"
},
{
name = "Breathy voiced",
symbols = { "̤", "ṳ", "ʱ" },
article = "Breathy voice",
},
{
name = "Creaky voiced",
symbols = { "̰", "ḛ", "ḭ", "ṵ" },
article = "Creaky voice",
},
{
name = "Nasalized and glottalized",
symbols = { "̰̃", "ã̰", "ḛ̃", "ḭ̃", "õ̰", "ṵ̃" },
article = "Rhinoglottophilia",
},
{
name = "Linguolabial",
symbols = { "̼", "" },
article = "Linguolabial consonant",
},
{
name = "Labialized",
symbols = { "ʷ", "ᵝ", "̫", "᫇", "", "" },
article = "Labialization",
},
{
name = "Open-labialized",
symbols = { "ꟹ" },
article = "Labialization",
},
{
name = "Labiodentalized",
symbols = { "ᶹ" },
article = "Labialization",
},
{
name = "Labio-palatalized",
symbols = { "ᶣ" },
article = "Labio-palatalization",
},
{
name = "Palatalized",
symbols = { "ʲ" },
article = "Palatalization (phonetics)",
},
{
name = "Velarized",
symbols = { "ˠ" },
article = "Velarization",
},
{
name = "Uvularized",
symbols = { "ʶ", "ᵡ" },
article = "Uvularization",
},
{
name = "Pharyngealized",
symbols = { "ˤ", "𐞕" },
article = "Pharyngealization",
},
{
name = "Velarized or pharyngealized",
symbols = { "̴", "ᵯ", "ᵰ", "ᵱ", "ᵬ", "ᵮ", "ᵵ", "ᵭ", "ᵴ", "ᵶ", "ᵳ", "ᵲ", "ꭨ" },
article = "Pharyngealization",
},
{
name = "Epiglottalized",
symbols = { "𐞴", "ᵸ" },
article = "Pharyngealization",
},
{
name = "Raised",
symbols = { "̝", "᷵", "˔" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Lowered",
symbols = { "̞", "", "˕" },
article = "Relative articulation#Raised and lowered",
},
{
name = "Advanced tongue root",
symbols = { "̘", "", "꭪" },
},
{
name = "Retracted tongue root",
symbols = { "̙", "", "꭫" },
},
{
name = "Dental",
symbols = { "̪", "͆" },
article = "Dental consonant",
},
{
name = "Interdental",
symbols = { "̪͆" },
article = "Interdental consonant",
},
{
name = "Apical",
symbols = { "̺" },
article = "Apical consonant",
},
{
name = "Laminal",
symbols = { "̻" },
article = "Laminal consonant",
},
{
name = "Nasalized",
symbols = { "̃", "ṽ" },
article = "Nasalization",
},
{
name = "Nasal vowel",
symbols = { "ĩ", "ỹ", "ɨ̃", "ʉ̃", "ɯ̃", "ũ", "ɪ̃", "ʏ̃", "ʊ̃", "ẽ", "ø̃", "ɘ̃", "ɵ̃", "ɤ̃", "õ", "ə̃", "ɛ̃", "œ̃", "ɜ̃", "ɞ̃", "ʌ̃", "ɔ̃", "æ̃", "ɐ̃", "ã", "ɶ̃", "ä̃", "ɑ̃", "ɒ̃" },
},
{
name = "Nasal release",
symbols = { "ⁿ" },
},
{
name = "Lateral release",
symbols = { "ˡ" },
article = "Lateral release (phonetics)",
},
{
name = "No audible release",
symbols = { "̚" },
},
{
name = "Ejective",
symbols = { "ʼ" },
article = "Ejective consonant",
},
{
name = "Glottalized",
symbols = { "ˀ" },
article = "Glottalization",
},
{
name = "Buccal speech",
symbols = { "ↀ" },
},
{
name = "Esophageal speech",
symbols = { "Œ" },
},
{
name = "Electrolaryngeal speech",
symbols = { "И" },
},
{
name = "Tracheo-esophageal speech",
symbols = { "Ю" },
},
-- SUPRASEGMENTALS
{
name = "Long",
symbols = { "ː" },
article = "Length (phonetics)",
},
{
name = "Half-long",
symbols = { "ˑ" },
article = "Length (phonetics)",
},
{
name = "Extra-short",
symbols = { "̆", "ŏ", "ӗ", "ă", "ĭ", "ŭ" },
article = "Extra-shortness",
},
-- TONES AND WORD ACCENTS
{
name = "Accent",
symbols = { "̋", "ű", "ӳ", "ő", "́", "í", "ý", "ú", "é", "ǿ", "ó", "ǽ", "á", "̄", "ī", "ȳ", "ū", "ē", "ō", "ǣ", "ā", "̀", "ì", "ỳ", "ù", "è", "ò", "à", "̏", "ȉ", "ȕ", "ȅ", "ȍ", "ȁ" },
article = "Pitch-accent language",
},
{
name = "Tone",
symbols = { "̌", "̂", "᷄", "᷅", "᷇", "᷆", "᷈", "᷉", "˥", "˦", "˧", "˨", "˩" },
article = "Tone (linguistics)",
},
-- EXTENDED IPA (extIPA)
{
name = "Alveolar",
symbols = { "͇" },
article = "Alveolar consonant",
},
{
name = "Strong articulation",
symbols = { "͈", "̎" },
article = "Fortis and lenis",
},
{
name = "Weak articulation",
symbols = { "͉", "᷂" },
article = "Fortis and lenis",
},
{
name = "Denasalized",
symbols = { "͊" },
article = "Denasalization",
},
{
name = "Velopharyngeal friction",
symbols = { "͌", "𐞐" },
article = "Velopharyngeal consonant",
},
{
name = "Whistled articulation",
symbols = { "͎" },
article = "Whistled sibilant",
},
{
name = "Unaspirated",
symbols = { "˭" },
article = "Tenuis consonant",
},
{
name = "Pre-aspiration",
symbols = { "ʰp", "ʰt", "ʰʈ", "ʰc", "ʰk", "ʰq", "ʰn" },
article = "Preaspiration",
},
-- NON-IPA
{
name = "Retroflex",
symbols = { "̣", "̢" },
article = "Retroflex consonant",
},
{
name = "Prenasalized consonant",
symbols = { "ᵐ", "ᶬ", "ⁿ̼d̼", "ᵐ̺b̺", "ⁿt", "ⁿd", "ⁿθ", "ⁿð", "ⁿs", "ⁿz", "ⁿʃ", "ⁿʒ", "ⁿɕ", "ⁿʑ", "ⁿr", "ⁿɬ", "ⁿɮ", "ⁿl", "ᶯ", "ᶮ", "ᵑ", "ᶰ" },
},
{
name = "Pre-stopped consonant",
symbols = { "ᵖ", "ᵇ", "ᵗ", "ᵈ", "𐞯", "𐞋", "ᶜ", "ᶡ", "ᵏ", "ᶢ", "𐞥", "𐞒", "𐞳" },
},
{
name = "Post-stopped nasal",
symbols = { "mᵇ", "nᵈ", "ɳ𐞋", "ɲᶡ", "ŋᶢ", "ɴ𐞒" },
},
{
name = "Trilled affricate",
symbols = { "ʳ", "𐞄", "𐞪", "tr̥", "dr" },
},
}
}
for k, group in pairs(rawData) do
for _, v in ipairs(group) do
local t = {
name = v.name,
symbol = v.symbols[1],
article = v.article or v.name,
audio = v.audio or ""
}
for _, s in ipairs(v.symbols) do
data[k][s] = t
end
end
end
return { data = data, rawData = rawData }
8eiku9nssbqt53dt03zxyjy16t5vbs4
Tempilet:IPAslink
10
2311
15674
2019-01-30T23:54:19Z
Nardog
667
done
15674
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|prefix=/|suffix=/|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
h3lgt5glogo4npwusorr9y7fhe302bc
15675
15674
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPAslink]]
15674
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|prefix=/|suffix=/|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
h3lgt5glogo4npwusorr9y7fhe302bc
Tempilet:Template link with subst
10
2312
15678
2020-11-21T12:06:47Z
Primefac
440
update
15678
wikitext
text/x-wiki
{{#Invoke:Template link general|main|subst=yes}}<noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tls|tlsp}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
ocgsk8veww4i9rmn4q2ennl2ky0hm26
15679
15678
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Template_link_with_subst]]
15678
wikitext
text/x-wiki
{{#Invoke:Template link general|main|subst=yes}}<noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tls|tlsp}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
ocgsk8veww4i9rmn4q2ennl2ky0hm26
Tempilet:Tls
10
2313
15680
2020-04-13T15:32:49Z
Primefac
440
Primefac moved page [[Template:Tls]] to [[Template:Template link with subst]] over redirect: full name for clarity
15680
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with subst]]
{{Redirect category shell|
{{R from move}}
}}
m5t5gg1c10dl3ux1kp8r2aljo5rhcci
15681
15680
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Tls]]
15680
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with subst]]
{{Redirect category shell|
{{R from move}}
}}
m5t5gg1c10dl3ux1kp8r2aljo5rhcci
Tempilet:IPAalink
10
2314
15682
2022-06-17T14:08:19Z
Nardog
667
lang
15682
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|prefix=⟨<span class="IPA" lang="und-fonipa">|suffix=</span>⟩|span=no|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
o6qo8q63vo3xxwbv4b6m2retlluzlee
15683
15682
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPAalink]]
15682
wikitext
text/x-wiki
<includeonly>{{#invoke:IPA symbol|link|symbol={{{1|}}}|text={{{2|}}}|prefix=⟨<span class="IPA" lang="und-fonipa">|suffix=</span>⟩|span=no|audio={{{audio|}}}|errortext={{{errortext|}}}}}</includeonly><noinclude>{{documentation}}</noinclude>
o6qo8q63vo3xxwbv4b6m2retlluzlee
Tempilet:IPA templates
10
2315
15686
2025-08-02T17:49:53Z
W.andrea
678
Clarify examples for the *link templates: use the mentioned templates, to demonstrate linking.
15686
wikitext
text/x-wiki
{{navbox
| name = IPA templates
| title = [[International Phonetic Alphabet|IPA]] templates
| state = {{{state<includeonly>|expanded</includeonly>}}}
| bodyclass = hlist
| group1 = Inline
| list1 = child
| 1_group1 = Formatting
| 1_list1 =
* {{tl|IPA}}
* {{tl|IPA link}}
* {{tl|IPAblink}} {{IPAblink|a}}
* {{tl|IPAslink}} {{IPAslink|a}}
* {{tl|IPAalink}} {{IPAalink|a}}
* {{tl|IPAplink}}
* {{tl|angbr IPA}}
* {{tl|IPA double slash}}
* {{tl|Chinese tone letter}}
* {{tl|Audio-IPA}}
| 1_group2 = Conversion
| 1_list2 =
<!-- IPAc-xx templates used in more than 100 articles as of Sept 2023 -->
* {{tl|IPAc-ar}}
* {{tl|IPAc-en}}
* {{tl|IPAc-cmn}}
* {{tl|IPAc-hu}}
* {{tl|IPAc-pl}}
* {{tl|IPAc-yue}}
* {{tls|X-SAMPA to IPA}}
| 1_group3 = Maintenance
| 1_list3 =
* {{tl|Needs IPA}}
* {{tl|Pronunciation needed}}
| group2 = Charts
| list2 =
* {{tl|IPA vowels}}
* {{tl|IPA pulmonic consonants}}
* {{tl|IPA non-pulmonic consonants}}
* {{tl|IPA co-articulated consonants}}
* {{tl|IPA affricates}}
| group3 = Guidance
| list3 =
* {{tl|IPA navigation}}
* {{tl|Infobox IPA}}
* {{tl|IPA notice}}
* {{tl|WikiIPA}}
* {{tl|IPA key}}
* {{tl|IPA keys}}
* {{tl|IPA language category}}
| group4 = Meta templates
| list4 =
* {{tl|IPA symbol}}
* {{tl|IPA audio link}}
* {{tl|IPA common}}
* {{tl|IPA soundbox}}
* {{tl|IPA notice/msg}}
}}<noinclude>{{documentation}}</noinclude>
hzu1qox7ise8ewigabpy7mekb64slkg
15687
15686
2026-11-09T06:13:50Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPA_templates]]
15686
wikitext
text/x-wiki
{{navbox
| name = IPA templates
| title = [[International Phonetic Alphabet|IPA]] templates
| state = {{{state<includeonly>|expanded</includeonly>}}}
| bodyclass = hlist
| group1 = Inline
| list1 = child
| 1_group1 = Formatting
| 1_list1 =
* {{tl|IPA}}
* {{tl|IPA link}}
* {{tl|IPAblink}} {{IPAblink|a}}
* {{tl|IPAslink}} {{IPAslink|a}}
* {{tl|IPAalink}} {{IPAalink|a}}
* {{tl|IPAplink}}
* {{tl|angbr IPA}}
* {{tl|IPA double slash}}
* {{tl|Chinese tone letter}}
* {{tl|Audio-IPA}}
| 1_group2 = Conversion
| 1_list2 =
<!-- IPAc-xx templates used in more than 100 articles as of Sept 2023 -->
* {{tl|IPAc-ar}}
* {{tl|IPAc-en}}
* {{tl|IPAc-cmn}}
* {{tl|IPAc-hu}}
* {{tl|IPAc-pl}}
* {{tl|IPAc-yue}}
* {{tls|X-SAMPA to IPA}}
| 1_group3 = Maintenance
| 1_list3 =
* {{tl|Needs IPA}}
* {{tl|Pronunciation needed}}
| group2 = Charts
| list2 =
* {{tl|IPA vowels}}
* {{tl|IPA pulmonic consonants}}
* {{tl|IPA non-pulmonic consonants}}
* {{tl|IPA co-articulated consonants}}
* {{tl|IPA affricates}}
| group3 = Guidance
| list3 =
* {{tl|IPA navigation}}
* {{tl|Infobox IPA}}
* {{tl|IPA notice}}
* {{tl|WikiIPA}}
* {{tl|IPA key}}
* {{tl|IPA keys}}
* {{tl|IPA language category}}
| group4 = Meta templates
| list4 =
* {{tl|IPA symbol}}
* {{tl|IPA audio link}}
* {{tl|IPA common}}
* {{tl|IPA soundbox}}
* {{tl|IPA notice/msg}}
}}<noinclude>{{documentation}}</noinclude>
hzu1qox7ise8ewigabpy7mekb64slkg
Tempilet:Demo inline
10
2316
15690
2025-12-26T18:00:26Z
MusikBot II
347
Protected "[[Template:Demo inline]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 250 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
15690
wikitext
text/x-wiki
<includeonly>{{#invoke:Demo|inline}}</includeonly><noinclude>{{documentation}}</noinclude>
hqe22q1vieijy9gk67hvln12qqp82za
15691
15690
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Demo_inline]]
15690
wikitext
text/x-wiki
<includeonly>{{#invoke:Demo|inline}}</includeonly><noinclude>{{documentation}}</noinclude>
hqe22q1vieijy9gk67hvln12qqp82za
Module:Demo
828
2317
15692
2024-08-14T02:31:11Z
BrandonXLF
679
Undid revision [[Special:Diff/1240199590|1240199590]] by [[Special:Contributions/BrandonXLF|BrandonXLF]] ([[User talk:BrandonXLF|talk]])
15692
Scribunto
text/plain
local p = {}
--creates a frame object that cannot access any of the parent's args
--unless a table containing a list keys of not to inherit is provided
function disinherit(frame, onlyTheseKeys)
local parent = frame:getParent() or frame
local orphan = parent:newChild{}
orphan.getParent = parent.getParent --returns nil
orphan.args = {}
if onlyTheseKeys then
local family = {parent, frame}
for f = 1, 2 do
for k, v in pairs(family[f] and family[f].args or {}) do
orphan.args[k] = orphan.args[k] or v
end
end
parent.args = mw.clone(orphan.args)
setmetatable(orphan.args, nil)
for _, k in ipairs(onlyTheseKeys) do
rawset(orphan.args, k, nil)
end
end
return orphan, parent
end
function getSeparator(args, default)
local br = tonumber(args.br) and ('<br>'):rep(args.br) or args.br
local sep = args.sep or br or default
return #sep > 0 and ' ' .. sep .. ' ' or sep
end
function p.get(frame, arg, passArgs)
local orphan, frame = disinherit(frame, passArgs and {arg or 1})
local code = frame.args[arg or 1] or ''
if code:match'UNIQ%-%-nowiki' then
code = mw.text.unstripNoWiki(code)
:gsub('<', '<')
:gsub('>', '>')
:gsub('"', '"')
-- Replace `}%-` with `}-` because of some server quirk leading to
-- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess('<nowiki>}-</nowiki>'))
-- outputting `}-` instead of `}-`, while it's ok with `<nowiki>} -</nowiki>`
:gsub('}%-', '}-')
-- The same with `-{`
:gsub('%-{', '-{')
end
local kill_categories = frame.args.demo_kill_categories or frame.args.nocat
return {
source = code,
output = orphan:preprocess(code):gsub(kill_categories and '%[%[Category.-%]%]' or '', ''),
frame = frame
}
end
function p.main(frame, demoTable)
local show = demoTable or p.get(frame)
local args = show.frame.args
if show[args.result_arg] then
return show[args.result_arg]
end
local yesno = require('Module:Yesno')
args.reverse = yesno(args.reverse, false)
args.sep = getSeparator(args, '')
local source = frame:extensionTag{
name = 'syntaxhighlight',
args = {
lang = 'wikitext',
style = args.style
},
content = show.source
}
return args.reverse and
show.output .. args.sep .. source or
source .. args.sep .. show.output
end
-- Alternate function to return an inline result
function p.inline(frame, demoTable)
local show = demoTable or p.get(frame)
local args = show.frame.args
if show[args.result_arg] then
return show[args.result_arg]
end
local yesno = require('Module:Yesno')
args.reverse = yesno(args.reverse, false)
args.sep = getSeparator(args, args.reverse and '←' or '→')
local source = frame:extensionTag{
name = 'syntaxhighlight',
args = {
lang = 'wikitext',
inline = true,
style = args.style
},
content = show.source
}
return args.reverse and
show.output .. args.sep .. source or
source .. args.sep .. show.output
end
--passing of args into other module without preprocessing
function p.module(frame)
local orphan, frame = disinherit(frame, {
'demo_template',
'demo_module',
'demo_module_func',
'demo_main',
'demo_sep',
'demo_br',
'demo_result_arg',
'demo_kill_categories',
'nocat'
})
local template = frame.args.demo_template and 'Template:'..frame.args.demo_template
local demoFunc = frame.args.demo_module_func or 'main\n'
local demoModule = require('Module:' .. frame.args.demo_module)[demoFunc:match('^%s*(.-)%s*$')]
frame.args.br, frame.args.result_arg = frame.args.demo_sep or frame.args.demo_br, frame.args.demo_result_arg
local kill_categories = frame.args.demo_kill_categories or frame.args.nocat
if demoModule then
local named = {insert = function(self, ...) table.insert(self, ...) return self end}
local source = {insert = named.insert, '{{', frame.args.demo_template or frame.args.demo_module, '\n'}
if not template then
source:insert(2, '#invoke:'):insert(4, '|'):insert(5, demoFunc)
end
local insertNamed = #source + 1
for k, v in pairs(orphan.args) do
local nan, insert = type(k) ~= 'number', {v}
local target = nan and named or source
target:insert'|'
if nan then
target:insert(k):insert'=':insert'\n'
table.insert(insert, 1, #target)
end
target:insert(unpack(insert))
local nowiki = v:match('nowiki')
if nowiki or v:match('{{.-}}') then
orphan.args[k] = frame:preprocess(nowiki and mw.text.unstripNoWiki(v) or v)
end
end
source:insert'}}'
table.insert(source, insertNamed, table.concat(named))
return p.main(orphan, {
source = table.concat(source), "<>'|=~",
output = tostring(demoModule(orphan)):gsub(kill_categories and '%[%[Category.-%]%]' or '', ''),
frame = frame
})
else
return "ERROR: Invalid module function: "..demoFunc
end
end
return p
nmruxy9m5q85bu8c8t5ietclrq4fqm3
15693
15692
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Demo]]
15692
Scribunto
text/plain
local p = {}
--creates a frame object that cannot access any of the parent's args
--unless a table containing a list keys of not to inherit is provided
function disinherit(frame, onlyTheseKeys)
local parent = frame:getParent() or frame
local orphan = parent:newChild{}
orphan.getParent = parent.getParent --returns nil
orphan.args = {}
if onlyTheseKeys then
local family = {parent, frame}
for f = 1, 2 do
for k, v in pairs(family[f] and family[f].args or {}) do
orphan.args[k] = orphan.args[k] or v
end
end
parent.args = mw.clone(orphan.args)
setmetatable(orphan.args, nil)
for _, k in ipairs(onlyTheseKeys) do
rawset(orphan.args, k, nil)
end
end
return orphan, parent
end
function getSeparator(args, default)
local br = tonumber(args.br) and ('<br>'):rep(args.br) or args.br
local sep = args.sep or br or default
return #sep > 0 and ' ' .. sep .. ' ' or sep
end
function p.get(frame, arg, passArgs)
local orphan, frame = disinherit(frame, passArgs and {arg or 1})
local code = frame.args[arg or 1] or ''
if code:match'UNIQ%-%-nowiki' then
code = mw.text.unstripNoWiki(code)
:gsub('<', '<')
:gsub('>', '>')
:gsub('"', '"')
-- Replace `}%-` with `}-` because of some server quirk leading to
-- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess('<nowiki>}-</nowiki>'))
-- outputting `}-` instead of `}-`, while it's ok with `<nowiki>} -</nowiki>`
:gsub('}%-', '}-')
-- The same with `-{`
:gsub('%-{', '-{')
end
local kill_categories = frame.args.demo_kill_categories or frame.args.nocat
return {
source = code,
output = orphan:preprocess(code):gsub(kill_categories and '%[%[Category.-%]%]' or '', ''),
frame = frame
}
end
function p.main(frame, demoTable)
local show = demoTable or p.get(frame)
local args = show.frame.args
if show[args.result_arg] then
return show[args.result_arg]
end
local yesno = require('Module:Yesno')
args.reverse = yesno(args.reverse, false)
args.sep = getSeparator(args, '')
local source = frame:extensionTag{
name = 'syntaxhighlight',
args = {
lang = 'wikitext',
style = args.style
},
content = show.source
}
return args.reverse and
show.output .. args.sep .. source or
source .. args.sep .. show.output
end
-- Alternate function to return an inline result
function p.inline(frame, demoTable)
local show = demoTable or p.get(frame)
local args = show.frame.args
if show[args.result_arg] then
return show[args.result_arg]
end
local yesno = require('Module:Yesno')
args.reverse = yesno(args.reverse, false)
args.sep = getSeparator(args, args.reverse and '←' or '→')
local source = frame:extensionTag{
name = 'syntaxhighlight',
args = {
lang = 'wikitext',
inline = true,
style = args.style
},
content = show.source
}
return args.reverse and
show.output .. args.sep .. source or
source .. args.sep .. show.output
end
--passing of args into other module without preprocessing
function p.module(frame)
local orphan, frame = disinherit(frame, {
'demo_template',
'demo_module',
'demo_module_func',
'demo_main',
'demo_sep',
'demo_br',
'demo_result_arg',
'demo_kill_categories',
'nocat'
})
local template = frame.args.demo_template and 'Template:'..frame.args.demo_template
local demoFunc = frame.args.demo_module_func or 'main\n'
local demoModule = require('Module:' .. frame.args.demo_module)[demoFunc:match('^%s*(.-)%s*$')]
frame.args.br, frame.args.result_arg = frame.args.demo_sep or frame.args.demo_br, frame.args.demo_result_arg
local kill_categories = frame.args.demo_kill_categories or frame.args.nocat
if demoModule then
local named = {insert = function(self, ...) table.insert(self, ...) return self end}
local source = {insert = named.insert, '{{', frame.args.demo_template or frame.args.demo_module, '\n'}
if not template then
source:insert(2, '#invoke:'):insert(4, '|'):insert(5, demoFunc)
end
local insertNamed = #source + 1
for k, v in pairs(orphan.args) do
local nan, insert = type(k) ~= 'number', {v}
local target = nan and named or source
target:insert'|'
if nan then
target:insert(k):insert'=':insert'\n'
table.insert(insert, 1, #target)
end
target:insert(unpack(insert))
local nowiki = v:match('nowiki')
if nowiki or v:match('{{.-}}') then
orphan.args[k] = frame:preprocess(nowiki and mw.text.unstripNoWiki(v) or v)
end
end
source:insert'}}'
table.insert(source, insertNamed, table.concat(named))
return p.main(orphan, {
source = table.concat(source), "<>'|=~",
output = tostring(demoModule(orphan)):gsub(kill_categories and '%[%[Category.-%]%]' or '', ''),
frame = frame
})
else
return "ERROR: Invalid module function: "..demoFunc
end
end
return p
nmruxy9m5q85bu8c8t5ietclrq4fqm3
Tempilet:Demo-inline
10
2318
15694
2021-04-24T17:42:45Z
JsfasdF252
680
JsfasdF252 moved page [[Template:Demo-inline]] to [[Template:Demo inline]]: unhyphenate
15694
wikitext
text/x-wiki
#REDIRECT [[Template:Demo inline]]
{{Redirect category shell|
{{R from move}}
}}
b7scpkaws10y44n7ugmnacu9qkhihhw
15695
15694
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Demo-inline]]
15694
wikitext
text/x-wiki
#REDIRECT [[Template:Demo inline]]
{{Redirect category shell|
{{R from move}}
}}
b7scpkaws10y44n7ugmnacu9qkhihhw
Module:IPAc-en/documentation
828
2319
15696
2017-05-20T17:29:46Z
Nardog
667
"<s>...</s>" wasn't properly shown
15696
Scribunto
text/plain
-- This module generates automatic documentation for [[Template:IPAc-en]].
local pronunciationData = mw.loadData('Module:IPAc-en/pronunciation')
local phonemeData = mw.loadData('Module:IPAc-en/phonemes')
local p = {}
local function makeCode(s)
return string.format('<code>%s</code>', mw.text.nowiki(s))
end
local function buildTable(options)
local ret = {}
ret[#ret + 1] = '{| class="wikitable"'
if options.headerRow then
for i, header in ipairs(options.headerRow) do
ret[#ret + 1] = '! ' .. header
end
end
if options.rows then
for i, t in ipairs(options.rows) do
ret[#ret + 1] = '|-'
for j, data in ipairs(t) do
ret[#ret + 1] = '| ' .. data
end
end
end
ret[#ret + 1] = '|}'
return table.concat(ret, '\n')
end
local function makeCodeTable(data, headers, callback)
local headerRow = {'Code', 'Aliases'}
for i, header in ipairs(headers) do
headerRow[#headerRow + 1] = header
end
local rows = {}
for i, t in ipairs(data) do
local aliases = {}
if t.aliases then
for i, alias in ipairs(t.aliases) do
aliases[#aliases + 1] = makeCode(alias)
end
end
aliases = table.concat(aliases, ', ')
rows[#rows + 1] = {makeCode(t.code), aliases, callback(t)}
end
return buildTable{
headerRow = headerRow,
rows = rows
}
end
function p.pronunciation()
return makeCodeTable(pronunciationData, {'Output'}, function (t)
return t.text
end)
end
function p.phonemes()
return makeCodeTable(
phonemeData,
{'Display text', 'Tooltip', 'Type'},
function (t)
return t.label, t.tooltip or '', t.tooltip and 'diaphoneme' or 'separator'
end
)
end
return p
ar8m065717bbbct1l18yrq5g7gox2te
15697
15696
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPAc-en/documentation]]
15696
Scribunto
text/plain
-- This module generates automatic documentation for [[Template:IPAc-en]].
local pronunciationData = mw.loadData('Module:IPAc-en/pronunciation')
local phonemeData = mw.loadData('Module:IPAc-en/phonemes')
local p = {}
local function makeCode(s)
return string.format('<code>%s</code>', mw.text.nowiki(s))
end
local function buildTable(options)
local ret = {}
ret[#ret + 1] = '{| class="wikitable"'
if options.headerRow then
for i, header in ipairs(options.headerRow) do
ret[#ret + 1] = '! ' .. header
end
end
if options.rows then
for i, t in ipairs(options.rows) do
ret[#ret + 1] = '|-'
for j, data in ipairs(t) do
ret[#ret + 1] = '| ' .. data
end
end
end
ret[#ret + 1] = '|}'
return table.concat(ret, '\n')
end
local function makeCodeTable(data, headers, callback)
local headerRow = {'Code', 'Aliases'}
for i, header in ipairs(headers) do
headerRow[#headerRow + 1] = header
end
local rows = {}
for i, t in ipairs(data) do
local aliases = {}
if t.aliases then
for i, alias in ipairs(t.aliases) do
aliases[#aliases + 1] = makeCode(alias)
end
end
aliases = table.concat(aliases, ', ')
rows[#rows + 1] = {makeCode(t.code), aliases, callback(t)}
end
return buildTable{
headerRow = headerRow,
rows = rows
}
end
function p.pronunciation()
return makeCodeTable(pronunciationData, {'Output'}, function (t)
return t.text
end)
end
function p.phonemes()
return makeCodeTable(
phonemeData,
{'Display text', 'Tooltip', 'Type'},
function (t)
return t.label, t.tooltip or '', t.tooltip and 'diaphoneme' or 'separator'
end
)
end
return p
ar8m065717bbbct1l18yrq5g7gox2te
Tempilet:IPAc-en/doc
10
2320
15698
2025-10-18T12:19:54Z
W.andrea
678
/* Examples */ +syntax highlighting. No need for links.
15698
wikitext
text/x-wiki
<noinclude>{{pp-vandalism|small=yes}}</noinclude>{{documentation subpage}}
{{High-use}}
{{lua|Module:IPAc-en}}
This template is used to display English [[International Phonetic Alphabet]] (IPA). The pronunciation is broken into individual [[diaphoneme]]s so that they will have tooltips (mouse-over text) to indicate pronunciation. All diaphonemes from [[Help:IPA/English]] are available.
== Usage ==
The transcription system of [[Help:IPA/English]], upon which this template relies, is diaphonemic, i.e. meant to cover multiple major varieties of English at once. If you wish to give a narrow transcription of a pronunciation in a certain variety of English, use {{tlx|IPA|2=en{{pipe}}...{{pipe}}generic=yes}}.
Note: Per [[WP:LEAD]], do not use this template in the lead section for common English words (e.g., ''[[pub]]'', ''[[rose]]'', ''[[pencil]]'', ''[[bus]]'', ''[[Monday]]'', ''[[Earth]]'', etc.).
The named parameter {{para|audio}} may be used to link to an audio file.
Notations with audio links will appear under [[:Category:Pages including recorded pronunciations]].
If "[invalid input]" is displayed, it means that an unsupported input was used. Such instances are tallied at [[:Category:Ill-formatted IPAc-en transclusions]], where they can be reviewed and fixed.
== Examples ==
* {{demo-inline|<nowiki>{{IPAc-en|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|audio=en-us-Alabama.ogg|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|US|audio=en-us-Alabama.ogg|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
Examples using [[X-SAMPA]] spelling for individual diaphonemes:
* {{demo-inline|<nowiki>{{IPAc-en|,|{|l|@|'|b|{|m|@}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|lang|audio=en-us-Alabama.ogg|,|{|l|@|'|b|{|m|@}}</nowiki>}}
== Pronunciation and IPA link codes ==
The initial argument (entry after |) can be used to indicate a pronunciation label. The codes are:
{| class="wikitable"
|+ Label codes
! Code !! Output
|-
| <code>lang</code> || English:
|-
| <code>local</code> || locally
|-
| <code>ipa</code> || [[International Phonetic Alphabet|IPA]]:
|-
| <code>also</code> || also
|-
| <code>uk</code> || [[British English|UK]]:
|-
| <code>us</code> || [[American English|US]]:
|-
| <code>uklang</code> || [[British English]]:
|-
| <code>uslang</code> || [[American English]]:
|-
| <code>ukalso</code> || [[British English|UK]] also
|-
| <code>usalso</code> || [[American English|US]] also
|-
| <code>alsouk</code> || also [[British English|UK]]:
|-
| <code>alsous</code> || also [[American English|US]]:
|}
The first argument that is not a code above will be treated as a diaphoneme. All diaphonemes listed at [[Help:IPA/English]] are available (except the ones that span two syllables such as {{IPA|/iə/}}, which need to be input as <code>i|ə</code>). Also available are {{IPA|/ɪəˈr/}}, {{IPA|/ɛəˈr/}}, {{IPA|/ʊəˈr/}}, {{IPA|/ɪəˌr/}}, {{IPA|/ɛəˌr/}}, and {{IPA|/ʊəˌr/}}, preserved for when a centering diphthong precedes a stress.
===Separator codes===
Use an underscore <code>_</code> to separate words. When multiple pronunciations for the same word(s) are possible, use a comma and an underscore <code>,_</code>, which will appear as a comma and a space, to separate the variants. As necessary, use a hyphen <code>-</code> to indicate omitted syllables. Diaphonemes are underlined, but separators are not, and separators do not have any tooltip text.
See the table below for a full list of separator codes.
===Diaphoneme codes===
Note that the aliases include ones that are kept merely for compatibility reasons and therefore not recommended for further use, as they might not accurately represent the sound represented by the output. Aliases from [[X-SAMPA]], on the other hand, are fine.
{{#invoke:IPAc-en/documentation|phonemes}}
== TemplateData ==
{{collapse top|TemplateData}}
{{TemplateData header}}
<templatedata>
{
"format": "inline",
"params": {
"1": {
"label": "1st input",
"type": "string",
"required": true,
"description": "Either a label code (e.g. 'local') or the first diaphoneme"
},
"2": {
"label": "2nd input",
"type": "string",
"required": false
},
"3": {
"label": "3rd input",
"type": "string",
"required": false
},
"4": {
"label": "4th input",
"type": "string",
"required": false
},
"5": {
"label": "5th input",
"type": "string",
"required": false
},
"6": {
"label": "6th input",
"type": "string",
"required": false
},
"7": {
"label": "7th input",
"type": "string",
"required": false
},
"8": {
"label": "8th input",
"type": "string",
"required": false
},
"9": {
"label": "9th input",
"type": "string",
"required": false
},
"10": {
"label": "10th input",
"type": "string",
"required": false
},
"11": {
"label": "11th input",
"type": "string",
"required": false
},
"12": {
"label": "12th input",
"type": "string",
"required": false
},
"13": {
"label": "13th input",
"type": "string",
"required": false
},
"14": {
"label": "14th input",
"type": "string",
"required": false
},
"15": {
"label": "15th input",
"type": "string",
"required": false
},
"16": {
"label": "16th input",
"type": "string",
"required": false
},
"17": {
"label": "17th input",
"type": "string",
"required": false
},
"18": {
"label": "18th input",
"type": "string",
"required": false
},
"19": {
"label": "19th input",
"type": "string",
"required": false
},
"20": {
"label": "20th input",
"type": "string",
"required": false
},
"21": {
"label": "21st input",
"type": "string",
"required": false
},
"22": {
"label": "22nd input",
"type": "string",
"required": false
},
"23": {
"label": "23rd input",
"type": "string",
"required": false
},
"24": {
"label": "24th input",
"type": "string",
"required": false
},
"25": {
"label": "25th input",
"type": "string",
"required": false
},
"26": {
"label": "26th input",
"type": "string",
"required": false
},
"27": {
"label": "27th input",
"type": "string",
"required": false
},
"28": {
"label": "28th input",
"type": "string",
"required": false
},
"29": {
"label": "29th input",
"type": "string",
"required": false
},
"30": {
"label": "30th input",
"type": "string",
"required": false
},
"31": {
"label": "31st input",
"type": "string",
"required": false
},
"32": {
"label": "32nd input",
"type": "string",
"required": false
},
"33": {
"label": "33rd input",
"type": "string",
"required": false
},
"34": {
"label": "34th input",
"type": "string",
"required": false
},
"35": {
"label": "35th input",
"type": "string",
"required": false
},
"36": {
"label": "36th input",
"type": "string",
"required": false
},
"37": {
"label": "37th input",
"type": "string",
"required": false
},
"38": {
"label": "38th input",
"type": "string",
"required": false
},
"39": {
"label": "39th input",
"type": "string",
"required": false
},
"40": {
"label": "40th input",
"type": "string",
"required": false
},
"41": {
"label": "41st input",
"type": "string",
"required": false
},
"42": {
"label": "42nd input",
"type": "string",
"required": false
},
"43": {
"label": "43rd input",
"type": "string",
"required": false
},
"44": {
"label": "44th input",
"type": "string",
"required": false
},
"45": {
"label": "45th input",
"type": "string",
"required": false
},
"46": {
"label": "46th input",
"type": "string",
"required": false
},
"47": {
"label": "47th input",
"type": "string",
"required": false
},
"48": {
"label": "48th input",
"type": "string",
"required": false
},
"49": {
"label": "49th input",
"type": "string",
"required": false
},
"50": {
"label": "50th input",
"type": "string",
"required": false
},
"51": {
"label": "51st input",
"type": "string",
"required": false
},
"52": {
"label": "52nd input",
"type": "string",
"required": false
},
"53": {
"label": "53rd input",
"type": "string",
"required": false
},
"54": {
"label": "54th input",
"type": "string",
"required": false
},
"55": {
"label": "55th input",
"type": "string",
"required": false
},
"56": {
"label": "56th input",
"type": "string",
"required": false
},
"57": {
"label": "57th input",
"type": "string",
"required": false
},
"58": {
"label": "58th input",
"type": "string",
"required": false
},
"59": {
"label": "59th input",
"type": "string",
"required": false
},
"60": {
"label": "60th input",
"type": "string",
"required": false
},
"61": {
"label": "61st input",
"type": "string",
"required": false
},
"62": {
"label": "62nd input",
"type": "string",
"required": false
},
"63": {
"label": "63rd input",
"type": "string",
"required": false
},
"64": {
"label": "64th input",
"type": "string",
"required": false
},
"65": {
"label": "65th input",
"type": "string",
"required": false
},
"66": {
"label": "66th input",
"type": "string",
"required": false
},
"67": {
"label": "67th input",
"type": "string",
"required": false
},
"68": {
"label": "68th input",
"type": "string",
"required": false
},
"69": {
"label": "69th input",
"type": "string",
"required": false
},
"70": {
"label": "70th input",
"type": "string",
"required": false
},
"71": {
"label": "71st input",
"type": "string",
"required": false
},
"72": {
"label": "72nd input",
"type": "string",
"required": false
},
"73": {
"label": "73rd input",
"type": "string",
"required": false
},
"74": {
"label": "74th input",
"type": "string",
"required": false
},
"75": {
"label": "75th input",
"type": "string",
"required": false
},
"76": {
"label": "76th input",
"type": "string",
"required": false
},
"77": {
"label": "77th input",
"type": "string",
"required": false
},
"78": {
"label": "78th input",
"type": "string",
"required": false
},
"79": {
"label": "79th input",
"type": "string",
"required": false
},
"80": {
"label": "80th input",
"type": "string",
"required": false
},
"81": {
"label": "81st input",
"type": "string",
"required": false
},
"82": {
"label": "82nd input",
"type": "string",
"required": false
},
"83": {
"label": "83rd input",
"type": "string",
"required": false
},
"84": {
"label": "84th input",
"type": "string",
"required": false
},
"85": {
"label": "85th input",
"type": "string",
"required": false
},
"86": {
"label": "86th input",
"type": "string",
"required": false
},
"87": {
"label": "87th input",
"type": "string",
"required": false
},
"88": {
"label": "88th input",
"type": "string",
"required": false
},
"89": {
"label": "89th input",
"type": "string",
"required": false
},
"90": {
"label": "90th input",
"type": "string",
"required": false
},
"91": {
"label": "91st input",
"type": "string",
"required": false
},
"92": {
"label": "92nd input",
"type": "string",
"required": false
},
"93": {
"label": "93rd input",
"type": "string",
"required": false
},
"94": {
"label": "94th input",
"type": "string",
"required": false
},
"95": {
"label": "95th input",
"type": "string",
"required": false
},
"96": {
"label": "96th input",
"type": "string",
"required": false
},
"97": {
"label": "97th input",
"type": "string",
"required": false
},
"98": {
"label": "98th input",
"type": "string",
"required": false
},
"99": {
"label": "99th input",
"type": "string",
"required": false
},
"100": {
"label": "100th input",
"type": "string",
"required": false
},
"audio": {
"label": "Audio file",
"description": "The audio file without the \"File:\" prefix",
"example": "En-us-Foobar.ogg",
"type": "wiki-file-name"
}
},
"description": "This template is used to display English International Phonetic Alphabet (IPA). The pronunciation is broken into individual diaphonemes so that they will have tooltips (mouse-over text) to indicate pronunciation."
}
</templatedata>
{{collapse bottom}}
== See also ==
* {{tl|Respell}}, for [[Help:Pronunciation respelling key|pronunciation respelling]]s, which may be used for English words in addition to the IPA
{{IPA templates}}
<includeonly>{{Sandbox other||
[[Category:IPA language templates|c]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
o7ltqqxjl0qgivrfbmvfmonw00ie31a
15699
15698
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Template:IPAc-en/doc]]
15698
wikitext
text/x-wiki
<noinclude>{{pp-vandalism|small=yes}}</noinclude>{{documentation subpage}}
{{High-use}}
{{lua|Module:IPAc-en}}
This template is used to display English [[International Phonetic Alphabet]] (IPA). The pronunciation is broken into individual [[diaphoneme]]s so that they will have tooltips (mouse-over text) to indicate pronunciation. All diaphonemes from [[Help:IPA/English]] are available.
== Usage ==
The transcription system of [[Help:IPA/English]], upon which this template relies, is diaphonemic, i.e. meant to cover multiple major varieties of English at once. If you wish to give a narrow transcription of a pronunciation in a certain variety of English, use {{tlx|IPA|2=en{{pipe}}...{{pipe}}generic=yes}}.
Note: Per [[WP:LEAD]], do not use this template in the lead section for common English words (e.g., ''[[pub]]'', ''[[rose]]'', ''[[pencil]]'', ''[[bus]]'', ''[[Monday]]'', ''[[Earth]]'', etc.).
The named parameter {{para|audio}} may be used to link to an audio file.
Notations with audio links will appear under [[:Category:Pages including recorded pronunciations]].
If "[invalid input]" is displayed, it means that an unsupported input was used. Such instances are tallied at [[:Category:Ill-formatted IPAc-en transclusions]], where they can be reviewed and fixed.
== Examples ==
* {{demo-inline|<nowiki>{{IPAc-en|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|audio=en-us-Alabama.ogg|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|US|audio=en-us-Alabama.ogg|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
Examples using [[X-SAMPA]] spelling for individual diaphonemes:
* {{demo-inline|<nowiki>{{IPAc-en|,|{|l|@|'|b|{|m|@}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|lang|audio=en-us-Alabama.ogg|,|{|l|@|'|b|{|m|@}}</nowiki>}}
== Pronunciation and IPA link codes ==
The initial argument (entry after |) can be used to indicate a pronunciation label. The codes are:
{| class="wikitable"
|+ Label codes
! Code !! Output
|-
| <code>lang</code> || English:
|-
| <code>local</code> || locally
|-
| <code>ipa</code> || [[International Phonetic Alphabet|IPA]]:
|-
| <code>also</code> || also
|-
| <code>uk</code> || [[British English|UK]]:
|-
| <code>us</code> || [[American English|US]]:
|-
| <code>uklang</code> || [[British English]]:
|-
| <code>uslang</code> || [[American English]]:
|-
| <code>ukalso</code> || [[British English|UK]] also
|-
| <code>usalso</code> || [[American English|US]] also
|-
| <code>alsouk</code> || also [[British English|UK]]:
|-
| <code>alsous</code> || also [[American English|US]]:
|}
The first argument that is not a code above will be treated as a diaphoneme. All diaphonemes listed at [[Help:IPA/English]] are available (except the ones that span two syllables such as {{IPA|/iə/}}, which need to be input as <code>i|ə</code>). Also available are {{IPA|/ɪəˈr/}}, {{IPA|/ɛəˈr/}}, {{IPA|/ʊəˈr/}}, {{IPA|/ɪəˌr/}}, {{IPA|/ɛəˌr/}}, and {{IPA|/ʊəˌr/}}, preserved for when a centering diphthong precedes a stress.
===Separator codes===
Use an underscore <code>_</code> to separate words. When multiple pronunciations for the same word(s) are possible, use a comma and an underscore <code>,_</code>, which will appear as a comma and a space, to separate the variants. As necessary, use a hyphen <code>-</code> to indicate omitted syllables. Diaphonemes are underlined, but separators are not, and separators do not have any tooltip text.
See the table below for a full list of separator codes.
===Diaphoneme codes===
Note that the aliases include ones that are kept merely for compatibility reasons and therefore not recommended for further use, as they might not accurately represent the sound represented by the output. Aliases from [[X-SAMPA]], on the other hand, are fine.
{{#invoke:IPAc-en/documentation|phonemes}}
== TemplateData ==
{{collapse top|TemplateData}}
{{TemplateData header}}
<templatedata>
{
"format": "inline",
"params": {
"1": {
"label": "1st input",
"type": "string",
"required": true,
"description": "Either a label code (e.g. 'local') or the first diaphoneme"
},
"2": {
"label": "2nd input",
"type": "string",
"required": false
},
"3": {
"label": "3rd input",
"type": "string",
"required": false
},
"4": {
"label": "4th input",
"type": "string",
"required": false
},
"5": {
"label": "5th input",
"type": "string",
"required": false
},
"6": {
"label": "6th input",
"type": "string",
"required": false
},
"7": {
"label": "7th input",
"type": "string",
"required": false
},
"8": {
"label": "8th input",
"type": "string",
"required": false
},
"9": {
"label": "9th input",
"type": "string",
"required": false
},
"10": {
"label": "10th input",
"type": "string",
"required": false
},
"11": {
"label": "11th input",
"type": "string",
"required": false
},
"12": {
"label": "12th input",
"type": "string",
"required": false
},
"13": {
"label": "13th input",
"type": "string",
"required": false
},
"14": {
"label": "14th input",
"type": "string",
"required": false
},
"15": {
"label": "15th input",
"type": "string",
"required": false
},
"16": {
"label": "16th input",
"type": "string",
"required": false
},
"17": {
"label": "17th input",
"type": "string",
"required": false
},
"18": {
"label": "18th input",
"type": "string",
"required": false
},
"19": {
"label": "19th input",
"type": "string",
"required": false
},
"20": {
"label": "20th input",
"type": "string",
"required": false
},
"21": {
"label": "21st input",
"type": "string",
"required": false
},
"22": {
"label": "22nd input",
"type": "string",
"required": false
},
"23": {
"label": "23rd input",
"type": "string",
"required": false
},
"24": {
"label": "24th input",
"type": "string",
"required": false
},
"25": {
"label": "25th input",
"type": "string",
"required": false
},
"26": {
"label": "26th input",
"type": "string",
"required": false
},
"27": {
"label": "27th input",
"type": "string",
"required": false
},
"28": {
"label": "28th input",
"type": "string",
"required": false
},
"29": {
"label": "29th input",
"type": "string",
"required": false
},
"30": {
"label": "30th input",
"type": "string",
"required": false
},
"31": {
"label": "31st input",
"type": "string",
"required": false
},
"32": {
"label": "32nd input",
"type": "string",
"required": false
},
"33": {
"label": "33rd input",
"type": "string",
"required": false
},
"34": {
"label": "34th input",
"type": "string",
"required": false
},
"35": {
"label": "35th input",
"type": "string",
"required": false
},
"36": {
"label": "36th input",
"type": "string",
"required": false
},
"37": {
"label": "37th input",
"type": "string",
"required": false
},
"38": {
"label": "38th input",
"type": "string",
"required": false
},
"39": {
"label": "39th input",
"type": "string",
"required": false
},
"40": {
"label": "40th input",
"type": "string",
"required": false
},
"41": {
"label": "41st input",
"type": "string",
"required": false
},
"42": {
"label": "42nd input",
"type": "string",
"required": false
},
"43": {
"label": "43rd input",
"type": "string",
"required": false
},
"44": {
"label": "44th input",
"type": "string",
"required": false
},
"45": {
"label": "45th input",
"type": "string",
"required": false
},
"46": {
"label": "46th input",
"type": "string",
"required": false
},
"47": {
"label": "47th input",
"type": "string",
"required": false
},
"48": {
"label": "48th input",
"type": "string",
"required": false
},
"49": {
"label": "49th input",
"type": "string",
"required": false
},
"50": {
"label": "50th input",
"type": "string",
"required": false
},
"51": {
"label": "51st input",
"type": "string",
"required": false
},
"52": {
"label": "52nd input",
"type": "string",
"required": false
},
"53": {
"label": "53rd input",
"type": "string",
"required": false
},
"54": {
"label": "54th input",
"type": "string",
"required": false
},
"55": {
"label": "55th input",
"type": "string",
"required": false
},
"56": {
"label": "56th input",
"type": "string",
"required": false
},
"57": {
"label": "57th input",
"type": "string",
"required": false
},
"58": {
"label": "58th input",
"type": "string",
"required": false
},
"59": {
"label": "59th input",
"type": "string",
"required": false
},
"60": {
"label": "60th input",
"type": "string",
"required": false
},
"61": {
"label": "61st input",
"type": "string",
"required": false
},
"62": {
"label": "62nd input",
"type": "string",
"required": false
},
"63": {
"label": "63rd input",
"type": "string",
"required": false
},
"64": {
"label": "64th input",
"type": "string",
"required": false
},
"65": {
"label": "65th input",
"type": "string",
"required": false
},
"66": {
"label": "66th input",
"type": "string",
"required": false
},
"67": {
"label": "67th input",
"type": "string",
"required": false
},
"68": {
"label": "68th input",
"type": "string",
"required": false
},
"69": {
"label": "69th input",
"type": "string",
"required": false
},
"70": {
"label": "70th input",
"type": "string",
"required": false
},
"71": {
"label": "71st input",
"type": "string",
"required": false
},
"72": {
"label": "72nd input",
"type": "string",
"required": false
},
"73": {
"label": "73rd input",
"type": "string",
"required": false
},
"74": {
"label": "74th input",
"type": "string",
"required": false
},
"75": {
"label": "75th input",
"type": "string",
"required": false
},
"76": {
"label": "76th input",
"type": "string",
"required": false
},
"77": {
"label": "77th input",
"type": "string",
"required": false
},
"78": {
"label": "78th input",
"type": "string",
"required": false
},
"79": {
"label": "79th input",
"type": "string",
"required": false
},
"80": {
"label": "80th input",
"type": "string",
"required": false
},
"81": {
"label": "81st input",
"type": "string",
"required": false
},
"82": {
"label": "82nd input",
"type": "string",
"required": false
},
"83": {
"label": "83rd input",
"type": "string",
"required": false
},
"84": {
"label": "84th input",
"type": "string",
"required": false
},
"85": {
"label": "85th input",
"type": "string",
"required": false
},
"86": {
"label": "86th input",
"type": "string",
"required": false
},
"87": {
"label": "87th input",
"type": "string",
"required": false
},
"88": {
"label": "88th input",
"type": "string",
"required": false
},
"89": {
"label": "89th input",
"type": "string",
"required": false
},
"90": {
"label": "90th input",
"type": "string",
"required": false
},
"91": {
"label": "91st input",
"type": "string",
"required": false
},
"92": {
"label": "92nd input",
"type": "string",
"required": false
},
"93": {
"label": "93rd input",
"type": "string",
"required": false
},
"94": {
"label": "94th input",
"type": "string",
"required": false
},
"95": {
"label": "95th input",
"type": "string",
"required": false
},
"96": {
"label": "96th input",
"type": "string",
"required": false
},
"97": {
"label": "97th input",
"type": "string",
"required": false
},
"98": {
"label": "98th input",
"type": "string",
"required": false
},
"99": {
"label": "99th input",
"type": "string",
"required": false
},
"100": {
"label": "100th input",
"type": "string",
"required": false
},
"audio": {
"label": "Audio file",
"description": "The audio file without the \"File:\" prefix",
"example": "En-us-Foobar.ogg",
"type": "wiki-file-name"
}
},
"description": "This template is used to display English International Phonetic Alphabet (IPA). The pronunciation is broken into individual diaphonemes so that they will have tooltips (mouse-over text) to indicate pronunciation."
}
</templatedata>
{{collapse bottom}}
== See also ==
* {{tl|Respell}}, for [[Help:Pronunciation respelling key|pronunciation respelling]]s, which may be used for English words in addition to the IPA
{{IPA templates}}
<includeonly>{{Sandbox other||
[[Category:IPA language templates|c]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
o7ltqqxjl0qgivrfbmvfmonw00ie31a
15708
15699
2026-11-09T06:15:31Z
RAPTOR7762
18
15708
wikitext
text/x-wiki
{{documentation subpage}}
{{High-use}}
{{lua|Module:IPAc-en}}
This template is used to display English [[International Phonetic Alphabet]] (IPA). The pronunciation is broken into individual [[diaphoneme]]s so that they will have tooltips (mouse-over text) to indicate pronunciation. All diaphonemes from [[Help:IPA/English]] are available.
== Usage ==
The transcription system of [[Help:IPA/English]], upon which this template relies, is diaphonemic, i.e. meant to cover multiple major varieties of English at once. If you wish to give a narrow transcription of a pronunciation in a certain variety of English, use {{tlx|IPA|2=en{{pipe}}...{{pipe}}generic=yes}}.
Note: Per [[WP:LEAD]], do not use this template in the lead section for common English words (e.g., ''[[pub]]'', ''[[rose]]'', ''[[pencil]]'', ''[[bus]]'', ''[[Monday]]'', ''[[Earth]]'', etc.).
The named parameter {{para|audio}} may be used to link to an audio file.
Notations with audio links will appear under [[:Category:Pages including recorded pronunciations]].
If "[invalid input]" is displayed, it means that an unsupported input was used. Such instances are tallied at [[:Category:Ill-formatted IPAc-en transclusions]], where they can be reviewed and fixed.
== Examples ==
* {{demo-inline|<nowiki>{{IPAc-en|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|audio=en-us-Alabama.ogg|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|US|audio=en-us-Alabama.ogg|ˌ|æ|l|ə|ˈ|b|æ|m|ə}}</nowiki>}}
Examples using [[X-SAMPA]] spelling for individual diaphonemes:
* {{demo-inline|<nowiki>{{IPAc-en|,|{|l|@|'|b|{|m|@}}</nowiki>}}
* {{demo-inline|<nowiki>{{IPAc-en|lang|audio=en-us-Alabama.ogg|,|{|l|@|'|b|{|m|@}}</nowiki>}}
== Pronunciation and IPA link codes ==
The initial argument (entry after |) can be used to indicate a pronunciation label. The codes are:
{| class="wikitable"
|+ Label codes
! Code !! Output
|-
| <code>lang</code> || English:
|-
| <code>local</code> || locally
|-
| <code>ipa</code> || [[International Phonetic Alphabet|IPA]]:
|-
| <code>also</code> || also
|-
| <code>uk</code> || [[British English|UK]]:
|-
| <code>us</code> || [[American English|US]]:
|-
| <code>uklang</code> || [[British English]]:
|-
| <code>uslang</code> || [[American English]]:
|-
| <code>ukalso</code> || [[British English|UK]] also
|-
| <code>usalso</code> || [[American English|US]] also
|-
| <code>alsouk</code> || also [[British English|UK]]:
|-
| <code>alsous</code> || also [[American English|US]]:
|}
The first argument that is not a code above will be treated as a diaphoneme. All diaphonemes listed at [[Help:IPA/English]] are available (except the ones that span two syllables such as {{IPA|/iə/}}, which need to be input as <code>i|ə</code>). Also available are {{IPA|/ɪəˈr/}}, {{IPA|/ɛəˈr/}}, {{IPA|/ʊəˈr/}}, {{IPA|/ɪəˌr/}}, {{IPA|/ɛəˌr/}}, and {{IPA|/ʊəˌr/}}, preserved for when a centering diphthong precedes a stress.
===Separator codes===
Use an underscore <code>_</code> to separate words. When multiple pronunciations for the same word(s) are possible, use a comma and an underscore <code>,_</code>, which will appear as a comma and a space, to separate the variants. As necessary, use a hyphen <code>-</code> to indicate omitted syllables. Diaphonemes are underlined, but separators are not, and separators do not have any tooltip text.
See the table below for a full list of separator codes.
===Diaphoneme codes===
Note that the aliases include ones that are kept merely for compatibility reasons and therefore not recommended for further use, as they might not accurately represent the sound represented by the output. Aliases from [[X-SAMPA]], on the other hand, are fine.
{{#invoke:IPAc-en/documentation|phonemes}}
== TemplateData ==
{{collapse top|TemplateData}}
{{TemplateData header}}
<templatedata>
{
"format": "inline",
"params": {
"1": {
"label": "1st input",
"type": "string",
"required": true,
"description": "Either a label code (e.g. 'local') or the first diaphoneme"
},
"2": {
"label": "2nd input",
"type": "string",
"required": false
},
"3": {
"label": "3rd input",
"type": "string",
"required": false
},
"4": {
"label": "4th input",
"type": "string",
"required": false
},
"5": {
"label": "5th input",
"type": "string",
"required": false
},
"6": {
"label": "6th input",
"type": "string",
"required": false
},
"7": {
"label": "7th input",
"type": "string",
"required": false
},
"8": {
"label": "8th input",
"type": "string",
"required": false
},
"9": {
"label": "9th input",
"type": "string",
"required": false
},
"10": {
"label": "10th input",
"type": "string",
"required": false
},
"11": {
"label": "11th input",
"type": "string",
"required": false
},
"12": {
"label": "12th input",
"type": "string",
"required": false
},
"13": {
"label": "13th input",
"type": "string",
"required": false
},
"14": {
"label": "14th input",
"type": "string",
"required": false
},
"15": {
"label": "15th input",
"type": "string",
"required": false
},
"16": {
"label": "16th input",
"type": "string",
"required": false
},
"17": {
"label": "17th input",
"type": "string",
"required": false
},
"18": {
"label": "18th input",
"type": "string",
"required": false
},
"19": {
"label": "19th input",
"type": "string",
"required": false
},
"20": {
"label": "20th input",
"type": "string",
"required": false
},
"21": {
"label": "21st input",
"type": "string",
"required": false
},
"22": {
"label": "22nd input",
"type": "string",
"required": false
},
"23": {
"label": "23rd input",
"type": "string",
"required": false
},
"24": {
"label": "24th input",
"type": "string",
"required": false
},
"25": {
"label": "25th input",
"type": "string",
"required": false
},
"26": {
"label": "26th input",
"type": "string",
"required": false
},
"27": {
"label": "27th input",
"type": "string",
"required": false
},
"28": {
"label": "28th input",
"type": "string",
"required": false
},
"29": {
"label": "29th input",
"type": "string",
"required": false
},
"30": {
"label": "30th input",
"type": "string",
"required": false
},
"31": {
"label": "31st input",
"type": "string",
"required": false
},
"32": {
"label": "32nd input",
"type": "string",
"required": false
},
"33": {
"label": "33rd input",
"type": "string",
"required": false
},
"34": {
"label": "34th input",
"type": "string",
"required": false
},
"35": {
"label": "35th input",
"type": "string",
"required": false
},
"36": {
"label": "36th input",
"type": "string",
"required": false
},
"37": {
"label": "37th input",
"type": "string",
"required": false
},
"38": {
"label": "38th input",
"type": "string",
"required": false
},
"39": {
"label": "39th input",
"type": "string",
"required": false
},
"40": {
"label": "40th input",
"type": "string",
"required": false
},
"41": {
"label": "41st input",
"type": "string",
"required": false
},
"42": {
"label": "42nd input",
"type": "string",
"required": false
},
"43": {
"label": "43rd input",
"type": "string",
"required": false
},
"44": {
"label": "44th input",
"type": "string",
"required": false
},
"45": {
"label": "45th input",
"type": "string",
"required": false
},
"46": {
"label": "46th input",
"type": "string",
"required": false
},
"47": {
"label": "47th input",
"type": "string",
"required": false
},
"48": {
"label": "48th input",
"type": "string",
"required": false
},
"49": {
"label": "49th input",
"type": "string",
"required": false
},
"50": {
"label": "50th input",
"type": "string",
"required": false
},
"51": {
"label": "51st input",
"type": "string",
"required": false
},
"52": {
"label": "52nd input",
"type": "string",
"required": false
},
"53": {
"label": "53rd input",
"type": "string",
"required": false
},
"54": {
"label": "54th input",
"type": "string",
"required": false
},
"55": {
"label": "55th input",
"type": "string",
"required": false
},
"56": {
"label": "56th input",
"type": "string",
"required": false
},
"57": {
"label": "57th input",
"type": "string",
"required": false
},
"58": {
"label": "58th input",
"type": "string",
"required": false
},
"59": {
"label": "59th input",
"type": "string",
"required": false
},
"60": {
"label": "60th input",
"type": "string",
"required": false
},
"61": {
"label": "61st input",
"type": "string",
"required": false
},
"62": {
"label": "62nd input",
"type": "string",
"required": false
},
"63": {
"label": "63rd input",
"type": "string",
"required": false
},
"64": {
"label": "64th input",
"type": "string",
"required": false
},
"65": {
"label": "65th input",
"type": "string",
"required": false
},
"66": {
"label": "66th input",
"type": "string",
"required": false
},
"67": {
"label": "67th input",
"type": "string",
"required": false
},
"68": {
"label": "68th input",
"type": "string",
"required": false
},
"69": {
"label": "69th input",
"type": "string",
"required": false
},
"70": {
"label": "70th input",
"type": "string",
"required": false
},
"71": {
"label": "71st input",
"type": "string",
"required": false
},
"72": {
"label": "72nd input",
"type": "string",
"required": false
},
"73": {
"label": "73rd input",
"type": "string",
"required": false
},
"74": {
"label": "74th input",
"type": "string",
"required": false
},
"75": {
"label": "75th input",
"type": "string",
"required": false
},
"76": {
"label": "76th input",
"type": "string",
"required": false
},
"77": {
"label": "77th input",
"type": "string",
"required": false
},
"78": {
"label": "78th input",
"type": "string",
"required": false
},
"79": {
"label": "79th input",
"type": "string",
"required": false
},
"80": {
"label": "80th input",
"type": "string",
"required": false
},
"81": {
"label": "81st input",
"type": "string",
"required": false
},
"82": {
"label": "82nd input",
"type": "string",
"required": false
},
"83": {
"label": "83rd input",
"type": "string",
"required": false
},
"84": {
"label": "84th input",
"type": "string",
"required": false
},
"85": {
"label": "85th input",
"type": "string",
"required": false
},
"86": {
"label": "86th input",
"type": "string",
"required": false
},
"87": {
"label": "87th input",
"type": "string",
"required": false
},
"88": {
"label": "88th input",
"type": "string",
"required": false
},
"89": {
"label": "89th input",
"type": "string",
"required": false
},
"90": {
"label": "90th input",
"type": "string",
"required": false
},
"91": {
"label": "91st input",
"type": "string",
"required": false
},
"92": {
"label": "92nd input",
"type": "string",
"required": false
},
"93": {
"label": "93rd input",
"type": "string",
"required": false
},
"94": {
"label": "94th input",
"type": "string",
"required": false
},
"95": {
"label": "95th input",
"type": "string",
"required": false
},
"96": {
"label": "96th input",
"type": "string",
"required": false
},
"97": {
"label": "97th input",
"type": "string",
"required": false
},
"98": {
"label": "98th input",
"type": "string",
"required": false
},
"99": {
"label": "99th input",
"type": "string",
"required": false
},
"100": {
"label": "100th input",
"type": "string",
"required": false
},
"audio": {
"label": "Audio file",
"description": "The audio file without the \"File:\" prefix",
"example": "En-us-Foobar.ogg",
"type": "wiki-file-name"
}
},
"description": "This template is used to display English International Phonetic Alphabet (IPA). The pronunciation is broken into individual diaphonemes so that they will have tooltips (mouse-over text) to indicate pronunciation."
}
</templatedata>
{{collapse bottom}}
== See also ==
* {{tl|Respell}}, for [[Help:Pronunciation respelling key|pronunciation respelling]]s, which may be used for English words in addition to the IPA
{{IPA templates}}
<includeonly>{{Sandbox other||
[[Category:IPA language templates|c]]
[[Category:Templates that add a tracking category]]
}}</includeonly>
pqs8t02jzct1bl3yf15los2li3gm9me
Module:IPA
828
2321
15700
2026-08-12T12:48:42Z
Ahecht
669
Add direct function
15700
Scribunto
text/plain
require('strict')
local p = {}
local function multiFind(s, patterns, init)
local i, j = mw.ustring.find(s, patterns[1], init)
for n = 2, #patterns do
local i2, j2 = mw.ustring.find(s, patterns[n], init)
if i2 and (not i or i2 < i) then
i, j = i2, j2
end
end
return i, j
end
local function wrapAtSpaces(s)
return mw.ustring.gsub(s, '(%s+)', '<span class="wrap">%1</span>')
end
local function wrapAtSpacesSafely(s)
local patterns = {
'%[%[[^%]|]-%s[^%]|]-|', -- Piped links
'</?[A-Za-z][^>]-%s[^>]->' -- HTML tags
}
s = mw.ustring.gsub(s, '%[%[([^%]|]-%s[^%]|]-)%]%]', '[[%1|%1]]') -- Pipe all links
local t = {}
local init
while true do
local i, j = multiFind(s, patterns, init)
if not i then
break
end
local pre = wrapAtSpaces(mw.ustring.sub(s, init, i - 1)) -- What precedes the match
table.insert(t, pre)
table.insert(t, mw.ustring.sub(s, i, j)) -- The match
init = j + 1
end
local post = wrapAtSpaces(mw.ustring.sub(s, init)) -- What follows the last match
table.insert(t, post)
return table.concat(t)
end
local function checkNamespace(isDebug)
return isDebug or require('Module:Category handler').main({ true })
end
local function renderCats(cats, isDebug)
if not cats[1] or not checkNamespace(isDebug) then
return ''
end
local t = {}
for _, v in ipairs(cats) do
table.insert(t, string.format(
'[[%sCategory:%s]]',
isDebug and ':' or '',
v
))
end
return table.concat(t)
end
local function resolveSynonym(s)
return mw.loadData('Module:Lang/ISO 639 synonyms')[s] or s
end
local function splitTag(s)
local langCode = s:gsub('%-.*', ''):lower()
langCode = resolveSynonym(langCode)
local regionCode = s:match('%-(.+)')
local isPrivate = regionCode and regionCode:sub(1, 2) == 'x-'
return langCode, regionCode, isPrivate
end
local function getLangName(code, link, raw)
return require('Module:Lang')._name_from_tag({
code,
link = link,
raw = raw,
-- Without linking, "{{IPA}}" gets expanded in some contexts
template = '[[Template:IPA|IPA]]'
})
end
local function linkLang(name, target, link)
return link == 'yes' and string.format(
'[[%s|%s]]',
target or name .. ' language',
name
) or name
end
function p._main(args)
local ret, cats = {}, {}
local isDebug = args.debug == 'yes'
local s, langCode, regionCode, isPrivate
-- Guide-linking mode
if args[2] and args[2] ~= '' then
local data = mw.loadData('Module:IPA/data')
local isGeneric = args.generic == 'yes'
s = args[2]
langCode, regionCode, isPrivate = splitTag(args[1])
local langData = data.langs[langCode] or {}
if regionCode then
if not isPrivate then
regionCode = regionCode:upper()
end
if langData.dialects and langData.dialects[regionCode] then
-- Overwrite language data with the dialect's
local newLangData = {}
for k, v in pairs(langData) do
if k ~= 'dialects' then
newLangData[k] = v
end
end
local dialectData = langData.dialects[regionCode]
if dialectData.aliasOf then
-- Use the canonical region code
regionCode = dialectData.aliasOf
isPrivate = regionCode:sub(1, 2) == 'x-'
dialectData = langData.dialects[regionCode]
end
-- Lowercase IANA variant
if dialectData.isVariant then
regionCode = regionCode:lower()
end
for k, v in pairs(dialectData) do
newLangData[k] = v
end
langData = newLangData
else
isGeneric = true
end
end
local fullLangCode = regionCode and langCode .. '-' .. regionCode
or langCode
local langName = langData.name
and linkLang(langData.name, langData.link, args.link)
or getLangName(fullLangCode, args.link)
if langName:sub(1, 5) == '<span' then
-- Module:Lang has returned an error
return langName .. renderCats({ 'IPA template errors' }, isDebug)
end
if args.cat ~= 'no' then
local catLangName = langData.name
or getLangName(fullLangCode, nil, 'yes')
if catLangName:sub(1, 5) == '<span' then
-- Module:Lang has returned an error, but it's not fatal
table.insert(cats, 'IPA template errors')
mw.addWarning(catLangName)
else
table.insert(cats, string.format('Pages with %s IPA', catLangName))
end
end
-- Label
local label = args.label
if not label then
local labelCode = args[3] and args[3]:lower()
or langData.defaultLabelCode
if labelCode == '' then
label = ''
else
local langText
if langData.text then
langText = linkLang(
langData.text,
mw.ustring.match(langName, '^%[%[([^|%]]+)'),
args.link
)
else
langText = mw.ustring.gsub(
langName,
'^%[%[(([^|]+) languages)%]%]$',
'[[%1|%2]]'
)
langText = mw.ustring.gsub(
langText,
' languages(%]?%]?)$',
'%1'
)
end
if labelCode and data.labels[labelCode] then
label = data.labels[labelCode]:format(langText)
else
label = data.defaultLabel:format(langText)
end
end
end
if label and label ~= '' then
local span = mw.html.create('span')
:addClass('IPA-label')
:wikitext(label)
if args.small ~= 'no' then
span:addClass('IPA-label-small')
table.insert(ret, mw.getCurrentFrame():extensionTag({
name = 'templatestyles',
args = { src = 'Module:IPA/styles.css' }
}))
end
table.insert(ret, tostring(span) .. ' ')
end
-- Brackets
s = (not isGeneric and langData.format or '[%s]'):format(s)
-- Link to key
local key = not isGeneric and langData.key or data.defaultKey
s = string.format('[[%s|%s]]', key, s)
else
-- Basic mode
s = args[1]
if args.lang and args.lang ~= '' then
langCode, regionCode, isPrivate = splitTag(args.lang)
end
if args.cat ~= 'no' then
table.insert(cats, 'Pages with plain IPA')
end
end
-- Transcription
do
local lang = (langCode or 'und') .. '-Latn'
if not isPrivate and regionCode then
lang = lang .. '-' .. regionCode
end
lang = lang .. '-fonipa'
local span = mw.html.create('span')
:addClass('IPA')
:addClass(args.class)
:attr('lang', lang)
-- wrap=all: Do nothing
-- wrap=none: Never break
-- Otherwise: Break at spaces only
if args.wrap ~= 'all' then
span:addClass('nowrap')
if args.wrap ~= 'none' then
s = wrapAtSpacesSafely(s)
end
end
if (not args[2] or args[2] == '') and args.tooltip ~= '' then
local tooltip = args.tooltip or
'Representation in the International Phonetic Alphabet (IPA)'
span:attr('title', tooltip)
end
s = tostring(span:wikitext(s))
table.insert(ret, s)
end
-- Audio
local audio = args.audio ~= '' and args.audio or args[4] ~= '' and args[4]
if audio then
local button = mw.getCurrentFrame():expandTemplate({
title = 'Audio',
args = { audio, '' }
})
table.insert(ret, ' ' .. button)
table.insert(cats, 'Pages including recorded pronunciations')
end
-- Categories
table.insert(ret, renderCats(cats, isDebug))
return table.concat(ret)
end
function p.main(frame)
local args = frame:getParent().args
if not args[1] then
return ''
end
for i, v in ipairs(args) do
args[i] = mw.text.trim(v)
end
return p._main(args)
end
function p.direct(frame)
local args = frame.args
if not args[1] then
return ''
end
for i, v in ipairs(args) do
args[i] = mw.text.trim(v)
end
return p._main(args)
end
p[''] = p.direct
return p
phcnq9r7vohl4joqv46mjx0e82omyvx
15701
15700
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPA]]
15700
Scribunto
text/plain
require('strict')
local p = {}
local function multiFind(s, patterns, init)
local i, j = mw.ustring.find(s, patterns[1], init)
for n = 2, #patterns do
local i2, j2 = mw.ustring.find(s, patterns[n], init)
if i2 and (not i or i2 < i) then
i, j = i2, j2
end
end
return i, j
end
local function wrapAtSpaces(s)
return mw.ustring.gsub(s, '(%s+)', '<span class="wrap">%1</span>')
end
local function wrapAtSpacesSafely(s)
local patterns = {
'%[%[[^%]|]-%s[^%]|]-|', -- Piped links
'</?[A-Za-z][^>]-%s[^>]->' -- HTML tags
}
s = mw.ustring.gsub(s, '%[%[([^%]|]-%s[^%]|]-)%]%]', '[[%1|%1]]') -- Pipe all links
local t = {}
local init
while true do
local i, j = multiFind(s, patterns, init)
if not i then
break
end
local pre = wrapAtSpaces(mw.ustring.sub(s, init, i - 1)) -- What precedes the match
table.insert(t, pre)
table.insert(t, mw.ustring.sub(s, i, j)) -- The match
init = j + 1
end
local post = wrapAtSpaces(mw.ustring.sub(s, init)) -- What follows the last match
table.insert(t, post)
return table.concat(t)
end
local function checkNamespace(isDebug)
return isDebug or require('Module:Category handler').main({ true })
end
local function renderCats(cats, isDebug)
if not cats[1] or not checkNamespace(isDebug) then
return ''
end
local t = {}
for _, v in ipairs(cats) do
table.insert(t, string.format(
'[[%sCategory:%s]]',
isDebug and ':' or '',
v
))
end
return table.concat(t)
end
local function resolveSynonym(s)
return mw.loadData('Module:Lang/ISO 639 synonyms')[s] or s
end
local function splitTag(s)
local langCode = s:gsub('%-.*', ''):lower()
langCode = resolveSynonym(langCode)
local regionCode = s:match('%-(.+)')
local isPrivate = regionCode and regionCode:sub(1, 2) == 'x-'
return langCode, regionCode, isPrivate
end
local function getLangName(code, link, raw)
return require('Module:Lang')._name_from_tag({
code,
link = link,
raw = raw,
-- Without linking, "{{IPA}}" gets expanded in some contexts
template = '[[Template:IPA|IPA]]'
})
end
local function linkLang(name, target, link)
return link == 'yes' and string.format(
'[[%s|%s]]',
target or name .. ' language',
name
) or name
end
function p._main(args)
local ret, cats = {}, {}
local isDebug = args.debug == 'yes'
local s, langCode, regionCode, isPrivate
-- Guide-linking mode
if args[2] and args[2] ~= '' then
local data = mw.loadData('Module:IPA/data')
local isGeneric = args.generic == 'yes'
s = args[2]
langCode, regionCode, isPrivate = splitTag(args[1])
local langData = data.langs[langCode] or {}
if regionCode then
if not isPrivate then
regionCode = regionCode:upper()
end
if langData.dialects and langData.dialects[regionCode] then
-- Overwrite language data with the dialect's
local newLangData = {}
for k, v in pairs(langData) do
if k ~= 'dialects' then
newLangData[k] = v
end
end
local dialectData = langData.dialects[regionCode]
if dialectData.aliasOf then
-- Use the canonical region code
regionCode = dialectData.aliasOf
isPrivate = regionCode:sub(1, 2) == 'x-'
dialectData = langData.dialects[regionCode]
end
-- Lowercase IANA variant
if dialectData.isVariant then
regionCode = regionCode:lower()
end
for k, v in pairs(dialectData) do
newLangData[k] = v
end
langData = newLangData
else
isGeneric = true
end
end
local fullLangCode = regionCode and langCode .. '-' .. regionCode
or langCode
local langName = langData.name
and linkLang(langData.name, langData.link, args.link)
or getLangName(fullLangCode, args.link)
if langName:sub(1, 5) == '<span' then
-- Module:Lang has returned an error
return langName .. renderCats({ 'IPA template errors' }, isDebug)
end
if args.cat ~= 'no' then
local catLangName = langData.name
or getLangName(fullLangCode, nil, 'yes')
if catLangName:sub(1, 5) == '<span' then
-- Module:Lang has returned an error, but it's not fatal
table.insert(cats, 'IPA template errors')
mw.addWarning(catLangName)
else
table.insert(cats, string.format('Pages with %s IPA', catLangName))
end
end
-- Label
local label = args.label
if not label then
local labelCode = args[3] and args[3]:lower()
or langData.defaultLabelCode
if labelCode == '' then
label = ''
else
local langText
if langData.text then
langText = linkLang(
langData.text,
mw.ustring.match(langName, '^%[%[([^|%]]+)'),
args.link
)
else
langText = mw.ustring.gsub(
langName,
'^%[%[(([^|]+) languages)%]%]$',
'[[%1|%2]]'
)
langText = mw.ustring.gsub(
langText,
' languages(%]?%]?)$',
'%1'
)
end
if labelCode and data.labels[labelCode] then
label = data.labels[labelCode]:format(langText)
else
label = data.defaultLabel:format(langText)
end
end
end
if label and label ~= '' then
local span = mw.html.create('span')
:addClass('IPA-label')
:wikitext(label)
if args.small ~= 'no' then
span:addClass('IPA-label-small')
table.insert(ret, mw.getCurrentFrame():extensionTag({
name = 'templatestyles',
args = { src = 'Module:IPA/styles.css' }
}))
end
table.insert(ret, tostring(span) .. ' ')
end
-- Brackets
s = (not isGeneric and langData.format or '[%s]'):format(s)
-- Link to key
local key = not isGeneric and langData.key or data.defaultKey
s = string.format('[[%s|%s]]', key, s)
else
-- Basic mode
s = args[1]
if args.lang and args.lang ~= '' then
langCode, regionCode, isPrivate = splitTag(args.lang)
end
if args.cat ~= 'no' then
table.insert(cats, 'Pages with plain IPA')
end
end
-- Transcription
do
local lang = (langCode or 'und') .. '-Latn'
if not isPrivate and regionCode then
lang = lang .. '-' .. regionCode
end
lang = lang .. '-fonipa'
local span = mw.html.create('span')
:addClass('IPA')
:addClass(args.class)
:attr('lang', lang)
-- wrap=all: Do nothing
-- wrap=none: Never break
-- Otherwise: Break at spaces only
if args.wrap ~= 'all' then
span:addClass('nowrap')
if args.wrap ~= 'none' then
s = wrapAtSpacesSafely(s)
end
end
if (not args[2] or args[2] == '') and args.tooltip ~= '' then
local tooltip = args.tooltip or
'Representation in the International Phonetic Alphabet (IPA)'
span:attr('title', tooltip)
end
s = tostring(span:wikitext(s))
table.insert(ret, s)
end
-- Audio
local audio = args.audio ~= '' and args.audio or args[4] ~= '' and args[4]
if audio then
local button = mw.getCurrentFrame():expandTemplate({
title = 'Audio',
args = { audio, '' }
})
table.insert(ret, ' ' .. button)
table.insert(cats, 'Pages including recorded pronunciations')
end
-- Categories
table.insert(ret, renderCats(cats, isDebug))
return table.concat(ret)
end
function p.main(frame)
local args = frame:getParent().args
if not args[1] then
return ''
end
for i, v in ipairs(args) do
args[i] = mw.text.trim(v)
end
return p._main(args)
end
function p.direct(frame)
local args = frame.args
if not args[1] then
return ''
end
for i, v in ipairs(args) do
args[i] = mw.text.trim(v)
end
return p._main(args)
end
p[''] = p.direct
return p
phcnq9r7vohl4joqv46mjx0e82omyvx
Module:IPA/styles.css
828
2322
15702
2023-09-26T08:28:57Z
Nardog
667
Parsoid uses a different class
15702
sanitized-css
text/css
/* {{pp-template}} */
.IPA-label-small {
font-size: 85%;
}
/* Don't shrink the label where text is already small, per [[MOS:SMALLTEXT]] */
.references .IPA-label-small,
.infobox .IPA-label-small,
.navbox .IPA-label-small {
font-size: 100%;
}
072qrnoi3jojcokw6kqxca0vddi5ui1
15703
15702
2026-11-09T06:13:51Z
RAPTOR7762
18
1 revision imported from [[:en:Module:IPA/styles.css]]
15702
sanitized-css
text/css
/* {{pp-template}} */
.IPA-label-small {
font-size: 85%;
}
/* Don't shrink the label where text is already small, per [[MOS:SMALLTEXT]] */
.references .IPA-label-small,
.infobox .IPA-label-small,
.navbox .IPA-label-small {
font-size: 100%;
}
072qrnoi3jojcokw6kqxca0vddi5ui1
Tempilet:High-use
10
2323
15709
2023-05-30T09:39:48Z
Lectonar
340
Changed protection settings for "[[Template:High-use]]": [[WP:High-risk templates|High-risk template or module]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
15709
wikitext
text/x-wiki
{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! -->
</noinclude>
j29sm6019piulvmp7rcudlkhl1yuxmv
15710
15709
2026-11-09T06:16:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:High-use]]
15709
wikitext
text/x-wiki
{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! -->
</noinclude>
j29sm6019piulvmp7rcudlkhl1yuxmv
Module:Protect
828
2324
15713
2019-03-13T12:54:02Z
Xaosflux
324
Changed protection level for "[[Module:Protect]]": used in interface [[MediaWiki:Protectedinterface]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
15713
Scribunto
text/plain
local function processResult(options, success, ...)
if not success then
local message = tostring(... or '(no message)')
if options.removeLocation then
message = string.gsub(message, '^Module:[^:]+:%d+: ', '', 1)
end
return string.format(options.errFormat, message)
end
return ...
end
local function protect(func, errFormat, options)
if type(errFormat) == 'table' then
options = options or errFormat
errFormat = nil
end
options = mw.clone(options) or {}
options.errFormat = errFormat or options.errFormat or 'Error: %s'
if not options.raw then
options.errFormat = '<strong class="error">' .. options.errFormat .. '</strong>'
end
options.removeLocation = options.removeLocation == nil or options.removeLocation
return function (...)
return processResult(options, pcall(func, ...))
end
end
return protect
lpwbveqfkihxx5w7otzmx6xlb5y323h
15714
15713
2026-11-09T06:16:44Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Protect]]
15713
Scribunto
text/plain
local function processResult(options, success, ...)
if not success then
local message = tostring(... or '(no message)')
if options.removeLocation then
message = string.gsub(message, '^Module:[^:]+:%d+: ', '', 1)
end
return string.format(options.errFormat, message)
end
return ...
end
local function protect(func, errFormat, options)
if type(errFormat) == 'table' then
options = options or errFormat
errFormat = nil
end
options = mw.clone(options) or {}
options.errFormat = errFormat or options.errFormat or 'Error: %s'
if not options.raw then
options.errFormat = '<strong class="error">' .. options.errFormat .. '</strong>'
end
options.removeLocation = options.removeLocation == nil or options.removeLocation
return function (...)
return processResult(options, pcall(func, ...))
end
end
return protect
lpwbveqfkihxx5w7otzmx6xlb5y323h
Tempilet:Var
10
2325
15715
2017-12-21T13:31:52Z
Izno
318
nix xml lang invocation
15715
wikitext
text/x-wiki
<var {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} style="padding-right: 1px;{{{style|}}}" {{#if:{{{lang|}}}|lang="{{{lang}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</var><noinclude>
<!--Categories and interwikis go near the bottom of the /doc page.-->
{{Documentation}}
</noinclude>
1ph0r212s7cz1dvg2q4quotqwsozpa8
15716
15715
2026-11-09T06:16:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Var]]
15715
wikitext
text/x-wiki
<var {{#if:{{{class|}}}|class="{{{class}}}"}} {{#if:{{{id|}}}|id="{{{id}}}"}} style="padding-right: 1px;{{{style|}}}" {{#if:{{{lang|}}}|lang="{{{lang}}}"}} {{#if:{{{title|}}}|title="{{{title}}}"}}>{{{1}}}</var><noinclude>
<!--Categories and interwikis go near the bottom of the /doc page.-->
{{Documentation}}
</noinclude>
1ph0r212s7cz1dvg2q4quotqwsozpa8
Tempilet:Editnotice
10
2326
15717
2025-12-26T17:58:43Z
Pppery
320
Add CSS class params per request
15717
wikitext
text/x-wiki
{{#ifeq:{{FULLROOTPAGENAME}}|Template:Editnotices
|{{Editnotice/notice
|expiry={{{expiry|¬}}}
|redirect={{{redirect|}}}
}}
}}{{#ifexpr:{{#ifeq:{{FULLROOTPAGENAME}}|Template:Editnotices
|1
|0
}}+{{#switch:{{{expiry|¬}}}
|indefinite = 1
|
|¬ = 1 <!-- Expiry not specified -->
|#default = {{#iferror:{{#time:U|{{{expiry}}}}}
|0 <!-- Invalid expiry time -->
|{{#ifexpr:{{#time:U|{{{expiry}}}}}-{{#time:U|{{CURRENTTIMESTAMP}}}}>0
|1 <!-- Notice current -->
|0 <!-- Notice expired -->
}}
}}
}}
|{{fmbox
|plainlinks= no<!-- override with `class` if needed -->
|type = {{{type|editnotice}}}
|id = {{{id|}}}
|templatestyles = {{{templatestyles|Template:Editnotice/styles.css}}}
|textstyle = {{{textstyle|}}}
|style = {{{style|}}}
|class = {{{class|}}} editnotice
|image = {{#if:{{{image|}}}
|{{#invoke:InfoboxImage|InfoboxImage|image={{{image}}}|size={{{imagesize|}}}|class={{{imageclass|}}}|sizedefault=40x40px}}
|none
}}
|imageright= {{#if:{{{imageright|}}}
|{{#invoke:InfoboxImage|InfoboxImage|image={{{imageright}}}|size={{{imagerightsize|}}}|class={{{imagerightclass|}}}|sizedefault=40x40px}}
}}
|text = {{#if:{{{header|}}}
|<div class="editnotice-header" style="font-weight: bold; {{{headerstyle|}}}">{{{header}}}</div>
}}
{{{text|{{{1}}}}}}
}}
}}{{#ifeq:{{FULLROOTPAGENAME}}|Template:Editnotices|{{#switch:{{{expiry|¬}}}
|indefinite
|
|¬ = <!-- Expiry not specified -->
|#default = {{#iferror:{{#time:U|{{{expiry}}}}}
| <!-- Invalid expiry time -->
|{{#ifexpr:{{#time:U|{{{expiry}}}}}-{{#time:U|{{CURRENTTIMESTAMP}}}}>0
| <!-- Notice current -->
|[[Category:Expired editnotices]] <!-- Notice expired -->
}}
}}
}}
}}<noinclude>
{{documentation}}
</noinclude>
9t3x7sjx6d1ojjp7wh26i2afji7w7e3
15718
15717
2026-11-09T06:16:44Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Editnotice]]
15717
wikitext
text/x-wiki
{{#ifeq:{{FULLROOTPAGENAME}}|Template:Editnotices
|{{Editnotice/notice
|expiry={{{expiry|¬}}}
|redirect={{{redirect|}}}
}}
}}{{#ifexpr:{{#ifeq:{{FULLROOTPAGENAME}}|Template:Editnotices
|1
|0
}}+{{#switch:{{{expiry|¬}}}
|indefinite = 1
|
|¬ = 1 <!-- Expiry not specified -->
|#default = {{#iferror:{{#time:U|{{{expiry}}}}}
|0 <!-- Invalid expiry time -->
|{{#ifexpr:{{#time:U|{{{expiry}}}}}-{{#time:U|{{CURRENTTIMESTAMP}}}}>0
|1 <!-- Notice current -->
|0 <!-- Notice expired -->
}}
}}
}}
|{{fmbox
|plainlinks= no<!-- override with `class` if needed -->
|type = {{{type|editnotice}}}
|id = {{{id|}}}
|templatestyles = {{{templatestyles|Template:Editnotice/styles.css}}}
|textstyle = {{{textstyle|}}}
|style = {{{style|}}}
|class = {{{class|}}} editnotice
|image = {{#if:{{{image|}}}
|{{#invoke:InfoboxImage|InfoboxImage|image={{{image}}}|size={{{imagesize|}}}|class={{{imageclass|}}}|sizedefault=40x40px}}
|none
}}
|imageright= {{#if:{{{imageright|}}}
|{{#invoke:InfoboxImage|InfoboxImage|image={{{imageright}}}|size={{{imagerightsize|}}}|class={{{imagerightclass|}}}|sizedefault=40x40px}}
}}
|text = {{#if:{{{header|}}}
|<div class="editnotice-header" style="font-weight: bold; {{{headerstyle|}}}">{{{header}}}</div>
}}
{{{text|{{{1}}}}}}
}}
}}{{#ifeq:{{FULLROOTPAGENAME}}|Template:Editnotices|{{#switch:{{{expiry|¬}}}
|indefinite
|
|¬ = <!-- Expiry not specified -->
|#default = {{#iferror:{{#time:U|{{{expiry}}}}}
| <!-- Invalid expiry time -->
|{{#ifexpr:{{#time:U|{{{expiry}}}}}-{{#time:U|{{CURRENTTIMESTAMP}}}}>0
| <!-- Notice current -->
|[[Category:Expired editnotices]] <!-- Notice expired -->
}}
}}
}}
}}<noinclude>
{{documentation}}
</noinclude>
9t3x7sjx6d1ojjp7wh26i2afji7w7e3
Module:Template test case
828
2327
15719
2026-09-01T16:38:24Z
Awesome Aasim
683
15719
Scribunto
text/plain
--[[
A module for generating test case templates.
This module incorporates code from the English Wikipedia's "Testcase table"
module,[1] written by Frietjes [2] with contributions by Mr. Stradivarius [3]
and Jackmcbarn,[4] and the English Wikipedia's "Testcase rows" module,[5]
written by Mr. Stradivarius.
The "Testcase table" and "Testcase rows" modules are released under the
CC BY-SA 3.0 License [6] and the GFDL.[7]
License: CC BY-SA 3.0 and the GFDL
Author: Mr. Stradivarius
[1] https://en.wikipedia.org/wiki/Module:Testcase_table
[2] https://en.wikipedia.org/wiki/User:Frietjes
[3] https://en.wikipedia.org/wiki/User:Mr._Stradivarius
[4] https://en.wikipedia.org/wiki/User:Jackmcbarn
[5] https://en.wikipedia.org/wiki/Module:Testcase_rows
[6] https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License
[7] https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License
]]
-- Load required modules
local yesno = require('Module:Yesno')
-- Set constants
local DATA_MODULE = 'Module:Template test case/data'
local SYNTAXHIGHLIGHT_IS_PRESENT = mw.getCurrentFrame():preprocess( "<syntaxhighlight lang=\"text\"></syntaxhighlight>" ) ~= "<syntaxhighlight lang=\"text\"></syntaxhighlight>"
-------------------------------------------------------------------------------
-- Shared methods
-------------------------------------------------------------------------------
local function message(self, key, ...)
-- This method is added to classes that need to deal with messages from the
-- config module.
local msg = self.cfg.msg[key]
if select(1, ...) then
return mw.message.newRawMessage(msg, ...):plain()
else
return msg
end
end
-------------------------------------------------------------------------------
-- Template class
-------------------------------------------------------------------------------
local Template = {}
Template.memoizedMethods = {
-- Names of methods to be memoized in each object. This table should only
-- hold methods with no parameters.
getFullPage = true,
getName = true,
makeHeader = true,
getOutput = true
}
function Template.new(invocationObj, options)
local obj = {}
-- Set input
for k, v in pairs(options or {}) do
if not Template[k] then
obj[k] = v
end
end
obj._invocation = invocationObj
-- Validate input
if not obj.template and not obj.title then
error('no template or title specified', 2)
end
-- Memoize expensive method calls
local memoFuncs = {}
return setmetatable(obj, {
__index = function (t, key)
if Template.memoizedMethods[key] then
local func = memoFuncs[key]
if not func then
local val = Template[key](t)
func = function () return val end
memoFuncs[key] = func
end
return func
else
return Template[key]
end
end
})
end
function Template:getFullPage()
if not self.template then
return self.title.prefixedText
elseif self.template:sub(1, 7) == '#invoke' then
return 'Module' .. self.template:sub(8):gsub('|.*', '')
else
local strippedTemplate, hasColon = self.template:gsub('^:', '', 1)
hasColon = hasColon > 0
local ns = strippedTemplate:match('^(.-):')
ns = ns and mw.site.namespaces[ns]
if ns then
return strippedTemplate
elseif hasColon then
return strippedTemplate -- Main namespace
else
return mw.site.namespaces[10].name .. ':' .. strippedTemplate
end
end
end
function Template:getName()
if self.template then
return self.template
else
return require('Module:Template invocation').name(self.title)
end
end
function Template:makeLink(display)
if display then
return string.format('[[:%s|%s]]', self:getFullPage(), display)
else
return string.format('[[:%s]]', self:getFullPage())
end
end
function Template:makeBraceLink(display)
display = display or self:getName()
local link = self:makeLink(display)
return mw.text.nowiki('{{') .. link .. mw.text.nowiki('}}')
end
function Template:makeHeader()
return self.heading or self:makeBraceLink()
end
function Template:getInvocation(format)
format = format or ''
local invocation = self._invocation:getInvocation{
template = self:getName(),
requireMagicWord = self.requireMagicWord,
}
if format == 'code' or (not SYNTAXHIGHLIGHT_IS_PRESENT and format == 'inline') then
-- if syntaxhighlight not present and inline required use code
invocation = '<code>' .. mw.text.nowiki(invocation) .. '</code>'
elseif format == 'kbd' then
invocation = '<kbd>' .. mw.text.nowiki(invocation) .. '</kbd>'
elseif format == 'plain' then
invocation = mw.text.nowiki(invocation)
elseif format == 'pre' or not SYNTAXHIGHLIGHT_IS_PRESENT then
-- if syntaxhighlight not present and block required use pre
invocation = mw.text.encode(invocation, '&')
invocation = '<pre style="white-space: pre-wrap;">' .. invocation .. '</pre>'
invocation = mw.getCurrentFrame():preprocess(invocation)
else
-- use syntaxhighlight as default if present
invocation = mw.text.encode(invocation, '&')
invocation = mw.getCurrentFrame():preprocess( '<syntaxhighlight lang="wikitext"' .. ( format == 'inline' and ' inline' or '') .. '>' .. invocation .. '</syntaxhighlight>' )
end
return invocation
end
function Template:getOutput()
local protect = require('Module:Protect')
-- calling self._invocation:getOutput{...}
return protect(self._invocation.getOutput)(self._invocation, {
template = self:getName(),
requireMagicWord = self.requireMagicWord,
})
end
-------------------------------------------------------------------------------
-- TestCase class
-------------------------------------------------------------------------------
local TestCase = {}
TestCase.__index = TestCase
TestCase.message = message -- add the message method
TestCase.renderMethods = {
-- Keys in this table are values of the "format" option, values are the
-- method for rendering that format.
columns = 'renderColumns',
rows = 'renderRows',
tablerows = 'renderRows',
inline = 'renderInline',
cells = 'renderCells',
default = 'renderDefault'
}
function TestCase.new(invocationObj, options, cfg)
local obj = setmetatable({}, TestCase)
obj.cfg = cfg
-- Separate general options from template options. Template options are
-- numbered, whereas general options are not.
local generalOptions, templateOptions = {}, {}
for k, v in pairs(options) do
local prefix, num
if type(k) == 'string' then
prefix, num = k:match('^(.-)([1-9][0-9]*)$')
end
if prefix then
num = tonumber(num)
templateOptions[num] = templateOptions[num] or {}
templateOptions[num][prefix] = v
else
generalOptions[k] = v
end
end
-- Set general options
generalOptions.showcode = yesno(generalOptions.showcode)
generalOptions.showheader = yesno(generalOptions.showheader) ~= false
generalOptions.showcaption = yesno(generalOptions.showcaption) ~= false
generalOptions.collapsible = yesno(generalOptions.collapsible)
generalOptions.notcollapsed = yesno(generalOptions.notcollapsed)
generalOptions.wantdiff = yesno(generalOptions.wantdiff)
obj.options = generalOptions
-- Preprocess template args
for num, t in pairs(templateOptions) do
if t.showtemplate ~= nil then
t.showtemplate = yesno(t.showtemplate)
end
end
-- Set up first two template options tables, so that if only the
-- "template3" is specified it isn't made the first template when the
-- the table options array is compressed.
templateOptions[1] = templateOptions[1] or {}
templateOptions[2] = templateOptions[2] or {}
-- Allow the "template" option to override the "template1" option for
-- backwards compatibility with [[Module:Testcase table]].
if generalOptions.template then
templateOptions[1].template = generalOptions.template
end
-- Add default template options
if templateOptions[1].template and not templateOptions[2].template then
templateOptions[2].template = templateOptions[1].template ..
'/' .. obj.cfg.sandboxSubpage
end
if not templateOptions[1].template then
templateOptions[1].title = mw.title.getCurrentTitle().basePageTitle
end
if not templateOptions[2].template then
templateOptions[2].title = templateOptions[1].title:subPageTitle(
obj.cfg.sandboxSubpage
)
end
-- Remove template options for any templates where the showtemplate
-- argument is false. This prevents any output for that template.
for num, t in pairs(templateOptions) do
if t.showtemplate == false then
templateOptions[num] = nil
end
end
-- Check for missing template names.
for num, t in pairs(templateOptions) do
if not t.template and not t.title then
error(obj:message(
'missing-template-option-error',
num, num
), 2)
end
end
-- Compress templateOptions table so we can iterate over it with ipairs.
templateOptions = (function (t)
local nums = {}
for num in pairs(t) do
nums[#nums + 1] = num
end
table.sort(nums)
local ret = {}
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end)(templateOptions)
-- Don't require the __TEMPLATENAME__ magic word for nowiki invocations if
-- there is only one template being output.
if #templateOptions <= 1 then
templateOptions[1].requireMagicWord = false
end
mw.logObject(templateOptions)
-- Make the template objects
obj.templates = {}
for i, options in ipairs(templateOptions) do
table.insert(obj.templates, Template.new(invocationObj, options))
end
-- Add tracking categories. At the moment we are only tracking templates
-- that use any "heading" parameters or an "output" parameter.
obj.categories = {}
for k, v in pairs(options) do
if type(k) == 'string' and k:find('heading') then
obj.categories['Test cases using heading parameters'] = true
elseif k == 'output' then
obj.categories['Test cases using output parameter'] = true
end
end
return obj
end
function TestCase:getTemplateOutput(templateObj)
local output = templateObj:getOutput()
if self.options.resetRefs then
mw.getCurrentFrame():extensionTag('references')
end
return output
end
function TestCase:templateOutputIsEqual()
-- Returns a boolean showing whether all of the template outputs are equal.
-- The random parts of strip markers (see [[Help:Strip markers]]) are
-- removed before comparison. This means a strip marker can contain anything
-- and still be treated as equal, but it solves the problem of otherwise
-- identical wikitext not returning as exactly equal.
local function normaliseOutput(obj)
local out = obj:getOutput()
-- Remove the random parts from strip markers.
out = out:gsub('(\127[^\127]*UNIQ%-%-%l+%-)%x+(%-%-?QINU[^\127]*\127)', '%1%2')
return out
end
local firstOutput = normaliseOutput(self.templates[1])
for i = 2, #self.templates do
local output = normaliseOutput(self.templates[i])
if output ~= firstOutput then
return false
end
end
return true
end
function TestCase:makeCollapsible(s)
local title = self.options.title or self.templates[1]:makeHeader()
if self.options.titlecode then
title = self.templates[1]:getInvocation('kbd')
end
local isEqual = self:templateOutputIsEqual()
local root = mw.html.create('div')
root
:wikitext(mw.getCurrentFrame():extensionTag{
name = 'templatestyles',
args = { src = 'Module:Template test case/styles.css' },
})
:addClass('mw-collapsible')
:addClass('test-case-collapsible')
:addClass(self.options.notcollapsed == false and 'mw-collapsed' or nil)
if self.options.wantdiff then
root
:tag('div')
:addClass(isEqual and 'test-case-collapsible-b1' or 'test-case-collapsible-b2')
:wikitext(title)
:done()
else
if self.options.notcollapsed ~= true or false then
root
:addClass(isEqual and 'mw-collapsed' or nil)
end
root
:tag('div')
:addClass(isEqual and 'test-case-collapsible-b3' or 'test-case-collapsible-b1')
:wikitext(title)
:done()
end
root
:tag('div')
:addClass('mw-collapsible-content')
:newline()
:wikitext(s)
:newline()
return tostring(root)
end
function TestCase:renderColumns()
local root = mw.html.create()
if self.options.showcode then
root
:wikitext(self.templates[1]:getInvocation())
:newline()
end
local tableroot = root:tag('table')
if self.options.showheader then
-- Caption
if self.options.showcaption then
tableroot
:addClass(self.options.class)
:cssText(self.options.style)
:tag('caption')
:wikitext(self.options.caption or self:message('columns-header'))
end
-- Headers
local headerRow = tableroot:tag('tr')
if self.options.rowheader then
-- rowheader is correct here. We need to add another th cell if
-- rowheader is set further down, even if heading0 is missing.
headerRow:tag('th'):wikitext(self.options.heading0)
end
local width
if #self.templates > 0 then
width = tostring(math.floor(100 / #self.templates)) .. '%'
else
width = '100%'
end
for i, obj in ipairs(self.templates) do
headerRow
:tag('th')
:css('width', width)
:wikitext(obj:makeHeader())
end
end
-- Row header
local dataRow = tableroot:tag('tr'):css('vertical-align', 'top')
if self.options.rowheader then
dataRow:tag('th')
:attr('scope', 'row')
:wikitext(self.options.rowheader)
end
-- Template output
for i, obj in ipairs(self.templates) do
if self.options.output == 'nowiki+' then
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
:wikitext('<pre style="white-space: pre-wrap;">')
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
:wikitext('</pre>')
elseif self.options.output == 'nowiki' then
dataRow:tag('td')
:newline()
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
else
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
end
end
return tostring(root)
end
function TestCase:renderRows()
local root = mw.html.create()
if self.options.showcode then
root
:wikitext(self.templates[1]:getInvocation())
:newline()
end
local tableroot = root:tag('table')
tableroot
:addClass(self.options.class)
:cssText(self.options.style)
if self.options.caption then
tableroot
:tag('caption')
:wikitext(self.options.caption)
end
for _, obj in ipairs(self.templates) do
local dataRow = tableroot:tag('tr')
-- Header
if self.options.showheader then
if self.options.format == 'tablerows' then
dataRow:tag('th')
:attr('scope', 'row')
:css('vertical-align', 'top')
:css('text-align', 'left')
:wikitext(obj:makeHeader())
dataRow:tag('td')
:css('vertical-align', 'top')
:css('padding', '0 1em')
:wikitext('→')
else
dataRow:tag('td')
:css('text-align', 'center')
:css('font-weight', 'bold')
:wikitext(obj:makeHeader())
dataRow = tableroot:tag('tr')
end
end
-- Template output
if self.options.output == 'nowiki+' then
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
:wikitext('<pre style="white-space: pre-wrap;">')
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
:wikitext('</pre>')
elseif self.options.output == 'nowiki' then
dataRow:tag('td')
:newline()
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
else
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
end
end
return tostring(root)
end
function TestCase:renderInline()
local arrow = mw.language.getContentLanguage():getArrow('forwards')
local ret = {}
for i, obj in ipairs(self.templates) do
local line = {}
line[#line + 1] = self.options.prefix or '* '
if self.options.showcode then
line[#line + 1] = obj:getInvocation('inline')
line[#line + 1] = ' '
line[#line + 1] = arrow
line[#line + 1] = ' '
end
if self.options.output == 'nowiki+' then
line[#line + 1] = self.options.before or ""
line[#line + 1] = self:getTemplateOutput(obj)
line[#line + 1] = self.options.after or ""
line[#line + 1] = '<pre style="white-space: pre-wrap;">'
line[#line + 1] = mw.text.nowiki(self.options.before or "")
line[#line + 1] = mw.text.nowiki(self:getTemplateOutput(obj))
line[#line + 1] = mw.text.nowiki(self.options.after or "")
line[#line + 1] = '</pre>'
elseif self.options.output == 'nowiki' then
line[#line + 1] = mw.text.nowiki(self.options.before or "")
line[#line + 1] = mw.text.nowiki(self:getTemplateOutput(obj))
line[#line + 1] = mw.text.nowiki(self.options.after or "")
else
line[#line + 1] = self.options.before or ""
line[#line + 1] = self:getTemplateOutput(obj)
line[#line + 1] = self.options.after or ""
end
ret[#ret + 1] = table.concat(line)
end
if self.options.addline then
local line = {}
line[#line + 1] = self.options.prefix or '* '
line[#line + 1] = self.options.addline
ret[#ret + 1] = table.concat(line)
end
return table.concat(ret, '\n')
end
function TestCase:renderCells()
local root = mw.html.create()
local dataRow = root:tag('tr')
dataRow
:css('vertical-align', 'top')
:addClass(self.options.class)
:cssText(self.options.style)
-- Row header
if self.options.rowheader then
dataRow:tag('th')
:attr('scope', 'row')
:newline()
:wikitext(self.options.rowheader or self:message('row-header'))
end
-- Caption
if self.options.showcaption then
dataRow:tag('th')
:attr('scope', 'row')
:newline()
:wikitext(self.options.caption or self:message('columns-header'))
end
-- Show code
if self.options.showcode then
dataRow:tag('td')
:newline()
:wikitext(self:getInvocation('inline'))
end
-- Template output
for i, obj in ipairs(self.templates) do
if self.options.output == 'nowiki+' then
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
:wikitext('<pre style="white-space: pre-wrap;">')
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
:wikitext('</pre>')
elseif self.options.output == 'nowiki' then
dataRow:tag('td')
:newline()
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
else
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
end
end
return tostring(root)
end
function TestCase:renderDefault()
local ret = {}
if self.options.showcode then
ret[#ret + 1] = self.templates[1]:getInvocation()
end
for i, obj in ipairs(self.templates) do
ret[#ret + 1] = '<div style="clear: both;"></div>'
if self.options.showheader then
ret[#ret + 1] = obj:makeHeader()
end
if self.options.output == 'nowiki+' then
ret[#ret + 1] = (self.options.before or "") ..
self:getTemplateOutput(obj) ..
(self.options.after or "") ..
'<pre style="white-space: pre-wrap;">' ..
mw.text.nowiki(self.options.before or "") ..
mw.text.nowiki(self:getTemplateOutput(obj)) ..
mw.text.nowiki(self.options.after or "") .. '</pre>'
elseif self.options.output == 'nowiki' then
ret[#ret + 1] = mw.text.nowiki(self.options.before or "") ..
mw.text.nowiki(self:getTemplateOutput(obj)) ..
mw.text.nowiki(self.options.after or "")
else
ret[#ret + 1] = (self.options.before or "") ..
self:getTemplateOutput(obj) ..
(self.options.after or "")
end
end
return table.concat(ret, '\n\n')
end
function TestCase:__tostring()
local format = self.options.format
local method = format and TestCase.renderMethods[format] or 'renderDefault'
local ret = self[method](self)
if self.options.collapsible then
ret = self:makeCollapsible(ret)
end
for cat in pairs(self.categories) do
ret = ret .. string.format('[[Category:%s]]', cat)
end
return ret
end
-------------------------------------------------------------------------------
-- Nowiki invocation class
-------------------------------------------------------------------------------
local NowikiInvocation = {}
NowikiInvocation.__index = NowikiInvocation
NowikiInvocation.message = message -- Add the message method
function NowikiInvocation.new(invocation, cfg)
local obj = setmetatable({}, NowikiInvocation)
obj.cfg = cfg
invocation = mw.text.unstrip(invocation)
-- Decode HTML entities for <, >, and ". This means that HTML entities in
-- the original code must be escaped as e.g. &lt;, which is unfortunate,
-- but it is the best we can do as the distinction between <, >, " and <,
-- >, " is lost during the original nowiki operation.
invocation = invocation:gsub('<', '<')
invocation = invocation:gsub('>', '>')
invocation = invocation:gsub('"', '"')
obj.invocation = invocation
return obj
end
function NowikiInvocation:getInvocation(options)
local template = options.template:gsub('%%', '%%%%') -- Escape "%" with "%%"
local invocation, count = self.invocation:gsub(
self.cfg.templateNameMagicWordPattern,
template
)
if options.requireMagicWord ~= false and count < 1 then
error(self:message(
'nowiki-magic-word-error',
self.cfg.templateNameMagicWord
))
end
return invocation
end
function NowikiInvocation:getOutput(options)
local invocation = self:getInvocation(options)
return mw.getCurrentFrame():preprocess(invocation)
end
-------------------------------------------------------------------------------
-- Table invocation class
-------------------------------------------------------------------------------
local TableInvocation = {}
TableInvocation.__index = TableInvocation
TableInvocation.message = message -- Add the message method
function TableInvocation.new(invokeArgs, nowikiCode, cfg)
local obj = setmetatable({}, TableInvocation)
obj.cfg = cfg
obj.invokeArgs = invokeArgs
obj.code = nowikiCode
return obj
end
function TableInvocation:getInvocation(options)
if self.code then
local nowikiObj = NowikiInvocation.new(self.code, self.cfg)
return nowikiObj:getInvocation(options)
else
return require('Module:Template invocation').invocation(
options.template,
self.invokeArgs
)
end
end
function TableInvocation:getOutput(options)
if (options.template:sub(1, 7) == '#invoke') then
local moduleCall = mw.text.split(options.template, '|', true)
local args = mw.clone(self.invokeArgs)
table.insert(args, 1, moduleCall[2])
return mw.getCurrentFrame():callParserFunction(moduleCall[1], args)
end
return mw.getCurrentFrame():expandTemplate{
title = options.template,
args = self.invokeArgs
}
end
-------------------------------------------------------------------------------
-- Bridge functions
--
-- These functions translate template arguments into forms that can be accepted
-- by the different classes, and return the results.
-------------------------------------------------------------------------------
local bridge = {}
function bridge.table(args, cfg)
cfg = cfg or mw.loadData(DATA_MODULE)
local options, invokeArgs = {}, {}
for k, v in pairs(args) do
local optionKey = type(k) == 'string' and k:match('^_(.*)$')
if optionKey then
if type(v) == 'string' then
v = v:match('^%s*(.-)%s*$') -- trim whitespace
end
if v ~= '' then
options[optionKey] = v
end
else
invokeArgs[k] = v
end
end
-- Allow passing a nowiki invocation as an option. While this means users
-- have to pass in the code twice, whitespace is preserved and < etc.
-- will work as intended.
local nowikiCode = options.code
options.code = nil
local invocationObj = TableInvocation.new(invokeArgs, nowikiCode, cfg)
local testCaseObj = TestCase.new(invocationObj, options, cfg)
return tostring(testCaseObj)
end
function bridge.nowiki(args, cfg)
cfg = cfg or mw.loadData(DATA_MODULE)
-- Convert args beginning with _ for consistency with the normal bridge
local newArgs = {}
for k, v in pairs(args) do
local normalName = type(k) == "string" and string.match(k, "^_(.*)$")
if normalName then
newArgs[normalName] = v
else
newArgs[k] = v
end
end
local code = newArgs.code or newArgs[1]
local invocationObj = NowikiInvocation.new(code, cfg)
newArgs.code = nil
newArgs[1] = nil
-- Assume we want to see the code as we already passed it in.
newArgs.showcode = newArgs.showcode or true
local testCaseObj = TestCase.new(invocationObj, newArgs, cfg)
return tostring(testCaseObj)
end
-------------------------------------------------------------------------------
-- Exports
-------------------------------------------------------------------------------
local p = {}
function p.main(frame, cfg)
cfg = cfg or mw.loadData(DATA_MODULE)
-- Load the wrapper config, if any.
local wrapperConfig
if frame.getParent then
local title = frame:getParent():getTitle()
local template = title:gsub(cfg.sandboxSubpagePattern, '')
wrapperConfig = cfg.wrappers[template]
end
-- Work out the function we will call, use it to generate the config for
-- Module:Arguments, and use Module:Arguments to find the arguments passed
-- by the user.
local func = wrapperConfig and wrapperConfig.func or 'table'
local userArgs = require('Module:Arguments').getArgs(frame, {
parentOnly = wrapperConfig,
frameOnly = not wrapperConfig,
trim = func ~= 'table',
removeBlanks = func ~= 'table'
})
-- Get default args and build the args table. User-specified args overwrite
-- default args.
local defaultArgs = wrapperConfig and wrapperConfig.args or {}
local args = {}
for k, v in pairs(defaultArgs) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return bridge[func](args, cfg)
end
function p._exportClasses() -- For testing
return {
Template = Template,
TestCase = TestCase,
NowikiInvocation = NowikiInvocation,
TableInvocation = TableInvocation
}
end
return p
saiu0jsc1rxo0bujmsl0mtks0pxrp9l
15720
15719
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Template_test_case]]
15719
Scribunto
text/plain
--[[
A module for generating test case templates.
This module incorporates code from the English Wikipedia's "Testcase table"
module,[1] written by Frietjes [2] with contributions by Mr. Stradivarius [3]
and Jackmcbarn,[4] and the English Wikipedia's "Testcase rows" module,[5]
written by Mr. Stradivarius.
The "Testcase table" and "Testcase rows" modules are released under the
CC BY-SA 3.0 License [6] and the GFDL.[7]
License: CC BY-SA 3.0 and the GFDL
Author: Mr. Stradivarius
[1] https://en.wikipedia.org/wiki/Module:Testcase_table
[2] https://en.wikipedia.org/wiki/User:Frietjes
[3] https://en.wikipedia.org/wiki/User:Mr._Stradivarius
[4] https://en.wikipedia.org/wiki/User:Jackmcbarn
[5] https://en.wikipedia.org/wiki/Module:Testcase_rows
[6] https://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License
[7] https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License
]]
-- Load required modules
local yesno = require('Module:Yesno')
-- Set constants
local DATA_MODULE = 'Module:Template test case/data'
local SYNTAXHIGHLIGHT_IS_PRESENT = mw.getCurrentFrame():preprocess( "<syntaxhighlight lang=\"text\"></syntaxhighlight>" ) ~= "<syntaxhighlight lang=\"text\"></syntaxhighlight>"
-------------------------------------------------------------------------------
-- Shared methods
-------------------------------------------------------------------------------
local function message(self, key, ...)
-- This method is added to classes that need to deal with messages from the
-- config module.
local msg = self.cfg.msg[key]
if select(1, ...) then
return mw.message.newRawMessage(msg, ...):plain()
else
return msg
end
end
-------------------------------------------------------------------------------
-- Template class
-------------------------------------------------------------------------------
local Template = {}
Template.memoizedMethods = {
-- Names of methods to be memoized in each object. This table should only
-- hold methods with no parameters.
getFullPage = true,
getName = true,
makeHeader = true,
getOutput = true
}
function Template.new(invocationObj, options)
local obj = {}
-- Set input
for k, v in pairs(options or {}) do
if not Template[k] then
obj[k] = v
end
end
obj._invocation = invocationObj
-- Validate input
if not obj.template and not obj.title then
error('no template or title specified', 2)
end
-- Memoize expensive method calls
local memoFuncs = {}
return setmetatable(obj, {
__index = function (t, key)
if Template.memoizedMethods[key] then
local func = memoFuncs[key]
if not func then
local val = Template[key](t)
func = function () return val end
memoFuncs[key] = func
end
return func
else
return Template[key]
end
end
})
end
function Template:getFullPage()
if not self.template then
return self.title.prefixedText
elseif self.template:sub(1, 7) == '#invoke' then
return 'Module' .. self.template:sub(8):gsub('|.*', '')
else
local strippedTemplate, hasColon = self.template:gsub('^:', '', 1)
hasColon = hasColon > 0
local ns = strippedTemplate:match('^(.-):')
ns = ns and mw.site.namespaces[ns]
if ns then
return strippedTemplate
elseif hasColon then
return strippedTemplate -- Main namespace
else
return mw.site.namespaces[10].name .. ':' .. strippedTemplate
end
end
end
function Template:getName()
if self.template then
return self.template
else
return require('Module:Template invocation').name(self.title)
end
end
function Template:makeLink(display)
if display then
return string.format('[[:%s|%s]]', self:getFullPage(), display)
else
return string.format('[[:%s]]', self:getFullPage())
end
end
function Template:makeBraceLink(display)
display = display or self:getName()
local link = self:makeLink(display)
return mw.text.nowiki('{{') .. link .. mw.text.nowiki('}}')
end
function Template:makeHeader()
return self.heading or self:makeBraceLink()
end
function Template:getInvocation(format)
format = format or ''
local invocation = self._invocation:getInvocation{
template = self:getName(),
requireMagicWord = self.requireMagicWord,
}
if format == 'code' or (not SYNTAXHIGHLIGHT_IS_PRESENT and format == 'inline') then
-- if syntaxhighlight not present and inline required use code
invocation = '<code>' .. mw.text.nowiki(invocation) .. '</code>'
elseif format == 'kbd' then
invocation = '<kbd>' .. mw.text.nowiki(invocation) .. '</kbd>'
elseif format == 'plain' then
invocation = mw.text.nowiki(invocation)
elseif format == 'pre' or not SYNTAXHIGHLIGHT_IS_PRESENT then
-- if syntaxhighlight not present and block required use pre
invocation = mw.text.encode(invocation, '&')
invocation = '<pre style="white-space: pre-wrap;">' .. invocation .. '</pre>'
invocation = mw.getCurrentFrame():preprocess(invocation)
else
-- use syntaxhighlight as default if present
invocation = mw.text.encode(invocation, '&')
invocation = mw.getCurrentFrame():preprocess( '<syntaxhighlight lang="wikitext"' .. ( format == 'inline' and ' inline' or '') .. '>' .. invocation .. '</syntaxhighlight>' )
end
return invocation
end
function Template:getOutput()
local protect = require('Module:Protect')
-- calling self._invocation:getOutput{...}
return protect(self._invocation.getOutput)(self._invocation, {
template = self:getName(),
requireMagicWord = self.requireMagicWord,
})
end
-------------------------------------------------------------------------------
-- TestCase class
-------------------------------------------------------------------------------
local TestCase = {}
TestCase.__index = TestCase
TestCase.message = message -- add the message method
TestCase.renderMethods = {
-- Keys in this table are values of the "format" option, values are the
-- method for rendering that format.
columns = 'renderColumns',
rows = 'renderRows',
tablerows = 'renderRows',
inline = 'renderInline',
cells = 'renderCells',
default = 'renderDefault'
}
function TestCase.new(invocationObj, options, cfg)
local obj = setmetatable({}, TestCase)
obj.cfg = cfg
-- Separate general options from template options. Template options are
-- numbered, whereas general options are not.
local generalOptions, templateOptions = {}, {}
for k, v in pairs(options) do
local prefix, num
if type(k) == 'string' then
prefix, num = k:match('^(.-)([1-9][0-9]*)$')
end
if prefix then
num = tonumber(num)
templateOptions[num] = templateOptions[num] or {}
templateOptions[num][prefix] = v
else
generalOptions[k] = v
end
end
-- Set general options
generalOptions.showcode = yesno(generalOptions.showcode)
generalOptions.showheader = yesno(generalOptions.showheader) ~= false
generalOptions.showcaption = yesno(generalOptions.showcaption) ~= false
generalOptions.collapsible = yesno(generalOptions.collapsible)
generalOptions.notcollapsed = yesno(generalOptions.notcollapsed)
generalOptions.wantdiff = yesno(generalOptions.wantdiff)
obj.options = generalOptions
-- Preprocess template args
for num, t in pairs(templateOptions) do
if t.showtemplate ~= nil then
t.showtemplate = yesno(t.showtemplate)
end
end
-- Set up first two template options tables, so that if only the
-- "template3" is specified it isn't made the first template when the
-- the table options array is compressed.
templateOptions[1] = templateOptions[1] or {}
templateOptions[2] = templateOptions[2] or {}
-- Allow the "template" option to override the "template1" option for
-- backwards compatibility with [[Module:Testcase table]].
if generalOptions.template then
templateOptions[1].template = generalOptions.template
end
-- Add default template options
if templateOptions[1].template and not templateOptions[2].template then
templateOptions[2].template = templateOptions[1].template ..
'/' .. obj.cfg.sandboxSubpage
end
if not templateOptions[1].template then
templateOptions[1].title = mw.title.getCurrentTitle().basePageTitle
end
if not templateOptions[2].template then
templateOptions[2].title = templateOptions[1].title:subPageTitle(
obj.cfg.sandboxSubpage
)
end
-- Remove template options for any templates where the showtemplate
-- argument is false. This prevents any output for that template.
for num, t in pairs(templateOptions) do
if t.showtemplate == false then
templateOptions[num] = nil
end
end
-- Check for missing template names.
for num, t in pairs(templateOptions) do
if not t.template and not t.title then
error(obj:message(
'missing-template-option-error',
num, num
), 2)
end
end
-- Compress templateOptions table so we can iterate over it with ipairs.
templateOptions = (function (t)
local nums = {}
for num in pairs(t) do
nums[#nums + 1] = num
end
table.sort(nums)
local ret = {}
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end)(templateOptions)
-- Don't require the __TEMPLATENAME__ magic word for nowiki invocations if
-- there is only one template being output.
if #templateOptions <= 1 then
templateOptions[1].requireMagicWord = false
end
mw.logObject(templateOptions)
-- Make the template objects
obj.templates = {}
for i, options in ipairs(templateOptions) do
table.insert(obj.templates, Template.new(invocationObj, options))
end
-- Add tracking categories. At the moment we are only tracking templates
-- that use any "heading" parameters or an "output" parameter.
obj.categories = {}
for k, v in pairs(options) do
if type(k) == 'string' and k:find('heading') then
obj.categories['Test cases using heading parameters'] = true
elseif k == 'output' then
obj.categories['Test cases using output parameter'] = true
end
end
return obj
end
function TestCase:getTemplateOutput(templateObj)
local output = templateObj:getOutput()
if self.options.resetRefs then
mw.getCurrentFrame():extensionTag('references')
end
return output
end
function TestCase:templateOutputIsEqual()
-- Returns a boolean showing whether all of the template outputs are equal.
-- The random parts of strip markers (see [[Help:Strip markers]]) are
-- removed before comparison. This means a strip marker can contain anything
-- and still be treated as equal, but it solves the problem of otherwise
-- identical wikitext not returning as exactly equal.
local function normaliseOutput(obj)
local out = obj:getOutput()
-- Remove the random parts from strip markers.
out = out:gsub('(\127[^\127]*UNIQ%-%-%l+%-)%x+(%-%-?QINU[^\127]*\127)', '%1%2')
return out
end
local firstOutput = normaliseOutput(self.templates[1])
for i = 2, #self.templates do
local output = normaliseOutput(self.templates[i])
if output ~= firstOutput then
return false
end
end
return true
end
function TestCase:makeCollapsible(s)
local title = self.options.title or self.templates[1]:makeHeader()
if self.options.titlecode then
title = self.templates[1]:getInvocation('kbd')
end
local isEqual = self:templateOutputIsEqual()
local root = mw.html.create('div')
root
:wikitext(mw.getCurrentFrame():extensionTag{
name = 'templatestyles',
args = { src = 'Module:Template test case/styles.css' },
})
:addClass('mw-collapsible')
:addClass('test-case-collapsible')
:addClass(self.options.notcollapsed == false and 'mw-collapsed' or nil)
if self.options.wantdiff then
root
:tag('div')
:addClass(isEqual and 'test-case-collapsible-b1' or 'test-case-collapsible-b2')
:wikitext(title)
:done()
else
if self.options.notcollapsed ~= true or false then
root
:addClass(isEqual and 'mw-collapsed' or nil)
end
root
:tag('div')
:addClass(isEqual and 'test-case-collapsible-b3' or 'test-case-collapsible-b1')
:wikitext(title)
:done()
end
root
:tag('div')
:addClass('mw-collapsible-content')
:newline()
:wikitext(s)
:newline()
return tostring(root)
end
function TestCase:renderColumns()
local root = mw.html.create()
if self.options.showcode then
root
:wikitext(self.templates[1]:getInvocation())
:newline()
end
local tableroot = root:tag('table')
if self.options.showheader then
-- Caption
if self.options.showcaption then
tableroot
:addClass(self.options.class)
:cssText(self.options.style)
:tag('caption')
:wikitext(self.options.caption or self:message('columns-header'))
end
-- Headers
local headerRow = tableroot:tag('tr')
if self.options.rowheader then
-- rowheader is correct here. We need to add another th cell if
-- rowheader is set further down, even if heading0 is missing.
headerRow:tag('th'):wikitext(self.options.heading0)
end
local width
if #self.templates > 0 then
width = tostring(math.floor(100 / #self.templates)) .. '%'
else
width = '100%'
end
for i, obj in ipairs(self.templates) do
headerRow
:tag('th')
:css('width', width)
:wikitext(obj:makeHeader())
end
end
-- Row header
local dataRow = tableroot:tag('tr'):css('vertical-align', 'top')
if self.options.rowheader then
dataRow:tag('th')
:attr('scope', 'row')
:wikitext(self.options.rowheader)
end
-- Template output
for i, obj in ipairs(self.templates) do
if self.options.output == 'nowiki+' then
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
:wikitext('<pre style="white-space: pre-wrap;">')
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
:wikitext('</pre>')
elseif self.options.output == 'nowiki' then
dataRow:tag('td')
:newline()
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
else
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
end
end
return tostring(root)
end
function TestCase:renderRows()
local root = mw.html.create()
if self.options.showcode then
root
:wikitext(self.templates[1]:getInvocation())
:newline()
end
local tableroot = root:tag('table')
tableroot
:addClass(self.options.class)
:cssText(self.options.style)
if self.options.caption then
tableroot
:tag('caption')
:wikitext(self.options.caption)
end
for _, obj in ipairs(self.templates) do
local dataRow = tableroot:tag('tr')
-- Header
if self.options.showheader then
if self.options.format == 'tablerows' then
dataRow:tag('th')
:attr('scope', 'row')
:css('vertical-align', 'top')
:css('text-align', 'left')
:wikitext(obj:makeHeader())
dataRow:tag('td')
:css('vertical-align', 'top')
:css('padding', '0 1em')
:wikitext('→')
else
dataRow:tag('td')
:css('text-align', 'center')
:css('font-weight', 'bold')
:wikitext(obj:makeHeader())
dataRow = tableroot:tag('tr')
end
end
-- Template output
if self.options.output == 'nowiki+' then
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
:wikitext('<pre style="white-space: pre-wrap;">')
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
:wikitext('</pre>')
elseif self.options.output == 'nowiki' then
dataRow:tag('td')
:newline()
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
else
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
end
end
return tostring(root)
end
function TestCase:renderInline()
local arrow = mw.language.getContentLanguage():getArrow('forwards')
local ret = {}
for i, obj in ipairs(self.templates) do
local line = {}
line[#line + 1] = self.options.prefix or '* '
if self.options.showcode then
line[#line + 1] = obj:getInvocation('inline')
line[#line + 1] = ' '
line[#line + 1] = arrow
line[#line + 1] = ' '
end
if self.options.output == 'nowiki+' then
line[#line + 1] = self.options.before or ""
line[#line + 1] = self:getTemplateOutput(obj)
line[#line + 1] = self.options.after or ""
line[#line + 1] = '<pre style="white-space: pre-wrap;">'
line[#line + 1] = mw.text.nowiki(self.options.before or "")
line[#line + 1] = mw.text.nowiki(self:getTemplateOutput(obj))
line[#line + 1] = mw.text.nowiki(self.options.after or "")
line[#line + 1] = '</pre>'
elseif self.options.output == 'nowiki' then
line[#line + 1] = mw.text.nowiki(self.options.before or "")
line[#line + 1] = mw.text.nowiki(self:getTemplateOutput(obj))
line[#line + 1] = mw.text.nowiki(self.options.after or "")
else
line[#line + 1] = self.options.before or ""
line[#line + 1] = self:getTemplateOutput(obj)
line[#line + 1] = self.options.after or ""
end
ret[#ret + 1] = table.concat(line)
end
if self.options.addline then
local line = {}
line[#line + 1] = self.options.prefix or '* '
line[#line + 1] = self.options.addline
ret[#ret + 1] = table.concat(line)
end
return table.concat(ret, '\n')
end
function TestCase:renderCells()
local root = mw.html.create()
local dataRow = root:tag('tr')
dataRow
:css('vertical-align', 'top')
:addClass(self.options.class)
:cssText(self.options.style)
-- Row header
if self.options.rowheader then
dataRow:tag('th')
:attr('scope', 'row')
:newline()
:wikitext(self.options.rowheader or self:message('row-header'))
end
-- Caption
if self.options.showcaption then
dataRow:tag('th')
:attr('scope', 'row')
:newline()
:wikitext(self.options.caption or self:message('columns-header'))
end
-- Show code
if self.options.showcode then
dataRow:tag('td')
:newline()
:wikitext(self:getInvocation('inline'))
end
-- Template output
for i, obj in ipairs(self.templates) do
if self.options.output == 'nowiki+' then
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
:wikitext('<pre style="white-space: pre-wrap;">')
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
:wikitext('</pre>')
elseif self.options.output == 'nowiki' then
dataRow:tag('td')
:newline()
:wikitext(mw.text.nowiki(self.options.before or ""))
:wikitext(mw.text.nowiki(self:getTemplateOutput(obj)))
:wikitext(mw.text.nowiki(self.options.after or ""))
else
dataRow:tag('td')
:newline()
:wikitext(self.options.before)
:wikitext(self:getTemplateOutput(obj))
:wikitext(self.options.after)
end
end
return tostring(root)
end
function TestCase:renderDefault()
local ret = {}
if self.options.showcode then
ret[#ret + 1] = self.templates[1]:getInvocation()
end
for i, obj in ipairs(self.templates) do
ret[#ret + 1] = '<div style="clear: both;"></div>'
if self.options.showheader then
ret[#ret + 1] = obj:makeHeader()
end
if self.options.output == 'nowiki+' then
ret[#ret + 1] = (self.options.before or "") ..
self:getTemplateOutput(obj) ..
(self.options.after or "") ..
'<pre style="white-space: pre-wrap;">' ..
mw.text.nowiki(self.options.before or "") ..
mw.text.nowiki(self:getTemplateOutput(obj)) ..
mw.text.nowiki(self.options.after or "") .. '</pre>'
elseif self.options.output == 'nowiki' then
ret[#ret + 1] = mw.text.nowiki(self.options.before or "") ..
mw.text.nowiki(self:getTemplateOutput(obj)) ..
mw.text.nowiki(self.options.after or "")
else
ret[#ret + 1] = (self.options.before or "") ..
self:getTemplateOutput(obj) ..
(self.options.after or "")
end
end
return table.concat(ret, '\n\n')
end
function TestCase:__tostring()
local format = self.options.format
local method = format and TestCase.renderMethods[format] or 'renderDefault'
local ret = self[method](self)
if self.options.collapsible then
ret = self:makeCollapsible(ret)
end
for cat in pairs(self.categories) do
ret = ret .. string.format('[[Category:%s]]', cat)
end
return ret
end
-------------------------------------------------------------------------------
-- Nowiki invocation class
-------------------------------------------------------------------------------
local NowikiInvocation = {}
NowikiInvocation.__index = NowikiInvocation
NowikiInvocation.message = message -- Add the message method
function NowikiInvocation.new(invocation, cfg)
local obj = setmetatable({}, NowikiInvocation)
obj.cfg = cfg
invocation = mw.text.unstrip(invocation)
-- Decode HTML entities for <, >, and ". This means that HTML entities in
-- the original code must be escaped as e.g. &lt;, which is unfortunate,
-- but it is the best we can do as the distinction between <, >, " and <,
-- >, " is lost during the original nowiki operation.
invocation = invocation:gsub('<', '<')
invocation = invocation:gsub('>', '>')
invocation = invocation:gsub('"', '"')
obj.invocation = invocation
return obj
end
function NowikiInvocation:getInvocation(options)
local template = options.template:gsub('%%', '%%%%') -- Escape "%" with "%%"
local invocation, count = self.invocation:gsub(
self.cfg.templateNameMagicWordPattern,
template
)
if options.requireMagicWord ~= false and count < 1 then
error(self:message(
'nowiki-magic-word-error',
self.cfg.templateNameMagicWord
))
end
return invocation
end
function NowikiInvocation:getOutput(options)
local invocation = self:getInvocation(options)
return mw.getCurrentFrame():preprocess(invocation)
end
-------------------------------------------------------------------------------
-- Table invocation class
-------------------------------------------------------------------------------
local TableInvocation = {}
TableInvocation.__index = TableInvocation
TableInvocation.message = message -- Add the message method
function TableInvocation.new(invokeArgs, nowikiCode, cfg)
local obj = setmetatable({}, TableInvocation)
obj.cfg = cfg
obj.invokeArgs = invokeArgs
obj.code = nowikiCode
return obj
end
function TableInvocation:getInvocation(options)
if self.code then
local nowikiObj = NowikiInvocation.new(self.code, self.cfg)
return nowikiObj:getInvocation(options)
else
return require('Module:Template invocation').invocation(
options.template,
self.invokeArgs
)
end
end
function TableInvocation:getOutput(options)
if (options.template:sub(1, 7) == '#invoke') then
local moduleCall = mw.text.split(options.template, '|', true)
local args = mw.clone(self.invokeArgs)
table.insert(args, 1, moduleCall[2])
return mw.getCurrentFrame():callParserFunction(moduleCall[1], args)
end
return mw.getCurrentFrame():expandTemplate{
title = options.template,
args = self.invokeArgs
}
end
-------------------------------------------------------------------------------
-- Bridge functions
--
-- These functions translate template arguments into forms that can be accepted
-- by the different classes, and return the results.
-------------------------------------------------------------------------------
local bridge = {}
function bridge.table(args, cfg)
cfg = cfg or mw.loadData(DATA_MODULE)
local options, invokeArgs = {}, {}
for k, v in pairs(args) do
local optionKey = type(k) == 'string' and k:match('^_(.*)$')
if optionKey then
if type(v) == 'string' then
v = v:match('^%s*(.-)%s*$') -- trim whitespace
end
if v ~= '' then
options[optionKey] = v
end
else
invokeArgs[k] = v
end
end
-- Allow passing a nowiki invocation as an option. While this means users
-- have to pass in the code twice, whitespace is preserved and < etc.
-- will work as intended.
local nowikiCode = options.code
options.code = nil
local invocationObj = TableInvocation.new(invokeArgs, nowikiCode, cfg)
local testCaseObj = TestCase.new(invocationObj, options, cfg)
return tostring(testCaseObj)
end
function bridge.nowiki(args, cfg)
cfg = cfg or mw.loadData(DATA_MODULE)
-- Convert args beginning with _ for consistency with the normal bridge
local newArgs = {}
for k, v in pairs(args) do
local normalName = type(k) == "string" and string.match(k, "^_(.*)$")
if normalName then
newArgs[normalName] = v
else
newArgs[k] = v
end
end
local code = newArgs.code or newArgs[1]
local invocationObj = NowikiInvocation.new(code, cfg)
newArgs.code = nil
newArgs[1] = nil
-- Assume we want to see the code as we already passed it in.
newArgs.showcode = newArgs.showcode or true
local testCaseObj = TestCase.new(invocationObj, newArgs, cfg)
return tostring(testCaseObj)
end
-------------------------------------------------------------------------------
-- Exports
-------------------------------------------------------------------------------
local p = {}
function p.main(frame, cfg)
cfg = cfg or mw.loadData(DATA_MODULE)
-- Load the wrapper config, if any.
local wrapperConfig
if frame.getParent then
local title = frame:getParent():getTitle()
local template = title:gsub(cfg.sandboxSubpagePattern, '')
wrapperConfig = cfg.wrappers[template]
end
-- Work out the function we will call, use it to generate the config for
-- Module:Arguments, and use Module:Arguments to find the arguments passed
-- by the user.
local func = wrapperConfig and wrapperConfig.func or 'table'
local userArgs = require('Module:Arguments').getArgs(frame, {
parentOnly = wrapperConfig,
frameOnly = not wrapperConfig,
trim = func ~= 'table',
removeBlanks = func ~= 'table'
})
-- Get default args and build the args table. User-specified args overwrite
-- default args.
local defaultArgs = wrapperConfig and wrapperConfig.args or {}
local args = {}
for k, v in pairs(defaultArgs) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return bridge[func](args, cfg)
end
function p._exportClasses() -- For testing
return {
Template = Template,
TestCase = TestCase,
NowikiInvocation = NowikiInvocation,
TableInvocation = TableInvocation
}
end
return p
saiu0jsc1rxo0bujmsl0mtks0pxrp9l
Module:Template test case/data
828
2328
15721
2019-01-24T21:23:12Z
MusikAnimal
316
Protected "[[Module:Template test case/data]]": [[Wikipedia:High-risk templates|High-risk module]] ([Edit=Require extended confirmed access] (indefinite))
15721
Scribunto
text/plain
-- This module processes configuration data for use in
-- [[Module:Template test case]]. It is loaded from the main module with
-- mw.loadData.
local cfg = require('Module:Template test case/config')
local function escapePattern(s)
s = s:gsub('%p', '%%%0')
return s
end
-- Escape config items that need to be used as patterns. Doing it here is more
-- efficient, as mw.loadData saves them from having to be computed for every
-- test case on a page.
cfg.templateNameMagicWordPattern = escapePattern(cfg.templateNameMagicWord)
cfg.sandboxSubpagePattern = '/' .. escapePattern(cfg.sandboxSubpage) .. '$'
return cfg
dmdplkk88kmnriu7s6pk3hhob51o8xa
15722
15721
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Template_test_case/data]]
15721
Scribunto
text/plain
-- This module processes configuration data for use in
-- [[Module:Template test case]]. It is loaded from the main module with
-- mw.loadData.
local cfg = require('Module:Template test case/config')
local function escapePattern(s)
s = s:gsub('%p', '%%%0')
return s
end
-- Escape config items that need to be used as patterns. Doing it here is more
-- efficient, as mw.loadData saves them from having to be computed for every
-- test case on a page.
cfg.templateNameMagicWordPattern = escapePattern(cfg.templateNameMagicWord)
cfg.sandboxSubpagePattern = '/' .. escapePattern(cfg.sandboxSubpage) .. '$'
return cfg
dmdplkk88kmnriu7s6pk3hhob51o8xa
Module:Template test case/config
828
2329
15723
2023-10-17T16:42:52Z
Aidan9382
684
Fix typo in comment (per edit request)
15723
Scribunto
text/plain
-------------------------------------------------------------------------------
-- Module:Template test case/config
-- This module holds configuration data for [[Module:Template test case]].
-------------------------------------------------------------------------------
return {
-------------------------------------------------------------------------------
-- Options
-------------------------------------------------------------------------------
-- The magic word used in place of the template name when making nowiki
-- invocations.
templateNameMagicWord = '__TEMPLATENAME__',
-- The subpage that sandboxes are typically stored on. Used when loading
-- wrapper template config and when guessing the sandbox template name.
sandboxSubpage = 'sandbox',
-------------------------------------------------------------------------------
-- Messages
-------------------------------------------------------------------------------
msg = {
-- The default header for test cases rendered in columns.
['columns-header'] = 'Side by side comparison',
-- The error message to use if a template option is missing.
-- $1 - the number of the missing template option.
['missing-template-option-error'] = "one or more options ending in '$1' " ..
"were detected, but no 'template$1' option was found",
-- The error message to use if a nowiki invocation is used but the template
-- name magic word is not found.
-- $1 - the value of the template name magic word
['nowiki-magic-word-error'] = "the template invocation must include '$1' in " ..
"place of the template name",
},
-------------------------------------------------------------------------------
-- Wrapper template config.
-- The wrapper template config is a table with wrapper template names as keys,
-- and subtables containing two fields:
-- func - the function name to be used with that template. This must be a
-- function exported by the main module. This is optional: the default
-- value is "table".
-- args - a table of default arguments to be used with that template. This is
-- is optional.
-------------------------------------------------------------------------------
wrappers = {
['Template:Test case'] = {},
['Template:Testcase table'] = {
args = {_format = 'columns'}
},
['Template:Testcase rows'] = {
args = {_format = 'rows'}
},
['Template:Test case nowiki'] = {
func = 'nowiki'
},
['Template:Nowiki template demo'] = {
func = 'nowiki',
args = {showheader = false, showtemplate2 = false}
},
['Template:Collapsible test case'] = {
args = {_collapsible = true}
},
['Template:Collapsible 2 test case'] = {
args = {_collapsible = true, _wantdiff = true}
},
['Template:Inline test case'] = {
args = {_format = 'inline', _showcode = true}
},
},
-------------------------------------------------------------------------------
-- End config
-------------------------------------------------------------------------------
}
ls9rvym0pi5xrbhs2q9kgqx1nenxr3g
15724
15723
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Template_test_case/config]]
15723
Scribunto
text/plain
-------------------------------------------------------------------------------
-- Module:Template test case/config
-- This module holds configuration data for [[Module:Template test case]].
-------------------------------------------------------------------------------
return {
-------------------------------------------------------------------------------
-- Options
-------------------------------------------------------------------------------
-- The magic word used in place of the template name when making nowiki
-- invocations.
templateNameMagicWord = '__TEMPLATENAME__',
-- The subpage that sandboxes are typically stored on. Used when loading
-- wrapper template config and when guessing the sandbox template name.
sandboxSubpage = 'sandbox',
-------------------------------------------------------------------------------
-- Messages
-------------------------------------------------------------------------------
msg = {
-- The default header for test cases rendered in columns.
['columns-header'] = 'Side by side comparison',
-- The error message to use if a template option is missing.
-- $1 - the number of the missing template option.
['missing-template-option-error'] = "one or more options ending in '$1' " ..
"were detected, but no 'template$1' option was found",
-- The error message to use if a nowiki invocation is used but the template
-- name magic word is not found.
-- $1 - the value of the template name magic word
['nowiki-magic-word-error'] = "the template invocation must include '$1' in " ..
"place of the template name",
},
-------------------------------------------------------------------------------
-- Wrapper template config.
-- The wrapper template config is a table with wrapper template names as keys,
-- and subtables containing two fields:
-- func - the function name to be used with that template. This must be a
-- function exported by the main module. This is optional: the default
-- value is "table".
-- args - a table of default arguments to be used with that template. This is
-- is optional.
-------------------------------------------------------------------------------
wrappers = {
['Template:Test case'] = {},
['Template:Testcase table'] = {
args = {_format = 'columns'}
},
['Template:Testcase rows'] = {
args = {_format = 'rows'}
},
['Template:Test case nowiki'] = {
func = 'nowiki'
},
['Template:Nowiki template demo'] = {
func = 'nowiki',
args = {showheader = false, showtemplate2 = false}
},
['Template:Collapsible test case'] = {
args = {_collapsible = true}
},
['Template:Collapsible 2 test case'] = {
args = {_collapsible = true, _wantdiff = true}
},
['Template:Inline test case'] = {
args = {_format = 'inline', _showcode = true}
},
},
-------------------------------------------------------------------------------
-- End config
-------------------------------------------------------------------------------
}
ls9rvym0pi5xrbhs2q9kgqx1nenxr3g
Module:Template invocation
828
2330
15725
2024-09-05T20:21:20Z
Pppery
320
Update name call to fix a few edge cases per request
15725
Scribunto
text/plain
-- This module provides functions for making MediaWiki template invocations.
local checkType = require('libraryUtil').checkType
local p = {}
------------------------------------------------------------------------
-- Name: p.name
-- Purpose: Find a template invocation name from a page name or a
-- mw.title object.
-- Description: This function detects whether a string or a mw.title
-- object has been passed in, and uses that to find a
-- template name as it is used in template invocations.
-- Parameters: title - full page name or mw.title object for the
-- template (string or mw.title object)
-- Returns: String
------------------------------------------------------------------------
function p.name(title)
if type(title) == 'string' then
title = mw.title.new(title)
if not title or #title.prefixedText == 0 or #title.interwiki > 0 then
error("invalid title in parameter #1 of function 'name'", 2)
end
elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then
error("parameter #1 of function 'name' must be a string or a mw.title object", 2)
end
if title.namespace == 10 then
local text = title.text
local check = mw.title.new(text, 10)
-- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo".
return check and mw.title.equals(title, check) and text or title.prefixedText
elseif title.namespace == 0 then
return ':' .. title.prefixedText
else
return title.prefixedText
end
end
------------------------------------------------------------------------
-- Name: p.invocation
-- Purpose: Construct a MediaWiki template invocation.
-- Description: This function makes a template invocation from the
-- name and the arguments given. Note that it isn't
-- perfect: we have no way of knowing what whitespace was
-- in the original invocation, the named parameters will be
-- alphabetically sorted, and any parameters with duplicate keys
-- will be removed.
-- Parameters: name - the template name, formatted as it will appear
-- in the invocation. (string)
-- args - a table of template arguments. (table)
-- format - formatting options. (string, optional)
-- Set to "nowiki" to escape, curly braces, pipes and
-- equals signs with their HTML entities. The default
-- is unescaped.
-- Returns: String
------------------------------------------------------------------------
function p.invocation(name, args, format)
checkType('invocation', 1, name, 'string')
checkType('invocation', 2, args, 'table')
checkType('invocation', 3, format, 'string', true)
-- Validate the args table and make a copy to work from. We need to
-- make a copy of the table rather than just using the original, as
-- some of the values may be erased when building the invocation.
local invArgs = {}
for k, v in pairs(args) do
local typek = type(k)
local typev = type(v)
if typek ~= 'string' and typek ~= 'number'
or typev ~= 'string' and typev ~= 'number'
then
error("invalid arguments table in parameter #2 of " ..
"'invocation' (keys and values must be strings or numbers)", 2)
end
invArgs[k] = v
end
-- Get the separators to use.
local seps = {
openb = '{{',
closeb = '}}',
pipe = '|',
equals = '='
}
if format == 'nowiki' then
for k, v in pairs(seps) do
seps[k] = mw.text.nowiki(v)
end
end
-- Build the invocation body with numbered args first, then named.
local ret = {}
ret[#ret + 1] = seps.openb
ret[#ret + 1] = name
for k, v in ipairs(invArgs) do
if type(v) == 'string' and v:find('=', 1, true) then
-- Likely something like 1=foo=bar which needs to be displayed as a named arg.
else
ret[#ret + 1] = seps.pipe
ret[#ret + 1] = v
invArgs[k] = nil -- Erase the key so that we don't add the value twice
end
end
local keys = {} -- sort parameter list; better than arbitrary order
for k, _ in pairs(invArgs) do
keys[#keys + 1] = k
end
table.sort(keys,
function (a, b)
-- Sort with keys of type number first, then string.
if type(a) == type(b) then
return a < b
elseif type(a) == 'number' then
return true
end
end
)
local maybeSpace = '' -- First named parameter should not be separated by a space
for _, v in ipairs(keys) do -- Add named args based on sorted parameter list
ret[#ret + 1] = maybeSpace .. seps.pipe
ret[#ret + 1] = tostring(v)
ret[#ret + 1] = seps.equals
ret[#ret + 1] = invArgs[v]
maybeSpace = ' '
end
ret[#ret + 1] = seps.closeb
return table.concat(ret)
end
return p
2md7jjxjwpjhfzpzbxftnmbmqvfpwv0
15726
15725
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Template_invocation]]
15725
Scribunto
text/plain
-- This module provides functions for making MediaWiki template invocations.
local checkType = require('libraryUtil').checkType
local p = {}
------------------------------------------------------------------------
-- Name: p.name
-- Purpose: Find a template invocation name from a page name or a
-- mw.title object.
-- Description: This function detects whether a string or a mw.title
-- object has been passed in, and uses that to find a
-- template name as it is used in template invocations.
-- Parameters: title - full page name or mw.title object for the
-- template (string or mw.title object)
-- Returns: String
------------------------------------------------------------------------
function p.name(title)
if type(title) == 'string' then
title = mw.title.new(title)
if not title or #title.prefixedText == 0 or #title.interwiki > 0 then
error("invalid title in parameter #1 of function 'name'", 2)
end
elseif type(title) ~= 'table' or type(title.getContent) ~= 'function' then
error("parameter #1 of function 'name' must be a string or a mw.title object", 2)
end
if title.namespace == 10 then
local text = title.text
local check = mw.title.new(text, 10)
-- Exclude the prefix, unless we have something like "Template:Category:Foo", which can't be abbreviated to "Category:Foo".
return check and mw.title.equals(title, check) and text or title.prefixedText
elseif title.namespace == 0 then
return ':' .. title.prefixedText
else
return title.prefixedText
end
end
------------------------------------------------------------------------
-- Name: p.invocation
-- Purpose: Construct a MediaWiki template invocation.
-- Description: This function makes a template invocation from the
-- name and the arguments given. Note that it isn't
-- perfect: we have no way of knowing what whitespace was
-- in the original invocation, the named parameters will be
-- alphabetically sorted, and any parameters with duplicate keys
-- will be removed.
-- Parameters: name - the template name, formatted as it will appear
-- in the invocation. (string)
-- args - a table of template arguments. (table)
-- format - formatting options. (string, optional)
-- Set to "nowiki" to escape, curly braces, pipes and
-- equals signs with their HTML entities. The default
-- is unescaped.
-- Returns: String
------------------------------------------------------------------------
function p.invocation(name, args, format)
checkType('invocation', 1, name, 'string')
checkType('invocation', 2, args, 'table')
checkType('invocation', 3, format, 'string', true)
-- Validate the args table and make a copy to work from. We need to
-- make a copy of the table rather than just using the original, as
-- some of the values may be erased when building the invocation.
local invArgs = {}
for k, v in pairs(args) do
local typek = type(k)
local typev = type(v)
if typek ~= 'string' and typek ~= 'number'
or typev ~= 'string' and typev ~= 'number'
then
error("invalid arguments table in parameter #2 of " ..
"'invocation' (keys and values must be strings or numbers)", 2)
end
invArgs[k] = v
end
-- Get the separators to use.
local seps = {
openb = '{{',
closeb = '}}',
pipe = '|',
equals = '='
}
if format == 'nowiki' then
for k, v in pairs(seps) do
seps[k] = mw.text.nowiki(v)
end
end
-- Build the invocation body with numbered args first, then named.
local ret = {}
ret[#ret + 1] = seps.openb
ret[#ret + 1] = name
for k, v in ipairs(invArgs) do
if type(v) == 'string' and v:find('=', 1, true) then
-- Likely something like 1=foo=bar which needs to be displayed as a named arg.
else
ret[#ret + 1] = seps.pipe
ret[#ret + 1] = v
invArgs[k] = nil -- Erase the key so that we don't add the value twice
end
end
local keys = {} -- sort parameter list; better than arbitrary order
for k, _ in pairs(invArgs) do
keys[#keys + 1] = k
end
table.sort(keys,
function (a, b)
-- Sort with keys of type number first, then string.
if type(a) == type(b) then
return a < b
elseif type(a) == 'number' then
return true
end
end
)
local maybeSpace = '' -- First named parameter should not be separated by a space
for _, v in ipairs(keys) do -- Add named args based on sorted parameter list
ret[#ret + 1] = maybeSpace .. seps.pipe
ret[#ret + 1] = tostring(v)
ret[#ret + 1] = seps.equals
ret[#ret + 1] = invArgs[v]
maybeSpace = ' '
end
ret[#ret + 1] = seps.closeb
return table.concat(ret)
end
return p
2md7jjxjwpjhfzpzbxftnmbmqvfpwv0
Tempilet:Nowiki template demo
10
2331
15727
2016-07-15T04:28:07Z
Mr. Stradivarius
672
create wrapper template for [[Module:Template test case]]
15727
wikitext
text/x-wiki
<includeonly>{{#invoke:Template test case|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
tqcbtoi20hh04qz7tcyj9c81ibksvas
15728
15727
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Nowiki_template_demo]]
15727
wikitext
text/x-wiki
<includeonly>{{#invoke:Template test case|main}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
tqcbtoi20hh04qz7tcyj9c81ibksvas
Module:Transclusion count/data/A
828
2332
15731
2026-10-18T05:08:36Z
Ahechtbot
346
[[Wikipedia:BOT|Bot]]: Updated page.
15731
Scribunto
text/plain
return {
["A-Class"] = 6200,
["A.k.a."] = 4400,
["A2r"] = 2100,
["ACArt"] = 3800,
["AFB_game_box_end"] = 2500,
["AFB_game_box_start"] = 2500,
["AFB_game_box_start/styles.css"] = 2500,
["AFC_comment"] = 13000,
["AFC_submission"] = 15000,
["AFC_submission_category_header"] = 4600,
["AFD_help"] = 176000,
["AFD_help/styles.css"] = 176000,
["AFI/Picture_box/show_picture"] = 4200,
["AFI_film"] = 10000,
["AFL"] = 2200,
["AFL_Car"] = 2700,
["AFL_Col"] = 2600,
["AFL_Ess"] = 2600,
["AFL_Gee"] = 2600,
["AFL_Haw"] = 2400,
["AFL_Mel"] = 2800,
["AFL_NM"] = 2300,
["AFL_Ric"] = 2500,
["AFL_StK"] = 2800,
["AFL_Tables"] = 12000,
["AFL_Year"] = 2800,
["AFL_player"] = 2100,
["AI-generated"] = 11000,
["ALG"] = 2700,
["AMARB"] = 4400,
["AM_station_data"] = 4400,
["ARBPIA"] = 3200,
["ARE"] = 2200,
["ARG"] = 7000,
["ARM"] = 2100,
["ASIN"] = 5000,
["ATP"] = 5200,
["AUD"] = 2000,
["AUS"] = 15000,
["AUT"] = 10000,
["AZE"] = 2900,
["A_note"] = 6700,
["A_or_an"] = 12000,
["Aan"] = 62000,
["Abbr"] = 559000,
["Abbreviation"] = 934000,
["Abbreviation_linked"] = 17000,
["Abbrlink"] = 17000,
["Abot"] = 32000,
["About"] = 171000,
["Absolute_page_title"] = 4700,
["Acad"] = 6700,
["Access_icon"] = 3300,
["According_to_whom"] = 4600,
["AchievementTable"] = 11000,
["AdSenseSummary"] = 12000,
["Added"] = 2900,
["Adjacent_communities"] = 30000,
["Adjacent_stations"] = 42000,
["Adjacent_stations/styles.css"] = 42000,
["Adjacent_stations_doc"] = 2400,
["Adjstn"] = 2500,
["Admin"] = 15000,
["Admin_help/helped"] = 2200,
["Administrator_note"] = 6900,
["Administrators'_noticeboard_archives_all"] = 2100,
["Administrators'_noticeboard_navbox_all"] = 2100,
["Adminnote"] = 3600,
["Advert"] = 8400,
["Aet"] = 7200,
["AfC_accept/C_percentage"] = 6500,
["AfC_age_category"] = 3200,
["AfC_comment"] = 26000,
["AfC_date_category"] = 273000,
["AfC_status/age"] = 3200,
["AfC_status/backlog"] = 3800,
["AfC_submission"] = 47000,
["AfC_submission/comments"] = 33000,
["AfC_submission/declined"] = 33000,
["AfC_submission/draft"] = 12000,
["AfC_submission/helptools"] = 45000,
["AfC_submission/pending"] = 3200,
["AfC_submission/styles.css"] = 47000,
["AfC_submission/tools"] = 3200,
["AfC_submission_category_header"] = 6900,
["AfC_submission_category_header/day"] = 6600,
["AfC_submission_category_header/td"] = 6600,
["AfC_talk/C_percentage"] = 6500,
["AfC_topic"] = 31000,
["AfD_categories_horizontal_shortnames"] = 5500,
["AfD_count_link"] = 4100,
["Afd-merged-from"] = 11000,
["Afd_bottom/old"] = 412000,
["Afd_top/old"] = 412000,
["Afd_top/old/styles.css"] = 412000,
["Africa_topic"] = 6600,
["After_extra_time"] = 7200,
["Age"] = 29000,
["Age_in_days"] = 5800,
["Age_in_years,_months,_weeks_and_days"] = 5400,
["Age_in_years,_months_and_days"] = 20000,
["Age_in_years_and_days"] = 5100,
["Age_in_years_and_days_nts"] = 5000,
["Agree"] = 2600,
["Ahnentafel"] = 7700,
["Ahnentafel/styles.css"] = 7700,
["Air_Force_Historical_Research_Agency"] = 4400,
["Air_force"] = 7600,
["Air_force/core"] = 7600,
["Aircontent"] = 9400,
["Aircraft_specs"] = 12000,
["Aircraft_specs/convert"] = 12000,
["Aircraft_specs/eng"] = 12000,
["Aircraft_specs/length"] = 12000,
["Aircraft_specs/range"] = 12000,
["Aircraft_specs/speed"] = 12000,
["Airport-dest-list"] = 3400,
["Airport_codes"] = 13000,
["Airport_destination_list"] = 4800,
["Aka"] = 2100,
["Al"] = 83000,
["Album"] = 3800,
["Album_chart"] = 37000,
["Album_cover_fur"] = 53000,
["Album_label_category"] = 2400,
["Album_label_category/core"] = 2400,
["Album_ratings"] = 29000,
["Album_reviews"] = 2300,
["Albums_category"] = 25000,
["Albums_category/core"] = 25000,
["Albums_category/type/default"] = 25000,
["Align"] = 214000,
["Aligned_table"] = 14000,
["AllIrelandByCountyCatNav"] = 3200,
["AllMusic"] = 77000,
["All_Ireland_by_county_category_navigation"] = 3200,
["All_plot"] = 2500,
["Allcaps"] = 11000,
["Allcaps/styles.css"] = 11000,
["Allmusic"] = 11000,
["Allow_wrap"] = 6300,
["Already_done"] = 3000,
["Also"] = 2300,
["Also_known_as"] = 6800,
["Alternating_rows_table"] = 2400,
["Alternating_rows_table/styles.css"] = 2400,
["Alumni"] = 3200,
["Always_substitute"] = 9300,
["Ambox"] = 1500000,
["Ambox_globe"] = 45000,
["Ambox_globe_current_red"] = 43000,
["American_English"] = 24000,
["American_football_roster/Footer"] = 4000,
["American_football_roster/Header"] = 4000,
["American_football_roster/Player"] = 4000,
["Americanfootballbox"] = 4800,
["Anarchism_announcements"] = 4100,
["Anarchism_announcements/shell"] = 4100,
["Anbl"] = 3600,
["Anchor"] = 85000,
["Angbr"] = 2800,
["Angbr_IPA"] = 2400,
["Angle_bracket"] = 4000,
["Anglican_navbox_titlestyle"] = 14000,
["Anglicise_rank"] = 554000,
["Animal_tasks"] = 38000,
["Anime_News_Network"] = 13000,
["Anl"] = 2300,
["Annotated_biography_link"] = 3600,
["Annotated_link"] = 17000,
["Anonblock"] = 35000,
["Antonym_of_(dis)establish"] = 16000,
["Apostrophe"] = 100000,
["Apostrophe+s"] = 8600,
["Arbitration_Committee_candidate/data"] = 107000,
["Archive"] = 349000,
["Archive_bottom"] = 71000,
["Archive_box"] = 17000,
["Archive_list"] = 98000,
["Archive_top"] = 51000,
["Archive_top/styles.css"] = 51000,
["Archive_top_green"] = 17000,
["Archive_top_green/styles.css"] = 17000,
["Archive_top_red"] = 7100,
["Archive_top_red/styles.css"] = 7100,
["Archivebottom"] = 3700,
["Archivebox"] = 2200,
["Archives"] = 56000,
["Archivetop"] = 3700,
["Army"] = 18000,
["Army/core"] = 18000,
["Art_UK_bio"] = 2600,
["Art_UK_bio/plural"] = 2600,
["Article"] = 3000,
["ArticleHistory"] = 27000,
["Article_for_improvement_banner/Picture_box"] = 4600,
["Article_for_improvement_banner/Picture_box/show_picture"] = 4200,
["Article_history"] = 53000,
["Article_links"] = 524000,
["Article_links_2"] = 83000,
["Article_or_page"] = 6600,
["Article_stub_box"] = 2370000,
["Articles_by_Importance"] = 12000,
["Articles_by_Quality"] = 37000,
["Articles_for_creation_links"] = 7000,
["As_of"] = 93000,
["As_written"] = 2600,
["Asbox"] = 2350000,
["Asia_topic"] = 11000,
["Asof"] = 6100,
["Assessed-Class"] = 18000,
["Assignment"] = 6000,
["Assignment_milestones"] = 5300,
["Association_of_Tennis_Professionals"] = 5200,
["AstDys"] = 2800,
["Asterisk"] = 3700,
["Astro_list_redirect_comment"] = 2000,
["AthAbbr"] = 7900,
["Atnhead"] = 6000,
["Atop"] = 7500,
["Atopg"] = 16000,
["Atopr"] = 6800,
["Attached_KML"] = 14000,
["Au"] = 6500,
["AuEduNewbie"] = 2700,
["Audio"] = 42000,
["Audio_sample"] = 3100,
["AustralianFootball"] = 9000,
["Australian_Dictionary_of_Biography"] = 2300,
["Australian_English"] = 4000,
["Australian_Football_League_team"] = 2200,
["Australian_dollar"] = 2300,
["Australian_party_style"] = 6700,
["Australian_politics/name"] = 4700,
["Australian_politics/party_colours"] = 6900,
["Austria_metadata_Wikidata"] = 2100,
["Austria_population_Wikidata"] = 2100,
["Aut"] = 7700,
["Authority_control"] = 2300000,
["Authority_control_(arts)"] = 16000,
["Auto_link"] = 74000,
["Autobiography"] = 2200,
["Autolink"] = 44000,
["Automated_tools"] = 84000,
["Automated_tools/core"] = 84000,
["Automatic_archive_navigator"] = 43000,
["Automatic_archives_blurb"] = 20000,
["Automatic_category_TOC"] = 864000,
["Automatic_category_TOC/core"] = 863000,
["Automatic_taxobox"] = 105000,
["Automatically_generated"] = 2000,
["Aviation_accidents_and_incidents"] = 2800,
["Avoid_wrap"] = 6400,
["Awaiting_admin"] = 3100,
["Awaitingadmin"] = 3000,
["Award2"] = 2600,
["Awards"] = 2600,
["Awards_table"] = 6300,
["Awards_table/styles.css"] = 6300,
["Ayd"] = 4800,
["Aye"] = 14000,
["Module:A_or_an"] = 12000,
["Module:A_or_an/words"] = 12000,
["Module:About"] = 172000,
["Module:Adjacent_stations"] = 80000,
["Module:Adjacent_stations/Amtrak"] = 2900,
["Module:Adjacent_stations/Deutsche_Bahn"] = 2100,
["Module:Adjacent_stations/Indian_Railways"] = 3800,
["Module:Adjacent_stations/JR_East"] = 2700,
["Module:Adjacent_stations/i18n"] = 80000,
["Module:Administrators'_noticeboard_archives"] = 2200,
["Module:Administrators'_noticeboard_archives/styles.css"] = 2200,
["Module:AfC_submission_catcheck"] = 267000,
["Module:AfC_topic"] = 31000,
["Module:Age"] = 1430000,
["Module:Ahnentafel"] = 7700,
["Module:Airport_destination_list"] = 4800,
["Module:Aligned_dates_list"] = 2800,
["Module:Aligned_table"] = 14000,
["Module:All_Ireland_by_county_category_navigation"] = 3400,
["Module:Anchor"] = 85000,
["Module:Ancient_Egypt_era"] = 2600,
["Module:Ancient_Egypt_era/data"] = 2600,
["Module:Ancient_Egypt_kings"] = 2600,
["Module:Ancient_Egypt_kings/data"] = 2600,
["Module:Ancient_Olympiads"] = 2600,
["Module:Ancient_Olympiads/data"] = 2600,
["Module:Annotated_link"] = 20000,
["Module:Archive"] = 349000,
["Module:Archive/config"] = 349000,
["Module:Archive_list"] = 101000,
["Module:Archives/bots"] = 36000,
["Module:Arguments"] = 37900000,
["Module:Armenian"] = 2600,
["Module:Arrowverse_redirect_category_handler"] = 2100,
["Module:Article_history"] = 53000,
["Module:Article_history/Category"] = 53000,
["Module:Article_history/config"] = 53000,
["Module:Article_history/styles.css"] = 53000,
["Module:Article_stub_box"] = 2370000,
["Module:Article_stub_box/styles.css"] = 2370000,
["Module:Articles_by_class"] = 49000,
["Module:Asbox_stubtree"] = 42000,
["Module:Attached_KML"] = 14000,
["Module:Attached_KML/styles.css"] = 14000,
["Module:Australian_place_map"] = 16000,
["Module:Authority_control"] = 2320000,
["Module:Authority_control/auxiliary"] = 719000,
["Module:Authority_control/config"] = 2320000,
["Module:Auto_date_formatter"] = 16000,
["Module:Automated_taxobox"] = 504000,
["Module:Autotaxobox"] = 657000,
}
12rnzj7z0decnstmxqr88go0q3mttl5
15732
15731
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/A]]
15731
Scribunto
text/plain
return {
["A-Class"] = 6200,
["A.k.a."] = 4400,
["A2r"] = 2100,
["ACArt"] = 3800,
["AFB_game_box_end"] = 2500,
["AFB_game_box_start"] = 2500,
["AFB_game_box_start/styles.css"] = 2500,
["AFC_comment"] = 13000,
["AFC_submission"] = 15000,
["AFC_submission_category_header"] = 4600,
["AFD_help"] = 176000,
["AFD_help/styles.css"] = 176000,
["AFI/Picture_box/show_picture"] = 4200,
["AFI_film"] = 10000,
["AFL"] = 2200,
["AFL_Car"] = 2700,
["AFL_Col"] = 2600,
["AFL_Ess"] = 2600,
["AFL_Gee"] = 2600,
["AFL_Haw"] = 2400,
["AFL_Mel"] = 2800,
["AFL_NM"] = 2300,
["AFL_Ric"] = 2500,
["AFL_StK"] = 2800,
["AFL_Tables"] = 12000,
["AFL_Year"] = 2800,
["AFL_player"] = 2100,
["AI-generated"] = 11000,
["ALG"] = 2700,
["AMARB"] = 4400,
["AM_station_data"] = 4400,
["ARBPIA"] = 3200,
["ARE"] = 2200,
["ARG"] = 7000,
["ARM"] = 2100,
["ASIN"] = 5000,
["ATP"] = 5200,
["AUD"] = 2000,
["AUS"] = 15000,
["AUT"] = 10000,
["AZE"] = 2900,
["A_note"] = 6700,
["A_or_an"] = 12000,
["Aan"] = 62000,
["Abbr"] = 559000,
["Abbreviation"] = 934000,
["Abbreviation_linked"] = 17000,
["Abbrlink"] = 17000,
["Abot"] = 32000,
["About"] = 171000,
["Absolute_page_title"] = 4700,
["Acad"] = 6700,
["Access_icon"] = 3300,
["According_to_whom"] = 4600,
["AchievementTable"] = 11000,
["AdSenseSummary"] = 12000,
["Added"] = 2900,
["Adjacent_communities"] = 30000,
["Adjacent_stations"] = 42000,
["Adjacent_stations/styles.css"] = 42000,
["Adjacent_stations_doc"] = 2400,
["Adjstn"] = 2500,
["Admin"] = 15000,
["Admin_help/helped"] = 2200,
["Administrator_note"] = 6900,
["Administrators'_noticeboard_archives_all"] = 2100,
["Administrators'_noticeboard_navbox_all"] = 2100,
["Adminnote"] = 3600,
["Advert"] = 8400,
["Aet"] = 7200,
["AfC_accept/C_percentage"] = 6500,
["AfC_age_category"] = 3200,
["AfC_comment"] = 26000,
["AfC_date_category"] = 273000,
["AfC_status/age"] = 3200,
["AfC_status/backlog"] = 3800,
["AfC_submission"] = 47000,
["AfC_submission/comments"] = 33000,
["AfC_submission/declined"] = 33000,
["AfC_submission/draft"] = 12000,
["AfC_submission/helptools"] = 45000,
["AfC_submission/pending"] = 3200,
["AfC_submission/styles.css"] = 47000,
["AfC_submission/tools"] = 3200,
["AfC_submission_category_header"] = 6900,
["AfC_submission_category_header/day"] = 6600,
["AfC_submission_category_header/td"] = 6600,
["AfC_talk/C_percentage"] = 6500,
["AfC_topic"] = 31000,
["AfD_categories_horizontal_shortnames"] = 5500,
["AfD_count_link"] = 4100,
["Afd-merged-from"] = 11000,
["Afd_bottom/old"] = 412000,
["Afd_top/old"] = 412000,
["Afd_top/old/styles.css"] = 412000,
["Africa_topic"] = 6600,
["After_extra_time"] = 7200,
["Age"] = 29000,
["Age_in_days"] = 5800,
["Age_in_years,_months,_weeks_and_days"] = 5400,
["Age_in_years,_months_and_days"] = 20000,
["Age_in_years_and_days"] = 5100,
["Age_in_years_and_days_nts"] = 5000,
["Agree"] = 2600,
["Ahnentafel"] = 7700,
["Ahnentafel/styles.css"] = 7700,
["Air_Force_Historical_Research_Agency"] = 4400,
["Air_force"] = 7600,
["Air_force/core"] = 7600,
["Aircontent"] = 9400,
["Aircraft_specs"] = 12000,
["Aircraft_specs/convert"] = 12000,
["Aircraft_specs/eng"] = 12000,
["Aircraft_specs/length"] = 12000,
["Aircraft_specs/range"] = 12000,
["Aircraft_specs/speed"] = 12000,
["Airport-dest-list"] = 3400,
["Airport_codes"] = 13000,
["Airport_destination_list"] = 4800,
["Aka"] = 2100,
["Al"] = 83000,
["Album"] = 3800,
["Album_chart"] = 37000,
["Album_cover_fur"] = 53000,
["Album_label_category"] = 2400,
["Album_label_category/core"] = 2400,
["Album_ratings"] = 29000,
["Album_reviews"] = 2300,
["Albums_category"] = 25000,
["Albums_category/core"] = 25000,
["Albums_category/type/default"] = 25000,
["Align"] = 214000,
["Aligned_table"] = 14000,
["AllIrelandByCountyCatNav"] = 3200,
["AllMusic"] = 77000,
["All_Ireland_by_county_category_navigation"] = 3200,
["All_plot"] = 2500,
["Allcaps"] = 11000,
["Allcaps/styles.css"] = 11000,
["Allmusic"] = 11000,
["Allow_wrap"] = 6300,
["Already_done"] = 3000,
["Also"] = 2300,
["Also_known_as"] = 6800,
["Alternating_rows_table"] = 2400,
["Alternating_rows_table/styles.css"] = 2400,
["Alumni"] = 3200,
["Always_substitute"] = 9300,
["Ambox"] = 1500000,
["Ambox_globe"] = 45000,
["Ambox_globe_current_red"] = 43000,
["American_English"] = 24000,
["American_football_roster/Footer"] = 4000,
["American_football_roster/Header"] = 4000,
["American_football_roster/Player"] = 4000,
["Americanfootballbox"] = 4800,
["Anarchism_announcements"] = 4100,
["Anarchism_announcements/shell"] = 4100,
["Anbl"] = 3600,
["Anchor"] = 85000,
["Angbr"] = 2800,
["Angbr_IPA"] = 2400,
["Angle_bracket"] = 4000,
["Anglican_navbox_titlestyle"] = 14000,
["Anglicise_rank"] = 554000,
["Animal_tasks"] = 38000,
["Anime_News_Network"] = 13000,
["Anl"] = 2300,
["Annotated_biography_link"] = 3600,
["Annotated_link"] = 17000,
["Anonblock"] = 35000,
["Antonym_of_(dis)establish"] = 16000,
["Apostrophe"] = 100000,
["Apostrophe+s"] = 8600,
["Arbitration_Committee_candidate/data"] = 107000,
["Archive"] = 349000,
["Archive_bottom"] = 71000,
["Archive_box"] = 17000,
["Archive_list"] = 98000,
["Archive_top"] = 51000,
["Archive_top/styles.css"] = 51000,
["Archive_top_green"] = 17000,
["Archive_top_green/styles.css"] = 17000,
["Archive_top_red"] = 7100,
["Archive_top_red/styles.css"] = 7100,
["Archivebottom"] = 3700,
["Archivebox"] = 2200,
["Archives"] = 56000,
["Archivetop"] = 3700,
["Army"] = 18000,
["Army/core"] = 18000,
["Art_UK_bio"] = 2600,
["Art_UK_bio/plural"] = 2600,
["Article"] = 3000,
["ArticleHistory"] = 27000,
["Article_for_improvement_banner/Picture_box"] = 4600,
["Article_for_improvement_banner/Picture_box/show_picture"] = 4200,
["Article_history"] = 53000,
["Article_links"] = 524000,
["Article_links_2"] = 83000,
["Article_or_page"] = 6600,
["Article_stub_box"] = 2370000,
["Articles_by_Importance"] = 12000,
["Articles_by_Quality"] = 37000,
["Articles_for_creation_links"] = 7000,
["As_of"] = 93000,
["As_written"] = 2600,
["Asbox"] = 2350000,
["Asia_topic"] = 11000,
["Asof"] = 6100,
["Assessed-Class"] = 18000,
["Assignment"] = 6000,
["Assignment_milestones"] = 5300,
["Association_of_Tennis_Professionals"] = 5200,
["AstDys"] = 2800,
["Asterisk"] = 3700,
["Astro_list_redirect_comment"] = 2000,
["AthAbbr"] = 7900,
["Atnhead"] = 6000,
["Atop"] = 7500,
["Atopg"] = 16000,
["Atopr"] = 6800,
["Attached_KML"] = 14000,
["Au"] = 6500,
["AuEduNewbie"] = 2700,
["Audio"] = 42000,
["Audio_sample"] = 3100,
["AustralianFootball"] = 9000,
["Australian_Dictionary_of_Biography"] = 2300,
["Australian_English"] = 4000,
["Australian_Football_League_team"] = 2200,
["Australian_dollar"] = 2300,
["Australian_party_style"] = 6700,
["Australian_politics/name"] = 4700,
["Australian_politics/party_colours"] = 6900,
["Austria_metadata_Wikidata"] = 2100,
["Austria_population_Wikidata"] = 2100,
["Aut"] = 7700,
["Authority_control"] = 2300000,
["Authority_control_(arts)"] = 16000,
["Auto_link"] = 74000,
["Autobiography"] = 2200,
["Autolink"] = 44000,
["Automated_tools"] = 84000,
["Automated_tools/core"] = 84000,
["Automatic_archive_navigator"] = 43000,
["Automatic_archives_blurb"] = 20000,
["Automatic_category_TOC"] = 864000,
["Automatic_category_TOC/core"] = 863000,
["Automatic_taxobox"] = 105000,
["Automatically_generated"] = 2000,
["Aviation_accidents_and_incidents"] = 2800,
["Avoid_wrap"] = 6400,
["Awaiting_admin"] = 3100,
["Awaitingadmin"] = 3000,
["Award2"] = 2600,
["Awards"] = 2600,
["Awards_table"] = 6300,
["Awards_table/styles.css"] = 6300,
["Ayd"] = 4800,
["Aye"] = 14000,
["Module:A_or_an"] = 12000,
["Module:A_or_an/words"] = 12000,
["Module:About"] = 172000,
["Module:Adjacent_stations"] = 80000,
["Module:Adjacent_stations/Amtrak"] = 2900,
["Module:Adjacent_stations/Deutsche_Bahn"] = 2100,
["Module:Adjacent_stations/Indian_Railways"] = 3800,
["Module:Adjacent_stations/JR_East"] = 2700,
["Module:Adjacent_stations/i18n"] = 80000,
["Module:Administrators'_noticeboard_archives"] = 2200,
["Module:Administrators'_noticeboard_archives/styles.css"] = 2200,
["Module:AfC_submission_catcheck"] = 267000,
["Module:AfC_topic"] = 31000,
["Module:Age"] = 1430000,
["Module:Ahnentafel"] = 7700,
["Module:Airport_destination_list"] = 4800,
["Module:Aligned_dates_list"] = 2800,
["Module:Aligned_table"] = 14000,
["Module:All_Ireland_by_county_category_navigation"] = 3400,
["Module:Anchor"] = 85000,
["Module:Ancient_Egypt_era"] = 2600,
["Module:Ancient_Egypt_era/data"] = 2600,
["Module:Ancient_Egypt_kings"] = 2600,
["Module:Ancient_Egypt_kings/data"] = 2600,
["Module:Ancient_Olympiads"] = 2600,
["Module:Ancient_Olympiads/data"] = 2600,
["Module:Annotated_link"] = 20000,
["Module:Archive"] = 349000,
["Module:Archive/config"] = 349000,
["Module:Archive_list"] = 101000,
["Module:Archives/bots"] = 36000,
["Module:Arguments"] = 37900000,
["Module:Armenian"] = 2600,
["Module:Arrowverse_redirect_category_handler"] = 2100,
["Module:Article_history"] = 53000,
["Module:Article_history/Category"] = 53000,
["Module:Article_history/config"] = 53000,
["Module:Article_history/styles.css"] = 53000,
["Module:Article_stub_box"] = 2370000,
["Module:Article_stub_box/styles.css"] = 2370000,
["Module:Articles_by_class"] = 49000,
["Module:Asbox_stubtree"] = 42000,
["Module:Attached_KML"] = 14000,
["Module:Attached_KML/styles.css"] = 14000,
["Module:Australian_place_map"] = 16000,
["Module:Authority_control"] = 2320000,
["Module:Authority_control/auxiliary"] = 719000,
["Module:Authority_control/config"] = 2320000,
["Module:Auto_date_formatter"] = 16000,
["Module:Automated_taxobox"] = 504000,
["Module:Autotaxobox"] = 657000,
}
12rnzj7z0decnstmxqr88go0q3mttl5
Module:Transclusion count/data/Y
828
2333
15733
2026-10-18T05:12:36Z
Ahechtbot
346
[[Wikipedia:BOT|Bot]]: Updated page.
15733
Scribunto
text/plain
return {
["Y"] = 7600,
["YEAR"] = 114000,
["YUG"] = 2100,
["YYYY_crimes_in_countryname_category_header"] = 3000,
["YYYY_crimes_in_countryname_category_header/inner_core"] = 3000,
["YYYY_crimes_in_countryname_category_header/outer_core"] = 3000,
["YYYY_disasters_in_countryname_category_header"] = 2700,
["YYYY_disasters_in_countryname_category_header/inner_core"] = 2700,
["YYYY_disasters_in_countryname_category_header/outer_core"] = 2700,
["YYYY_elections_in_countryname_category_header"] = 3600,
["YYYY_elections_in_countryname_category_header/inner_core"] = 3600,
["YYYY_elections_in_countryname_category_header/outer_core"] = 3600,
["YYYY_foos_category_header"] = 2100,
["YYYY_foos_category_header/core"] = 2100,
["YYYY_genre_films_category_header"] = 2400,
["YYYY_genre_films_category_header/core"] = 2400,
["YYYY_in_nationality_sport_category_header"] = 13000,
["YYYY_in_nationality_sport_category_header/inner_core"] = 13000,
["YYYY_in_nationality_sport_category_header/outer_core"] = 13000,
["YYYY_in_nationality_women's_sport_category_header"] = 2400,
["YYYY_in_nationality_women's_sport_category_header/core"] = 2400,
["YYYY_in_sport_category_header"] = 6900,
["YYYY_in_sport_category_header/inner_core"] = 6900,
["YYYY_in_sport_category_header/outer_core"] = 6900,
["YYYY_nationality_films_category_header"] = 3200,
["YYYY_nationality_films_category_header/core"] = 3200,
["Ya"] = 5300,
["Year"] = 6600,
["Year2range"] = 8000,
["YearInCountryPortalBox"] = 39000,
["Year_article"] = 11000,
["Year_births_or_deaths_category_header"] = 4500,
["Year_births_or_deaths_category_header/core"] = 4500,
["Year_category_header"] = 2900,
["Year_category_header/core"] = 2900,
["Year_category_name"] = 7100,
["Year_category_name/AD_year"] = 6400,
["Year_in_Europe"] = 6200,
["Year_in_Europe/expr"] = 6200,
["Year_in_US_state_category"] = 9600,
["Year_in_US_state_category/core"] = 9600,
["Year_in_continent/expr"] = 9300,
["Year_in_continent/link"] = 9300,
["Year_in_continent_category"] = 3700,
["Year_in_continent_category/core"] = 3700,
["Year_in_country_by_month"] = 2700,
["Year_in_country_by_month/core"] = 2700,
["Year_in_country_category"] = 36000,
["Year_in_country_category/inner_core"] = 36000,
["Year_in_country_category/outer_core"] = 36000,
["Year_in_country_portal_box"] = 86000,
["Year_in_country_portal_box/make"] = 86000,
["Year_in_country_portal_box/parse"] = 86000,
["Year_in_football"] = 2600,
["Year_in_nationality_television_category"] = 3400,
["Year_in_nationality_television_category/core"] = 3400,
["Year_in_region"] = 14000,
["Year_in_region/link"] = 14000,
["Year_in_various_calendars"] = 2600,
["Year_nationality_television_series_debuts_or_endings_category"] = 5100,
["Year_nationality_television_series_debuts_or_endings_category/core"] = 5100,
["Year_nav"] = 2600,
["Year_nav_topic5"] = 5600,
["Year_topic_navigation"] = 7300,
["Yearly_archive_list"] = 879000,
["Yearly_archive_list/display"] = 879000,
["Years_or_months_ago"] = 110000,
["Yel"] = 19000,
["Yellow_card"] = 19000,
["Yes"] = 14000,
["Yes2"] = 13000,
["YesNo"] = 2800,
["YesNo-Yes"] = 58000,
["Yesno"] = 10400000,
["Yesno-no"] = 2250000,
["Yesno-yes"] = 727000,
["Ygm"] = 2000,
["Yo"] = 27000,
["You've_got_mail"] = 12000,
["YouTube"] = 76000,
["Youtube"] = 2300,
["Yy"] = 11000,
["Yycat"] = 2400,
["Yyend"] = 11000,
["Yytop"] = 11000,
["Module:Year_category_type"] = 2900,
["Module:Year_in_various_calendars"] = 2600,
["Module:Yesno"] = 33500000,
}
b5nq9rszkh9k90dzv02q769r5l2u5vn
15734
15733
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Module:Transclusion_count/data/Y]]
15733
Scribunto
text/plain
return {
["Y"] = 7600,
["YEAR"] = 114000,
["YUG"] = 2100,
["YYYY_crimes_in_countryname_category_header"] = 3000,
["YYYY_crimes_in_countryname_category_header/inner_core"] = 3000,
["YYYY_crimes_in_countryname_category_header/outer_core"] = 3000,
["YYYY_disasters_in_countryname_category_header"] = 2700,
["YYYY_disasters_in_countryname_category_header/inner_core"] = 2700,
["YYYY_disasters_in_countryname_category_header/outer_core"] = 2700,
["YYYY_elections_in_countryname_category_header"] = 3600,
["YYYY_elections_in_countryname_category_header/inner_core"] = 3600,
["YYYY_elections_in_countryname_category_header/outer_core"] = 3600,
["YYYY_foos_category_header"] = 2100,
["YYYY_foos_category_header/core"] = 2100,
["YYYY_genre_films_category_header"] = 2400,
["YYYY_genre_films_category_header/core"] = 2400,
["YYYY_in_nationality_sport_category_header"] = 13000,
["YYYY_in_nationality_sport_category_header/inner_core"] = 13000,
["YYYY_in_nationality_sport_category_header/outer_core"] = 13000,
["YYYY_in_nationality_women's_sport_category_header"] = 2400,
["YYYY_in_nationality_women's_sport_category_header/core"] = 2400,
["YYYY_in_sport_category_header"] = 6900,
["YYYY_in_sport_category_header/inner_core"] = 6900,
["YYYY_in_sport_category_header/outer_core"] = 6900,
["YYYY_nationality_films_category_header"] = 3200,
["YYYY_nationality_films_category_header/core"] = 3200,
["Ya"] = 5300,
["Year"] = 6600,
["Year2range"] = 8000,
["YearInCountryPortalBox"] = 39000,
["Year_article"] = 11000,
["Year_births_or_deaths_category_header"] = 4500,
["Year_births_or_deaths_category_header/core"] = 4500,
["Year_category_header"] = 2900,
["Year_category_header/core"] = 2900,
["Year_category_name"] = 7100,
["Year_category_name/AD_year"] = 6400,
["Year_in_Europe"] = 6200,
["Year_in_Europe/expr"] = 6200,
["Year_in_US_state_category"] = 9600,
["Year_in_US_state_category/core"] = 9600,
["Year_in_continent/expr"] = 9300,
["Year_in_continent/link"] = 9300,
["Year_in_continent_category"] = 3700,
["Year_in_continent_category/core"] = 3700,
["Year_in_country_by_month"] = 2700,
["Year_in_country_by_month/core"] = 2700,
["Year_in_country_category"] = 36000,
["Year_in_country_category/inner_core"] = 36000,
["Year_in_country_category/outer_core"] = 36000,
["Year_in_country_portal_box"] = 86000,
["Year_in_country_portal_box/make"] = 86000,
["Year_in_country_portal_box/parse"] = 86000,
["Year_in_football"] = 2600,
["Year_in_nationality_television_category"] = 3400,
["Year_in_nationality_television_category/core"] = 3400,
["Year_in_region"] = 14000,
["Year_in_region/link"] = 14000,
["Year_in_various_calendars"] = 2600,
["Year_nationality_television_series_debuts_or_endings_category"] = 5100,
["Year_nationality_television_series_debuts_or_endings_category/core"] = 5100,
["Year_nav"] = 2600,
["Year_nav_topic5"] = 5600,
["Year_topic_navigation"] = 7300,
["Yearly_archive_list"] = 879000,
["Yearly_archive_list/display"] = 879000,
["Years_or_months_ago"] = 110000,
["Yel"] = 19000,
["Yellow_card"] = 19000,
["Yes"] = 14000,
["Yes2"] = 13000,
["YesNo"] = 2800,
["YesNo-Yes"] = 58000,
["Yesno"] = 10400000,
["Yesno-no"] = 2250000,
["Yesno-yes"] = 727000,
["Ygm"] = 2000,
["Yo"] = 27000,
["You've_got_mail"] = 12000,
["YouTube"] = 76000,
["Youtube"] = 2300,
["Yy"] = 11000,
["Yycat"] = 2400,
["Yyend"] = 11000,
["Yytop"] = 11000,
["Module:Year_category_type"] = 2900,
["Module:Year_in_various_calendars"] = 2600,
["Module:Yesno"] = 33500000,
}
b5nq9rszkh9k90dzv02q769r5l2u5vn
Tempilet:High-use/doc
10
2334
15737
2026-02-06T06:48:15Z
Oshwah
686
Commas.
15737
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{High-use}}
{{lua|Module:High-use}}
This is the {{tlx|high-use}} message box.
It is meant to be put at the top of the documentation subpage for templates. For templates transcluded onto less than 2000 pages, it provides a link to a page with the number of transclusions. Many template users and editors want this info. For templates transcluded onto more than 2,000 pages, it shows the number of transclusions directly. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to <code>risk</code>, a stronger wording is given. See [[Wikipedia:High-risk templates]] for background information.
'''Note''': It is normal for some of the links in the message box to be red.
== Usage ==
{{tlx |High-use}}
{{tlx |High-use |2=2=''discussion page, or use + notation'' |3=info=''additional text'' }}
'''all parameters'''
<pre style="overflow:auto;">
{{High-use |1= |2= |info= |demo= |form= |expiry= }}
</pre>
The template can be used as is, and will automatically use bot-updated transclusion counts from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]], when available. It can also take some parameters:
* <code>1=''number of transclusions''</code>: ''(deprecated)'' The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored, if transclusion data is available for the current page (generally, for templates with more than 2,000 transclusions).
* <code>2=''discussion page, or use + notation''</code>: The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, <code>2=WP:VPT</code> will insert a link to [[WP:VPT]]),
* {{para|info|<{{var|extra information}}>}}: When set to non-blank, will insert <{{var|extra information}}> into the template text.
* {{para|demo|<{{var|Template_name}}>}}: Will use the transclusion count for the template at <code><nowiki>[[Template:</nowiki><{{var|Template_name}}>]]</code> instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]].
* {{para|form}}: When set to "<code>editnotice</code>", will display the message using {{tl|editnotice}} instead of {{tl|ombox}}.
* {{para|expiry}}: Sets the {{para|expiry}} parameter for {{tl|editnotice}}.
* {{para|no-percent|yes}}: suppresses automatic 'percent of all pages' annotation; 'percent of all pages' annotation is automatically added when template is used in more than 1% of all pages (currently <code><nowiki>{{NUMBEROFPAGES}}</nowiki></code> is {{NUMBEROFPAGES}} pages so 1% is {{formatnum:{{#expr:trunc ({{formatnum:{{NUMBEROFPAGES}}|R}}/100)}}}} pages)
== Examples ==
The full code for a /doc page top usually looks like this:
<pre>
{{documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{high-use}}
</pre>
=== Standard form ===
{{nowiki template demo|code=<nowiki>{{high-use}}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use | |Wikipedia talk:High-risk templates }}</nowiki>}}
=== Rounding and + notation ===
{{nowiki template demo|code=<nowiki>{{high-use |49,500 |demo=A template that does not exist }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |49,500+ |demo=A template that does not exist }}</nowiki>}}
=== Editnotice form ===
{{nowiki template demo|code=<nowiki>{{high-use |form=editnotice }}</nowiki>}}
=== High risk ===
{{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno |no-percent=yes}}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |risk |demo=High-use }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |risk |Wikipedia talk:High-risk templates |info=This is a very large number! |demo=Yesno}}</nowiki>}}
== Technical details ==
The [[Template:High-use/sandbox|/sandbox]] and [[Template:High-use/testcases|/testcases]] links are the standard names for such subpages. If those pages are created, then the green /doc box for the template will detect them and link to them in its heading. For instance, see the top of this documentation.
[[User:Ahechtbot|Ahechtbot]] compiles usage statistics for all templates with 2,000 or more transclusions, using [[User:Ahechtbot/transclusioncount.py]], and writes them to subpages of [[Module:Transclusion count/data]] (see [[Wikipedia:Bots/Requests for approval/Ahechtbot 6]]). These pages are usually updated every Sunday, but since running the query is resource intensive, it may be delayed or skipped if Wikipedia server usage is high. '''Important''': If a transclusion count is available in [[Module:Transclusion count/data]], any manually input values will be ignored by this template.
== Supporting templates and modules ==
* {{tl|ombox}} which uses {{module link|Message box|ombox}}
* {{tl|editnotice}} which uses {{module link|Message box|fmbox}}
* {{module link|high-use|main}}
* {{module link|transclusion count|fetch}}
== Redirects ==
*{{tl|high use}} and {{tl|highuse}} - with and without space.
*Full list of redirects is '''[https://en.wikipedia.org/wiki/Special:WhatLinksHere?target=Template%3AHigh-use&namespace=&hidetrans=1&hidelinks=1&limit=50 here].'''
== See also ==
* {{tl|Interconnected template}} – for templates that have dependencies on others, or on config files, subpages, dynamic doc, etc.
* {{tl|pp-template}} – protection template that usually is put on high-risk templates
* {{tl|Used in system}} – for templates used in the Wikipedia user interface
* {{tl|R from high-use template}} – an [[WP:RCAT]] version of this template, for use in template redirects
* [[Wikipedia:High-risk templates]]
* [[Wikipedia:Template sandbox and test cases]]
== Template counters ==
* [[toollabs:templatecount/]] – easy to use, returns current (real time) transclusion count for a template
* <span class="plainlinks">[{{fullurl:Special:MostLinkedTemplates|limit=500}} Special:MostLinkedTemplates]</span> – special page search for most transcluded templates
* [[Special:PrefixIndex/Module:Transclusion_count/data/]] – template count data used by this template that is broken down by first letter of template and rounded to two or three significant figures, and updated weekly
* [[Wikipedia:Database reports/Templates transcluded on the most pages]] – lists templates with 2,000 or more transclusions.
<!-- * [[tools:~dispenser/cgi-bin/embeddedincount.py]] – Seems to lack human interface, probably meant for programs to call. (not working anymore) -->
<includeonly>{{sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Documentation header templates]]
}}</includeonly>
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "number of transclusions (DEPRECATED)",
"description": "either a static number of times the template has been transcluded, or the word \"risk\" (without quotes) to display \"a very large number of\" instead of the actual value.",
"type": "string",
"suggestedvalues": [
"risk"
],
"deprecated": "This value will be ignored, if transclusion data is available for the current page."
},
"2": {
"label": "discussion page, or use + notation",
"description": "The second parameter is overloaded. It will cause the number of transclusions to display as \"#,###+\" instead of \"approximately #,###\" when set equal to \"yes\" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, 2=WP:VPT will insert a link to WP:VPT)",
"type": "string",
"default": " ",
"autovalue": " "
},
"info": {
"label": "Extra information",
"description": "When set to non-blank, will insert the value of this parameter into the template text.",
"type": "content"
},
"demo": {
"label": "template name (intended for demo purposes)",
"description": "Will use the transclusion count for the template at [[Template:<Template_name>]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in Special:PrefixIndex/Module:Transclusion_count/data/.",
"type": "string"
},
"form": {
"label": "form for this template",
"description": "When set to \"editnotice\", will display the message using {{editnotice}} instead of {{ombox}}.",
"type": "string",
"suggestedvalues": [
"editnotice",
" "
]
},
"expiry": {
"label": "Expiry for {{editnotice}}",
"description": "if `form=editnotice`, this will set the expiry parameter of the editnotice.",
"type": "date"
},
"system": {
"description": "Please directly use {{Used in system}} instead",
"deprecated": true
}
},
"description": "This is the {{high-use}} message box.\n\nIt is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to risk, then a stronger wording is given.\n\nNote: It is normal that some of the links in the message box are red. ",
"format": "inline"
}
</templatedata>
81iu3o8t76yrm8cw4f4u8t8f5pgkjy2
15738
15737
2026-11-09T06:16:45Z
RAPTOR7762
18
1 revision imported from [[:en:Template:High-use/doc]]
15737
wikitext
text/x-wiki
{{Documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{High-use}}
{{lua|Module:High-use}}
This is the {{tlx|high-use}} message box.
It is meant to be put at the top of the documentation subpage for templates. For templates transcluded onto less than 2000 pages, it provides a link to a page with the number of transclusions. Many template users and editors want this info. For templates transcluded onto more than 2,000 pages, it shows the number of transclusions directly. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to <code>risk</code>, a stronger wording is given. See [[Wikipedia:High-risk templates]] for background information.
'''Note''': It is normal for some of the links in the message box to be red.
== Usage ==
{{tlx |High-use}}
{{tlx |High-use |2=2=''discussion page, or use + notation'' |3=info=''additional text'' }}
'''all parameters'''
<pre style="overflow:auto;">
{{High-use |1= |2= |info= |demo= |form= |expiry= }}
</pre>
The template can be used as is, and will automatically use bot-updated transclusion counts from [[Special:PrefixIndex/Module:Transclusion_count/data/|subpages of Module:Transclusion_count/data/]], when available. It can also take some parameters:
* <code>1=''number of transclusions''</code>: ''(deprecated)'' The first parameter is either a static number of times the template has been transcluded, or the word "risk" (without quotes) to display "a very large number of" instead of the actual value. This value will be ignored, if transclusion data is available for the current page (generally, for templates with more than 2,000 transclusions).
* <code>2=''discussion page, or use + notation''</code>: The second parameter is overloaded. It will cause the number of transclusions to display as "#,###+" instead of "approximately #,###" when set equal to "yes" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, <code>2=WP:VPT</code> will insert a link to [[WP:VPT]]),
* {{para|info|<{{var|extra information}}>}}: When set to non-blank, will insert <{{var|extra information}}> into the template text.
* {{para|demo|<{{var|Template_name}}>}}: Will use the transclusion count for the template at <code><nowiki>[[Template:</nowiki><{{var|Template_name}}>]]</code> instead of detecting what template it is being used on. Capitalization must exactly match the value used in [[Special:PrefixIndex/Module:Transclusion_count/data/]].
* {{para|form}}: When set to "<code>editnotice</code>", will display the message using {{tl|editnotice}} instead of {{tl|ombox}}.
* {{para|expiry}}: Sets the {{para|expiry}} parameter for {{tl|editnotice}}.
* {{para|no-percent|yes}}: suppresses automatic 'percent of all pages' annotation; 'percent of all pages' annotation is automatically added when template is used in more than 1% of all pages (currently <code><nowiki>{{NUMBEROFPAGES}}</nowiki></code> is {{NUMBEROFPAGES}} pages so 1% is {{formatnum:{{#expr:trunc ({{formatnum:{{NUMBEROFPAGES}}|R}}/100)}}}} pages)
== Examples ==
The full code for a /doc page top usually looks like this:
<pre>
{{documentation subpage}}
<!-- Add categories where indicated at the bottom of this page and interwikis at Wikidata -->
{{high-use}}
</pre>
=== Standard form ===
{{nowiki template demo|code=<nowiki>{{high-use}}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use | |Wikipedia talk:High-risk templates }}</nowiki>}}
=== Rounding and + notation ===
{{nowiki template demo|code=<nowiki>{{high-use |49,500 |demo=A template that does not exist }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |49,500+ |demo=A template that does not exist }}</nowiki>}}
=== Editnotice form ===
{{nowiki template demo|code=<nowiki>{{high-use |form=editnotice }}</nowiki>}}
=== High risk ===
{{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |demo=Yesno |no-percent=yes}}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |risk |demo=High-use }}</nowiki>}}
{{nowiki template demo|code=<nowiki>{{high-use |risk |Wikipedia talk:High-risk templates |info=This is a very large number! |demo=Yesno}}</nowiki>}}
== Technical details ==
The [[Template:High-use/sandbox|/sandbox]] and [[Template:High-use/testcases|/testcases]] links are the standard names for such subpages. If those pages are created, then the green /doc box for the template will detect them and link to them in its heading. For instance, see the top of this documentation.
[[User:Ahechtbot|Ahechtbot]] compiles usage statistics for all templates with 2,000 or more transclusions, using [[User:Ahechtbot/transclusioncount.py]], and writes them to subpages of [[Module:Transclusion count/data]] (see [[Wikipedia:Bots/Requests for approval/Ahechtbot 6]]). These pages are usually updated every Sunday, but since running the query is resource intensive, it may be delayed or skipped if Wikipedia server usage is high. '''Important''': If a transclusion count is available in [[Module:Transclusion count/data]], any manually input values will be ignored by this template.
== Supporting templates and modules ==
* {{tl|ombox}} which uses {{module link|Message box|ombox}}
* {{tl|editnotice}} which uses {{module link|Message box|fmbox}}
* {{module link|high-use|main}}
* {{module link|transclusion count|fetch}}
== Redirects ==
*{{tl|high use}} and {{tl|highuse}} - with and without space.
*Full list of redirects is '''[https://en.wikipedia.org/wiki/Special:WhatLinksHere?target=Template%3AHigh-use&namespace=&hidetrans=1&hidelinks=1&limit=50 here].'''
== See also ==
* {{tl|Interconnected template}} – for templates that have dependencies on others, or on config files, subpages, dynamic doc, etc.
* {{tl|pp-template}} – protection template that usually is put on high-risk templates
* {{tl|Used in system}} – for templates used in the Wikipedia user interface
* {{tl|R from high-use template}} – an [[WP:RCAT]] version of this template, for use in template redirects
* [[Wikipedia:High-risk templates]]
* [[Wikipedia:Template sandbox and test cases]]
== Template counters ==
* [[toollabs:templatecount/]] – easy to use, returns current (real time) transclusion count for a template
* <span class="plainlinks">[{{fullurl:Special:MostLinkedTemplates|limit=500}} Special:MostLinkedTemplates]</span> – special page search for most transcluded templates
* [[Special:PrefixIndex/Module:Transclusion_count/data/]] – template count data used by this template that is broken down by first letter of template and rounded to two or three significant figures, and updated weekly
* [[Wikipedia:Database reports/Templates transcluded on the most pages]] – lists templates with 2,000 or more transclusions.
<!-- * [[tools:~dispenser/cgi-bin/embeddedincount.py]] – Seems to lack human interface, probably meant for programs to call. (not working anymore) -->
<includeonly>{{sandbox other||
<!-- Categories go below this line, please; interwikis go to Wikidata, thank you! -->
[[Category:Documentation header templates]]
}}</includeonly>
== TemplateData ==
{{TemplateData header}}
<templatedata>
{
"params": {
"1": {
"label": "number of transclusions (DEPRECATED)",
"description": "either a static number of times the template has been transcluded, or the word \"risk\" (without quotes) to display \"a very large number of\" instead of the actual value.",
"type": "string",
"suggestedvalues": [
"risk"
],
"deprecated": "This value will be ignored, if transclusion data is available for the current page."
},
"2": {
"label": "discussion page, or use + notation",
"description": "The second parameter is overloaded. It will cause the number of transclusions to display as \"#,###+\" instead of \"approximately #,###\" when set equal to \"yes\" (without quotes). When used in this manner, values will be rounded down, instead of rounded to the nearest number with the appropriate number of significant figures. When set to any other non-blank value, it will replace the link to the template's talk page to the value of the parameter (for example, 2=WP:VPT will insert a link to WP:VPT)",
"type": "string",
"default": " ",
"autovalue": " "
},
"info": {
"label": "Extra information",
"description": "When set to non-blank, will insert the value of this parameter into the template text.",
"type": "content"
},
"demo": {
"label": "template name (intended for demo purposes)",
"description": "Will use the transclusion count for the template at [[Template:<Template_name>]] instead of detecting what template it is being used on. Capitalization must exactly match the value used in Special:PrefixIndex/Module:Transclusion_count/data/.",
"type": "string"
},
"form": {
"label": "form for this template",
"description": "When set to \"editnotice\", will display the message using {{editnotice}} instead of {{ombox}}.",
"type": "string",
"suggestedvalues": [
"editnotice",
" "
]
},
"expiry": {
"label": "Expiry for {{editnotice}}",
"description": "if `form=editnotice`, this will set the expiry parameter of the editnotice.",
"type": "date"
},
"system": {
"description": "Please directly use {{Used in system}} instead",
"deprecated": true
}
},
"description": "This is the {{high-use}} message box.\n\nIt is meant to be put at the top of the documentation subpage for templates transcluded onto more than 2,000 pages. For templates transcluded onto more than 100,000 pages, or if the first parameter is set to risk, then a stronger wording is given.\n\nNote: It is normal that some of the links in the message box are red. ",
"format": "inline"
}
</templatedata>
81iu3o8t76yrm8cw4f4u8t8f5pgkjy2
Tempilet:Editnotice/styles.css
10
2335
15739
2025-10-19T04:06:59Z
Izno
318
switch to only targeting this template also
15739
sanitized-css
text/css
/* {{pp-protected|small=yes}} */
/** Originally copied from [[Module:Message box/fmbox.css]] as base on 2025/09/06 */
/** Community consensus at [[Special:Diff/1317496908]] */
@media screen and (max-width: 479px) { /* Target smartphones */
.editnotice .mbox-image, /* Stack icon and text vertically */
.editnotice .mbox-text, /* Make the font size normal */
.editnotice .mbox-imageright,
.editnotice-header,
.editnotice-header span {
font-size: 100% !important;
}
.editnotice .mbox-image img.mw-file-element,
.editnotice .mbox-imageright img.mw-file-element{
height: auto;
width: auto;
max-height: 40px;
}
}
990epmd3872kx116siozymetc65w6b2
15740
15739
2026-11-09T06:16:46Z
RAPTOR7762
18
1 revision imported from [[:en:Template:Editnotice/styles.css]]
15739
sanitized-css
text/css
/* {{pp-protected|small=yes}} */
/** Originally copied from [[Module:Message box/fmbox.css]] as base on 2025/09/06 */
/** Community consensus at [[Special:Diff/1317496908]] */
@media screen and (max-width: 479px) { /* Target smartphones */
.editnotice .mbox-image, /* Stack icon and text vertically */
.editnotice .mbox-text, /* Make the font size normal */
.editnotice .mbox-imageright,
.editnotice-header,
.editnotice-header span {
font-size: 100% !important;
}
.editnotice .mbox-image img.mw-file-element,
.editnotice .mbox-imageright img.mw-file-element{
height: auto;
width: auto;
max-height: 40px;
}
}
990epmd3872kx116siozymetc65w6b2