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 = &#126;&#126;&#126;&#126; }}</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 = &#126;&#126;&#126;&#126; }}</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) .. '&lt;' .. tag .. '&gt;...&lt;/' .. tag .. '&gt;') 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) .. '&lt;' .. tag .. '&gt;...&lt;/' .. tag .. '&gt;') 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 == "&nbsp;" 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 == "&nbsp;" 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&#x20;%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&#x20;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&#x20;%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&#x20;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("&#35;", "#") -- 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;', '#'), '&#35;', '#'), ';') 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("&#35;", "#") -- 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;', '#'), '&#35;', '#'), ';') 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&nbsp;policy on&nbsp;the&nbsp;biographies" .. ' of&nbsp;living&nbsp;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' .. ' &#123;&#123;[[Template:unblock|unblock]]&#125;&#125; 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&nbsp;policy on&nbsp;the&nbsp;biographies" .. ' of&nbsp;living&nbsp;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' .. ' &#123;&#123;[[Template:unblock|unblock]]&#125;&#125; 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 = &#126;&#126;&#126;&#126; }}</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 &#32;{{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 &#32;{{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 = "&#124;", 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 = {"&nbsp;"}, 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 = "&thinsp;...<span class=\"wrap\">&thinsp;</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 = "&#124;", 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 = {"&nbsp;"}, 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 = "&thinsp;...<span class=\"wrap\">&thinsp;</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=&#91;|suffix=&#93;|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=&#91;|suffix=&#93;|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=&#x27E8;<span class="IPA" lang="und-fonipa">|suffix=</span>&#x27E9;|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=&#x27E8;<span class="IPA" lang="und-fonipa">|suffix=</span>&#x27E9;|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}}&nbsp;{{IPAblink|a}} * {{tl|IPAslink}}&nbsp;{{IPAslink|a}} * {{tl|IPAalink}}&nbsp;{{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}}&nbsp;{{IPAblink|a}} * {{tl|IPAslink}}&nbsp;{{IPAslink|a}} * {{tl|IPAalink}}&nbsp;{{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('&lt;', '<') :gsub('&gt;', '>') :gsub('&quot;', '"') -- Replace `&#125;%-` with `}-` because of some server quirk leading to -- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess('<nowiki>}-</nowiki>')) -- outputting `&#125;-` instead of `}-`, while it's ok with `<nowiki>} -</nowiki>` :gsub('&#125;%-', '}-') -- The same with `-&#123;` :gsub('%-&#123;', '-{') 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('&lt;', '<') :gsub('&gt;', '>') :gsub('&quot;', '"') -- Replace `&#125;%-` with `}-` because of some server quirk leading to -- =mw.text.unstripNoWiki(mw.getCurrentFrame():preprocess('<nowiki>}-</nowiki>')) -- outputting `&#125;-` instead of `}-`, while it's ok with `<nowiki>} -</nowiki>` :gsub('&#125;%-', '}-') -- The same with `-&#123;` :gsub('%-&#123;', '-{') 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 '&#91;%s&#93;'):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 '&#91;%s&#93;'):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. &amp;lt;, which is unfortunate, -- but it is the best we can do as the distinction between <, >, " and &lt;, -- &gt;, &quot; is lost during the original nowiki operation. invocation = invocation:gsub('&lt;', '<') invocation = invocation:gsub('&gt;', '>') invocation = invocation:gsub('&quot;', '"') 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 &lt; 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. &amp;lt;, which is unfortunate, -- but it is the best we can do as the distinction between <, >, " and &lt;, -- &gt;, &quot; is lost during the original nowiki operation. invocation = invocation:gsub('&lt;', '<') invocation = invocation:gsub('&gt;', '>') invocation = invocation:gsub('&quot;', '"') 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 &lt; 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|&lt;{{var|extra information}}>}}: When set to non-blank, will insert &lt;{{var|extra information}}> into the template text. * {{para|demo|&lt;{{var|Template_name}}>}}: Will use the transclusion count for the template at <code><nowiki>[[Template:</nowiki>&lt;{{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|&lt;{{var|extra information}}>}}: When set to non-blank, will insert &lt;{{var|extra information}}> into the template text. * {{para|demo|&lt;{{var|Template_name}}>}}: Will use the transclusion count for the template at <code><nowiki>[[Template:</nowiki>&lt;{{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