Module:Documentation
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"; }
-- this is to automatically categorize data modules and prevent cluttering Cat:Uncategorized modules local data_modules_regex_cats = { ["^Module:data tables/data..?.?.?$"] = "Reference module sharded data tables", ["^Module:Quotations/...?.?.?.?.?.?$"] = "Quotation data modules", ["^Module:zh/data/.+[a-zA-z0-9]$"] = "Chinese data modules", -- capture submodules of zh/data that do not end with a hanzi in the title ["^Module:zh/data/dial%-pron/"] = "Chinese dialectal pronunciation data modules", ["^Module:zh/data/dial%-syn/"] = "Chinese dialectal synonyms data modules", ["^Module:zh/data/glyph%-data/"] = "Chinese historical character forms data modules", ["^Module:zh/data/ltc%-pron/"] = "Middle Chinese pronunciation data modules", ["^Module:zh/data/och%-pron%-BS/"] = "Old Chinese (Baxter-Sagart) pronunciation data modules", ["^Module:zh/data/och%-pron%-ZS/"] = "Old Chinese (Zhengzhang) pronunciation data modules", ["^Module:Unicode data"] = "Unicode data modules", ["^Module:number list/data/"] = "Number data modules", ["^Module:es%-conj/data/"] = "Spanish data modules" }
function export.show(frame) local params = { ["hr"] = {}, ["for"] = {}, ["from"] = {}, ["notsubpage"] = { type = "boolean", default = false }, ["nodoc"] = { type = "boolean", default = false }, }
local args = require("Module:parameters").process(frame.args, params)
local output = { '\nlocal cats = {}
if (not args.hr) or (args.hr == "above") then output[#output + 1] = "----\n" end
local title = ((args['for'] ~= "") and args['for']) and mw.title.new(args['for']) or mw.title.getCurrentTitle() local doc_title = mw.title.new((args['from'] ~= "") and args['from'] or (title.fullText .. '/documentation')) local contentModel = title.contentModel
local pagetype = mw.getContentLanguage():lcfirst(title.nsText) .. " page" local preload
local user_name, skin_name
if contentModel == "javascript" then pagetype = "script" preload = 'Template:documentation/preloadTemplate' -- XXX if title.nsText == 'User' then user_name = title.rootText end elseif contentModel == "css" then pagetype = "style sheet" preload = 'Template:documentation/preloadTemplate' -- XXX if title.nsText == 'User' then user_name = title.rootText end elseif contentModel == "Scribunto" then pagetype = "module" user_name = title.rootText:match("^User:(.+)") if user_name then preload = 'Template:documentation/preloadModuleSandbox' else preload = 'Template:documentation/preloadModule' end elseif title.nsText == "Template" then pagetype = "template" preload = 'Template:documentation/preloadTemplate' elseif title.nsText == "Wiktionary" then pagetype = "project page" preload = 'Template:documentation/preloadTemplate' -- XXX end
local old_title if doc_title.isRedirect then old_title = doc_title doc_title = mw.title.new(string.match(doc_title:getContent(), "^#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]]-)%]%]")) end
local fallback_docs, doc_content
output[#output + 1] = "- "
if doc_title.exists then
output[#output + 1] =
"
- The following " .. "documentation is located at [[" .. doc_title.fullText .. "]]. " .. "[[" .. doc_title:fullUrl { action = 'edit' } .. " edit]] " else if contentModel == "Scribunto" then local automatic_cat = "Uncategorized modules" if user_name then fallback_docs = 'documentation/fallback/user module' automatic_cat = "User sandbox modules" else for r, cat in pairs(data_modules_regex_cats) do if mw.ustring.match(title.fullText, r) then automatic_cat = cat; break end end if mw.ustring.match(title.fullText, "^Module:zh/data/ltc%-pron/") or mw.ustring.match(title.fullText, "^Module:zh/data/och%-pron%-BS/") or mw.ustring.match(title.fullText, "^Module:zh/data/och%-pron%-ZS/") then require('Module:zh-track').track_data_module(title.fullText) end end cats[#cats + 1] = automatic_cat if title.fullText:find("^Module:Unicode data/") then local subpage = title.fullText:match("/([^/]+)") if subpage == "names" or subpage == "images" then local hexnum = title.fullText:match("/[^/]+/(%x%x%x)$") if not hexnum then error("???") end local low, high = tonumber(hexnum .. "000", 16), tonumber(hexnum .. "FFF", 16) local datum = subpage == "images" and "the pagenames of images" or "the names" doc_content = string.format( "This data module contains " .. datum .. " of " .. "Unicode codepoints within the range U+%X to U+%X.", low, high) end end -- meaning module is not in user's sandbox or one of many datamodule boring series if automatic_cat == "Uncategorized modules" and not fallback_docs then cats[#cats + 1] = "Templates and modules needing documentation" end elseif title.nsText == "Template" then --cats[#cats + 1] = "Uncategorized templates" if not ( fallback_docs or args.nodoc ) then cats[#cats + 1] = "Templates and modules needing documentation" end elseif (contentModel == "css") or (contentModel == "javascript") 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[#output + 1] = "
- The following " .. "documentation is " .. "generated by Module:documentation. [[" .. mw.title.new("Module:documentation"):fullUrl { action = 'edit' } .. " edit]] " elseif not args.nodoc then output[#output + 1] = "
- This " .. pagetype .. " lacks a documentation subpage. " .. (fallback_docs and "You may " or "Please ") .. "[" .. doc_title:fullUrl { action = 'edit', preload = preload } .. " create it]. \n" 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 = mw.text.split(items, "|") for i, item in ipairs(items) do if title.fullText == ("MediaWiki:Gadget-" .. item) then is_gadget = true output[#output + 1] = "
- This script is a part of the
"
output[#output + 1] = gadget output[#output + 1] = " gadget ([" output[#output + 1] = tostring(mw.uri.fullUrl('MediaWiki:Gadgets-definition', 'action=edit')) output[#output + 1] = " edit definitions])- "
- Description ([" output[#output + 1] = tostring(mw.uri.fullUrl('MediaWiki:Gadget-' .. gadget, 'action=edit')) output[#output + 1] = " edit]): " output[#output + 1] = mw.message.new('Gadget-' .. gadget):plain() output[#output + 1] = "
" table.remove(items, i) if #items > 0 then for j, item in ipairs(items) do items[j] = '' .. item .. '' end output[#output + 1] = "- Other parts: " output[#output + 1] = mw.text.listToText(items) output[#output + 1] = "
" end output[#output + 1] = "
break end end end end
if not is_gadget then output[#output + 1] = "
if old_title then output[#output + 1] = "
local links = {}
if title.isSubpage and not args.notsubpage then links[#links + 1] = "root page" links[#links + 1] = "root page's subpages" else links[#links + 1] = "subpage list" end
if (contentModel == "javascript") or (contentModel == "css") then links[#links + 1] = "what links here"
if user_name then links[#links + 1] = "your own" end else links[#links + 1] = '[' .. tostring(mw.uri.fullUrl('Special:WhatLinksHere/' .. title.fullText, 'hidelinks=1&hideredirs=1')) .. ' transclusions]'
if contentModel ~= "Scribunto" then links[#links + 1] = '[' .. tostring(mw.uri.fullUrl('Special:WhatLinksHere/' .. title.fullText, 'hidelinks=1&hidetrans=1')) .. ' redirects]' end end
if contentModel == "Scribunto" then if title.isSubpage and (title.subpageText == "testcases") then links[#links + 1] = "tested module" else links[#links + 1] = "testcases" end
if user_name then links[#links + 1] = "user page" links[#links + 1] = "user talk page" links[#links + 1] = "userspace" end end
if #links > 0 then output[#output + 1] = "
if doc_title.exists then output[#output + 1] = frame:expandTemplate { title = doc_title.fullText } elseif doc_content then output[#output + 1] = doc_content elseif fallback_docs then output[#output + 1] = frame:expandTemplate { title = fallback_docs; args = { ['user'] = user_name; ['page'] = title.fullText; ['skin name'] = skin_name; } } end
if args.hr == "below" then
output[#output + 1] = '\n'
else
output[#output + 1] = '\n
'
end
for _, cat in ipairs(cats) do output[#output + 1] = "" end
output[#output + 1] = "return table.concat(output) end
-- Used by Template: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("^(.-)%-translit")
if not codeInPagename then return "" end
local langs = {} local codeInPagenameInList = false local category = "" if languageObjects[1] and subpage ~= "documentation" then local agreement = languageObjects[2] and "s" or "" category = "[[Category:Transliteration modules used by " .. #languageObjects .. " language" .. agreement .. "]]" end
for i, lang in ipairs(languageObjects) do if lang:getCode() == codeInPagename then table.remove(languageObjects, i) codeInPagenameInList = true break end end
local function link(lang)
local canonicalName = lang:getCanonicalName()
return "" .. canonicalName ..
" (" .. lang:getCode() .. "
)"
end
-- TODO: Use serialCommaJoin in Module:table. if not languageObjects[1] then return category or "" end
table.sort(languageObjects, function(lang1, lang2) return lang1:getCode() < lang2:getCode() end) if languageObjects[3] then for i, lang in ipairs(languageObjects) do table.insert(langs, link(lang)) if languageObjects[i + 2] then table.insert(langs, ", ") elseif languageObjects[i + 1] then table.insert(langs, ', and ') end end else for i, lang in ipairs(languageObjects) do table.insert(langs, link(lang))
if languageObjects[i + 1] then table.insert(langs, " and ") end end end
langs = table.concat(langs)
return "It is " .. ( codeInPagenameInList and "also" or "" ) .. " used to transliterate " .. langs .. "." .. category end
return export