Modul:pendokumenan
Penampilan
- Laman modul ini kekurangan sublaman pendokumenan. Sila cipta laman pendokumenan tersebut.
- Pautan berguna: senarai sublaman • pautan • transklusi • kes ujian • kotak pasir
local export = {}
local array_module = "Modul:array"
local debug_track_module = "Modul:debug/track"
local frame_module = "Modul:frame"
local fun_is_callable_module = "Modul:fun/isCallable"
local languages_module = "Modul:languages"
local links_module = "Modul:links"
local load_module = "Modul:load"
local module_categorization_module = "Modul:module categorization"
local number_list_show_module = "Modul:number list/show"
local pages_module = "Modul:pages"
local parameters_module = "Modul:parameters"
local scripts_module = "Modul:scripts"
local string_endswith_module = "Modul:string/endswith"
local string_gline_module = "Modul:string/gline"
local string_insert_module = "Modul:string/insert"
local string_startswith_module = "Modul:string/startswith"
local string_utilities_module = "Modul:string utilities"
local template_parser_module = "Modul:template parser"
local title_exists_module = "Modul:title/exists"
local title_new_title_module = "Modul:title/newTitle"
local concat = table.concat
local error = error
local full_url = mw.uri.fullUrl
local get_current_title = mw.title.getCurrentTitle
local insert = table.insert
local ipairs = ipairs
local list_to_text = mw.text.listToText
local new_message = mw.message.new
local pcall = pcall
local require = require
local tonumber = tonumber
local tostring = tostring
local type = type
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local function Array(...)
Array = require(array_module)
return Array(...)
end
local function categorize_module(...)
categorize_module = require(module_categorization_module).categorize
return categorize_module(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function endswith(...)
endswith = require(string_endswith_module)
return endswith(...)
end
local function expand_template(...)
expand_template = require(frame_module).expandTemplate
return expand_template(...)
end
local function find_templates(...)
find_templates = require(template_parser_module).find_templates
return find_templates(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function get_pagetype(...)
get_pagetype = require(pages_module).get_pagetype
return get_pagetype(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function gline(...)
gline = require(string_gline_module)
return gline(...)
end
local function is_callable(...)
is_callable = require(fun_is_callable_module)
return is_callable(...)
end
local function is_documentation(...)
is_documentation = require(pages_module).is_documentation
return is_documentation(...)
end
local function is_sandbox(...)
is_sandbox = require(pages_module).is_sandbox
return is_sandbox(...)
end
local function new_title(...)
new_title = require(title_new_title_module)
return new_title(...)
end
local function number_list_show_table(...)
number_list_show_table = require(number_list_show_module).table
return number_list_show_table(...)
end
local function preprocess(...)
preprocess = require(frame_module).preprocess
return preprocess(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function safe_load_data(...)
safe_load_data = require(load_module).safe_load_data
return safe_load_data(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function startswith(...)
startswith = require(string_startswith_module)
return startswith(...)
end
local function string_insert(...)
string_insert = require(string_insert_module)
return string_insert(...)
end
local function title_exists(...)
title_exists = require(title_exists_module)
return title_exists(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
local skins = {
["common" ] = "";
["vector" ] = "Vector";
["monobook" ] = "Monobook";
["cologneblue"] = "Cologne Blue";
["modern" ] = "Modern";
}
local function track(page)
debug_track("pendokumenan/" .. page)
return true
end
local function compare_pages(page1, page2, text)
return "[" .. tostring(
full_url("Khas:ComparePages", {page1 = page1, page2 = page2}))
.. " " .. text .. "]"
end
-- Avoid transcluding [[Modul:languages/cache]] everywhere.
local lang_cache = setmetatable({}, { __index = function (self, k)
return require("Modul:languages/cache")[k]
end })
local function zh_link(word)
return full_link{
lang = lang_cache.zh,
term = word
}
end
local function make_languages_data_documentation(title, cats, division)
local doc_template, module_cat
if endswith(division, "/extra") then
division = division:sub(1, -7)
doc_template = "language extradata documentation"
module_cat = "Modul data ekstra bahasa"
else
doc_template = "language data documentation"
module_cat = "Modul data bahasa"
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("^Modul: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(
"Modul data ini mengandungi " .. text_type .. " kepada " ..
"titik-titik kod [[Lampiran:Unicode|Unicode]] dalam julat U+%04X ke U+%04X.",
low, high)
if subpage == "images" and safe_load_data("Modul:Unicode data/emoji images/" .. first_three_of_code_point) then
text = text .. " Senarai ini termasuk varian teks emoji. Untuk senarai varian emoji aksara tersebut, lihat [[Modul:Unicode data/emoji images/" .. first_three_of_code_point .. "]]."
elseif subpage == "emoji images" then
text = text .. " Untuk imej gaya teks, lihat [[Modul: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
if lang._fullCode then
langname = lang_cache[lang._fullCode]:getCanonicalName()
else
langname = lang:getCanonicalName()
end
cats:insert(overall_data_module_cat .. "|" .. langname)
cats:insert("Modul bahasa " .. langname)
cats:insert("Modul data bahasa " .. langname)
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 [[Modul: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 "Templat:" 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 [[Modul: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
[[Modul: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 = "^Modul:languages/data/(3/%l/extra)$",
process = make_languages_data_documentation,
},
{
regex = "^Modul:languages/data/(3/%l)$",
process = make_languages_data_documentation,
},
{
regex = "^Modul:languages/data/(2/extra)$",
process = make_languages_data_documentation,
},
{
regex = "^Modul:languages/data/(2)$",
process = make_languages_data_documentation,
},
{
regex = "^Modul:languages/data/(exceptional/extra)$",
process = make_languages_data_documentation,
},
{
regex = "^Modul:languages/data/(exceptional)$",
process = make_languages_data_documentation,
},
{
regex = "^Modul:languages/.+$",
cat = "Modul bahasa dan tulisan",
},
{
regex = "^Modul:scripts/.+$",
cat = "Modul bahasa dan tulisan",
},
{
regex = "^Modul:data tables/data..?.?.?$",
cat = "Jadual data berpecah modul rujukan",
},
{
regex = "^Modul:zh/data/dial%-pron/.+$",
cat = "Modul data sebutan dialek Cina",
process = "zh dial or syn",
},
{
regex = "^Modul:zh/data/dial%-syn/.+$",
cat = "Modul data sinonim dialek Cina",
process = "zh dial or syn",
},
{
regex = "^Modul:zh/data/glyph%-data/.+$",
cat = "Modul data bentuk aksara Cina bersejarah",
process = function(title, cats)
local character = title.fullText:match("^Modul:zh/data/glyph%-data/(.+)")
if character then
return ("Modul ini mengandungi data tentang bentuk aksara Cina bersejarah %s.")
:format(zh_link(character))
end
end,
},
{
regex = "^Modul:zh/data/ltc%-pron/(.+)$",
cat = "Modul data sebutan bahasa Cina Pertengahan|%1",
process = "zh data",
},
{
regex = "^Modul:zh/data/och%-pron%-BS/(.+)$",
cat = "Modul data sebutan bahasa Cina Kuno (Baxter-Sagart)|%1",
process = "zh data",
},
{
regex = "^Modul:zh/data/och%-pron%-ZS/(.+)$",
cat = "Modul data sebutan bahasa Cina Kuno (Zhengzhang)|%1",
process = "zh data",
},
{
-- capture rest of zh/data submodules
regex = "^Modul:zh/data/(.+)$",
cat = "Modul data bahasa Cina|%1",
},
{
regex = "^Modul:mul/guoxue%-data/cjk%-?(.*)$",
process = "guoxue-data",
},
{
regex = "^Modul:Unicode data/(.+)$",
cat = "Modul data Unicode|%1",
process = make_Unicode_data_documentation,
},
{
regex = "^Modul:number list/data/(.+)$",
process = function(title, cats, lang_code)
local lang = insert_lang_data_module_cats(cats, lang_code, "Modul data nombor")
if lang then
return ("This module contains data on various types of numbers in %s.\n%s")
:format(lang:makeCategoryLink(), number_list_show_table() or "")
end
end,
},
{
regex = "^Modul:accel/(.+)$",
process = function(title, cats)
local lang_code = title.subpageText
local lang = lang_cache[lang_code]
if lang then
cats:insert("Modul bahasa " .. lang:getCanonicalName() .. "|accel")
cats:insert(("Submodul accel|%s"):format(lang:getCanonicalName()))
return ("This module contains new entry creation rules for %s; see [[WT:ACCEL]] for an overview, and [[Modul:accel]] for information on creating new rules.")
:format(lang:makeCategoryLink())
end
end,
},
{
regex = "^Modul:inc%-ash/dial/data/(.+)$",
cat = "Modul Prakrit Ashoka|%1",
process = function(title, cats)
local word = title.fullText:match("^Modul: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(full_link({ term = word, lang = lang }, "term"),
lang:makeCategoryLink())
end
end,
},
{
regex = "^.+%-translit$",
process = "translit",
},
{
regex = "^Modul:form of/lang%-data/(.+)$",
process = function(title, cats, lang_code)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Modul form-of khusus bahasa")
if lang then
-- FIXME, display more info.
return "This module contains language-specific form-of data (tags, shortcuts, base lemma params. etc.) for " ..
langname .. "."
end
end
},
{
regex = "^Modul:labels/data/lang/(.+)$",
process = function(title, cats, lang_code)
local lang = insert_lang_data_module_cats(cats, lang_code, "Modul data label khusus bahasa")
if lang then
return {
title = "label language-specific data documentation",
args = { [1] = lang_code },
}
end
end
},
{
regex = "^Modul:category tree/lang/(.+)$",
process = function(title, cats, lang_code)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Modul data category tree/lang")
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 category tree system, which is a general framework for generating the "
.. "descriptions and categorization of category pages.\n\n"
.. "For more information, see [[Modul:category tree/lang/doc]].\n\n"
.. "'''NOTE:''' If you add a new language-specific module, you must add the language code to the "
.. "list at the top of [[Modul:category tree/lang]] in order for the module to be recognized."
end
end
},
{
regex = "^Modul:category tree/topic/(.+)$",
process = function(title, cats, submodule)
cats:insert("Modul data category tree/topic| ")
return {
title = "topic cat data submodule documentation"
}
end
},
{
regex = "^Modul:category tree/(.+)$",
process = function(title, cats, submodule)
cats:insert("Modul data category tree| ")
return {
title = "category tree data submodule documentation"
}
end
},
{
regex = "^Modul:ja/data/(.+)$",
cat = "Modul data bahasa Jepun|%1",
},
{
regex = "^Modul:fi%-dialects/data/feature/Kettunen1940 ([0-9]+)$",
cat = "Modul atlas data dialek Finland|%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 = "^Modul:fi%-dialects/data/feature/(.+)",
cat = "Modul data dialek Finland|%1",
},
{
regex = "^Modul:fi%-dialects/data/word/(.+)",
cat = "Modul data dialek Finland|%1",
},
{
regex = "^Modul:Swadesh/data/([%l-]+)$",
process = function(title, cats, lang_code)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Modul swadesh")
if lang then
return "This module contains the [[Swadesh list]] of basic vocabulary in " .. langname .. "."
end
end
},
{
regex = "^Modul:Swadesh/data/([%l-]+)/([^/]*)$",
process = function(title, cats, lang_code, variety)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Modul swadesh")
if lang then
local prefix = "This module contains the [[Swadesh list]] of basic vocabulary in the "
local etym_lang = get_lang(variety, nil, "allow etym")
if etym_lang then
return ("%s %s variety of %s."):format(prefix, etym_lang:getCanonicalName(), langname)
end
local script = get_script(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 = "^Modul:typing%-aids",
process = function(title, cats)
local data_suffix = title.fullText:match("^Modul:typing%-aids/data/(.+)$")
local sortkey
if data_suffix then
if data_suffix:find "^[%l-]+$" then
local lang = get_lang(data_suffix)
if lang then
sortkey = lang:getCanonicalName()
cats:insert("Modul data bahasa " .. sortkey)
end
elseif data_suffix:find "^%u%l%l%l$" then
local script = get_script(data_suffix)
if script then
sortkey = script:getCanonicalName()
cats:insert(script:getCategoryName())
end
end
cats:insert("Modul data kemasukan aksara|" .. (sortkey or data_suffix))
end
end,
},
{
regex = "^Modul:R:([%l-]+):(.+)$",
process = function(title, cats, lang_code, refname)
local lang = lang_cache[lang_code]
if lang then
cats:insert("Modul bahasa " .. lang:getCanonicalName() .. "|" .. refname)
cats:insert(("Modul rujukan|%s"):format(lang:getCanonicalName()))
return "Modul ini menerapkan templat rujukan {{temp|R:" .. lang_code .. ":" .. refname .. "}}."
end
end,
},
{
regex = "^Modul:Quotations/([%l-]+)/?(.*)",
process = "Quotation",
},
{
regex = "^Modul:affix/lang%-data/([%l-]+)",
process = "affix lang-data",
},
{
regex = "^Modul:dialect synonyms/([%l-]+)$",
process = function(title, cats, lang_code)
local lang = lang_cache[lang_code]
if lang then
local langname = lang:getCanonicalName()
cats:insert("Modul data sinonim dialek|" .. langname)
cats:insert("Modul data sinonim dialek " .. langname .. "| ")
return "Modul ini mengandungi data tentang kelainan bahasa " .. langname .. " tertentu, untuk kegunaan " ..
"{{tl|sinonim dialek}}. Sinonim sebenar itu sendiri terkandung dalam submodul.\n\n" ..
expand_template({ title = 'dial syn', args = { lang_code, ["demo mode"] = "y" } })
end
end,
},
{
regex = "^Modul:dialect synonyms/([%l-]+)/(.+)$",
process = function(title, cats, lang_code, term)
local lang = lang_cache[lang_code]
if lang then
local langname = lang:getCanonicalName()
cats:insert("Modul data sinonim dialek|" .. langname)
cats:insert("Modul data sinonim dialek" .. langname .. "|" .. term)
return ("Modul ini mengandungi sinonim dialek %s untuk {{m|%s|%s}}.\n\n%s"):format(langname, lang_code, term, expand_template({ title = 'dial syn', args = { lang_code, term } }))
end
end,
},
{
regex = "^Modul:bibliography/data/([%l-]+)$",
process = function(title, cats, lang_code)
if lang_code == "preload" then
return 'Used as a base model for other languages when the button "create new language submodule" is clicked.'
end
local page = require(title.fullText).bib_page
if not page then
page = lang_cache[lang_code]:getCanonicalName()
if page then
cats:insert("modul " .. page)
end
end
cats:insert("Modul rujukan")
return "This module holds bibliographical data for "..page..". For the formatted bibliography see '''[[Appendix:Bibliography/"..page.."]]'''."
end,
},
}
function export.show(frame)
local boolean_default_false = {type = "boolean", default = false}
local args = process_params(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 new_title(args["for"]) or get_current_title()
local doc_title = args.from ~= "-" and new_title(args.from or title.fullText .. '/doc') or nil
local contentModel = title.contentModel
local pagetype, is_script_or_stylesheet = get_pagetype(title)
local preload, fallback_docs, doc_content, old_doc_title, user_name, skin_name, needs_doc
local doc_content_source = "Modul:pendokumenan"
local auto_generated_cat_source
local cats_auto_generated = false
if not args.allowondoc and is_documentation(title) 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 [[Templat:pendokumenan subpage]].")
elseif is_sandbox(title) then
local sandbox_ns = title.nsText
preload = ("Templat:pendokumenan/preload%s%sSandbox"):format(
sandbox_ns == "Modul" and sandbox_ns or "Templat",
title.rootText:match("^[Pp]engguna:(.+)") and "Pengguna" or ""
)
elseif pagetype:match("%f[%w]gadget%f[%W]") then
preload = "Templat:pendokumenan/preloadGadget"
elseif pagetype:match("%f[%w]script%f[%W]") then -- .js
if title.nsText == "MediaWiki" then
preload = "Templat:pendokumenan/preloadMediaWikiJavaScript"
else
preload = "Templat:pendokumenan/preloadTemplate" -- XXX
if title.nsText == "Pengguna" then
user_name = title.rootText
end
end
is_script_or_stylesheet = true
elseif pagetype:match("%f[%w]stylesheet%f[%W]") then -- .css
preload = "Templat:pendokumenan/preloadTemplate" -- XXX
if title.nsText == "Pengguna" then
user_name = title.rootText
end
is_script_or_stylesheet = true
elseif contentModel == "Scribunto" then -- Exclude pages in Modul: which aren't Scribunto.
preload = "Templat:pendokumenan/preloadModule"
elseif pagetype:match("%f[%w]template%f[%W]") or pagetype:match("%f[%w]project%f[%W]") then
preload = "Templat:pendokumenan/preloadTemplate"
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 = "pendokumenan/fallback/user module"
automatic_cats = {"Modul kotak pasir pengguna"}
else
for _, data in ipairs(module_regex) do
local captures = {umatch(title.fullText, data.regex)}
if #captures > 0 then
local cat, process_function
if is_callable(data.process) then
process_function = data.process
elseif type(data.process) == "string" then
doc_content_source = "Modul:pendokumenan/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 "Templat:" .. doc_content.title or doc_content_source
doc_content = expand_template(doc_content)
elseif doc_content ~= nil then
doc_content = preprocess(doc_content)
end
cat = data.cat
if cat then
if type(cat) == "string" then
cat = {cat}
end
for _, c in ipairs(cat) do
insert(cats, (ugsub(title.fullText, data.regex, c)))
end
end
break
end
end
end
if title.subpageText == "templates" then
cats:insert("Modul antara muka templat")
end
if automatic_cats then
for _, c in ipairs(automatic_cats) do
cats:insert(c)
end
end
if #cats == 0 then
local auto_cats = categorize_module(frame, "return raw", "noerror")
if #auto_cats > 0 then
auto_generated_cat_source = "Modul: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.content
-- 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 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 = " Kategori dijana secara automatik oleh [[" .. auto_generated_cat_source .. "]]. <sup>[[" ..
new_title(auto_generated_cat_source):fullUrl{action = "edit"} .. " sunting]]</sup>"
end
end
end
output:insert(
"<dd><i style=\"font-size: larger;\">Berikut merupakan " ..
"[[Bantuan:Mendokumenkan templat dan modul|pendokumenan]] yang terletak di [[" ..
doc_title.fullText .. "]]. " .. "<sup>[[" .. doc_title:fullUrl{action = "edit"} .. " sunting]]</sup>" ..
cats_auto_generated_text .. "</i></dd>")
else
if contentModel == "Scribunto" then
get_module_doc_and_cats(false)
elseif title.nsText == "Templat" then
--cats:insert("Uncategorized templates")
needs_doc = not (fallback_docs or nodoc)
elseif user_name and is_script_or_stylesheet then
skin_name = skins[title.text:sub(#title.rootText + 1):match("^/(%l+)%.[jc]ss?$")]
if skin_name then
fallback_docs = "pendokumenan/fallback/user " .. contentModel
end
end
if doc_content then
output:insert(
"<dd><i style=\"font-size: larger;\">Berikut merupakan " ..
"[[Bantuan:Mendokumenkan templat dan modul|pendokumenan]] yang " ..
"dijana oleh [[" .. doc_content_source .. "]]. <sup>[[" ..
new_title(doc_content_source):fullUrl{action = "edit"} ..
" sunting]]</sup> </i></dd>")
elseif not nodoc then
if doc_title then
output:insert(
"<dd><i style=\"font-size: larger;\">Laman " .. pagetype ..
" ini kekurangan [[Bantuan:Mendokumenkan templat dan modul|sublaman pendokumenan]]. " ..
(fallback_docs and "Anda boleh " or "Sila ") ..
"[" .. doc_title:fullUrl{action = "edit", preload = preload}
.. " cipta laman pendokumenan tersebut].</i></dd>\n")
else
output:insert(
"<dd><i style=\"font-size: larger; color: #FF0000;\">Tidak dapat menjana secara automatik " ..
"pendokumenan untuk " .. pagetype ..".</i></dd>\n")
end
end
end
if startswith(title.fullText, "MediaWiki:Gadget-") then
local is_gadget = false
for line in gline(new_title("MediaWiki:Gadgets-definition").content) do
local gadget, items = line:match("^%*%s*(%a[%w_-]*)%[.-%]|(.+)$")
if not gadget then
gadget, items = line:match("^%*%s*(%a[%w_-]*)|(.+)$")
end
if gadget then
items = Array(split(items, "|"))
for i, item in ipairs(items) do
if title.fullText == ("MediaWiki:Gadget-" .. item) then
is_gadget = true
output:insert("<dd> ''Skrip ini merupakan sebahagian daripada <code>")
output:insert(gadget)
output:insert("</code> gadget ([")
output:insert(tostring(full_url("MediaWiki:Gadgets-definition", {action = "edit"})))
output:insert(" sunting takrifan])'' <dl>")
output:insert("<dd> ''Huraian ([")
output:insert(tostring(full_url("MediaWiki:Gadget-" .. gadget, {action = "edit"})))
output:insert(" sunting])'': ")
output:insert(preprocess(new_message('Gadget-' .. gadget):plain()))
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> ''Bahagian lain'': ")
output:insert(list_to_text(items))
output:insert("</dd>")
end
output:insert("</dl></dd>")
break
end
end
end
end
if not is_gadget then
output:insert("<dd> ''Skrip ini bukanlah sebahagian daripada [")
output:insert(tostring(full_url("Khas:Gadgets", {uselang = "ms"})))
output:insert(' gajet] ([')
output:insert(tostring(full_url("MediaWiki:Gadgets-definition", {action = "edit"})))
output:insert(' sunting takrifan]).</dd>')
-- else
-- cats:insert("Wiktionary gadgets")
end
end
if old_doc_title then
output:insert("<dd> ''Dilencong daripada'' [")
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 .. "|akar laman]]")
links:insert("[[Khas:PrefixIndex/" .. title.nsText .. ":" .. title.rootText .. "/|sublaman akar laman]]")
else
links:insert("[[Khas:PrefixIndex/" .. title.fullText .. "/|senarai sublaman]]")
end
links:insert(
"[" .. tostring(full_url("Khas:WhatLinksHere/" .. title.fullText, {hidetrans = true, hideredirs = true})) .. " pautan]")
if contentModel ~= "Scribunto" then
links:insert(
"[" .. tostring(full_url("Khas:WhatLinksHere/" .. title.fullText, {hidelinks = true, hidetrans = true})) .. " lencongan]")
end
if is_script_or_stylesheet then
if user_name then
links:insert("[[Khas:MyPage" .. title.text:sub(#title.rootText + 1) .. "|milik anda]]")
end
else
links:insert(
"[" .. tostring(full_url("Khas:WhatLinksHere/" .. title.fullText, {hidelinks = true, hideredirs = true})) .. " transklusi]")
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 .. "|modul teruji]]")
else
links:insert("[[" .. title.fullText .. "/testcases|kes ujian]]")
end
if user_name then
links:insert("[[Pengguna:" .. user_name .. "|laman pengguna]]")
links:insert("[[Perbincangan pengguna:" .. user_name .. "|laman perbincangan pengguna]]")
links:insert("[[Khas:PrefixIndex/Pengguna:" .. user_name .. "/|ruang pengguna]]")
-- If sandbox module, add a link to the module that this is a sandbox of.
-- Exclude user sandbox modules like [[User:Dine2016/sandbox]].
elseif title.text:find("/sandbox%d*%f[/%z]") then
cats:insert("Modul kotak pasir")
-- Sandbox modules don’t really need documentation.
needs_doc = false
-- Don't track user sandbox modules.
local text_title = new_title(title.text)
if not (text_title and text_title.namespace == 2) then
track("sandbox to be moved")
local sandbox_of, diff = title.baseText
if title_exists(sandbox_of) then
diff = " (" .. compare_pages(title.fullText, sandbox_of, "diff") .. ")"
else
track("no sandbox of")
end
links:insert("[[:" .. sandbox_of .. "|kotak pasir bagi]]" .. (diff or ""))
end
-- If not a sandbox module, add link to sandbox module.
-- Sometimes there are multiple sandboxes for a single Modul:
-- [[Modul:sa-pronunc/sandbox]], [[Modul:sa-pronunc/sandbox2]].
-- Occasionally sandbox modules have their own subpages that are also
-- sandboxes: [[Modul:grc-decl/sandbox/decl]].
else
local sandbox_title
if title.rootText == "grc-decl" then
sandbox_title = string_insert(title.fullText, 16, "/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 .. "|kotak pasir]]"
local diff
if title_exists(sandbox_title) then
diff = " (" .. compare_pages(title.fullText, sandbox_title, "diff") .. ")"
end
links:insert(sandbox_link .. (diff or ""))
end
end
if title.nsText == "Templat" 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 = "Laman_yang_ada_ralat_skrip|ralat_ParserFunction|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(full_url('Khas:Search', errorq..eincategory )) .. ' ralat]'
.. ' (' ..
'[' .. tostring(full_url('Khas:Search', errorq..'ralat_ParserFunction' )) .. ' penghurai]'
.. '/' ..
'[' .. tostring(full_url('Khas:Search', errorq..'Laman_yang_ada_ralat_skrip' )) .. ' modul]'
.. ')'
)
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("Templat kotak pasir")
-- 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 title_exists(sandbox_of) then
diff = " (" .. compare_pages(title.fullText, sandbox_of, "diff") .. ")"
else
track("no sandbox of")
end
links:insert("[[:" .. sandbox_of .. "|kotak pasir bagi]]" .. (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 title_exists(sandbox_title) then
diff = " (" .. compare_pages(title.fullText, sandbox_title, "diff") .. ")"
end
links:insert("[[:" .. sandbox_title .. "|kotak pasir]]" .. (diff or ""))
end
end
if #links > 0 then
output:insert("<dd> ''Pautan berguna'': " .. links:concat(" • ") .. "</dd>")
end
end
output:insert("</dl>\n")
-- Show error from [[Modul:category tree/topic cat/data]] on its submodules'
-- documentation to, for instance, warn about duplicate labels.
if startswith(title.fullText, "Modul:category tree/topic/") then
local ok, err = pcall(require, "Modul:category tree/topic/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 = expand_template{ title = doc_title.fullText }
elseif not doc_content and fallback_docs then
doc_content = expand_template{
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 "span"))
if cats_auto_generated and not cats[1] and (not doc_content or not doc_content:find("%[%[Kategori:")) then
if contentModel == "Scribunto" then
cats:insert("Modul belum dikategorikan")
-- elseif title.nsText == "Templat" then
-- cats:insert("Uncategorized templates")
end
end
if needs_doc then
cats:insert("Templat dan modul yang memerlukan pendokumenan")
end
for _, cat in ipairs(cats) do
output:insert("[[Kategori:" .. cat .. "]]")
end
output:insert("</div>\n")
return output:concat()
end
function export.module_auto_doc_table()
local parts = {}
local function ins(text)
insert(parts, text)
end
ins('{|class="wikitable"')
ins("! Regex !! Kategori !! Modul kendali")
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
insert(cat_parts, ("<code>%s</code>"):format((cat:gsub("|", "|"))))
end
cat_text = concat(cat_parts, ", ")
else
cat_text = "''(unspecified)''"
end
ins("|-")
ins(("| <code>%s</code> || %s || %s"):format(spec.regex, cat_text,
is_callable(spec.process) and "''(dikendali secara dalaman)''" or
type(spec.process) == "string" and ("[[Modul:pendokumenan/functions/%s]]"):format(spec.process) or
"''(no documentation generator)''"))
end
ins("|}")
return 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 = get_current_title()
subpage = title.subpageText
pagename = title.text
if subpage ~= pagename then
pagename = title.rootText
end
end
local translitModule = pagename
local languageObjects = require("Modul:languages/byTranslitModule")(translitModule)
local codeInPagename = pagename:match("^([%l-]+)%-.*translit$")
local categories = Array()
local codeInPagenameInList = false
if codeInPagename then
if languageObjects[1] and subpage ~= "doc" then
local agreement = languageObjects[2] and "s" or ""
categories:insert("[[Kategori:Modul transliterasi digunakan oleh bahasa " ..
#languageObjects .. " " .. agreement .. "]]")
end
languageObjects = Array(languageObjects)
:filter(
function (lang)
local result = lang:getCode() ~= codeInPagename
codeInPagenameInList = codeInPagenameInList or result
return result
end)
end
if subpage ~= "doc" then
for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do
local script = get_script(script_code)
if script then
categories:insert("[[Kategori:" .. script:getCategoryName() .. "]]")
end
end
end
if subpage ~= "doc" and not title_exists("Modul:" .. pagename .. "/testcases") then
categories:insert("[[Kategori:Modul transliterasi tanpa sublaman kes ujian]]")
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 "Ia " .. ( codeInPagenameInList and "juga" or "" ) ..
" digunakan untuk mentransliterasi bahasa " .. 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 = get_current_title()
subpage = title.subpageText
pagename = title.text
if subpage ~= pagename then
pagename = title.rootText
end
end
local entryNameModule = pagename
local languageObjects = require("Modul:languages/byEntryNameModule")(entryNameModule)
local codeInPagename = pagename:match("^([%l-]+)%-.*entryname$")
local categories = Array()
local codeInPagenameInList = false
if codeInPagename then
if languageObjects[1] and subpage ~= "doc" then
local agreement = languageObjects[2] and "s" or ""
categories:insert("[[Kategori:Modul janaan nama masukan yang digunakan oleh bahasa " ..
#languageObjects .. " " .. agreement .. "]]")
end
languageObjects = Array(languageObjects)
:filter(
function (lang)
local result = lang:getCode() ~= codeInPagename
codeInPagenameInList = codeInPagenameInList or result
return result
end)
end
if subpage ~= "doc" then
for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do
local script = get_script(script_code)
if script then
categories:insert("[[Kategori:" .. script:getCategoryName() .. "]]")
end
end
end
if subpage ~= "doc" and not title_exists("Modul:" .. pagename .. "/testcases") then
categories:insert("[[Kategori:Modul janaan nama masukan tanpa sublaman kes ujian]]")
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 "Ia " .. ( codeInPagenameInList and "juga" or "" ) ..
" digunakan untuk menjana nama masukan untuk bahasa " .. 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 = get_current_title()
subpage = title.subpageText
pagename = title.text
if subpage ~= pagename then
pagename = title.rootText
end
end
local sortkeyModule = pagename
local languageObjects = require("Modul:languages/bySortkeyModule")(sortkeyModule)
local codeInPagename = pagename:match("^([%l-]+)%-.*sortkey$")
local categories = Array()
local codeInPagenameInList = false
if codeInPagename then
if languageObjects[1] and subpage ~= "doc" then
local agreement = languageObjects[2] and "s" or ""
categories:insert("[[Kategori:Modul janaan kunci isih yang digunakan oleh bahasa " ..
#languageObjects .. " " .. agreement .. "]]")
end
languageObjects = Array(languageObjects)
:filter(
function (lang)
local result = lang:getCode() ~= codeInPagename
codeInPagenameInList = codeInPagenameInList or result
return result
end)
end
if subpage ~= "doc" then
for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do
local script = get_script(script_code)
if script then
categories:insert("[[Kategori:" .. script:getCategoryName() .. "]]")
end
end
end
if subpage ~= "doc" and not title_exists("Modul:" .. pagename .. "/testcases") then
categories:insert("[[Kategori:Modul janaan kunci isih tanpa sublaman kes ujian]]")
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 "Ia " .. ( codeInPagenameInList and "juga" or "" ) ..
" digunakan untuk isih " .. langs .. "." .. categories:concat()
end
return export