Modul:category tree/languages
Penampilan
- Berikut merupakan pendokumenan yang dijana oleh Templat:category tree data submodule documentation. [sunting]
- Pautan berguna: akar laman • sublaman akar laman • pautan • transklusi • kes ujian • kotak pasir
Submodul data ini mentakrifkan sebahagian daripada struktur kategori Wikikamus.
Untuk pengenalan kepada sistem poscatboiler dan penerangan tentang cara menambah atau mengubah suai kategori, lihat Modul:category tree/data/doc.
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Semua bahasa"] = {
topright = "{{commonscat|Languages}}\n[[Fail:Languages world map-transparent background.svg|thumb|right|250px|Peta anggaran kasar keluarga bahasa yang wujud di seluruh dunia]]",
description = "Kategori ini mengandungi kategori-kategori untuk setiap bahasa yang wujud di Wikikamus.",
additional = "Bukan semua bahasa yang Wikikamus iktiraf ada kategori di sini lagi. Terdapat banyak bahasa yang tidak mendapat " ..
"sebarang perhatian dari penyunting, disebabkan bukan semua pengguna Wikikamus kenal akan setiap satu " ..
"bahasa yang wujud. Lihat [[Wiktionary:Senarai bahasa]] untuk senarai penuh.",
parents = {
"Asas",
},
}
raw_categories["Semua bahasa pupus"] = {
description = "Kategori ini mengandungi kategori-kategori untuk setiap [[bahasa pupus]] di Wikikamus.",
additional = "Jangan keliru akan kategori ini dengan [[Kategori:Bahasa pupus]], yang merupakan kategori payung untuk nama-nama bahasa yang pupus berpadanan dengan bahasa yang wujud (contohnya, bahasa {{m+|de|Langobardisch}} untuk bahasa [[Lombardik]] kuno).",
parents = {
"Semua bahasa",
},
}
raw_categories["Bahasa mengikut negara"] = {
topright = "{{commonscat|Bahasa mengikut benua}}",
description = "Kategori-kategori yang menggolongkan bahasa mengikut negara.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Semua bahasa",
},
}
raw_categories["Bahasa-bahasa pencilan"] = {
topright = "{{wikipedia|Bahasa pencilan}}\n{{commonscat|Bahasa pencilan}}",
description = "Bahasa yang tidak mempunyai bahasa kerabat yang diketahui.",
parents = {
{name = "Bahasa mengikut keluarga", sort = "*Pencilan"},
{name = "Semua keluarga bahasa", sort = "Pencilan"},
},
}
raw_categories["Bahasa yang tidak diisih mengikut kategori tempat"] = {
description = "Bahasa yang tidak menyatakan (dalam panggilan {{tl|auto cat}}) tempat ia dituturkan.",
additional = "Hal ini tidaklah termasuk bahasa buatan dan bahasa rekonstruksi; maka, semua bahasa dalam kategori ini secara eksplisit menyatakan lokasinya sebagai {{cd|UNKNOWN}}.",
parents = {
{name = "Permintaan"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page defining the category, find the call to
-- {{auto cat}} (if any), and return a table of its arguments. If the category page doesn't exist or doesn't have
-- an {{auto cat}} invocation, return nil.
--
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Kategori:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
local frame = mw.getCurrentFrame()
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and canonicalizes them, so uses of {{autocat}}
-- will also be found.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^(.*)$")
local bare_location = location_no_the or location
local location_link
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
location_link = concat(bare_location_parts, ", ")
if location_no_the then
location_link = "" .. location_link
end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle()
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then
track("setwikt/hyphen")
end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(wikimedialang:getCanonicalName() ~= canonicalName and "(''" .. wikimedialang:getCanonicalName() .. "'') " or "") ..
"'''[[:" .. wikimedialang:getCode() .. ":|" .. wikimedialang:getCode() .. ".wiktionary.org]]'''")
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''Tiada.''"
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''Pautan bahasa ]=], canonicalName, [=['''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | '''Wikipedia Bahasa Melayu''' mempunyai satu rencana berkenaan:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''Tiada.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | [[File:Wikimedia-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | '''Wikimedia Commons''' mempunyai pautan ke kandungan berkaitan bahasa ]=], canonicalName, [=[ pada projek saudaranya:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''Tiada.''" or "'''[[commons:" .. (setsister:gsub("^Kategori:", "Category:")) .. "|" .. (setsister:gsub("^Kategori:", "Category:")) .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | [[File:Wiktionary-logo-v2.svg|35px|none|Wikikamus]]
|style="border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | '''Edisi Wikikamus''']=], wikt_plural, [=[ ditulis dalam bahasa ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | [[File:Open book nae 02.svg|35px|none|Entry]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4,lightgray);" | '''Kata masukan Wikikamus''' untuk nama bahasa ini dalam bahasa Melayu:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("ms"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]]
|| '''Sumber Wikikamus''' untuk penyunting memberikan sumbangan berkenaan kata masukan bahasa ]=], canonicalName, [=[:
<div style="padding: 5px 0">
* '''[[Wikikamus:Garis panduan kata masukan bahasa ]=], canonicalName, [=[|Garis panduan kata masukan]]'''
* '''[[:Kategori:Templat rujukan bahasa ]=], canonicalName, [=[|Templat rujukan]] ({{PAGESINCAT:Templat rujukan bahasa ]=], canonicalName, [=[}})'''
* '''[[Lampiran:Bibliografi bahasa ]=], canonicalName, [=[|Bibliografi]]'''
</div>
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Sunting data bahasa")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Nama berkanun</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Nama lain</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>Alias</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Ragam bahasa</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wikikamus:Bahasa|Kod bahasa]]</th><td><code>" .. lang:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[Wikikamus:Keluarga bahasa|Keluarga bahasa]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>tidak dikelaskan</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Kategori:Bahasa-bahasa pencilan|bahasa pencilan]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Kategori:Bahasa-bahasa campuran|bahasa campuran]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Kategori:Bahasa-bahasa isyarat|bahasa isyarat]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Kategori:Bahasa-bahasa kreol atau pijin|kreol atau pijin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Kategori:Bahasa-bahasa buatan|bahasa buatan]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Leluhur</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Khas:Cari', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
return sc:makeCategoryLink()
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wikikamus:Tulisan|Tulisan]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wikikamus:Tulisan|Tulisan]]</th>\n<td>tidak dikhususkan</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Modul:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Modul:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Modul:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Modul<br>jana borang")
add_module_info(raw_data.translit, "[[Wikikamus:Transliterasi dan perumian|Modul<br>transliterasi]]")
add_module_info(raw_data.display_text, "Modul<br>papar teks")
add_module_info(raw_data.entry_name, "Modul<br>nama entri")
add_module_info(raw_data.sort_key, "Modul<br>[[kunci isih]]")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[' .. URL .. ' ' .. wikidataItem .. ']'
else
link = '<span class="error">Butir Wikidata tidak sah: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left;">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"Laman ini merupakan kategori utama untuk '''" .. nameWithLanguage .. "''', diwakili di Wikikamus melalui [[Wiktionary:Bahasa|kod]] '''" .. lang:getCode() .. "'''. " ..
"Bahasa ini mengandungi istilah-istilah dalam penulisan sejarah, yang maknanya masih belum ditentukan oleh para cendekiawan."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find("^Bahasa ") then
the_prefix = ""
else
the_prefix = ""
end
local description = "Kategori ini merupakan kategori utama " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "dunia" then
this_prep = "di"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "di"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; dan ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("Ia %s %s %s.\n\n"):format(
extinct and "merupakan sebuah [[bahasa pupus]] yang pernah dituturkan" or "dituturkan", prep, location_link_text)
elseif extinct then
location_desc = "Ia merupakan sebuah [[bahasa pupus]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Maklumat berkenaan bahasa " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
"Bahasa " .. ucfirst(canonicalName) .. " merupakan sebuah bahasa rekonstruksi. Perkataan dan akar bahasa ini tidak dibuktikan secara langsung dalam mana-mana karya bertulis, tetapi telah dibina semula melalui ''kaedah perbandingan'', " ..
"dengan cara mencari persamaan tetap antara bahasa yang tidak dapat dijelaskan secara kebetulan atau peminjaman kata, dan mengekstrapolasi bentuk purba daripada persamaan ini.\n\n" ..
"Menurut [[Wikikamus:Kriteria kemasukan|kriteria kemasukan]] kami, perkataan pada bahasa " .. canonicalName ..
" sepatutnya '''tidak''' wujud pada entri ruang nama utama, tetapi boleh ditambah pada ruang nama Rekonstruksi:. "
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
"Bahasa " .. ucfirst(canonicalName) .. " merupakan sebuah bahasa buatan yang hanya digunakan sekali sekala. " ..
"Menurut [[Wikikamus:Kriteria kemasukan|kriteria kemasukan]] kami, perkataan pada bahasa " .. canonicalName ..
" sepatutnya '''tidak''' wujud pada entri ruang nama utama, tetapi boleh ditambah pada ruang nama Rekonstruksi:. " ..
"Semua perkataan bahasa ini boleh didapati pada [[Lampiran:Bahasa " .. ucfirst(canonicalName) .. "]]."
end
local entry_guidelines_page = "Wikikamus:Garis panduan kata masukan bahasa " .. canonicalName
local entry_guidelines = new_title(entry_guidelines_page)
if entry_guidelines.exists then
add = add .. "\n\n" ..
"Sila lihat '''[[" .. entry_guidelines_page .. "]]''' untuk maklumat dan pertimbangan khusus apabila ingin mencipta kata masukan " .. nameWithLanguage .. "."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame(
tree_of_descendants,
"Pokok bahasa")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " tidak mempunyai turunan atau kelainan bahasa yang disenaraikan dalam modul data bahasa Wikikamus."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "ms"}
local ret = {{name = "Semua bahasa", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Kategori:Bahasa belum diklasifikasi", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Kategori:Bahasa-bahasa pencilan", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Kategori:Bahasa-bahasa campuran", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Kategori:Semua bahasa isyarat", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Kategori:Bahasa-bahasa kreol atau pijin", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- Avoid Haitian Creole being categorised in [[:Category:Haitian Creole-based creole or pidgin languages]], as one of its ancestors is an etymology-only variety of it.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Kategori:Bahasa-bahasa kreol atau pijin berasaskan bahasa " .. ucfirst(anc_extra:getFullName()), sort = sortkey})
end
else
insert(ret, {name = "Kategori:Bahasa-bahasa kreol atau pijin berasaskan bahasa " .. ucfirst(anc:getFullName()), sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Kategori:Bahasa buatan pada lampiran sahaja", sort = sortkey})
else
insert(ret, {name = "Kategori:Bahasa-bahasa buatan", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Kategori:Bahasa buatan berasaskan bahasa " .. ucfirst(anc_extra:getFullName()), sort = sortkey})
end
else
insert(ret, {name = "Kategori:Bahasa buatan berasaskan bahasa " .. ucfirst(anc:getFullName()), sort = sortkey})
end
end
else
insert(ret, {name = "Kategori:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Kategori:Bahasa rekonstruksi",
sort = {sort_base = canonicalName:gsub("Purba$", ""), lang = "ms"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Kategori:Bahasa-bahasa " .. sc:getCategoryName(), sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Kategori:Bahasa dengan transliterasi automatik", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Bahasa di " .. location
insert(ret, {name = "Kategori:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Kategori:Semua bahasa pupus", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Kategori:Bahasa yang belum diisih ke dalam kategori tempat", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
for _, label in ipairs({"Lampiran", "Penyelenggaraan entri", "Lema", "Nama", "Frasa", "Rima", "Simbol", "Templat", "Perkataan mengikut etimologi", "Perkataan mengikut penggunaan"}) do
insert(ret, {name = label, is_label = true})
end
insert(ret, {name = "Perkataan diterbitkan daripada bahasa {{{langname}}}", is_label = true, lang = false})
insert(ret, {name = "{{{langcode}}}:Semua topik", sort = "semua topik"})
insert(ret, {name = "Ragam bahasa {{{langname}}}"})
insert(ret, {name = "Permintaan berkenaan {{{langname}}}"})
insert(ret, {name = "Rima:Bahasa {{{langname}}}", description = "Senarai perkataan bahasa {{{langname}}} mengikut rimanya."})
insert(ret, {name = "Pengguna {{{langcode}}}", description = "Pengguna Wikikamus yang dikategorikan mengikut tahap kefasihan berbahasa {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:match("^[Bb]ahasa") or category:match("^[Ll]ek")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^Bahasa (.*)$")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Bahasa di (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^(.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^(.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Bahasa di " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Bahasa mengikut negara", sort = {sort_base = bare_location, lang = "ms"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "Kategori:" .. locationcat, sort = "Bahasa di "})
end
else
local location_cat = ("Kategori:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "Bahasa di"})
end
end
local description = ("Kategori untuk kumpulan bahasa kepada %s (termasuk sublek)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("^Bahasa-bahasa kreol atau pijin berasaskan bahasa (.*)")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Bahasa-bahasa kreol atau pijin", sort = {sort_base = "*" .. langname, lang = "ms"}}},
breadcrumb = "berasaskan bahasa " .. lang:getCanonicalName(),
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("^Bahasa buatan berasaskan bahasa (.*)")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Bahasa buatan berasaskan bahasa " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Bahasa-bahasa buatan", sort = {sort_base = "*" .. langname, lang = "ms"}}},
breadcrumb = "berasaskan bahasa " .. lang:getCanonicalName(),
}
end
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}