Modul:category tree/entry maintenance
Penampilan
- Berikut merupakan pendokumenan yang dijana oleh Templat:category tree data submodule documentation. [sunting]
- Pautan berguna: laman akar • sublaman laman akar • 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 labels = {}
local raw_categories = {}
local raw_handlers = {}
local functions_module = "Module:fun"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local table_module = "Module:table"
local extend = require(table_module).extend
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local unpack = unpack or table.unpack -- Lua 5.2 compatibilityc
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["Penyelenggaraan entri"] = {
description = "Entri bahasa {{{langname}}}, atau entri dalam bahasa lain yang mengandungi perkataan {{{langname}}},yang sedang dijejaki untuk perhatian dan penambahbaikan oleh penyunting.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella_parents = "Asas",
}
labels["Entri dengan pengepala bahasa tidak betul"] = {
description = "Entri bahasa {{{langname}}} yang diletakkan di bawah pengepala bahasa yang salah.",
additional = "Ini boleh berlaku atas sebab-sebab berikut:\n" ..
"* Salah tulis.\n" ..
"* Laku musnah.\n" ..
"* Kod bahasa yang salah digunakan.\n" ..
"* Nama bahasa alternatif digunakan.\n" ..
"* Aksara khas digunakan yang tidak digunakan dalam nama yang diberi dalam modul-modul data bahasa.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
lang_position = "mid",
label_before = "Entri",
label_after = "dengan pengepala bahasa tidak betul",
}
labels["Entri tanpa pengepala Rujukan"] = {
description = "{{{langname}}} entries without a References header.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["entries without References or Further reading header"] = {
description = "{{{langname}}} entries without a References or Further reading header.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["entries that don't exist"] = {
description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.",
parents = {"Penyelenggaraan entri"},
umbrella_parents = "Asas",
}
labels["Entri dengan pokok etimologi"] = {
description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology texts"] = {
description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons with invalid IDs"] = {
description = "Entries which use the {{tl|etymon}} template with an invalid ID. For example, {{code|entry>lang>nonexistent ID}} or {{code|lang>nonexistent entry>nonexistent ID}}",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["Entri dengan kategori nama bahasa yang menggunakan penanda mentah"] = {
description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
lang_position = "mid",
label_before = "Entri",
label_after = "dengan kategori nama bahasa yang menggunakan penanda mentah",
}
labels["Entri dengan kategori topik yang menggunakan penanda mentah"] = {
description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
lang_position = "mid",
label_before = "Entri",
label_after = "dengan kategori topik yang menggunakan penanda mentah",
}
labels["Entri dengan sumber usang"] = {
description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.",
parents = {"Penyelenggaraan entri"},
}
labels["Terbitan tidak pasti"] = {
description = "Etimologi bahasa {{{langname}}} menggunakan {{tl|undefined derivation}}, di mana templat lebih khusus seperti {{tl|borrowed}} atau {{tl|inherited}} patut digunakan.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["descendants to be fixed in desctree"] = {
description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["Permintaan perkataan"] = {
description = "Entri dengan [[Templat:der]], [[Templat:inh]], [[Templat:m]] dsb. yang ketiadaan parameter pautan ke perkataan bahasa {{{langname}}}.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["Pautan merah"] = {
description = "Pautan terhadap entri bahasa {{{langname}}} yang belum dicipta lagi.",
parents = {"Penyelenggaraan entri"},
catfix = false,
can_be_empty = true,
hidden = true,
}
labels["Perkataan dengan sebutan AFA"] = {
description = "Perkataan bahasa {{{langname}}} dengan perwakilan sebutan dalam bentuk Abjad Fonetik Antarabangsa (AFA).",
additional = "Bagi permintaan berkenaan kategori ini, lihat [[:Kategori:Permintaan sebutan entri bahasa {{{langname}}}]].",
parents = {"Penyelenggaraan entri"},
}
labels["Sebutan IPA dengan pemisah tidak sah"] = {
description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
labels["terms with hyphenation"] = {
description = "{{{langname}}} terms that include hyphenation.",
parents = {"Penyelenggaraan entri"},
}
labels["Perkataan dengan audio sebutan"] = {
description = "Perkataan bahasa {{{langname}}} dengan fail audio yang membunyikan sebutan.",
additional = "Bagi permintaan berkenaan kategori ini, lihat [[:Kategori:Permintaan audio sebutan perkataan bahasa {{{langname}}}]].",
parents = {"Penyelenggaraan entri"},
}
labels["Entri kehilangan Templat:reconstructed"] = {
description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation, extra)
labels[label] = {
description = desc or label .. " dalam bahasa {{{langname}}}.",
additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" ..
"Ambil perhatian bahawa laman dalam kategori ini tidak semestinya sama dengan istilah sebenar yang dipersoalkan. " ..
"Hal ini kerap berlaku, contohnya, pada laman bahasa Inggeris bahagian terjemahan, apabila istilah yang " ..
"mencetuskan penambahan kategori itu merupakan salah satu daripada terjemahan."),
parents = {"Penyelenggaraan entri"},
catfix = false,
toc_template = "{{{langcode}}}-categoryTOC",
toc_template_full = "{{{langcode}}}-categoryTOC/full",
can_be_empty = true,
hidden = true,
}
if extra then
for k, v in pairs(extra) do
labels[label][k] = v
end
end
end
add_manual_param_category("Perkataan dalam bentuk tulisan tidak piawai", nil,
"Laman-laman diletakkan di sini jika memiliki perkataan yang ditulis dalam tulisan yang tidak tersenarai dalam " ..
"senarai tulisan dalam data bahasa. Hal ini mungkin memerlukan tulisan baharu disenaraikan ataupun kod tulisan yang tidak betul digunakan.",
true,
{
lang_position = "mid",
label_before = "Perkataan",
label_after = "dalam bentuk tulisan tidak piawai",
}
)
add_manual_param_category("Perkataan dengan transliterasi manual tidak lewah", nil,
"Laman-laman diletakkan di sini jika memiliki perkataan dengan transliterasi yang ditakrifkan secara manual dengan " ..
"parameter {{para|tr}} dsb. tetapi berbeza dengan transliterasi yang dijana secara automatik.",
true)
add_manual_param_category("Perkataan dengan transliterasi lewah", nil,
"Laman-laman diletakkan di sini jika memiliki perkataan dengan transliterasi yang ditakrifkan secara manual dengan " ..
"parameter {{para|tr}} dsb. dan sama dengan transliterasi yang dijana secara automatik.",
true)
add_manual_param_category("Perkataan dengan kod tulisan manual tidak lewah", nil,
"Laman-laman diletakkan di sini jika memiliki perkataan dengan kod tulisan yang ditakrifkan secara manual dengan " ..
"parameter {{para|sc}} dsb. tetapi berbeza dengan kod yang dijana secara automatik.",
true)
add_manual_param_category("Perkataan dengan kod tulisan lewah", nil,
"Laman-laman diletakkan di sini jika memiliki perkataan dengan kod tulisan yang ditakrifkan secara manual dengan " ..
"parameter {{para|sc}} dsb. dan merupakan kod yang sama dengan kod yang dijana secara automatik.",
true)
add_manual_param_category("Perkataan dengan kunci isih tidak lewah dan tidak automatik",
"{{{langname}}} terms with non-redundant non-automated sortkeys.",
"Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " ..
"generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " ..
"parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " ..
"sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " ..
"page will also be added here.",
false,
{
lang_position = "mid",
label_before = "Perkataan",
label_after = "dengan kunci isih tidak lewah dan tidak automatik",
}
)
add_manual_param_category("Perkataan dengan kunci isih lewah",
"{{{langname}}} terms with redundant sortkeys.",
"Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " ..
"as the one which is automatically generated.",
false,
{
lang_position = "mid",
label_before = "Perkataan",
label_after = "dengan kunci isih lewah",
}
)
add_manual_param_category("Pautan dengan parameter sasaran lewah",
"Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " ..
"separately.",
"This occurs when the only difference between the link target and the alt text is that the alt text contains " ..
"diacritics (or other characters) which would have been ignored anyway had they been included in the link " ..
"target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " ..
"({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " ..
"displayed.")
add_manual_param_category("Pautan dengan parameter alt diabaikan",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("Pautan dengan parameter alt lewah",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.",
"This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " ..
"({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).")
add_manual_param_category("Pautan dengan parameter id diabaikan",
"Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("Pautan dengan pautan wiki lewah",
"Pages containing {{{langname}}} links which contain a redundant wikilink.",
"This occurs if link target consists of a single wikilink, which should instead be entered in the " ..
"conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " ..
"is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " ..
"{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " ..
"unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}",
false,
{
lang_position = "mid",
label_before = "Pautan",
label_after = "dengan pautan wiki lewah",
}
)
add_manual_param_category("Pautan dengan serpihan manual",
"Pages containing {{{langname}}} links where a manual link fragment has been given.",
"This occurs when the link fragment has been specified using {{code|#}} after the term, " ..
"which overrides the normal fragment generated by link templates that points to the relevant " ..
"language section.\n\nLink fragments are used to point to a specific section on a target page, and " ..
"it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " ..
"additional content is added to the target page: for example, the fragment {{code|#Adjective}} " ..
"will start pointing to the wrong section if another language with an adjective section is added above " ..
"the intended language.")
labels["descendant hubs"] = {
description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.",
parents = {"Penyelenggaraan entri"},
}
labels["terms needing to be assigned to a sense"] = {
description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
--[=[
labels["terms with inflection tables"] = {
description = "{{{langname}}} entries that contain inflection tables.".
additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].",
parents = {"Penyelenggaraan entri"},
}
]=]
labels["terms with collocations"] = {
description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.",
additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"Penyelenggaraan entri"},
}
labels["Perkataan dengan contoh penggunaan"] = {
description = "Entri bahasa {{{langname}}} yang mengandungi contoh penggunaan yang ditambah dengan templat seperti {{tl|ux}}.",
additional = "Bagi permintaan berkenaan kategori ini, lihat [[:Kategori:Permintaan contoh penggunaan bahasa {{{langname}}}]]. Lihat juga [[:Kategori:Requests for collocations in {{{langname}}}]] dan [[:Kategori:Permintaan petikan {{{langname}}}]].",
parents = {"Penyelenggaraan entri"},
}
labels["Perkataan dengan petikan"] = {
description = "Entri bahasa {{{langname}}} yang mengandungi petikan yang ditambah dengan templat seperti {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, dsb.",
additional = "Bagi permintaan berkenaan kategori ini, lihat [[:Kategori:Permintaan petikan bahasa {{{langname}}}]]. Lihat juga [[:Kategori:Permintaan contoh penggunaan bahasa {{{langname}}}]].",
parents = {"Penyelenggaraan entri"},
}
labels["Perkataan dengan parameter inti lewah"] = {
description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).",
additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
lang_position = "mid",
label_before = "Perkataan",
label_after = "dengan kunci isih lewah"
}
labels["perkataan dengan pautan merah dalam barisan inti"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"pautan merah"},
can_be_empty = true,
hidden = true,
}
labels["perkataan dengan pautan merah di jadual infleksi"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"pautan merah"},
can_be_empty = true,
hidden = true,
}
labels["requests for English equivalent term"] = {
description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
for _, quot_type in ipairs { "quotations", "usage examples" } do
labels[quot_type .. " dengan terjemahan ditinggalkan"] = {
description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.",
parents = {"Penyelenggaraan entri"},
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs({"kata nama", "kata nama khas", "kata kerja", "kata sifat", "adverba", "partisipel", "penunjuk", "kata ganti nama", "kata bilangan", "imbuhan", "pemendekan"}) do
labels[pos .. " dengan pautan merah di barisan inti"] = {
description = pos .. " bahasa {{{langname}}} dengan pautan merah dalam barisan inti.",
parents = {"perkataan dengan pautan merah dalam barisan inti"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
labels[pos .. " dengan pautan merah di jadual infleksi"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"perkataan dengan pautan merah di jadual infleksi"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs { "Kata nama", "Kata nama khas", "Kata ganti nama" } do
local label = pos .. " dengan ketidakpastian bentuk jamak"
labels[label] = {
description = label .. " untuk bahasa {{{langname}}}.",
additional = "Istilah biasanya ditambahkan ke dalam kategori ini dengan menetapkan {{code|?}} sebagai " ..
"bentuk jamak. Sejauh yang mungkin, bentuk jamak sepatutnya ditambahkan atau, jika kata nama tersebut " ..
"tidak boleh dihitung, hal itu perlu dinyatakan dengan sewajarnya (biasanya menggunakan {{code|-}} " ..
"sebagai ganti bentuk jamak). Sesetengah bahasa menyokong nilai {{code|!}} untuk menunjukkan bahawa " ..
"bentuk jamak tidak dapat dibuktikan tetapi kata nama tersebut secara teori boleh dihitung.",
breadcrumb = "dengan ketidakpastian bentuk jamak",
lang_position = "mid",
label_before = pos,
label_after = "dengan ketidakpastian bentuk jamak",
parents = {
{name = pos, sort = "dengan ketidakpastian bentuk jamak"},
"Penyelenggaraan entri",
},
}
end
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Subkategori penyelenggaraan entri mengikut bahasa"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Subkategori penyelenggaraan entri mengikut bahasa"] = {
description = "Kategori payung yang melitupi topik berkenaan penyelenggaraan entri.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Metakategori payung",
{name = "Penyelenggaraan entri", is_label = true, sort = " "},
},
}
raw_categories["Permintaan"] = {
topright = "{{shortcut|WT:CR|WT:RQ}}",
description = "A parent category for the various request categories.",
parents = {"Kategori:Wiktionary"},
}
raw_categories["Permintaan mengikut bahasa"] = {
description = "Categories with requests in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "Subkategori permintaan mengikut bahasa", sort = " "},
{name = "Permintaan", sort = " "},
},
breadcrumb = "Mengikut bahasa",
}
raw_categories["Subkategori permintaan mengikut bahasa"] = {
description = "Umbrella categories covering topics related to requests.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Metakategori payung",
{name = "Permintaan", sort = " "},
},
}
raw_categories["Permintaan petikan mengikut sumber"] = {
description = "Categories with requests for quotation, broken out by the source of the quotation.",
additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].",
parents = {{name = "Permintaan petikan", sort = "source"}},
breadcrumb = "Mengikut sumber",
}
raw_categories["Permintaan petikan"] = {
-- FIXME
description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.",
parents = {{name = "Permintaan", sort = "quotations"}},
breadcrumb = "Quotations",
}
raw_categories["Permintaan tarikh"] = {
description = "Requests for a date to be added to a quotation.",
additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " ..
"Please remove the template from the article once the date has been provided.",
parents = {{name = "Permintaan", sort = "date"}},
breadcrumb = "Tarikh",
}
raw_categories["Permintaan terjemahan dalam kategori kecekapan pengguna mengikut bilangan pengguna"] = {
description = "Permintaan terjemahan to be added to user-competency categories, sorted mengikut bilangan pengguna with that competency.",
parents = {{name = "Permintaan", sort = "terjemahan"}},
breadcrumb = "Terjemahan dalam kategori kecekapan pengguna mengikut bilangan pengguna",
}
raw_categories["Permintaan terjemahan dalam kategori kecekapan pengguna mengikut bahasa"] = {
description = "Permintaan terjemahan to be added to user-competency categories, sorted mengikut bahasa.",
parents = {{name = "Permintaan", sort = "terjemahan"}},
breadcrumb = "Terjemahan dalam kategori kecekapan pengguna mengikut bahasa",
hidden = true,
}
raw_categories["Perkataan dengan terjemahan mengikut bahasa"] = {
description = "Terms with translations, sorted by language.",
parents = {{name = "Subkategori penyelenggaraan entri mengikut bahasa", sort = "translations by language"}},
breadcrumb = "Terjemahan",
}
raw_categories["Entries using missing taxonomic names"] = {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." ..
"\n\nSee [[:Category:mul:Taxonomic names]].",
parents = {{name = "Penyelenggaraan entri", is_label = true, lang = "mul", sort = "missing taxonomic names"}},
breadcrumb = "Missing taxonomic names",
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function script_name_to_code(name)
local sc = require(scripts_module).getByCanonicalName(name)
if not sc then
error("Unrecognized script name '" .. name .. "'")
end
return sc:getCode()
end
--[=[
This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings
that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an
`items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at
least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in
other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in
functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in
turn references a third property).
If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing
group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in
which case there is no language name associated with the category name. The language name must be the canonical name of
a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name
may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and
`language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional
properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full
language of the etymology-only language.
If the `regex` values of multiple category specs match, the first one takes precedence.
Recognized or predefined properties:
`pagename`: Current pagename.
`regex`: See above.
`1`, `2`, `3`, ...: See above.
`language_name`, `language_code`, `language_object`: See above.
`parent_language_name`, `parent_language_code`, `parent_language_object`: See above.
`nolang`: See above.
`allow_etym_lang`: Language names may be etymology-only languages. See above.
`description`: Override the description (normally taken directly from the pagename).
`template_name`: Name of template which generates this category.
`template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to
display an example template call and the output of this call.
`template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when
generating example template output (but not when displaying an example template call) and is intended for a template
call that uses the |nocat=1 parameter.
`template_example_output`: Override the text that displays example template output (see `template_sample_call`).
`additional_template_description`: Extra text to be displayed after the example template output.
`parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and
sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have
{{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO
by language", the parent will be "Subkategori permintaan mengikut bahasa" with FOO as the sort key. Otherwise, the
`language_name` property must exist, and the parent will be "Requests concerning LANGNAME", with the pagename minus
any initial "Requests for " as the sort key. Note that this does *NOT* apply if an etymology-only language is
associated with the category, in which case `etym_parents` is used instead.
`etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as
`parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name
replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests
concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
`umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language
is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated
language is an etymology-only language); otherwise there will be no umbrella category.
`breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the
pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be
"FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from
the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only
language is associated with the category, in which case `etym_breadcrumb` is used instead.
`etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value
of `language_name`.
`not_hidden_category`: Don't hide the category.
`catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is
expanded.
`toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that
request-specific {{{PROPERTY}}} syntax is expanded.
In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately
expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the
`template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when
inserted, so template references are not expanded. Triple-brace property references are still expanded in these
properties; but beware that if any of those property references contain template references, they won't be expanded.
(This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references
{{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this
property using a function.)
]=]
local requests_categories = {
{
regex = "^Permintaan berkenaan bahasa (.+)$",
allow_etym_lang = true,
description = "Categories with {{{1}}} entries that need the attention of experienced editors.",
parents = {{name = "Penyelenggaraan entri", is_label = true, sort = "Permintaan"}},
etym_parents = {{name = "Permintaan berkenaan bahasa {{{parent_language_name}}}", sort = "{{{1}}}"}},
umbrella = "Permintaan mengikut bahasa",
breadcrumb = "Permintaan",
not_hidden_category = true,
},
{
regex = "^Requests for etymologies in (.+) entries$",
allow_etym_lang = true,
umbrella = "Requests for etymologies by language",
template_name = "rfe",
},
{
regex = "^Requests for expansion of etymologies in (.+) entries$",
umbrella = "Requests for expansion of etymologies by language",
template_name = "etystub",
},
{
regex = "^Requests for pronunciation in (.+) entries$",
umbrella = "Requests for pronunciation by language",
template_name = "rfp",
},
{
regex = "^Requests for audio pronunciation in (.+) entries$",
umbrella = "Requests for audio pronunciation by language",
template_name = "rfap",
},
{
regex = "^Requests for definitions in (.+) entries$",
umbrella = "Requests for definitions by language",
template_name = "rfdef",
},
{
regex = "^Requests for clarification of definitions in (.+) entries$",
umbrella = "Requests for clarification of definitions by language",
template_name = "rfclarify",
},
}
for _, spec_with_pos in ipairs {
{"inflections", "rfinfl"},
{"plural forms"},
{"tone", "rftone"},
{"accents"},
{"aspect", "rfaspect"},
{"animacy"},
{"gender", "rfgender"},
{"noun class"},
} do
local property, rftemplate = unpack(spec_with_pos)
table.insert(requests_categories,
{
-- This is for part-of-speech-specific categories such as
-- "Requests for inflections in Northern Ndebele noun entries" or
-- "Requests for accents in Ukrainian proper noun entries".
-- Here and below, we assume that the part of speech is begins with
-- a lowercase letter, while the preceding language name ends in a
-- capitalized word. Note that this entry comes before the
-- following one and takes precedence over it.
regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property),
parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}},
umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property),
breadcrumb = "{{{2}}}",
template_name = rftemplate,
template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s in (.+) entries$"):format(property),
umbrella = ("Requests for %s by language"):format(property),
template_name = rftemplate,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s of (.+) by language$"):format(property),
nolang = true,
}
)
end
extend(requests_categories, {
{
regex = "^Requests for example sentences in (.+)$",
umbrella = "Requests for example sentences by language",
template_name = "rfex",
},
{
regex = "^Permintaan petikan bahasa (.+)$",
umbrella = "Permintaan petikan mengikut bahasa",
template_name = "rfquote",
},
{
regex = "^Permintaan terjemahan ke dalam bahasa (.+)$",
allow_etym_lang = true,
umbrella = "Permintaan terjemahan mengikut bahasa",
template_name = "t-needed",
catfix = "ms",
},
{
regex = "^Permintaan terjemahan contoh penggunaan bahasa (.+)$",
allow_etym_lang = true,
umbrella = "Permintaan terjemahan contoh penggunaan mengikut bahasa",
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|usex}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}",
additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Permintaan terjemahan petikan bahasa (.+)$",
allow_etym_lang = true,
umbrella = "Permintaan terjemahan petikan mengikut bahasa",
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|quote}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}",
additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for review of (.+) translations$",
allow_etym_lang = true,
umbrella = "Requests for review of translations by language",
template_name = "t-check",
template_sample_call = "{{t-check|{{{language_code}}}|example}}",
template_example_output = "",
catfix = "ms",
},
{
regex = "^Permintaan transliterasi perkataan bahasa (.+)$",
umbrella = "Permintaan transliterasi perkataan mengikut bahasa",
template_name = "rftranslit",
additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " ..
"the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " ..
"automated transliteration, such as Hebrew and Persian).",
},
{
regex = "^Permintaan transliterasi contoh penggunaan bahasa (.+)$",
umbrella = "Permintaan transliterasi contoh penggunaan mengikut bahasa",
template_name = "rftranslit",
template_sample_call = "{{rftranslit|{{{language_code}}}}}",
template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Permintaan transliterasi petikan bahasa (.+)$",
umbrella = "Permintaan transliterasi petikan mengikut bahasa",
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for native script for (.+) terms$",
allow_etym_lang = true,
etym_parents = {
{name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"},
{name = "Permintaan berkenaan bahasa {{{language_name}}}", sort = "native script"},
},
umbrella = "Requests for native script by language",
template_name = "rfscript",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for native script in (.+) usage examples$",
umbrella = "Requests for native script in usage examples by language",
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied."
},
{
regex = "^Requests for native script in (.+) quotations$",
umbrella = "Requests for native script in quotations by language",
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied."
},
{
regex = "^Requests for (.+) script for (.+) terms$",
language_name = "{{{2}}}",
allow_etym_lang = true,
parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}},
etym_parents = {
{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"},
{name = "Permintaan berkenaan bahasa {{{language_name}}}", sort = "{{{1}}} script"},
},
umbrella = "Requests for {{{1}}} script by language",
breadcrumb = "{{{1}}}",
etym_breadcrumb = "{{{1}}}",
template_name = "rfscript",
-- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the
-- conversion of script name to script code needs to be done using an inline function like this, instead of
-- a {{#invoke:...}} template call.
script_code = function(items)
return script_name_to_code(items["1"])
end,
template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for (.+) script by language$",
parents = {{name = "Requests for script by language", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
},
{
regex = "^Requests for script by language$",
nolang = true,
},
{
regex = "^Requests for images in (.+) entries$",
umbrella = "Requests for images by language",
template_name = "rfi",
},
{
regex = "^Requests for references for (.+) terms$",
umbrella = "Requests for references by language",
template_name = "rfref",
},
{
regex = "^Requests for references for etymologies in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}},
umbrella = "Requests for references for etymologies by language",
breadcrumb = "Etymologies",
template_name = "rfv-etym",
},
{
regex = "^Requests for references for pronunciations in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}},
umbrella = "Requests for references for pronunciations by language",
breadcrumb = "Pronunciations",
template_name = "rfv-pron",
},
{
regex = "^Permintaan perhatian berkenaan bahasa (.+)$",
umbrella = "Permintaan perhatian mengikut bahasa",
breadcrumb = "Perhatian",
template_name = "perhatian",
template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}",
template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.",
-- These pages typically contain a mixture of English and native-language entries, so disable catfix.
catfix = false,
-- Setting catfix = false will normally trigger the English table of contents template.
-- We still want the native-language table of contents template, though.
toc_template = "{{{language_code}}}-categoryTOC",
toc_template_full = "{{{language_code}}}-categoryTOC/full",
},
{
regex = "^Requests for cleanup in (.+) entries$",
umbrella = "Requests for cleanup by language",
template_name = "rfc",
template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$",
umbrella = "Requests for cleanup of Pronunciation N headers by language",
template_name = "rfc-pron-n",
template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}",
template_example_output = "This template does not generate any text in entries.",
additional_template_description = [=[
The purpose of this category is to tag entries that use headers with "Pronunciation" and a number.
While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header.
[[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed.
This category is hidden.]=],
},
{
regex = "^Requests for deletion in (.+) entries$",
umbrella = "Requests for deletion by language",
template_name = "rfd",
template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for verification in (.+) entries$",
umbrella = "Requests for verification by language",
template_name = "rfv",
},
{
regex = "^Requests for attention in (.+) etymologies$",
umbrella = "Permintaan perhatian mengikut bahasa"
},
{
regex = "^Requests for quotations/(.+)$",
description = "Requests for a quotation or for quotations from {{{1}}}.",
parents = {{name = "Permintaan petikan mengikut sumber", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfquotek",
template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}",
},
{
regex = "^Requests for date in (.+) entries$",
umbrella = "Requests for date by language",
template_name = "rfdate",
additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " ..
"automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " ..
"parameter in each case on the page automatically removes the article from this category. See " ..
"[[Wiktionary:Quotations]] for information about formatting dates and quotations.",
},
{
regex = "^Requests for date/(.+)$",
description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.",
parents = {{name = "Permintaan tarikh mengikut sumber", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfdatek",
template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}",
},
{
regex = "^Requests for attestation of (.+) terms$",
umbrella = "Requests for attestation of terms by language",
breadcrumb = "Attestation",
additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)."
},
})
local user_competency_additional_template_description = "This is added by user-competency categories such as " ..
"[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " ..
"the native-language text indicating this fact is missing. The appropriate translation should mirror the " ..
"English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " ..
"level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " ..
"language in the text should be surrounded by double angle brackets, e.g. \"<<français>>\", which " ..
"causes it to be automatically linked to the appropriate parent category."
local user_competency_parents = {{name = "Permintaan terjemahan dalam kategori kecekapan pengguna mengikut bilangan pengguna",
sort = function(items)
return " " .. ("%010d"):format(items["1"])
end,
}}
extend(requests_categories, {
{
regex = "^Permintaan terjemahan dalam kategori kecekapan pengguna seramai ([0-9]+)%-([0-9]+) pengguna$",
description = "Permintaan terjemahan frasa yang menunjukkan kecekapan pengguna untuk bahasa tertentu dan tahap kecekapan tertentu, untuk kategori dengan {{{1}}}-{{{2}}} pengguna.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}-{{{2}}}",
nolang = true,
},
{
regex = "^Permintaan terjemahan dalam kategori kecekapan pengguna seramai ([0-9]+) (pengguna?)$",
description = "Permintaan terjemahan frasa yang menunjukkan kecekapan pengguna untuk bahasa tertentu dan tahap kecekapan tertentu, untuk kategori dengan {{{1}}} {{{2}}}.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}",
nolang = true,
}
})
table.insert(raw_handlers, function(data)
local items
local function init_items()
items = {pagename = data.category}
end
local function expand_value(item, val)
if not val then
return val
elseif is_callable(val) then
return expand_value(item .. " ⇒ function", val(items))
elseif type(val) == "table" then
for k, v in pairs(val) do
val[k] = expand_value(item .. " ⇒ " .. k, v)
end
return val
elseif type(val) == "number" then
val = tostring(val)
end
if type(val) ~= "string" then
error(("The item '%s' on page %s is of type %s and can't be concatenated"):format(
item, items.pagename, type(val)))
end
-- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done
-- recursively, since some of the items are nested:
-- {{{template_sample_call_with_temp}}}
-- ⇓
-- {{{{{template_name}}}|{{{language_code}}}}}
-- ⇓
-- {{attention|en}}
if val:find("{{{") then
val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop)
local propval = items[prop]
if not propval then
error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"):
format(prop, item, items.pagename))
end
return expand_value(item .. " ⇒ " .. prop, propval)
end
)
end
return val
end
local function expand_items_value(item)
return expand_value(item, items[item])
end
local function convert_items_to_category_data(items)
if not items.nolang then
items.language_name = items.language_name or "{{{1}}}"
items.language_name = expand_items_value("language_name")
items.language_object = require(languages_module).getByCanonicalName(items.language_name, true,
items.allow_etym_lang)
items.language_code = items.language_object:getCode()
items.is_etym_lang = items.language_object:hasType("etymology-only")
if items.is_etym_lang then
items.parent_language_object = items.language_object:getFull()
-- Reject weird cases where etymology language has no parent.
if not items.parent_language_object then
return nil
end
items.parent_language_code = items.parent_language_object:getCode()
items.parent_language_name = items.parent_language_object:getCanonicalName()
-- Reject weird cases where the parent language has the same name as the child etymology language. In
-- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and
-- Bashkardi.
if items.parent_language_name == items.language_name then
return nil
end
else
end
end
if items.template_name then
items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}"
items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>"
if items.template_example_output then
items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output
else
items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call
items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}"
end
if items.additional_template_description then
items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description
end
else
items.full_text_about_the_template = items.additional_template_description
end
local parents, breadcrumb
if items.is_etym_lang then
parents = items.etym_parents
breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name
else
parents = items.parents
breadcrumb = expand_items_value("breadcrumb")
end
if parents then
for _, parent in ipairs(parents) do
parent.name = expand_value("parent.name", parent.name)
parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "ms"}
end
else
local umbrella_type = items.pagename:match("^Permintaan (.+) mengikut bahasa$")
if umbrella_type then
breadcrumb = breadcrumb or umbrella_type
parents = {{name = "Subkategori permintaan mengikut bahasa", sort = umbrella_type}}
elseif not items.language_name then
error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'")
else
local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "")
requests_concerning_breadcrumb =
requests_concerning_breadcrumb:gsub("^Permintaan ", ""):gsub(" in entries$", ""):gsub(" for terms$", "")
local requests_concerning_parent =
{
name = "Permintaan berkenaan bahasa " .. items.language_name,
sort = {sort_base = requests_concerning_breadcrumb, lang = "ms"}
}
if items.is_etym_lang then
local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name))
parents = {
{name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "ms"}},
requests_concerning_parent
}
else
breadcrumb = breadcrumb or requests_concerning_breadcrumb
parents = {requests_concerning_parent}
end
end
end
if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then
table.insert(parents, {
name = expand_items_value("umbrella"),
sort = {sort_base = items.language_name, lang = "ms"}
})
end
local additional = expand_items_value("full_text_about_the_template")
if items.pagename:find(" mengikut bahasa$") then
additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "")
end
return {
description = expand_items_value("description") or items.pagename .. ".",
lang = items.parent_language_code or items.language_code,
additional = additional,
parents = parents,
-- If no breadcrumb= and not an etym-only language, it will default to the category name
breadcrumb = breadcrumb,
catfix = expand_items_value("catfix"),
toc_template = expand_items_value("toc_template"),
toc_template_full = expand_items_value("toc_template_full"),
hidden = not items.nolang and not items.not_hidden_category,
can_be_empty = true,
}
end
-- First look for a regular (usually language or script-specific) category.
for _, category in ipairs(requests_categories) do
local matchvals = {mw.ustring.match(data.category, category.regex)}
if #matchvals > 0 then
init_items()
for key, value in pairs(category) do
items[key] = value
end
for key, value in ipairs(matchvals) do
items["" .. key] = value
end
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
-- Now look for umbrella categories.
for _, category in ipairs(requests_categories) do
if data.category == category.umbrella then
init_items()
items.nolang = true
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
return nil
end)
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Perkataan dengan terjemahan bahasa (.+)$")
local lang = langname and require(languages_module).getByCanonicalName(langname, true, true)
if lang then
lang = lang:getCode()
return {
description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. lang .. "|...}}, {{tl|t+|" .. lang .. "|...}}, etc.",
parents = {
{name = "Penyelenggaraan entri", is_label = true, lang = lang, sort = "terjemahan"},
{
name = "Perkataan dengan terjemahan mengikut bahasa",
sort = {sort_base = langname, lang = "ms"}
},
},
breadcrumb = "Terjemahan",
catfix = false,
can_be_empty = true,
hidden = true,
}
end
end)
local recognized_taxtypes = require(table_module).listToSet {
"ambiguous",
"binomial",
"branch",
"clade",
"cladus",
"class",
"cohort",
"convariety",
"cultivar group",
"cultivar",
"division",
"empire",
"epifamily",
"epithet",
"family",
"form taxon",
"form",
"genus",
"grade",
"grandorder",
"group",
"hybrid",
"informal group",
"infraclass",
"infracohort",
"infrakingdom",
"infraorder",
"infraphylum",
"infraspecies",
"kingdom",
"magnorder",
"megacohort",
"mirorder",
"morph",
"nothogenus",
"nothospecies",
"nothosubspecies",
"nothovariety",
"obsolete",
"oofamily",
"order",
"parvclass",
"parvorder",
"phylum",
"section",
"series",
"serovar",
"species group",
"species",
"stem",
"stirps",
"strain",
"subclass",
"subcohort",
"subdivision",
"subfamily",
"subgenus",
"subgroup",
"subinfraorder",
"subkingdom",
"suborder",
"subphylum",
"subsection",
"subspecies",
"subterclass",
"subtribe",
"superclass",
"supercohort",
"superfamily",
"supergroup",
"superorder",
"superphylum",
"supertribe",
"taxon",
"tribe",
"trinomial",
"undescribed species",
"unknown",
"unranked group",
"variety",
"virus complex",
}
table.insert(raw_handlers, function(data)
local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$")
if taxtype and recognized_taxtypes[taxtype] then
return {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.",
parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "ms"}}},
breadcrumb = taxtype,
hidden = true,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}