CINXE.COM
View source for Module:documentation - Wiktionary, the free dictionary
<!DOCTYPE html> <html class="client-nojs" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>View source for Module:documentation - Wiktionary, the free dictionary</title> <script>(function(){var className="client-js";var cookie=document.cookie.match(/(?:^|; )enwiktionarymwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":true,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"c21318f0-5876-4655-b536-709cb2fcec35","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"Module:documentation","wgTitle":"documentation","wgCurRevisionId":82724304,"wgRevisionId":0,"wgArticleId":4590091,"wgIsArticle":false,"wgIsRedirect":false,"wgAction":"edit","wgUserName":null,"wgUserGroups":["*"], "wgCategories":[],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"Scribunto","wgRelevantPageName":"Module:documentation","wgRelevantArticleId":4590091,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":["autoconfirmed"],"wgRestrictionMove":["autoconfirmed"],"wgNoticeProject":"wiktionary","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":40000,"wgCodeEditorCurrentLanguage":"lua","wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false, "wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.gadget.LanguagesAndScripts":"ready","ext.gadget.Palette":"ready","ext.gadget.Site":"ready","ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.codeEditor.styles":"ready","skins.vector.styles.legacy":"ready","ext.charinsert.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","codex-search-styles":"ready","ext.uls.interlanguage":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.codeEditor","ext.scribunto.edit","mediawiki.action.edit.collapsibleFooter","site","mediawiki.page.ready","skins.vector.legacy.js","ext.centralNotice.geoIP","ext.charinsert","ext.gadget.LegacyScripts","ext.gadget.DocTabs","ext.gadget.RevdelInfo","ext.gadget.PagePreviews","ext.gadget.Edittools","ext.gadget.defaultVisibilityToggles", "ext.gadget.UnsupportedTitles","ext.gadget.WiktGadgetPrefs","ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.checkUser.clientHints","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=codex-search-styles%7Cext.charinsert.styles%7Cext.codeEditor.styles%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediaBadges%7Cskins.vector.styles.legacy&only=styles&skin=vector"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.gadget.LanguagesAndScripts%2CPalette%2CSite&only=styles&skin=vector"> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="noindex,nofollow,max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="Wiktionary"> <meta property="og:title" content="View source for Module:documentation - Wiktionary, the free dictionary"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wiktionary.org/wiki/Module:documentation"> <link rel="apple-touch-icon" href="/static/apple-touch/wiktionary/en.png"> <link rel="icon" href="/static/favicon/wiktionary/en.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wiktionary (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wiktionary.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wiktionary.org/wiki/Module:documentation"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wiktionary Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="codeeditor-loading skin-vector-legacy mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-828 ns-subject page-Module_documentation rootpage-Module_documentation skin-vector action-edit"><div id="mw-page-base" class="noprint"></div> <div id="mw-head-base" class="noprint"></div> <div id="content" class="mw-body" role="main"> <a id="top"></a> <div id="siteNotice"><!-- CentralNotice --></div> <div class="mw-indicators"> </div> <h1 id="firstHeading" class="firstHeading mw-first-heading">View source for Module:documentation</h1> <div id="bodyContent" class="vector-body"> <div id="contentSub"><div id="mw-content-subtitle">← <a href="/wiki/Module:documentation" title="Module:documentation">Module:documentation</a></div></div> <div id="contentSub2"></div> <div id="jump-to-nav"></div> <a class="mw-jump-link" href="#mw-head">Jump to navigation</a> <a class="mw-jump-link" href="#searchInput">Jump to search</a> <div id="mw-content-text" class="mw-body-content"><p>You do not have permission to edit this page, for the following reasons: </p> <ul class="permissions-errors"><li class="mw-permissionerror-protectedpagetext">This page has been locked to prevent editing. You may be able to edit <a href="/wiki/Module:documentation/sandbox" title="Module:documentation/sandbox">this module's sandbox</a>. You can recommend any additions or changes to this page on <a href="/wiki/Module_talk:documentation" title="Module talk:documentation">its talkpage</a>, if the latter is not similarly locked, or at the <a href="/wiki/Wiktionary:ID" class="mw-redirect" title="Wiktionary:ID">Information Desk</a>. Please note that talk pages of <b>modules</b> are not often watched. If you have an edit request for a module, please post it to a new topic at the <a href="/wiki/Wiktionary:Grease_pit" title="Wiktionary:Grease pit">Grease pit</a>.</li><li class="mw-permissionerror-globalblocking-blockedtext-range"><b>Your IP address is in a range that has been <a href="https://meta.wikimedia.org/wiki/Special:MyLanguage/Global_blocks" class="extiw" title="m:Special:MyLanguage/Global blocks">blocked on all Wikimedia Foundation wikis</a>.</b> The block was made by <a href="/wiki/User:Jon_Kolbert" title="User:Jon Kolbert">Jon Kolbert</a>. The reason given is <i><a href="https://meta.wikimedia.org/wiki/Special:MyLanguage/NOP" class="extiw" title="m:Special:MyLanguage/NOP">Open proxy/Webhost</a>: See the <a href="https://meta.wikimedia.org/wiki/WM:OP/H" class="extiw" title="m:WM:OP/H">help page</a> if you are affected </i>. <ul><li>Start of block: 15:12, 27 August 2023</li> <li>Expiry of block: 15:12, 27 August 2028</li></ul> Your current IP address is 8.222.208.146. The blocked range is 8.222.128.0/17. Please include all above details in any queries you make. If you believe you were blocked by mistake, you can find additional information and instructions in the <a href="https://meta.wikimedia.org/wiki/Special:MyLanguage/No_open_proxies" class="extiw" title="m:Special:MyLanguage/No open proxies">No open proxies</a> global policy. Otherwise, to discuss the block please <a href="https://meta.wikimedia.org/wiki/Steward_requests/Global" class="extiw" title="m:Steward requests/Global">post a request for review on Meta-Wiki</a>. You could also send an email to the <a href="https://meta.wikimedia.org/wiki/Special:MyLanguage/Stewards" class="extiw" title="m:Special:MyLanguage/Stewards">stewards</a> <a href="https://meta.wikimedia.org/wiki/Special:MyLanguage/VRT" class="extiw" title="m:Special:MyLanguage/VRT">VRT</a> queue at <kbd>stewards@wikimedia.org</kbd> including all above details.</li></ul><hr /> <p>You can view and copy the source of this page. </p><textarea readonly="" accesskey="," id="wpTextbox1" cols="80" rows="25" style="" class="mw-editfont-monospace" lang="en" dir="ltr" name="wpTextbox1">local export = {} -- it is either here, or in [[Module:ugly hacks]], and it is not in ugly hacks. function export.CONTENTMODEL() return mw.title.getCurrentTitle().contentModel end local skins = { ["common" ] = ""; ["vector" ] = "Vector"; ["monobook" ] = "Monobook"; ["cologneblue"] = "Cologne Blue"; ["modern" ] = "Modern"; } local Array = require "Module:array" local function track(page) require("Module:debug/track")("documentation/" .. page) return true end local function compare_pages(page1, page2, text) return "[" .. tostring( mw.uri.fullUrl("Special:ComparePages", {page1 = page1, page2 = page2})) .. " " .. text .. "]" end local function page_exists(title) local success, title_obj = pcall(mw.title.new, title) return success and title_obj.exists end -- Avoid transcluding [[Module:languages/cache]] everywhere. local lang_cache = setmetatable({}, { __index = function (self, k) return require "Module:languages/cache"[k] end }) local function zh_link(word) return require("Module:links").full_link{ lang = lang_cache.zh, term = word } end local function make_languages_data_documentation(title, cats, division) local doc_template, module_cat if division:find("/extra$") then division = division:gsub("/extra$", "") doc_template = "language extradata documentation" module_cat = "Language extra data modules" else doc_template = "language data documentation" module_cat = "Language data modules" end local sort_key if division == "exceptional" then sort_key = "x" else sort_key = division:gsub("/", "") end cats:insert(module_cat .. "|" .. sort_key) return { title = doc_template } end local function make_Unicode_data_documentation(title, cats) local subpage, first_three_of_code_point = title.fullText:match("^Module:Unicode data/([^/]+)/(%x%x%x)$") if subpage == "names" or subpage == "images" or subpage == "emoji images" then local low, high = tonumber(first_three_of_code_point .. "000", 16), tonumber(first_three_of_code_point .. "FFF", 16) local text, text_type if subpage == "names" then text_type = "titles of images" elseif subpage == "images" then text_type = "titles of images" elseif subpage == "emoji images" then text_type = "emoji-style images" end text = string.format( "This data module contains the " .. text_type .. " of " .. "[[Appendix:Unicode|Unicode]] code points within the range U+%04X to U+%04X.", low, high) if subpage == "images" and pcall(mw.loadData, "Module:Unicode data/emoji images/" .. first_three_of_code_point) then text = text .. " This list includes the text variants of emojis. For the list of emoji variants of those characters, see [[Module:Unicode data/emoji images/" .. first_three_of_code_point .. "]]." elseif subpage == "emoji images" then text = text .. " For text-style images, see [[Module:Unicode data/images/" .. first_three_of_code_point .. "]]." end return text end end local function insert_lang_data_module_cats(cats, langcode, overall_data_module_cat) local lang = lang_cache[langcode] if lang then local langname = lang:getCanonicalName() cats:insert(overall_data_module_cat .. "|" .. langname) cats:insert(langname .. " modules") cats:insert(langname .. " data modules") return lang, langname end end --[=[ This provides categories and documentation for various data modules, so that [[Category:Uncategorized modules]] isn't unnecessarily cluttered. It is a list of tables, each of which have the following possible fields: `regex` (required): A Lua pattern to match the module's title. If it matches, the data in this entry will be used. Any captures in the pattern can by referenced in the `cat` field using %1 for the first capture, %2 for the second, etc. (often used for creating the sortkey for the category). In addition, the captures are passed to the `process` function as the third and subsequent parameters. `process` (optional): This may be a function or a string. If it is a function, it is called as follows: `process(TITLE, CATS, CAPTURE1, CAPTURE2, ...)` where: * TITLE is a title object describing the module's title; see [https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Title_objects]. * CATS is an array object (see [[Module:array]]) of categories that the module will be added to. * CAPTURE1, CAPTURE2, ... contain any captures in the `regex` field. The return value of `process` should either be a string (which will be used as the module's documentation), or a table specifying the name of a template to expand to get the documentation, along with the arguments to that template. In the latter format, the template name (bare, without the "Template:" prefix) should be in the `title` field, and any arguments should be in `args; in this case, the template name will be listed above the generated documentation as the source of the documentation, along with an edit button to edit the template's contents. If, however, the return value of the `process` function is a string, any template invocations will be expanded using frame:preprocess(), and [[Module:documentation]] will be listed as the source of the documentation. If `process` itself is a string rather than a function, it should name a submodule under [[Module:documentation/functions/]] which returns a function, of the same type as described above. This submodule will be specified as the source of the documentation (unless it returns a table naming a template to expand to get the documentation, as described above). If `process` is omitted entirely, the module will have no documentation. `cat` (optional): A string naming the category into which the module should be placed, or a list of such strings. Captures specified in `regex` may be referenced in this string using %1 for the first capture, %2 for the second, etc. It is also possible to add categories in the `process` function by inserting them into the passed-in CATS array (the second parameter). ]=] local module_regex = { { regex = "^Module:languages/data/(3/[a-z]/extra)$", process = make_languages_data_documentation, }, { regex = "^Module:languages/data/(3/[a-z])$", process = make_languages_data_documentation, }, { regex = "^Module:languages/data/(2/extra)$", process = make_languages_data_documentation, }, { regex = "^Module:languages/data/(2)$", process = make_languages_data_documentation, }, { regex = "^Module:languages/data/(exceptional/extra)$", process = make_languages_data_documentation, }, { regex = "^Module:languages/data/(exceptional)$", process = make_languages_data_documentation, }, { regex = "^Module:languages/.+$", cat = "Language and script modules", }, { regex = "^Module:scripts/.+$", cat = "Language and script modules", }, { regex = "^Module:data tables/data..?.?.?$", cat = "Reference module sharded data tables", }, { regex = "^Module:zh/data/dial%-pron/.+$", cat = "Chinese dialectal pronunciation data modules", process = "zh dial or syn", }, { regex = "^Module:zh/data/dial%-syn/.+$", cat = "Chinese dialect synonyms data modules", process = "zh dial or syn", }, { regex = "^Module:zh/data/glyph%-data/.+$", cat = "Chinese historical character forms data modules", process = function(title, cats) local character = title.fullText:match("^Module:zh/data/glyph%-data/(.+)") if character then return ("This module contains data on historical forms of the Chinese character %s.") :format(zh_link(character)) end end, }, { regex = "^Module:zh/data/ltc%-pron/(.+)$", cat = "Middle Chinese pronunciation data modules|%1", process = "zh data", }, { regex = "^Module:zh/data/och%-pron%-BS/(.+)$", cat = "Old Chinese (Baxter-Sagart) pronunciation data modules|%1", process = "zh data", }, { regex = "^Module:zh/data/och%-pron%-ZS/(.+)$", cat = "Old Chinese (Zhengzhang) pronunciation data modules|%1", process = "zh data", }, { -- capture rest of zh/data submodules regex = "^Module:zh/data/(.+)$", cat = "Chinese data modules|%1", }, { regex = "^Module:mul/guoxue%-data/cjk%-?(.*)$", process = "guoxue-data", }, { regex = "^Module:Unicode data/(.+)$", cat = "Unicode data modules|%1", process = make_Unicode_data_documentation, }, { regex = "^Module:number list/data/(.+)$", process = function(title, cats, lang_code) local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Number data modules") if lang then return ("This module contains data on various types of numbers in %s.\n%s") :format(lang:makeCategoryLink(), require("Module:number list/show").table() or "") end end, }, { regex = "^Module:accel/(.+)$", process = function(title, cats) local lang_code = title.subpageText local lang = lang_cache[lang_code] if lang then cats:insert(lang:getCanonicalName() .. " modules|accel") cats:insert(("Accel submodules|%s"):format(lang:getCanonicalName())) return ("This module contains new entry creation rules for %s; see [[WT:ACCEL]] for an overview, and [[Module:accel]] for information on creating new rules.") :format(lang:makeCategoryLink()) end end, }, { regex = "^Module:inc%-ash/dial/data/(.+)$", cat = "Ashokan Prakrit modules|%1", process = function(title, cats) local word = title.fullText:match("^Module:inc%-ash/dial/data/(.+)$") if word then local lang = lang_cache["inc-ash"] return ("This module contains data on the pronunciation of %s in dialects of %s.") :format(require("Module:links").full_link({ term = word, lang = lang }, "term"), lang:makeCategoryLink()) end end, }, { regex = "^.+%-translit$", process = "translit", }, { regex = "^Module:form of/lang%-data/(.+)$", process = function(title, cats, lang_code) local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Language-specific form-of modules") if lang then -- FIXME, display more info. return "This module contains language-specific form-of data (tags, shortcuts, base lemma params. etc.) for " .. langname .. ".\n\n'''NOTE:''' If you add a new language-specific module, you must add the language code to the " .. "list at the top of [[Module:form of]] in order for the module to be recognized." end end }, { regex = "^Module:labels/data/lang/(.+)$", process = function(title, cats, lang_code) local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Language-specific label data modules") if lang then return { title = "label language-specific data documentation", args = { [1] = lang_code }, } end end }, { regex = "^Module:category tree/poscatboiler/data/lang%-specific/(.+)$", process = function(title, cats, lang_code) local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Category tree data modules/poscatboiler") if lang then return "This module handles generating the descriptions and categorization for " .. langname .. " category pages " .. "of the format \"" .. langname .. " LABEL\" where LABEL can be any text. Examples are " .. "[[:Category:Bulgarian conjugation 2.1 verbs]] and [[:Category:Russian velar-stem neuter-form nouns]]. " .. "This module is part of the poscatboiler system, which is a general framework for generating the " .. "descriptions and categorization of category pages.\n\n" .. "For more information, see [[Module:category tree/poscatboiler/data/lang-specific/documentation]].\n\n" .. "'''NOTE:''' If you add a new language-specific module, you must add the language code to the " .. "list at the top of [[Module:category tree/poscatboiler/data/lang-specific]] in order for the module to be " .. "recognized." end end }, { regex = "^Module:category tree/poscatboiler/data/(.+)$", process = function(title, cats, submodule) cats:insert("Category tree data modules/poscatboiler| ") return { title = "poscatboiler data submodule documentation" } end }, { regex = "^Module:category tree/topic cat/data/(.+)$", process = function(title, cats, submodule) cats:insert("Category tree data modules/topic cat| ") return { title = "topic cat data submodule documentation" } end }, { regex = "^Module:ja/data/(.+)$", cat = "Japanese data modules|%1", }, { regex = "^Module:fi%-dialects/data/feature/Kettunen1940 ([0-9]+)$", cat = "Finnish dialectal data atlas modules|%1", process = function(title, cats, shard) return "This module contains shard " .. shard .. " of the online version of Lauri Kettunen's 1940 work " .. "''Suomen murteet III A. Murrekartasto'' (\"Finnish dialects III A: Dialect atlas\"). " .. "It was imported and converted from urn:nbn:fi:csc-kata20151130145346403821, published by the " .. "''Kotimaisten kielten keskus'' under the CC BY 4.0 license." end }, { regex = "^Module:fi%-dialects/data/feature/(.+)", cat = "Finnish dialectal data modules|%1", }, { regex = "^Module:fi%-dialects/data/word/(.+)", cat = "Finnish dialectal data modules|%1", }, { regex = "^Module:Swadesh/data/([a-z-]+)$", process = function(title, cats, lang_code) local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Swadesh modules") if lang then return "This module contains the [[Swadesh list]] of basic vocabulary in " .. langname .. "." end end }, { regex = "^Module:Swadesh/data/([a-z-]+)/([^/]*)$", process = function(title, cats, lang_code, variety) local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Swadesh modules") if lang then local prefix = "This module contains the [[Swadesh list]] of basic vocabulary in the " local etym_lang = require("Module:languages").getByCode(variety, nil, "allow etym") if etym_lang then return ("%s %s variety of %s."):format(prefix, etym_lang:getCanonicalName(), langname) end local script = require("Module:scripts").getByCode(variety) if script then return ("%s %s %s script."):format(prefix, langname, script:getCanonicalName()) end return ("%s %s variety of %s."):format(prefix, variety, langname) end end }, { regex = "^Module:typing%-aids", process = function(title, cats) local data_suffix = title.fullText:match("^Module:typing%-aids/data/(.+)$") local sortkey if data_suffix then if data_suffix:find "^[%l-]+$" then local lang = require("Module:languages").getByCode(data_suffix) if lang then sortkey = lang:getCanonicalName() cats:insert(sortkey .. " data modules") end elseif data_suffix:find "^%u%l%l%l$" then local script = require("Module:scripts").getByCode(data_suffix) if script then sortkey = script:getCanonicalName() cats:insert(script:getCategoryName()) end end cats:insert("Character insertion data modules|" .. (sortkey or data_suffix)) end end, }, { regex = "^Module:R:([a-z%-]+):(.+)$", process = function(title, cats, lang_code, refname) local lang = lang_cache[lang_code] if lang then cats:insert(lang:getCanonicalName() .. " modules|" .. refname) cats:insert(("Reference modules|%s"):format(lang:getCanonicalName())) return "This module implements the reference template {{temp|R:" .. lang_code .. ":" .. refname .. "}}." end end, }, { regex = "^Module:Quotations/([a-z-]+)/?(.*)", process = "Quotation", }, { regex = "^Module:affix/lang%-data/([a-z-]+)", process = "affix lang-data", }, { regex = "^Module:dialect synonyms/([a-z-]+)$", process = function(title, cats, lang_code) local lang = lang_cache[lang_code] if lang then local langname = lang:getCanonicalName() cats:insert("Dialect synonyms data modules|" .. langname) cats:insert(langname .. " dialect synonyms data modules| ") return "This module contains data on specific varieties of " .. langname .. ", for use by " .. "{{tl|dialect synonyms}}. The actual synonyms themselves are contained in submodules." end end, }, { regex = "^Module:dialect synonyms/([a-z-]+)/(.+)$", process = function(title, cats, lang_code, term) local lang = lang_cache[lang_code] if lang then local langname = lang:getCanonicalName() cats:insert("Dialect synonyms data modules|" .. langname) cats:insert(langname .. " dialect synonyms data modules|" .. term) return ("This module contains dialectal %s synonyms for {{m|%s|%s}}."):format(langname, lang_code, term) end end, }, } function export.show(frame) local boolean_default_false = {type = "boolean", default = false} local args = require("Module:parameters").process(frame.args, { ["hr"] = true, ["for"] = true, ["from"] = true, ["allowondoc"] = boolean_default_false, -- Don't throw an error if used on a documentation subpage. ["notsubpage"] = boolean_default_false, ["nodoc"] = boolean_default_false, ["nolinks"] = boolean_default_false, -- suppress all "Useful links" ["nosandbox"] = boolean_default_false, -- supress sandbox }) local output = Array('\n<div class="documentation" style="display:block; clear:both">\n') local cats = Array() local nodoc = args.nodoc if (not args.hr) or (args.hr == "above") then output:insert("----\n") end local title = args["for"] and mw.title.new(args["for"]) or mw.title.getCurrentTitle() local doc_title = args.from ~= "-" and mw.title.new(args.from or title.fullText .. '/documentation') or nil local contentModel = title.contentModel local pagetype = require("Module:pages").pagetype(title) local preload, fallback_docs, doc_content, old_doc_title, user_name, skin_name, needs_doc local doc_content_source = "Module:documentation" local auto_generated_cat_source local cats_auto_generated = false if pagetype == "script" then -- .js if title.nsText == "MediaWiki" then if title.text:find("Gadget-") then preload = "Template:documentation/preloadGadget" else preload = "Template:documentation/preloadMediaWikiJavaScript" end else preload = "Template:documentation/preloadTemplate" -- XXX end if title.nsText == "User" then user_name = title.rootText end elseif pagetype == "stylesheet" then -- .css preload = "Template:documentation/preloadTemplate" -- XXX if title.nsText == "User" then user_name = title.rootText end elseif pagetype == "module" or pagetype == "module testcase page" then preload = "Template:documentation/preloadModule" elseif pagetype == "module sandbox" then user_name = title.rootText:match("^[Uu]ser:(.+)") if user_name then preload = "Template:documentation/preloadModuleUserSandbox" else preload = "Template:documentation/preloadModuleSandbox" end elseif pagetype == "template" or pagetype == "template testcase page" then preload = "Template:documentation/preloadTemplate" elseif pagetype == "template sandbox" then user_name = title.rootText:match("^[Uu]ser:(.+)") if user_name then preload = "Template:documentation/preloadTemplateUserSandbox" else preload = "Template:documentation/preloadTemplateSandbox" end elseif pagetype == "project page" or pagetype == "sandbox" then preload = "Template:documentation/preloadTemplate" -- XXX elseif not args.allowondoc and (pagetype == "template documentation page" or pagetype == "module documentation page") then -- TODO: merge with {{documentation subpage}}, and choose behaviour based on the page type. error("This template should not be used on a documentation page. Please use [[Template:documentation subpage]].") end if doc_title and doc_title.isRedirect then old_doc_title = doc_title doc_title = doc_title.redirectTarget end output:insert("<dl class=\"plainlinks\" style=\"font-size: smaller;\">") local function get_module_doc_and_cats(categories_only) cats_auto_generated = true local automatic_cats = nil if user_name then fallback_docs = "documentation/fallback/user module" automatic_cats = {"User sandbox modules"} else for _, data in ipairs(module_regex) do local captures = {mw.ustring.match(title.fullText, data.regex)} if #captures > 0 then local cat local process_function if type(data.process) == "function" then process_function = data.process elseif type(data.process) == "string" then doc_content_source = "Module:documentation/functions/" .. data.process process_function = require(doc_content_source) end if process_function then doc_content = process_function(title, cats, unpack(captures)) end if type(doc_content) == "table" then doc_content_source = doc_content.title and "Template:" .. doc_content.title or doc_content_source doc_content = mw.getCurrentFrame():expandTemplate(doc_content) elseif doc_content and doc_content:find("{{") then doc_content = mw.getCurrentFrame():preprocess(doc_content) end cat = data.cat if cat then if type(cat) == "string" then cat = {cat} end for _, c in ipairs(cat) do -- gsub() and Lua :gsub() return two arguments, which causes all sorts of problems. -- Terrible design, there should have been a separate two-argument function. local gsub_sucks = mw.ustring.gsub(title.fullText, data.regex, c) table.insert(cats, gsub_sucks) end end break end end end if title.subpageText == "templates" then cats:insert("Template interface modules") end if automatic_cats then for _, c in ipairs(automatic_cats) do cats:insert(c) end end if #cats == 0 then local auto_cats = require("Module:module categorization").categorize(frame, "return raw", "noerror") if #auto_cats > 0 then auto_generated_cat_source = "Module:module categorization" end for _, category in ipairs(auto_cats) do cats:insert(category) end end -- meaning module is not in user’s sandbox or one of many datamodule boring series needs_doc = not categories_only and not (automatic_cats or doc_content or fallback_docs) end -- Override automatic documentation, if present. if doc_title and doc_title.exists then local cats_auto_generated_text = "" if contentModel == "Scribunto" then local doc_page_content = doc_title:getContent() -- Track then do nothing if there are uses of includeonly. The -- pattern is slightly too permissive, but any false-positives are -- obvious typos that should be corrected. if doc_page_content:lower():match("</?includeonly%f[%s/>][^>]*>") then track("module-includeonly") else -- Check for uses of {{module cat}}. find_templates treats the -- input as transcluded by default (i.e. it parses the wikitext -- which will be transcluded through to the module page). local module_cat for template in require("Module:template parser").find_templates(doc_page_content) do if template:get_name() == "module cat" then module_cat = true break end end if not module_cat then get_module_doc_and_cats("categories only") auto_generated_cat_source = auto_generated_cat_source or doc_content_source cats_auto_generated_text = " Categories were auto-generated by [[" .. auto_generated_cat_source .. "]]. <sup>[[" .. mw.title.new(auto_generated_cat_source):fullUrl{action = "edit"} .. " edit]]</sup>" end end end output:insert( "<dd><i style=\"font-size: larger;\">The following " .. "[[Help:Documenting templates and modules|documentation]] is located at [[" .. doc_title.fullText .. "]]. " .. "<sup>[[" .. doc_title:fullUrl{action = "edit"} .. " edit]]</sup>" .. cats_auto_generated_text .. "</i></dd>") else if contentModel == "Scribunto" then get_module_doc_and_cats(false) elseif title.nsText == "Template" then --cats:insert("Uncategorized templates") needs_doc = not (fallback_docs or nodoc) elseif pagetype == "script" or pagetype == "stylesheet" then if user_name then skin_name = skins[title.text:sub(#title.rootText + 1):match("^/([a-z]+)%.[jc]ss?$")] if skin_name then fallback_docs = "documentation/fallback/user " .. contentModel end end end if doc_content then output:insert( "<dd><i style=\"font-size: larger;\">The following " .. "[[Help:Documenting templates and modules|documentation]] is " .. "generated by [[" .. doc_content_source .. "]]. <sup>[[" .. mw.title.new(doc_content_source):fullUrl{action = "edit"} .. " edit]]</sup> </i></dd>") elseif not nodoc then if doc_title then output:insert( "<dd><i style=\"font-size: larger;\">This " .. pagetype .. " lacks a [[Help:Documenting templates and modules|documentation subpage]]. " .. (fallback_docs and "You may " or "Please ") .. "[" .. doc_title:fullUrl{action = "edit", preload = preload} .. " create it].</i></dd>\n") else output:insert( "<dd><i style=\"font-size: larger; color: #FF0000;\">Unable to auto-generate " .. "documentation for this " .. pagetype ..".</i></dd>\n") end end end if title.fullText:match("^MediaWiki:Gadget%-") then local is_gadget = false local gadget_list = mw.title.new("MediaWiki:Gadgets-definition"):getContent() for line in mw.text.gsplit(gadget_list, "\n") do local gadget, opts, items = line:match("^%*%s*([A-Za-z][A-Za-z0-9_%-]*)%[(.-)%]|(.+)$") -- opts is unused if not gadget then gadget, items = line:match("^%*%s*([A-Za-z][A-Za-z0-9_%-]*)|(.+)$") end if gadget then items = Array(mw.text.split(items, "|")) for i, item in ipairs(items) do if title.fullText == ("MediaWiki:Gadget-" .. item) then is_gadget = true output:insert("<dd> ''This script is a part of the <code>") output:insert(gadget) output:insert("</code> gadget ([") output:insert(tostring(mw.uri.fullUrl("MediaWiki:Gadgets-definition", {action = "edit"}))) output:insert(" edit definitions])'' <dl>") output:insert("<dd> ''Description ([") output:insert(tostring(mw.uri.fullUrl("MediaWiki:Gadget-" .. gadget, {action = "edit"}))) output:insert(" edit])'': ") local gadget_description = mw.message.new('Gadget-' .. gadget):plain() gadget_description = frame:preprocess(gadget_description) output:insert(gadget_description) output:insert(" </dd>") items:remove(i) if #items > 0 then for j, item in ipairs(items) do items[j] = '[[MediaWiki:Gadget-' .. item .. '|' .. item .. ']]' end output:insert("<dd> ''Other parts'': ") output:insert(mw.text.listToText(items)) output:insert("</dd>") end output:insert("</dl></dd>") break end end end end if not is_gadget then output:insert("<dd> ''This script is not a part of any [") output:insert(tostring(mw.uri.fullUrl("Special:Gadgets", {uselang = "en"}))) output:insert(' gadget] ([') output:insert(tostring(mw.uri.fullUrl("MediaWiki:Gadgets-definition", {action = "edit"}))) output:insert(' edit definitions]).</dd>') -- else -- cats:insert("Wiktionary gadgets") end end if old_doc_title then output:insert("<dd> ''Redirected from'' [") output:insert(old_doc_title:fullUrl{redirect = "no"}) output:insert(" ") output:insert(old_doc_title.fullText) output:insert("] ([") output:insert(old_doc_title:fullUrl{action = "edit"}) output:insert(" edit]).</dd>\n") end if not args.nolinks then local links = Array() if title.isSubpage and not args.notsubpage then links:insert("[[:" .. title.nsText .. ":" .. title.rootText .. "|root page]]") links:insert("[[Special:PrefixIndex/" .. title.nsText .. ":" .. title.rootText .. "/|root page’s subpages]]") else links:insert("[[Special:PrefixIndex/" .. title.fullText .. "/|subpage list]]") end links:insert( "[" .. tostring(mw.uri.fullUrl("Special:WhatLinksHere/" .. title.fullText, {hidetrans = true, hideredirs = true})) .. " links]") if contentModel ~= "Scribunto" then links:insert( "[" .. tostring(mw.uri.fullUrl("Special:WhatLinksHere/" .. title.fullText, {hidelinks = true, hidetrans = true})) .. " redirects]") end if pagetype == "script" or pagetype == "stylesheet" then if user_name then links:insert("[[Special:MyPage" .. title.text:sub(#title.rootText + 1) .. "|your own]]") end else links:insert( "[" .. tostring(mw.uri.fullUrl("Special:WhatLinksHere/" .. title.fullText, {hidelinks = true, hideredirs = true})) .. " transclusions]") end if contentModel == "Scribunto" then local is_testcases = title.isSubpage and title.subpageText == "testcases" local without_subpage = title.nsText .. ":" .. title.baseText if is_testcases then links:insert("[[:" .. without_subpage .. "|tested module]]") else links:insert("[[" .. title.fullText .. "/testcases|testcases]]") end if user_name then links:insert("[[User:" .. user_name .. "|user page]]") links:insert("[[User talk:" .. user_name .. "|user talk page]]") links:insert("[[Special:PrefixIndex/User:" .. user_name .. "/|userspace]]") else -- If sandbox module, add a link to the module that this is a sandbox of. -- Exclude user sandbox modules like [[User:Dine2016/sandbox]]. if title.text:find("/sandbox%d*%f[/%z]") then cats:insert("Sandbox modules") track("sandbox to be moved") -- Sandbox modules don’t really need documentation. needs_doc = false -- Will behave badly if “/sandbox” occurs twice in title! local sandbox_of = title.fullText:gsub("/sandbox%d*%f[/%z]", "") local diff if page_exists(sandbox_of) then diff = " (" .. compare_pages(title.fullText, sandbox_of, "diff") .. ")" else track("no sandbox of") end links:insert("[[:" .. sandbox_of .. "|sandbox of]]" .. (diff or "")) -- If not a sandbox module, add link to sandbox module. -- Sometimes there are multiple sandboxes for a single module: -- [[Module:sa-pronunc/sandbox]], [[Module:sa-pronunc/sandbox2]]. -- Occasionally sandbox modules have their own subpages that are also -- sandboxes: [[Module:grc-decl/sandbox/decl]]. else local sandbox_title if title.fullText:find("^Module:grc%-decl/") then sandbox_title = title.fullText:gsub("^Module:grc%-decl/", "Module:grc-decl/sandbox/") elseif is_testcases then sandbox_title = title.fullText:gsub("/testcases", "/sandbox/testcases") else sandbox_title = title.fullText .. "/sandbox" end local sandbox_link = "[[:" .. sandbox_title .. "|sandbox]]" local diff if page_exists(sandbox_title) then diff = " (" .. compare_pages(title.fullText, sandbox_title, "diff") .. ")" end links:insert(sandbox_link .. (diff or "")) end end end if title.nsText == "Template" then -- Error search: all(any namespace), hastemplate (show pages using the template), insource (show source code), incategory (any/specific error) -- [[mw:Help:CirrusSearch]], [[w:Help:Searching/Regex]] -- apparently same with/without: &profile=advanced&fulltext=1 local errorq = 'searchengineselect=mediawiki&search=all: hastemplate:\"'..title.rootText..'\" insource:\"'..title.rootText..'\" incategory:' local eincategory = "Pages_with_module_errors|ParserFunction_errors|DisplayTitle_errors|Pages_with_ISBN_errors|Pages_with_ISSN_errors|Pages_with_reference_errors|Pages_with_syntax_highlighting_errors|Pages_with_TemplateStyles_errors" links:insert( '[' .. tostring(mw.uri.fullUrl('Special:Search', errorq..eincategory )) .. ' errors]' .. ' (' .. '[' .. tostring(mw.uri.fullUrl('Special:Search', errorq..'ParserFunction_errors' )) .. ' parser]' .. '/' .. '[' .. tostring(mw.uri.fullUrl('Special:Search', errorq..'Pages_with_module_errors' )) .. ' module]' .. ')' ) if title.isSubpage and title.text:find("/sandbox%d*%f[/%z]") then -- This is a sandbox template. -- At the moment there are no user sandbox templates with subpage -- “/sandbox”. cats:insert("Sandbox templates") -- Sandbox templates don’t really need documentation. needs_doc = false -- Will behave badly if “/sandbox” occurs twice in title! local sandbox_of = title.fullText:gsub("/sandbox%d*%f[/%z]", "") local diff if page_exists(sandbox_of) then diff = " (" .. compare_pages(title.fullText, sandbox_of, "diff") .. ")" else track("no sandbox of") end links:insert("[[:" .. sandbox_of .. "|sandbox of]]" .. (diff or "")) -- This is a template that can have a sandbox. elseif not args.nosandbox then -- unless we tell it not to local sandbox_title = title.fullText .. "/sandbox" local diff if page_exists(sandbox_title) then diff = " (" .. compare_pages(title.fullText, sandbox_title, "diff") .. ")" end links:insert("[[:" .. sandbox_title .. "|sandbox]]" .. (diff or "")) end end if #links > 0 then output:insert("<dd> ''Useful links'': " .. links:concat(" • ") .. "</dd>") end end output:insert("</dl>\n") -- Show error from [[Module:category tree/topic cat/data]] on its submodules' -- documentation to, for instance, warn about duplicate labels. if title.fullText:find("Module:category tree/topic cat/data", 1, true) == 1 then local ok, err = pcall(require, "Module:category tree/topic cat/data") if not ok then output:insert('<span class="error">' .. err .. '</span>\n\n') end end if doc_title and doc_title.exists then -- Override automatic documentation, if present. doc_content = frame:expandTemplate { title = doc_title.fullText } elseif not doc_content and fallback_docs then doc_content = frame:expandTemplate { title = fallback_docs, args = { ['user'] = user_name, ['page'] = title.fullText, ['skin name'] = skin_name, }, } end if doc_content then output:insert(doc_content) end output:insert(('\n<%s style="clear: both;" />'):format(args.hr == "below" and "hr" or "br")) if cats_auto_generated and not cats[1] and (not doc_content or not doc_content:find("%[%[Category:")) then if contentModel == "Scribunto" then cats:insert("Uncategorized modules") -- elseif title.nsText == "Template" then -- cats:insert("Uncategorized templates") end end if needs_doc then cats:insert("Templates and modules needing documentation") end for _, cat in ipairs(cats) do output:insert("[[Category:" .. cat .. "]]") end output:insert("</div>\n") return output:concat() end function export.module_auto_doc_table() local parts = {} local function ins(text) table.insert(parts, text) end ins('{|class="wikitable"') ins("! Regex !! Category !! Handling modules") for _, spec in ipairs(module_regex) do local cat_text local cats = spec.cat if cats then local cat_parts = {} if type(cats) == "string" then cats = {cats} end for _, cat in ipairs(cats) do table.insert(cat_parts, ("<code>%s</code>"):format((cat:gsub("|", "&#124;")))) end cat_text = table.concat(cat_parts, ", ") else cat_text = "''(unspecified)''" end ins("|-") ins(("| <code>%s</code> || %s || %s"):format(spec.regex, cat_text, type(spec.process) == "function" and "''(handled internally)''" or type(spec.process) == "string" and ("[[Module:documentation/functions/%s]]"):format(spec.process) or "''(no documentation generator)''")) end ins("|}") return table.concat(parts, "\n") end -- Used by {{translit module documentation}}. function export.translitModuleLangList(frame) local pagename, subpage if frame.args[1] then pagename = frame.args[1] else local title = mw.title.getCurrentTitle() subpage = title.subpageText pagename = title.text if subpage ~= pagename then pagename = title.rootText end end local translitModule = pagename local languageObjects = require("Module:languages/byTranslitModule")(translitModule) local codeInPagename = pagename:match("^([%l-]+)%-.*translit$") local categories = Array() local codeInPagenameInList = false if codeInPagename then if languageObjects[1] and subpage ~= "documentation" then local agreement = languageObjects[2] and "s" or "" categories:insert("[[Category:Transliteration modules used by " .. #languageObjects .. " language" .. agreement .. "]]") end languageObjects = Array(languageObjects) :filter( function (lang) local result = lang:getCode() ~= codeInPagename codeInPagenameInList = codeInPagenameInList or result return result end) end if subpage ~= "documentation" then for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do local script = require "Module:scripts".getByCode(script_code) if script then categories:insert("[[Category:" .. script:getCategoryName() .. "]]") end end end if subpage ~= "documentation" and not page_exists("Module:" .. pagename .. "/testcases") then categories:insert("[[Category:Transliteration modules without a testcases subpage]]") end if not languageObjects[1] then return categories:concat() end local langs = Array(languageObjects) :sort( function(lang1, lang2) return lang1:getCode() < lang2:getCode() end) -- This will not error because languageObjects is not empty. :map(languageObjects[1].makeCategoryLink) :serialCommaJoin() return "It is " .. ( codeInPagenameInList and "also" or "" ) .. " used to transliterate " .. langs .. "." .. categories:concat() end -- Used by {{entry name module documentation}}. function export.entryNameModuleLangList(frame) local pagename, subpage if frame.args[1] then pagename = frame.args[1] else local title = mw.title.getCurrentTitle() subpage = title.subpageText pagename = title.text if subpage ~= pagename then pagename = title.rootText end end local entryNameModule = pagename local languageObjects = require("Module:languages/byEntryNameModule")(entryNameModule) local codeInPagename = pagename:match("^([%l-]+)%-.*entryname$") local categories = Array() local codeInPagenameInList = false if codeInPagename then if languageObjects[1] and subpage ~= "documentation" then local agreement = languageObjects[2] and "s" or "" categories:insert("[[Category:Entry name-generating modules used by " .. #languageObjects .. " language" .. agreement .. "]]") end languageObjects = Array(languageObjects) :filter( function (lang) local result = lang:getCode() ~= codeInPagename codeInPagenameInList = codeInPagenameInList or result return result end) end if subpage ~= "documentation" then for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do local script = require "Module:scripts".getByCode(script_code) if script then categories:insert("[[Category:" .. script:getCategoryName() .. "]]") end end end if subpage ~= "documentation" and not page_exists("Module:" .. pagename .. "/testcases") then categories:insert("[[Category:Entry name-generating modules without a testcases subpage]]") end if not languageObjects[1] then return categories:concat() end local langs = Array(languageObjects) :sort( function(lang1, lang2) return lang1:getCode() < lang2:getCode() end) -- This will not error because languageObjects is not empty. :map(languageObjects[1].makeCategoryLink) :serialCommaJoin() return "It is " .. ( codeInPagenameInList and "also" or "" ) .. " used to generate entry names for " .. langs .. "." .. categories:concat() end -- Used by {{sortkey module documentation}}. function export.sortkeyModuleLangList(frame) local pagename, subpage if frame.args[1] then pagename = frame.args[1] else local title = mw.title.getCurrentTitle() subpage = title.subpageText pagename = title.text if subpage ~= pagename then pagename = title.rootText end end local sortkeyModule = pagename local languageObjects = require("Module:languages/bySortkeyModule")(sortkeyModule) local codeInPagename = pagename:match("^([%l-]+)%-.*sortkey$") local categories = Array() local codeInPagenameInList = false if codeInPagename then if languageObjects[1] and subpage ~= "documentation" then local agreement = languageObjects[2] and "s" or "" categories:insert("[[Category:Sortkey-generating modules used by " .. #languageObjects .. " language" .. agreement .. "]]") end languageObjects = Array(languageObjects) :filter( function (lang) local result = lang:getCode() ~= codeInPagename codeInPagenameInList = codeInPagenameInList or result return result end) end if subpage ~= "documentation" then for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do local script = require "Module:scripts".getByCode(script_code) if script then categories:insert("[[Category:" .. script:getCategoryName() .. "]]") end end end if subpage ~= "documentation" and not page_exists("Module:" .. pagename .. "/testcases") then categories:insert("[[Category:Sortkey-generating modules without a testcases subpage]]") end if not languageObjects[1] then return categories:concat() end local langs = Array(languageObjects) :sort( function(lang1, lang2) return lang1:getCode() < lang2:getCode() end) -- This will not error because languageObjects is not empty. :map(languageObjects[1].makeCategoryLink) :serialCommaJoin() return "It is " .. ( codeInPagenameInList and "also" or "" ) .. " used to sort " .. langs .. "." .. categories:concat() end return export </textarea><div id="mw-scribunto-console"></div><div class="templatesUsed"><div class="mw-templatesUsedExplanation"><p>Templates used on this page: </p></div><ul> <li><a href="/w/index.php?title=Wiktionary:Tracking/documentation/module-includeonly&action=edit&redlink=1" class="new" title="Wiktionary:Tracking/documentation/module-includeonly (page does not exist)">Wiktionary:Tracking/documentation/module-includeonly</a> (<a href="/w/index.php?title=Wiktionary:Tracking/documentation/module-includeonly&action=edit" class="new" title="Wiktionary:Tracking/documentation/module-includeonly (page does not exist)">edit</a>) </li><li><a href="/wiki/Template:cd" class="mw-redirect" title="Template:cd">Template:cd</a> (<a href="/w/index.php?title=Template:cd&action=edit" class="mw-redirect" title="Template:cd">view source</a>) (semi-protected)</li><li><a href="/wiki/Template:code" title="Template:code">Template:code</a> (<a href="/w/index.php?title=Template:code&action=edit" title="Template:code">view source</a>) (template editor protected)</li><li><a href="/wiki/Template:documentation" title="Template:documentation">Template:documentation</a> (<a href="/w/index.php?title=Template:documentation&action=edit" title="Template:documentation">view source</a>) (template editor protected)</li><li><a href="/wiki/Template:temp" title="Template:temp">Template:temp</a> (<a href="/w/index.php?title=Template:temp&action=edit" title="Template:temp">view source</a>) (template editor protected)</li><li><a href="/wiki/Template:tl" class="mw-redirect" title="Template:tl">Template:tl</a> (<a href="/w/index.php?title=Template:tl&action=edit" class="mw-redirect" title="Template:tl">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:array" title="Module:array">Module:array</a> (<a href="/w/index.php?title=Module:array&action=edit" title="Module:array">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:code" title="Module:code">Module:code</a> (<a href="/w/index.php?title=Module:code&action=edit" title="Module:code">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:data/entities" title="Module:data/entities">Module:data/entities</a> (<a href="/w/index.php?title=Module:data/entities&action=edit" title="Module:data/entities">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:data/magic_words" title="Module:data/magic words">Module:data/magic words</a> (<a href="/w/index.php?title=Module:data/magic_words&action=edit" title="Module:data/magic words">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:data/metamethods" title="Module:data/metamethods">Module:data/metamethods</a> (<a href="/w/index.php?title=Module:data/metamethods&action=edit" title="Module:data/metamethods">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:debug/track" title="Module:debug/track">Module:debug/track</a> (<a href="/w/index.php?title=Module:debug/track&action=edit" title="Module:debug/track">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:documentation" title="Module:documentation">Module:documentation</a> (<a href="/w/index.php?title=Module:documentation&action=edit" title="Module:documentation">view source</a>) (semi-protected)</li><li><a href="/wiki/Module:documentation/documentation" title="Module:documentation/documentation">Module:documentation/documentation</a> (<a href="/w/index.php?title=Module:documentation/documentation&action=edit" title="Module:documentation/documentation">view source</a>) (semi-protected)</li><li><a href="/wiki/Module:fun" title="Module:fun">Module:fun</a> (<a href="/w/index.php?title=Module:fun&action=edit" title="Module:fun">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:pages" title="Module:pages">Module:pages</a> (<a href="/w/index.php?title=Module:pages&action=edit" title="Module:pages">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:parameters" title="Module:parameters">Module:parameters</a> (<a href="/w/index.php?title=Module:parameters&action=edit" title="Module:parameters">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:parser" title="Module:parser">Module:parser</a> (<a href="/w/index.php?title=Module:parser&action=edit" title="Module:parser">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:require_when_needed" title="Module:require when needed">Module:require when needed</a> (<a href="/w/index.php?title=Module:require_when_needed&action=edit" title="Module:require when needed">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:string_utilities" title="Module:string utilities">Module:string utilities</a> (<a href="/w/index.php?title=Module:string_utilities&action=edit" title="Module:string utilities">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:table" title="Module:table">Module:table</a> (<a href="/w/index.php?title=Module:table&action=edit" title="Module:table">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:template_parser" title="Module:template parser">Module:template parser</a> (<a href="/w/index.php?title=Module:template_parser&action=edit" title="Module:template parser">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:template_parser/templates" title="Module:template parser/templates">Module:template parser/templates</a> (<a href="/w/index.php?title=Module:template_parser/templates&action=edit" title="Module:template parser/templates">view source</a>) (template editor protected)</li><li><a href="/wiki/Module:yesno" title="Module:yesno">Module:yesno</a> (<a href="/w/index.php?title=Module:yesno&action=edit" title="Module:yesno">view source</a>) (template editor protected)</li></ul></div><p id="mw-returnto">Return to <a href="/wiki/Module:documentation" title="Module:documentation">Module:documentation</a>.</p> <!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wiktionary.org/wiki/Module:documentation">https://en.wiktionary.org/wiki/Module:documentation</a>"</div></div> <div id="catlinks" class="catlinks catlinks-allhidden" data-mw="interface"></div> </div> </div> <div id="mw-navigation"> <h2>Navigation menu</h2> <div id="mw-head"> <nav id="p-personal" class="mw-portlet mw-portlet-personal vector-user-menu-legacy vector-menu" aria-labelledby="p-personal-label" > <h3 id="p-personal-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Personal tools</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anonuserpage" class="mw-list-item"><span title="The user page for the IP address you are editing as">Not logged in</span></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li><li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-createaccount" class="mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=Module%3Adocumentation&returntoquery=action%3Dedit" title="You are encouraged to create an account and log in; however, it is not mandatory"><span>Create account</span></a></li><li id="pt-login" class="mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=Module%3Adocumentation&returntoquery=action%3Dedit" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span>Log in</span></a></li> </ul> </div> </nav> <div id="left-navigation"> <nav id="p-namespaces" class="mw-portlet mw-portlet-namespaces vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-namespaces-label" > <h3 id="p-namespaces-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Namespaces</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-module" class="selected mw-list-item"><a href="/wiki/Module:documentation" title="View the module page [c]" accesskey="c"><span>Module</span></a></li><li id="ca-talk" class="mw-list-item"><a href="/wiki/Module_talk:documentation" rel="discussion" title="Discussion about the content page [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </nav> <nav id="p-variants" class="mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-variants-label" > <input type="checkbox" id="p-variants-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-variants" class="vector-menu-checkbox" aria-labelledby="p-variants-label" > <label id="p-variants-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">English</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> </div> <div id="right-navigation"> <nav id="p-views" class="mw-portlet mw-portlet-views vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-views-label" > <h3 id="p-views-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Views</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="mw-list-item"><a href="/wiki/Module:documentation"><span>Read</span></a></li><li id="ca-viewsource" class="selected mw-list-item"><a href="/w/index.php?title=Module:documentation&action=edit" title="This page is protected. You can view its source [e]" accesskey="e"><span>View source</span></a></li><li id="ca-history" class="mw-list-item"><a href="/w/index.php?title=Module:documentation&action=history" title="Past revisions of this page [h]" accesskey="h"><span>History</span></a></li> </ul> </div> </nav> <nav id="p-cactions" class="mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-cactions-label" title="More options" > <input type="checkbox" id="p-cactions-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-cactions" class="vector-menu-checkbox" aria-labelledby="p-cactions-label" > <label id="p-cactions-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">More</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <h3 >Search</h3> <form action="/w/index.php" id="searchform" class="vector-search-box-form"> <div id="simpleSearch" class="vector-search-box-inner" data-search-loc="header-navigation"> <input class="vector-search-box-input" type="search" name="search" placeholder="Search Wiktionary" aria-label="Search Wiktionary" autocapitalize="none" title="Search Wiktionary [f]" accesskey="f" id="searchInput" > <input type="hidden" name="title" value="Special:Search"> <input id="mw-searchButton" class="searchButton mw-fallbackSearchButton" type="submit" name="fulltext" title="Search the pages for this text" value="Search"> <input id="searchButton" class="searchButton" type="submit" name="go" title="Go to a page with this exact name if it exists" value="Go"> </div> </form> </div> </div> </div> <div id="mw-panel" class="vector-legacy-sidebar"> <div id="p-logo" role="banner"> <a class="mw-wiki-logo" href="/wiki/Wiktionary:Main_Page" title="Visit the main page"></a> </div> <nav id="p-navigation" class="mw-portlet mw-portlet-navigation vector-menu-portal portal vector-menu" aria-labelledby="p-navigation-label" > <h3 id="p-navigation-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Navigation</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-text" class="mw-list-item"><a href="/wiki/Wiktionary:Main_Page"><span>Main Page</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wiktionary:Community_portal" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-requestedarticles" class="mw-list-item"><a href="/wiki/Wiktionary:Requested_entries"><span>Requested entries</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random entry</span></a></li><li id="n-help" class="mw-list-item"><a href="https://en.wiktionary.org/wiki/Help:Contents" title="The place to find out"><span>Help</span></a></li><li id="n-Glossary" class="mw-list-item"><a href="/wiki/Appendix:Glossary"><span>Glossary</span></a></li><li id="n-sitesupport" class="mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wiktionary.org&uselang=en" title="Support us"><span>Donations</span></a></li><li id="n-contact" class="mw-list-item"><a href="/wiki/Wiktionary:Contact_us"><span>Contact us</span></a></li> </ul> </div> </nav> <nav id="p-tb" class="mw-portlet mw-portlet-tb vector-menu-portal portal vector-menu" aria-labelledby="p-tb-label" > <h3 id="p-tb-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Tools</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Module:documentation" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Module:documentation" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=en" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Module:documentation&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fen.wiktionary.org%2Fw%2Findex.php%3Ftitle%3DModule%3Adocumentation%26action%3Dedit"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fen.wiktionary.org%2Fw%2Findex.php%3Ftitle%3DModule%3Adocumentation%26action%3Dedit"><span>Download QR code</span></a></li> </ul> </div> </nav> <nav id="p-wikibase-otherprojects" class="mw-portlet mw-portlet-wikibase-otherprojects vector-menu-portal portal vector-menu" aria-labelledby="p-wikibase-otherprojects-label" > <h3 id="p-wikibase-otherprojects-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In other projects</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q14357839" title="Link to connected data repository item [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </nav> <nav id="p-lang" class="mw-portlet mw-portlet-lang vector-menu-portal portal vector-menu" aria-labelledby="p-lang-label" > <h3 id="p-lang-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In other languages</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="uls-after-portlet-link"></span></div> </div> </nav> </div> </div> <footer id="footer" class="mw-footer" > <ul id="footer-info"> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wiktionary:About">About Wiktionary</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wiktionary:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wiktionary.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wiktionary.org/w/index.php?title=Module:documentation&action=edit&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> <script>(RLQ=window.RLQ||[]).push(function(){mw.log.warn("This page is using the deprecated ResourceLoader module \"codex-search-styles\".\n[1.43] Use a CodexModule with codexComponents to set your specific components used: https://www.mediawiki.org/wiki/Codex#Using_a_limited_subset_of_components");mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-pdn6j","wgBackendResponseTime":219,"wgPageParseReport":{"limitreport":{"cputime":"0.010","walltime":"0.013","ppvisitednodes":{"value":48,"limit":1000000},"postexpandincludesize":{"value":1600,"limit":2097152},"templateargumentsize":{"value":0,"limit":2097152},"expansiondepth":{"value":5,"limit":100},"expensivefunctioncount":{"value":0,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":0,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 0.000 1 -total"]},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-pdn6j","timestamp":"20241124072209","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>