Wiktionary
gdwiktionary
https://gd.wiktionary.org/wiki/Pr%C3%AComh-Dhuilleag
MediaWiki 1.47.0-wmf.12
case-sensitive
Meadhan
Sònraichte
Deasbaireachd
Cleachdaiche
Deasbaireachd a' chleachdaiche
Wiktionary
An deasbaireachd aig Wiktionary
Faidhle
Deasbaireachd an fhaidhle
MediaWiki
Deasbaireachd MediaWiki
Teamplaid
Deasbaireachd na teamplaid
Cobhair
Deasbaireachd na cobharach
Roinn-seòrsa
Deasbaireachd na roinn-seòrsa
TimedText
TimedText talk
Mòideal
Deasbaireachd mòideil
Event
Event talk
Roinn-seòrsa:Cànan Gàidhlig
14
7400
88351
85418
2026-07-26T22:47:24Z
Altronic
4137
Ghluais Altronic duilleag [[Roinn-seòrsa:Faclan Gàidhlig]] gu [[Roinn-seòrsa:Cànan Gàidhlig]]
85418
wikitext
text/x-wiki
{{Multiple image
<!-- Layout parameters -->
| align = left <!-- right (default), left, center, none -->
| background color = <!-- box background -->
| border = <!-- Alignment within an Infobox -->
| caption_align = center <!-- left (default), center, right -->
| direction = vertical <!-- horizontal (default), vertical -->
| image_gap = <!-- 5 (default) Only works in horizontal mode -->
| image_style = <!-- border:1; (default) border:none; -->
| perrow = <!-- The value passed to perrow may be a single number, or a list of numbers delimited by / -->
| total_width = <!-- total width of all the displayed images in pixels (an integer, omit "px" suffix) -->
| width = <!-- displayed width of each image in pixels (an integer, omit "px" suffix); overrides "width[n]"s below -->
<!-- Header -->
| header = Cànan {{gd|g}}
| header_align = <!-- center (default), left, right -->
| header_background = <!-- Example #EEFFGG or red -->
<!--image 1-->
| image1 = Flag of Scotland.svg
| caption1 = Bratach Alba
<!--image 2-->
| image2 = Coat of arms of Scotland.svg
| caption2 = Gearradh-arm na h-Alba
<!--image 3-->
| image3 = Scottish Government logo.svg
| caption3 = Suaicheantas na Riaghaltas na h-Alba
<!--image 4-->
| image4 = Scots Gaelic speakers in the 2011 census.png
| caption4 = Luchd-labhairt {{gd|g}} ann an 2011
}}
{{Multiple image
<!-- Layout parameters -->
| align = <!-- right (default), left, center, none -->
| background color = <!-- box background -->
| border = <!-- Alignment within an Infobox -->
| caption_align = center <!-- left (default), center, right -->
| direction = vertical <!-- horizontal (default), vertical -->
| image_gap = <!-- 5 (default) Only works in horizontal mode -->
| image_style = <!-- border:1; (default) border:none; -->
| perrow = <!-- The value passed to perrow may be a single number, or a list of numbers delimited by / -->
| total_width = <!-- total width of all the displayed images in pixels (an integer, omit "px" suffix) -->
| width = <!-- displayed width of each image in pixels (an integer, omit "px" suffix); overrides "width[n]"s below -->
<!-- Header -->
| header = Brataichean
| header_align = <!-- center (default), left, right -->
| header_background = <!-- Example #EEFFGG or red -->
<!--image 1-->
| image1 = Flag of Edinburgh.svg
| caption1 = Bratach Dhùn Èideann
<!--image 2-->
| image2 = 2007 Flag of Orkney.svg
| caption2 = Bratach Arcaibh (2007)
<!--image 3
| image3 = Flag of Barra.svg
| caption3 = Bratach Bharraigh
-->
| image3 = Flag of East Lothian.svg
| caption3 = Bratach Lodainn an Ear
<!--image 4-->
| image4 = Flag of Sutherland.svg
| caption4 = Bratach Chataibh (2018)
<!--image 5-->
| image5 = Western Isles Council Flag.svg
| caption5 = Bratach Comhairle Eileanan an Iar
<!--image 6-->
| image6 = Flag of Caithness.svg
| caption6 = Bratach Ghallaibh
<!--image 7-->
| image7 = Flag of Aberdeen.svg
| caption7 = Bratach Obar Dheathain
<!--image 8
| image8 = City Flag of Aberdeen.svg
| caption8 = Bratach Cathair-bhaile Obar Dheathain
-->
| image8 = Flag of Kirkcudbrightshire.svg
| caption8 = Bratach Siorrachd Kirkcudbright
<!--image 9-->
| image9 = Flag of Shetland.svg
| caption9 = Bratach Shealtainn
<!--image 10 -->
| image10 = Flag of Scottish Canadians.png
| caption10 = Bratach Canadaich Albannach
}}
<!--
[[Faidhle:Scots Gaelic speakers in the 2011 census.png|border|240px|thumb|Luchd-labhairt {{gd|g}} ann an 2011]]
[[Faidhle:Flag of Scotland.svg|border|240px|thumb|Bratach na h-Alba]]
-->
=[[Faidhle:Flag of Scotland.svg|border|75px|middle]] Faclan {{gd|g}} - {{gd|3}} words [[Faidhle:Flag of Scottish Canadians.png|border|75px|middle]]=
==Craobh teaghlaich - Family tree==
An rangachd teaghlaich-chànain gu cod(an) ISO 639-5 's Gàidhlig:<br>
<div class="center" style="width: auto; margin-left: auto; margin-right: auto;">{{Mór|<code>{{gd|7}}:gd ({{gd}})</code>|125%|valign=normal}}</div>
{{-cuideachd-}}
*[[:en:Category:{{gd|3}} lemmas]]
*[[:en:Category:{{gd|3}} language]]
*[[:en:wikipedia:{{gd|3}} language]]
{{gd-roinn-seòrsaClàr-innse}}
{{Stadastaireachd|gd}}
<!--
[[Faidhle:Scottish Government logo.svg|border|240px|thumb|Suaicheantas na Riaghaltas na h-Alba]]
[[Faidhle:Coat of arms of Scotland.svg|border|240px|thumb|Gearradh-arm na h-Alba]]
[[Faidhle:City Flag of Aberdeen.svg|border|240px|thumb|Bratach Cathair-bhaile Obar Dheathain]]
[[Faidhle:Flag of Aberdeen.svg|border|240px|thumb|Bratach Obar Dheathain]]
[[Faidhle:Flag of Barra.svg|border|240px|thumb|Bratach Bharraigh ]]
[[Faidhle:2007 Flag of Orkney.svg|border|240px|thumb|2007 Bratach Arcaibh]]
[[Faidhle:Flag of Shetland.svg|border|240px|thumb|Bratach Shealtainn]]
[[Faidhle:Flag of Sutherland.svg|border|240px|thumb|2018 Bratach Chataibh]]
[[Faidhle:Caithness Flag.svg|border|240px|thumb|Bratach Ghallaibh]]
[[Faidhle:Western Isles Council Flag.svg|border|240px|thumb|Bratach Comhairle Eileanan an Iar]]
-->
[[Roinn-seòrsa:Faclan a-rèir cànain|{{gd}}]]
[[Roinn-seòrsa:Cànain Goidheilge|{{gd}}]]
[[Roinn-seòrsa:Cànain na h-Alba|{{gd}}]]
[[Roinn-seòrsa:Cànain na Canada|{{gd}}]]
[[Roinn-seòrsa:Cànain Ceilteach|{{gd}}]]
01bky159b5fh1gh1gj48aobso2ikq62
Mòideal:usex
828
16637
88468
86121
2026-07-27T02:12:10Z
Altronic
4137
change text
88468
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local links_module = "Module:links"
local scripts_module = "Module:scripts"
local script_utilities_module = "Module:script utilities"
local string_utilities_module = "Module:string utilities"
local usex_data_module = "Module:usex/data"
local m_str_utils = require(string_utilities_module)
local rsubn = m_str_utils.gsub
local rsplit = m_str_utils.split
local rfind = m_str_utils.find
local uupper = m_str_utils.upper
local ulen = m_str_utils.len
local u = m_str_utils.char
local translit_data = mw.loadData("Module:transliteration/data")
local needs_translit = translit_data[1]
local BRACKET_SUB = u(0xFFF0)
local original_text = "<small>''original:''</small> "
-- 100 more or less corresponds to the setting of 30 for the example text alone as formerly used in
-- {{hi-x}} and {{ur-x}}, taking into account transliteration, gloss and formatting characters.
-- FIXME: We should have different widths for desktop vs. mobile and generate the appropriate CSS so
-- both are handled correctly.
local MAX_INLINE_WIDTH = 100 -- In characters. HACK! FIXME! Do this a better way.
-- List of scripts whose characters are double-width/full-width.
local double_width_scripts = {"Hani", "Hrkt", "Hang"}
-- microformat2 classes, see https://phabricator.wikimedia.org/T138709
local css_classes = {
container_ux = 'h-usage-example',
container_quotation = 'h-quotation',
example = 'e-example',
quotation = 'e-quotation',
quotation_with_citation = 'e-quotation cited-passage',
translation = 'e-translation',
-- The following are added by [[Module:script utilities]], using [[Module:script utilities/data]]
-- transliteration = 'e-transliteration',
-- transcription = 'e-transcription',
normalization = 'e-normalization',
literally = 'e-literally',
qualifier = 'e-qualifier',
source = 'e-source',
footer = 'e-footer'
}
-- helper functions
local function track(page, code)
local tracking_page = "usex/" .. page
local debug_track = require(debug_track_module)
debug_track(tracking_page)
if code then
debug_track(tracking_page .. "/" .. code)
end
return true
end
-- version of rsubn() that discards all but the first return value
local function rsub(term, foo, bar)
local retval = rsubn(term, foo, bar)
return retval
end
local function wrap(tag, class, text, lang)
if lang then
lang = ' lang="' .. lang .. '"'
else
lang = ""
end
if text and class then
return table.concat{'<', tag, ' class="', class, '"', lang, '>', text, '</', tag, '>'}
else
return nil
end
end
local function span(class, text) return wrap('span', class, text) end
local function div(class, text) return wrap('div', class, text) end
-- Remove any HTML from the formatted text and resolve links, since the extra characters don't contribute to the
-- displayed length.
local function convert_to_raw_text(text)
text = rsub(text, "<.->", "")
if text:find("%[%[") then
text = require(links_module).remove_links(text)
end
return text
end
local function get_character_width(text)
local charsets = {}
for _, script in ipairs(double_width_scripts) do
table.insert(charsets, require(scripts_module).getByCode(script):getCharacters())
end
local single_width_chars = ulen(rsub(text, "[" .. table.concat(charsets) .. "]", ""))
local total_chars = ulen(text)
local double_width_chars = total_chars - single_width_chars
return single_width_chars + 2 * double_width_chars
end
--[==[
Apply the substitutions in `subst` (from the {{para|subst}} parameter or similar) to the example or quotation in
`usex` after removing links, returning the resulting text. `track`, if supplied, is a function of one argument that is
used to insert tracking categories: one for any call to this function, another if a single / is used in the `subst`
argument.
]==]
function export.apply_subst(usex, subst, track)
local subbed_usex = require(links_module).remove_links(usex)
local function do_track(page)
if track then
track(page)
end
return true
end
if subst then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/usex/subst]]
do_track("subst")
subst = rsplit(subst, ",")
for _, subpair in ipairs(subst) do
-- [[Special:WhatLinksHere/Wiktionary:Tracking/usex/subst-single-slash]]
local subsplit = rsplit(subpair, rfind(subpair, "//") and "//" or do_track("subst-single-slash") and "/")
subbed_usex = rsub(subbed_usex, subsplit[1], subsplit[2])
end
end
return subbed_usex
end
--[=[
Process parameters for usex text (either the primary text or the original text) and associated annotations. On input,
the following fields are recognized in `data` (all are optional except as marked):
* `lang`: Language object of text; may be an etymology language (REQUIRED).
* `termlang`: The language object of the term being illustrated, which may be different from the language of the main
quotation text and should always be based off of the main text, not the original text. Used for
categories. May be an etymology language (REQUIRED).
* `usex`: Text of usex/quotation.
* `sc`: Script object of text.
* `tr`: Manual transliteration.
* `ts`: Transcription.
* `norm`: Normalized version of text.
* `normsc`: Script object of normalized version of text, or "auto".
* `subst`: String of substitutions for transliteration purposes.
* `quote`: If non-nil, this is a quotation (using {{tl|quote}} or {{tl|quote-*}}) instead of a usage example (using
{{tl|usex}}). If it has the specific value "quote-meta", this is a quotation with citation (invoked from
{{tl|quote-*}}). This controls the CSS class used to display the quotation, as well as the face used to tag the usex
(which in turn results in the usex being upright text if a quotation, and italic text if a usage example).
* `title`: Title object of the current page (REQUIRED).
* `q`: List of left qualifiers.
* `qq`: List of right qualifiers.
* `ref`: String to display directly after any right qualifier, with no space. (FIXME: Should be converted into
an actual ref.)
* `nocat`: Overall `data.nocat` value.
* `categories`: List to insert categories into (REQUIRED).
* `example_type`: Either "quotation" (if `quote` specified) or "usage example" (otherwise) (REQUIRED).
On output, return an object with four fields:
* `usex`: Formatted usex, including qualifiers attached to both sides and `ref` attached to the right. Always specified.
* `tr`: Formatted transliteration; may be nil.
* `ts`: Formatted transcription; may be nil.
* `norm`: Formatted normalized version of usex; may be nil.
]=]
local function process_usex_text(data)
local lang = data.lang
local termlang = data.termlang
local usex = data.usex
local sc = data.sc
local sc_explicit = sc
local tr = data.tr
local ts = data.ts
local norm = data.norm
local normsc = data.normsc
local subst = data.subst
local quote = data.quote
local leftq = data.q
local rightq = data.qq
local ref = data.ref
local nocat = data.nocat
local categories = data.categories
local example_type = data.example_type
local title = data.title
if normsc == "auto" then
normsc = nil
elseif not normsc then
normsc = sc
end
if not sc then
sc = lang:findBestScript(usex)
end
if not normsc and norm then
normsc = lang:findBestScript(norm)
end
local langcode = lang:getFullCode()
-- tr=- means omit transliteration altogether
if tr == "-" then
tr = nil
else
-- Try to auto-transliterate.
if tr then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/usex/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/usex/manual-tr/LANGCODE]]
track("manual-tr", langcode)
else
-- First, try transliterating the normalization, if supplied.
if norm and normsc then
local normsc_code = normsc:getCode()
if normsc_code ~= "None" and not normsc_code:find("Lat") then -- Latn, Latf, Latg, pjt-Latn
local subbed_norm = export.apply_subst(norm, subst, track)
tr = lang:transliterate(subbed_norm, normsc)
end
end
-- If no normalization, or the normalization is in a Latin script, or the transliteration of the
-- normalization failed, fall back to transliterating the usex.
if not tr and usex then
local subbed_usex = export.apply_subst(usex, subst, track)
tr = lang:transliterate(subbed_usex, sc)
end
-- If the language doesn't have capitalization and is specified in [[Module:usex/data]], then capitalize any sentences.
-- Exclamation marks and question marks need to be unescaped then re-escaped.
if tr and mw.loadData(usex_data_module).capitalize_sentences[langcode] then
tr = tr:gsub("!", "!")
:gsub("?", "?")
tr = rsub(tr, "%f[^%z%p%s](.)(.-[%.%?!‽])", function(m1, m2)
return uupper(m1) .. m2
end)
tr = tr:gsub("!", "!")
:gsub("%?", "?")
end
end
-- If there is still no transliteration, then add a cleanup category.
if not tr and needs_translit[langcode] then
local sccode = sc:getCode()
if sccode ~= "None" and not sccode:find("Lat") then
table.insert(categories, ("Requests for transliteration of %s %ss"):format(lang:getCanonicalName(),
example_type))
end
end
end
if tr and norm then
track("tr-and-norm")
end
if tr then
tr = require(script_utilities_module).tag_translit(tr, langcode, "usex")
end
if ts then
ts = require(script_utilities_module).tag_transcription(ts, langcode, "usex")
ts = "/" .. ts .. "/"
end
local function do_language_and_script_tagging(usex, lang, sc, css_class)
usex = require(links_module).embedded_language_links{term = usex, lang = lang, sc = sc}
local face
if quote then
face = nil
else
face = "term"
end
usex = require(script_utilities_module).tag_text(usex, lang, sc, face, css_class)
return usex
end
if usex then
usex = do_language_and_script_tagging(usex, lang, sc,
quote == "quote-meta" and css_classes.quotation_with_citation or
quote and css_classes.quotation or css_classes.example)
if not nocat then
-- Only add [[Citations:foo]] to [[:Category:LANG terms with quotations]] if [[foo]] exists.
local ok_to_add_cat
if title.nsText ~= "Citations" then
ok_to_add_cat = true
else
-- Here we don't want to use the subpage text because we check [[Citations:foo]] against [[foo]] and
-- if there's a slash in what follows 'Citations:', we want to check against the full page with the
-- slash.
local mainspace_title = mw.title.new(title.text)
if mainspace_title and mainspace_title.exists then
ok_to_add_cat = true
end
end
if ok_to_add_cat then
-- Categories beginning with the language name should use full languages as that's what the poscat
-- system requires, but 'Requests for' categories can use etymology-only languages.
table.insert(categories, ("%s terms with %ss"):format(termlang:getFullName(), example_type))
end
end
else
if tr then
table.insert(categories, ("Requests for %s in %s %ss"):format(
sc_explicit and sc_explicit:getDisplayForm() or "native script",
lang:getCanonicalName(), example_type))
end
-- TODO: Trigger some kind of error here
usex = "<small>(please add the primary text of this " .. example_type .. ")</small>"
end
if norm then
-- Use brackets in HTML entity format just to make sure we don't interfere with links; add brackets before
-- script tagging so that if the script tagging increases the font size, the brackets get increased too.
norm = "[" .. norm .. "]"
norm = do_language_and_script_tagging(norm, lang, normsc, css_classes.normalization)
end
local result = {}
if leftq and #leftq > 0 then
table.insert(result, span(css_classes.qualifier, require("Module:qualifier").format_qualifier(leftq)) .. " ")
end
table.insert(result, usex)
if rightq and #rightq > 0 then
table.insert(result, " " .. span(css_classes.qualifier, require("Module:qualifier").format_qualifier(rightq)))
end
if ref and ref ~= "" then
track("ref")
table.insert(result, ref)
end
return {
usex = table.concat(result),
tr = tr,
ts = ts,
norm = norm
}
end
local function format_audio(audio)
if audio then
return " [[File:" .. audio .. "|25px]]"
else
return ""
end
end
--[==[
Format a usex or quotation. Implementation of {{tl|ux}}, {{tl|quote}} and {{tl|quote-*}} templates (e.g.
{{tl|quote-book}}, {{tl|quote-journal}}, {{tl|quote-web}}, etc.). FIXME: Should also be used by {{tl|Q}} and
[[Module:Quotations]].
Takes a single object `data`, containining the following fields:
* `usex`: The text of the usex or quotation to format. Semi-mandatory (a maintenance line is displayed if missing).
* `lang`: The language object of the text. Mandatory. May be an etymology language.
* `termlang`: The language object of the term, which may be different from the language of the text. Defaults to `lang`.
Used for categories. May be an etymology language.
* `sc`: The script object of the text. Autodetected if not given.
* `quote`: If specified, this is a quotation rather than a usex (uses a different CSS class that affects formatting).
* `inline`: If specified, format the usex or quotation inline (on one line).
* `translation`: Translation of the usex or quotation, if in a foreign language.
* `lit`: Literal translation (if the translation in `translation` is idiomatic and differs significantly from the
literal translation).
* `normalization`: Normalized version of the usex or quotation (esp. for older languages where nonstandard spellings
were common).
* `normsc`: Script object of the normalized text. If unspecified, use the script object given in `sc` if any, otherwise
do script detection on the normalized text. If "auto", do script detection on the normalized text even if
a script was specified in `sc`.
* `transliteration`: Transliteration of the usex. If unspecified, transliterate the normalization if specified and not
in a Latin script and transliterable, otherwise fall back to transliterating the usex text.
* `transcription`: Transcription of the usex, for languages where the transliteration differs significantly from the
pronunciation.
* `subst`: String indicating substitutions to perform on the usex/quotation and normalization prior to transliterating
them. Multiple substs are comma-separated and individual substs are of the form FROM//TO where FROM is a
Lua pattern and TO is a Lua replacement spec. (FROM/TO is also recognized if no // is present in the
substitution.)
* `q`: If specified, a list of left qualifiers to display before the usex/quotation text.
* `qq`: If specified, a list of right qualifiers to display after the usex/quotation text.
* `qualifiers`: If specified, a list of right qualifiers to display after the usex/quotation text, for compatibility
purposes.
* `ref`: Reference text to display directly after the right qualifiers. (FIXME: Instead, this should be actual
references.)
* `audio`: Name of the audio file containing the usex in spoken form.
* `orig`: Original text, if the primary text of the usex or quotation is a translation.
* `origlang`: The language object of the original text. Mandatory if original text given. May be an etymology language.
* `origsc`: The script object of the original text. Autodetected if not given.
* `orignorm`: Normalized version of the original text (esp. for older languages where nonstandard spellings were
common).
* `orignormsc`: Script object of the normalized original text. If unspecified, use the script object given in `origsc`
if any, otherwise do script detection on the normalized original text. If "auto", do script detection
on the normalized text even if a script was specified in `origsc`.
* `origtr`: Transliteration of the original text. If unspecified, transliterate the normalized original text if
specified and not in a Latin script and transliterable, otherwise fall back to transliterating the original
text.
* `origts`: Transcription of the original text, for languages where the transliteration differs significantly from the
pronunciation.
* `origsubst`: String indicating substitutions to perform on the original text and normalization thereof prior to
transliterating them. Multiple substs are comma-separated and individual substs are of the form FROM//TO
where FROM is a Lua pattern and TO is a Lua replacement spec. (FROM/TO is also recognized if no // is
present in the substitution.)
* `origq`: If specified, a list of left qualifiers to display before the original text.
* `origqq`: If specified, a list of right qualifiers to display after the original text.
* `origref`: Reference text to display directly after the right qualifiers of the original text. (FIXME: Instead, this
should be actual references.)
* `source`: Source of the quotation, displayed in parens after the quotation text.
* `footer`: Footer displaying miscellaneous information, shown after the quotation. (Typically this should be in a
small font.)
* `nocat`: Suppress categorization.
* `noreq`: Suppress request for translation when no translation provided.
* `sortkey`: Sort key for categories.
* `brackets`: If specified, show a bracket at the end (used with brackets= in {{tl|quote-*}} templates, which show the
bracket at the beginning, to indicate a mention rather than a use).
* `class`: Additional CSS class surrounding the entire formatted text.
]==]
function export.format_usex(data)
local lang = data.lang
local termlang = data.termlang or lang
local translation = data.translation
local quote = data.quote
local lit = data.lit
local audio = data.audio
local source = data.source
local brackets = data.brackets
local footer = data.footer
local sortkey = data.sortkey
local noreq = data.noreq
local title
if data.pagename then -- for testing, doc pages, etc.
title = mw.title.new(data.pagename)
if not title then
error(("Bad value for `data.pagename`: '%s'"):format(data.pagename))
end
else
title = mw.title.getCurrentTitle()
end
--[[
if title.nsText == "Reconstruction" or lang:hasType("reconstructed") then
error("Reconstructed languages and reconstructed terms cannot have usage examples, as we have no record of their use.")
end
]]
if lit then
lit = "(literally, “" .. span(css_classes.literally, lit) .. "”)"
end
if source then
source = "(" .. span(css_classes.source, source) .. ")"
end
if footer then
footer = span(css_classes.footer, footer)
end
local example_type = quote and "quotation" or "usage example" -- used in error messages and categories
local categories = {}
local usex_obj = process_usex_text {
lang = lang,
termlang = termlang,
usex = data.usex,
sc = data.sc,
tr = data.transliteration,
ts = data.transcription,
norm = data.normalization,
normsc = data.normsc,
subst = data.subst,
quote = data.quote,
title = title,
q = data.q,
qq = data.qq,
ref = data.ref,
nocat = data.nocat,
categories = categories,
example_type = example_type,
}
local orig_obj = data.orig and process_usex_text {
lang = data.origlang,
-- Any categories derived from the original text should use the language of the main text or the term inside it,
-- not the language of the original text.
termlang = termlang,
usex = data.orig,
sc = data.origsc,
tr = data.origtr,
ts = data.origts,
norm = data.orignorm,
normsc = data.orignormsc,
subst = data.origsubst,
quote = data.quote,
title = title,
q = data.origq,
qq = data.origqq,
ref = data.origref,
nocat = data.nocat,
categories = categories,
example_type = example_type,
} or nil
if translation == "-" then
translation = nil
table.insert(categories, ("%s %ss with omitted translation"):format(lang:getFullName(),
example_type))
elseif translation then
translation = span(css_classes.translation, translation)
elseif not noreq then
local langcode = lang:getFullCode()
local origlangcode = data.origlang and data.origlang:getFullCode()
if langcode ~= "gd" and langcode ~= "mul" and langcode ~= "und" and origlangcode ~= "gd" then
-- add trreq category if translation is unspecified and language is not english, translingual or
-- undetermined
table.insert(categories, ("Requests for translations of %s %ss"):format(lang:getCanonicalName(),
example_type))
if quote then
translation = "<small>([[WT:Quotations#Adding translations to quotations|cuir eadar-theangachadh]] dhen"
.. example_type .. " seo ris)</small>"
else
translation = "<small>(cuir eadar-theangachadh dhen " .. example_type .. " seo rise)</small>"
end
end
end
local function generate_inline_usex()
local result = {}
local function ins(text)
table.insert(result, text)
end
ins(usex_obj.usex)
ins(format_audio(audio))
local function insert_annotations(obj)
if obj.norm then
ins(" " .. obj.norm)
end
if obj.tr or obj.ts then
ins(" ―")
if obj.tr then
ins(" " .. obj.tr)
end
if obj.ts then
ins(" " .. obj.ts)
end
end
end
insert_annotations(usex_obj)
if orig_obj then
ins(" (")
ins("[" .. original_text .. orig_obj.usex .. "]")
insert_annotations(orig_obj)
ins(")")
end
if translation then
ins(" ― " .. translation)
end
if lit then
ins(" " .. lit)
end
if source then
ins(" " .. source)
end
if footer then
ins(" " .. footer)
end
if data.brackets then
ins("]")
end
return table.concat(result)
end
local function generate_multiline_usex()
local result = {}
local function ins(text)
table.insert(result, text)
end
ins(usex_obj.usex)
ins(format_audio(audio))
local any_usex_annotations = usex_obj.tr or usex_obj.ts or usex_obj.norm or translation or lit
local any_orig_annotations = orig_obj and (orig_obj.tr or orig_obj.ts or orig_obj.norm)
if any_usex_annotations or orig_obj or source or footer then
ins("<dl>")
local function insert_dd(text)
if text then
ins("<dd>")
ins(text)
if data.brackets then
ins(BRACKET_SUB)
end
ins("</dd>")
end
end
insert_dd(usex_obj.norm)
insert_dd(usex_obj.tr)
insert_dd(usex_obj.ts)
if orig_obj then
insert_dd("[" .. original_text .. orig_obj.usex .. "]")
if any_orig_annotations then
ins("<dd><dl>")
insert_dd(orig_obj.norm)
insert_dd(orig_obj.tr)
insert_dd(orig_obj.ts)
ins("</dl></dd>")
end
end
insert_dd(translation)
insert_dd(lit)
if source or footer then
if any_usex_annotations then
ins("<dd><dl>")
end
insert_dd(source)
insert_dd(footer)
if any_usex_annotations then
ins("</dl></dd>")
end
end
ins("</dl>")
elseif data.brackets then
ins(BRACKET_SUB)
end
result = table.concat(result)
if data.brackets then
result = result:gsub("^(.*)" .. BRACKET_SUB, "%1]"):gsub(BRACKET_SUB, "")
end
return result
end
local is_inline
if data.inline == "auto" then
result = generate_inline_usex()
if get_character_width(convert_to_raw_text(result)) > MAX_INLINE_WIDTH then
result = generate_multiline_usex()
is_inline = false
else
is_inline = true
end
elseif data.inline then
result = generate_inline_usex()
is_inline = true
else
result = generate_multiline_usex()
is_inline = false
end
local class = quote and css_classes.container_quotation or css_classes.container_ux
if data.class then
class = class .. " " .. data.class
end
result = (is_inline and span or div)(class, result)
return result .. require("Module:utilities").format_categories(categories, lang, sortkey)
end
return export
r009fs3o5gqammed13xfxs55i6n4atf
Mòideal:labels/data/lang/gd
828
17305
88349
87501
2026-07-26T21:10:58Z
Altronic
4137
88349
Scribunto
text/plain
local labels = {}
labels["Applecross"] = {
Wikipedia = "Applecross",
regional_categories = "Wester Ross",
}
labels["Argyll"] = {
Wikipedia = "Argyll",
region = "[[Argyll]] in western [[Scotland]]",
regional_categories = true,
parent = true,
}
labels["Arran"] = {
Wikipedia = "Arran Gaelic",
regional_categories = true,
parent = "South Argyll",
verb = "formerly spoken",
prep = "on",
region = "the [[Isle of Arran]]",
type = "extinct",
}
labels["Ardnamurchan"] = {
Wikipedia = "Ardnamurchan",
regional_categories = true,
parent = true,
region = "the [[Ardnamurchan]] Peninsula in the historic province of [[Lochaber]]",
}
labels["Badenoch"] = {
Wikipedia = "Badenoch",
regional_categories = true,
parent = true,
region = "the district of [[Badenoch]] in the [[Scottish Highlands]]",
}
labels["Barra"] = {
Wikipedia = "Barra",
regional_categories = true,
parent = "Southern Hebridean",
prep = "on",
region = "the island of [[Barra]] in the [[Outer Hebrides]]",
}
labels["Benbecula"] = {
Wikipedia = "Benbecula",
regional_categories = true,
parent = "Uist",
prep = "on",
region = "the island of [[Benbecula]] in the [[Outer Hebrides]]",
}
labels["Bernera"] = {
aliases = {"Great Bernera"},
Wikipedia = "Great Bernera",
regional_categories = "Lewis",
}
labels["Bracadale"] = {
Wikipedia = "Bracadale",
regional_categories = "Skye",
}
labels["Canada"] = {
Wikipedia = "Canadian Gaelic",
regional_categories = "Canadian",
parent = true,
}
labels["Cape Breton"] = {
aliases = {"Cape Breton Island"},
Wikipedia = "Cape Breton Island",
regional_categories = true,
parent = "Canada",
}
labels["Coigach"] = {
aliases = {"Coigeach"},
Wikipedia = "Coigach",
regional_categories = true,
parent = "Ross-shire",
region = "the peninsula north of [[Ullapool]] in [[Ross]] in the [[Scottish Highlands]]",
}
labels["Colonsay"] = {
Wikipedia = "Colonsay",
regional_categories = true,
parent = true,
prep = "on",
region = "the island of [[Colonsay]] in the [[Inner Hebrides]]",
}
labels["Deeside"] = {
Wikipedia = "Deeside Gaelic",
regional_categories = true,
parent = true,
verb = "formerly spoken",
region = "[[Aberdeenshire]], until 1984",
type = "extinct",
}
labels["Duirinish"] = {
aliases = {"Dunvegan"},
Wikipedia = "Duirinish, Skye",
regional_categories = "Skye",
}
labels["Easter Ross"] = {
Wikipedia = "Easter Ross",
regional_categories = true,
parent = "Ross-shire",
region = "the eastern part of the area of [[Ross]] in the [[Scottish Highlands]]",
}
labels["Eigg"] = {
Wikipedia = "Eigg",
regional_categories = true,
parent = true,
prep = "on",
region = "the island of [[Eigg]] in the [[Inner Hebrides]]",
}
labels["Èirisgeigh"] = {
aliases = {"Éirisgeigh"},
Wikipedia = "Eriskay",
regional_categories = true,
parent = "Uibhist",
prep = "on",
region = "the island of [[Eriskay]] in the [[Outer Hebrides]]",
}
labels["Gigha"] = {
Wikipedia = "Gigha",
regional_categories = true,
parent = "South Argyll",
prep = "in",
region = "the island of [[Gigha]] off the west coast of [[Kintyre]]",
}
labels["Harris"] = {
Wikipedia = "Harris, Outer Hebrides",
regional_categories = true,
parent = "Southern Hebridean",
region = "the southern and more mountainous part of the island of [[Lewis and Harris]], the largest island in the [[Outer Hebrides]]",
}
labels["Islay"] = {
Wikipedia = "Islay",
regional_categories = true,
parent = "South Argyll",
prep = "on",
region = "the island of [[Islay]], the southernmost island of the [[Inner Hebrides]]",
}
labels["Diùra"] = {
Wikipedia = "Jura, Scotland",
regional_categories = true,
parent = "South Argyll",
prep = "on",
region = "the island of [[Jura]] in the [[Inner Hebrides]]",
}
labels["Kintyre"] = {
Wikipedia = "Kintyre",
regional_categories = true,
parent = "South Argyll",
region = "the peninsula of [[Kintyre]] in western [[Scotland]]",
}
labels["Leòdhas"] = {
aliases = {"Isle of Lewis"},
Wikipedia = "Isle of Lewis",
regional_categories = true,
parent = true,
region = "the northern part of the island of [[Lewis and Harris]], the largest island in the [[Outer Hebrides]]",
}
labels["Lismore"] = {
Wikipedia = "Lismore, Scotland",
regional_categories = true,
parent = "Argyll",
}
labels["Lochaber"] = {
Wikipedia = "Lochaber",
regional_categories = true,
parent = true,
region = "[[Lochaber]], a historic province in the western part of the [[Scottish Highlands]]",
}
labels["Lochalsh"] = {
Wikipedia = "Lochalsh",
regional_categories = true,
parent = "Ross-shire",
region = "the region of [[Lochalsh]] in the western part of the [[Scottish Highlands]]",
}
labels["Lochs"] = {
aliases = {"Leurbost"},
Wikipedia = "Lochs, Outer Hebrides",
regional_categories = "Lewis",
}
labels["Mackay Country"] = {
aliases = {"Reay", "MacKay Country", "Strathnaver", "North Sutherland"},
Wikipedia = "Strathnaver",
regional_categories = true,
parent = true,
region = "the historic province of [[Mackay Country]] in the northern part of the [[Scottish Highlands]]",
}
labels["Mull"] = {
Wikipedia = "Isle of Mull",
regional_categories = true,
parent = "Argyll",
prep = "on",
region = "the island of [[Mull]], the second largest island of the [[Inner Hebrides]]",
}
labels["Ness"] = {
Wikipedia = "Ness, Lewis",
regional_categories = "Lewis",
}
labels["Uibhist a Tuath"] = {
Wikipedia = "Uidhist a Tuath",
regional_categories = true,
parent = "Uibhist",
prep = "on",
region = "the island of [[North Uist]] in the [[Outer Hebrides]]",
}
labels["Perthshire"] = {
Wikipedia = "Perthshire",
regional_categories = true,
parent = true,
region = "the historic county of [[Perthshire]] in central [[Scotland]]",
}
labels["Prince Edward Island"] = {
Wikipedia = "Prince Edward Island",
regional_categories = true,
parent = "Canada",
}
labels["Raasay"] = {
aliases = {"Isle of Raasay"},
Wikipedia = "Raasay",
regional_categories = true,
parent = "Skye",
prep = "on",
region = "the island of [[Raasay]] in the [[Inner Hebrides]], between [[Skye]] and the mainland",
}
labels["Ross-shire"] = {
aliases = {"Ross"},
Wikipedia = "Ross-shire",
regional_categories = true,
parent = true,
region = "the historic county of [[Ross-shire]] in the [[Scottish Highlands]]",
}
labels["Scalpay"] = {
Wikipedia = "Scalpay, Outer Hebrides",
regional_categories = true,
parent = "Harris",
prep = "on",
region = "the island of [[Scalpay, Outer Hebrides|Scalpay]] in the [[Outer Hebrides]]",
}
labels["Skye"] = {
aliases = {"Isle of Skye"},
Wikipedia = "Isle of Skye",
regional_categories = true,
parent = true,
prep = "on",
region = "the island of [[Syke]], the largest island of the [[Inner Hebrides]]",
}
labels["Sleat"] = {
Wikipedia = "Sleat",
regional_categories = "Skye",
}
labels["South Argyll"] = {
aliases = {"Southwestern"},
Wikipedia = "South Argyll dialect group",
regional_categories = true,
parent = "Argyll",
region = "the islands of [[Islay]], [[Jura, Scotland|Jura]], [[Colonsay]], [[Gigha]] and [[Isle of Arran|Arran]], and the peninsula of [[Kintyre]]",
}
labels["Uibhist a Deas"] = {
Wikipedia = "Uidhist a Deas",
regional_categories = true,
parent = "Uibhist",
prep = "on",
region = "the island of [[South Uist]], the second largest island of the [[Outer Hebrides]]",
}
labels["Southern Hebridean"] = {
Wikipedia = "Southern Hebridean dialect group",
regional_categories = true,
region = "the island groups of [[Harris, Outer Hebrides|Harris]], [[Uist]] and [[Barra]]",
}
labels["Strath"] = {
aliases = {"Strath Swordale"},
regional_categories = "Skye",
}
labels["Strathspey"] = {
Wikipedia = "Strathspey, Scotland",
regional_categories = true,
parent = true,
region = "the region of [[Strathspey]], comprising part of the valley of [[Spey]] in the [[Scottish Highlands]]",
}
labels["Sutherland"] = {
aliases = {"East Sutherland"},
Wikipedia = "East Sutherland Gaelic",
regional_categories = true,
parent = true,
verb = "formerly spoken",
region = "the historic county of [[Sutherland]] in the [[Scottish Highlands]]",
type = "extinct",
}
labels["Tiree"] = {
Wikipedia = "Tiree",
regional_categories = true,
parent = true,
region = "the island of [[Tiree]], the most westerly island of the [[Inner Hebrides]]",
}
labels["Trotternish"] = {
Wikipedia = "Trotternish",
regional_categories = "Skye",
}
labels["Uig"] = {
aliases = {"Uig Lewis"},
Wikipedia = "Uig, Lewis",
regional_categories = "Lewis",
}
labels["Uibhist"] = {
aliases = "Uidhist",
Wikipedia = "Uist",
regional_categories = true,
parent = "Southern Hebridean",
prep = "in",
region = "the archipelago of [[Uist]], part of the [[Outer Hebrides]]",
}
labels["Wester Ross"] = {
Wikipedia = "Wester Ross",
regional_categories = true,
parent = "Ross-shire",
region = "the western part of the area of [[Ross]] in the [[Scottish Highlands]]",
}
return require("Module:labels").finalize_data(labels)
fpxel2m2b0tiphmovjw3ffs953gix5u
88350
88349
2026-07-26T22:43:24Z
Altronic
4137
Neo-dhèan mùthadh [[Special:Diff/88349|88349]] leis [[Special:Contributions/Altronic|Altronic]] ([[User talk:Altronic|an deasbaireachd]])
88350
Scribunto
text/plain
local labels = {}
labels["Applecross"] = {
Wikipedia = "Applecross",
regional_categories = "Wester Ross",
}
labels["Argyll"] = {
Wikipedia = "Argyll",
region = "[[Argyll]] in western [[Scotland]]",
regional_categories = true,
parent = true,
}
labels["Arran"] = {
Wikipedia = "Arran Gaelic",
regional_categories = true,
parent = "South Argyll",
verb = "formerly spoken",
prep = "on",
region = "the [[Isle of Arran]]",
type = "extinct",
}
labels["Ardnamurchan"] = {
Wikipedia = "Ardnamurchan",
regional_categories = true,
parent = true,
region = "the [[Ardnamurchan]] Peninsula in the historic province of [[Lochaber]]",
}
labels["Badenoch"] = {
Wikipedia = "Badenoch",
regional_categories = true,
parent = true,
region = "the district of [[Badenoch]] in the [[Scottish Highlands]]",
}
labels["Barra"] = {
Wikipedia = "Barra",
regional_categories = true,
parent = "Southern Hebridean",
prep = "on",
region = "the island of [[Barra]] in the [[Outer Hebrides]]",
}
labels["Benbecula"] = {
Wikipedia = "Benbecula",
regional_categories = true,
parent = "Uist",
prep = "on",
region = "the island of [[Benbecula]] in the [[Outer Hebrides]]",
}
labels["Bernera"] = {
aliases = {"Great Bernera"},
Wikipedia = "Great Bernera",
regional_categories = "Lewis",
}
labels["Bracadale"] = {
Wikipedia = "Bracadale",
regional_categories = "Skye",
}
labels["Canada"] = {
Wikipedia = "Canadian Gaelic",
regional_categories = "Canadian",
parent = true,
}
labels["Cape Breton"] = {
aliases = {"Cape Breton Island"},
Wikipedia = "Cape Breton Island",
regional_categories = true,
parent = "Canada",
}
labels["Coigach"] = {
aliases = {"Coigeach"},
Wikipedia = "Coigach",
regional_categories = true,
parent = "Ross-shire",
region = "the peninsula north of [[Ullapool]] in [[Ross]] in the [[Scottish Highlands]]",
}
labels["Colonsay"] = {
Wikipedia = "Colonsay",
regional_categories = true,
parent = true,
prep = "on",
region = "the island of [[Colonsay]] in the [[Inner Hebrides]]",
}
labels["Deeside"] = {
Wikipedia = "Deeside Gaelic",
regional_categories = true,
parent = true,
verb = "formerly spoken",
region = "[[Aberdeenshire]], until 1984",
type = "extinct",
}
labels["Duirinish"] = {
aliases = {"Dunvegan"},
Wikipedia = "Duirinish, Skye",
regional_categories = "Skye",
}
labels["Easter Ross"] = {
Wikipedia = "Easter Ross",
regional_categories = true,
parent = "Ross-shire",
region = "the eastern part of the area of [[Ross]] in the [[Scottish Highlands]]",
}
labels["Eigg"] = {
Wikipedia = "Eigg",
regional_categories = true,
parent = true,
prep = "on",
region = "the island of [[Eigg]] in the [[Inner Hebrides]]",
}
labels["Eriskay"] = {
Wikipedia = "Eriskay",
regional_categories = true,
parent = "Uist",
prep = "on",
region = "the island of [[Eriskay]] in the [[Outer Hebrides]]",
}
labels["Gigha"] = {
Wikipedia = "Gigha",
regional_categories = true,
parent = "South Argyll",
prep = "in",
region = "the island of [[Gigha]] off the west coast of [[Kintyre]]",
}
labels["Harris"] = {
Wikipedia = "Harris, Outer Hebrides",
regional_categories = true,
parent = "Southern Hebridean",
region = "the southern and more mountainous part of the island of [[Lewis and Harris]], the largest island in the [[Outer Hebrides]]",
}
labels["Islay"] = {
Wikipedia = "Islay",
regional_categories = true,
parent = "South Argyll",
prep = "on",
region = "the island of [[Islay]], the southernmost island of the [[Inner Hebrides]]",
}
labels["Jura"] = {
Wikipedia = "Jura, Scotland",
regional_categories = true,
parent = "South Argyll",
prep = "on",
region = "the island of [[Jura]] in the [[Inner Hebrides]]",
}
labels["Kintyre"] = {
Wikipedia = "Kintyre",
regional_categories = true,
parent = "South Argyll",
region = "the peninsula of [[Kintyre]] in western [[Scotland]]",
}
labels["Lewis"] = {
aliases = {"Isle of Lewis"},
Wikipedia = "Isle of Lewis",
regional_categories = true,
parent = true,
region = "the northern part of the island of [[Lewis and Harris]], the largest island in the [[Outer Hebrides]]",
}
labels["Lismore"] = {
Wikipedia = "Lismore, Scotland",
regional_categories = true,
parent = "Argyll",
}
labels["Lochaber"] = {
Wikipedia = "Lochaber",
regional_categories = true,
parent = true,
region = "[[Lochaber]], a historic province in the western part of the [[Scottish Highlands]]",
}
labels["Lochalsh"] = {
Wikipedia = "Lochalsh",
regional_categories = true,
parent = "Ross-shire",
region = "the region of [[Lochalsh]] in the western part of the [[Scottish Highlands]]",
}
labels["Lochs"] = {
aliases = {"Leurbost"},
Wikipedia = "Lochs, Outer Hebrides",
regional_categories = "Lewis",
}
labels["Mackay Country"] = {
aliases = {"Reay", "MacKay Country", "Strathnaver", "North Sutherland"},
Wikipedia = "Strathnaver",
regional_categories = true,
parent = true,
region = "the historic province of [[Mackay Country]] in the northern part of the [[Scottish Highlands]]",
}
labels["Mull"] = {
Wikipedia = "Isle of Mull",
regional_categories = true,
parent = "Argyll",
prep = "on",
region = "the island of [[Mull]], the second largest island of the [[Inner Hebrides]]",
}
labels["Ness"] = {
Wikipedia = "Ness, Lewis",
regional_categories = "Lewis",
}
labels["North Uist"] = {
Wikipedia = "North Uist",
regional_categories = true,
parent = "Uist",
prep = "on",
region = "the island of [[North Uist]] in the [[Outer Hebrides]]",
}
labels["Perthshire"] = {
Wikipedia = "Perthshire",
regional_categories = true,
parent = true,
region = "the historic county of [[Perthshire]] in central [[Scotland]]",
}
labels["Prince Edward Island"] = {
Wikipedia = "Prince Edward Island",
regional_categories = true,
parent = "Canada",
}
labels["Raasay"] = {
aliases = {"Isle of Raasay"},
Wikipedia = "Raasay",
regional_categories = true,
parent = "Skye",
prep = "on",
region = "the island of [[Raasay]] in the [[Inner Hebrides]], between [[Skye]] and the mainland",
}
labels["Ross-shire"] = {
aliases = {"Ross"},
Wikipedia = "Ross-shire",
regional_categories = true,
parent = true,
region = "the historic county of [[Ross-shire]] in the [[Scottish Highlands]]",
}
labels["Scalpay"] = {
Wikipedia = "Scalpay, Outer Hebrides",
regional_categories = true,
parent = "Harris",
prep = "on",
region = "the island of [[Scalpay, Outer Hebrides|Scalpay]] in the [[Outer Hebrides]]",
}
labels["Skye"] = {
aliases = {"Isle of Skye"},
Wikipedia = "Isle of Skye",
regional_categories = true,
parent = true,
prep = "on",
region = "the island of [[Syke]], the largest island of the [[Inner Hebrides]]",
}
labels["Sleat"] = {
Wikipedia = "Sleat",
regional_categories = "Skye",
}
labels["South Argyll"] = {
aliases = {"Southwestern"},
Wikipedia = "South Argyll dialect group",
regional_categories = true,
parent = "Argyll",
region = "the islands of [[Islay]], [[Jura, Scotland|Jura]], [[Colonsay]], [[Gigha]] and [[Isle of Arran|Arran]], and the peninsula of [[Kintyre]]",
}
labels["South Uist"] = {
Wikipedia = "South Uist",
regional_categories = true,
parent = "Uist",
prep = "on",
region = "the island of [[South Uist]], the second largest island of the [[Outer Hebrides]]",
}
labels["Southern Hebridean"] = {
Wikipedia = "Southern Hebridean dialect group",
regional_categories = true,
region = "the island groups of [[Harris, Outer Hebrides|Harris]], [[Uist]] and [[Barra]]",
}
labels["Strath"] = {
aliases = {"Strath Swordale"},
regional_categories = "Skye",
}
labels["Strathspey"] = {
Wikipedia = "Strathspey, Scotland",
regional_categories = true,
parent = true,
region = "the region of [[Strathspey]], comprising part of the valley of [[Spey]] in the [[Scottish Highlands]]",
}
labels["Sutherland"] = {
aliases = {"East Sutherland"},
Wikipedia = "East Sutherland Gaelic",
regional_categories = true,
parent = true,
verb = "formerly spoken",
region = "the historic county of [[Sutherland]] in the [[Scottish Highlands]]",
type = "extinct",
}
labels["Tiree"] = {
Wikipedia = "Tiree",
regional_categories = true,
parent = true,
region = "the island of [[Tiree]], the most westerly island of the [[Inner Hebrides]]",
}
labels["Trotternish"] = {
Wikipedia = "Trotternish",
regional_categories = "Skye",
}
labels["Uig"] = {
aliases = {"Uig Lewis"},
Wikipedia = "Uig, Lewis",
regional_categories = "Lewis",
}
labels["Uist"] = {
Wikipedia = "Uist",
regional_categories = true,
parent = "Southern Hebridean",
prep = "in",
region = "the archipelago of [[Uist]], part of the [[Outer Hebrides]]",
}
labels["Wester Ross"] = {
Wikipedia = "Wester Ross",
regional_categories = true,
parent = "Ross-shire",
region = "the western part of the area of [[Ross]] in the [[Scottish Highlands]]",
}
return require("Module:labels").finalize_data(labels)
k1fknbpqfczwmpdx4956w3j1g18xa09
bàsaich
0
17704
88348
2026-07-26T20:56:20Z
Altronic
4137
Chaidh duilleag le "==Gàidhlig== ===Gnìomhair=== {{gd-verb|past=bhàsaich|fut=bàsaichidh|vn=bàsachadh|pp=bàsaichte}} # [[beathach|Beathach]] beò nach eil duine a sgur a bhith beò. #: {{ux|gd|Bhàsaich mo choin 3 bhliadhnaichean o choinn.}} # {{lb|gd|Leòdhas|Èirisgeigh|Barraigh}} Beathach beò a' gabhail a-steach nan daoine a sgur a bhith beò. ====Co-nasgadh==== {{gd-conj|bàsachadh}} ===Mùthadh=== {{gd-mut}}" a chruthachadh
88348
wikitext
text/x-wiki
==Gàidhlig==
===Gnìomhair===
{{gd-verb|past=bhàsaich|fut=bàsaichidh|vn=bàsachadh|pp=bàsaichte}}
# [[beathach|Beathach]] beò nach eil duine a sgur a bhith beò.
#: {{ux|gd|Bhàsaich mo choin 3 bhliadhnaichean o choinn.}}
# {{lb|gd|Leòdhas|Èirisgeigh|Barraigh}} Beathach beò a' gabhail a-steach nan daoine a sgur a bhith beò.
====Co-nasgadh====
{{gd-conj|bàsachadh}}
===Mùthadh===
{{gd-mut}}
jndyx3yb4axwkcmg8kgzsuns3hd8b0w
88465
88348
2026-07-27T01:46:12Z
Altronic
4137
Chuir ris nòtaichean ùsaide
88465
wikitext
text/x-wiki
==Gàidhlig==
===Gnìomhair===
{{gd-verb|past=bhàsaich|fut=bàsaichidh|vn=bàsachadh|pp=bàsaichte}}
# [[beathach|Beathach]] beò nach eil duine a sgur a bhith beò.
#: {{ux|gd|Bhàsaich mo choin 3 bhliadhnaichean o choinn.}}
# {{lb|gd|Leòdhas|Èirisgeigh|Barraigh}} Beathach beò a' gabhail a-steach nan daoine a sgur a bhith beò.
====Nòtaichean ùsaide====
Chan eil an briathar seo a' cleachdadh a iomradh air bàs nan daoine ach na dual-chainntean anns an Leòdhas, Èirisgeigh agus Barraigh. Anns na dual-chainntean eile, tha briathair eile mar [[siubhail]] no [[caochail]] a' cleachdadh an àite.
====Co-nasgadh====
{{gd-conj|bàsachadh}}
===Mùthadh===
{{gd-mut}}
mg3z03n0f293aqcqxsb5vo2lxrjq4vz
88466
88465
2026-07-27T01:48:43Z
Altronic
4137
/* Nòtaichean ùsaide */
88466
wikitext
text/x-wiki
==Gàidhlig==
===Gnìomhair===
{{gd-verb|past=bhàsaich|fut=bàsaichidh|vn=bàsachadh|pp=bàsaichte}}
# [[beathach|Beathach]] beò nach eil duine a sgur a bhith beò.
#: {{ux|gd|Bhàsaich mo choin 3 bhliadhnaichean o choinn.}}
# {{lb|gd|Leòdhas|Èirisgeigh|Barraigh}} Beathach beò a' gabhail a-steach nan daoine a sgur a bhith beò.
====Nòtaichean ùsaide====
Chan eil an briathar seo a' cleachdadh a iomradh air bàs nan daoine ach na dual-chainntean anns an Leòdhas, Èirisgeigh agus Barraigh. Anns na dual-chainntean eile, tha briathran eile mar [[siubhail]] no [[caochail]] a' cleachdadh an àite.
====Co-nasgadh====
{{gd-conj|bàsachadh}}
===Mùthadh===
{{gd-mut}}
n2guf5g1i08jazetx2slx1fekwwfgvy
88467
88466
2026-07-27T01:55:32Z
Altronic
4137
88467
wikitext
text/x-wiki
==Gàidhlig==
===Gnìomhair===
{{gd-verb|past=bhàsaich|fut=bàsaichidh|vn=bàsachadh|pp=bàsaichte}}
# [[beathach|Beathach]] beò nach eil duine a sgur a bhith beò.
#: {{ux|gd|Bhàsaich mo choin 3 bhliadhnaichean o chionn.}}
# {{lb|gd|Leòdhas|Èirisgeigh|Barraigh}} Beathach beò a' gabhail a-steach nan daoine a sgur a bhith beò.
====Nòtaichean ùsaide====
Chan eil an briathar seo a' cleachdadh a iomradh air bàs nan daoine ach na dual-chainntean anns an Leòdhas, Èirisgeigh agus Barraigh. Anns na dual-chainntean eile, tha briathran eile mar [[siubhail]] no [[caochail]] a' cleachdadh an àite.
====Co-nasgadh====
{{gd-conj|bàsachadh}}
===Mùthadh===
{{gd-mut}}
8f75enn0ifxabbbkxxuwg5rgghb3qhl
Roinn-seòrsa:Faclan Gàidhlig
14
17705
88352
2026-07-26T22:47:24Z
Altronic
4137
Ghluais Altronic duilleag [[Roinn-seòrsa:Faclan Gàidhlig]] gu [[Roinn-seòrsa:Cànan Gàidhlig]]
88352
wikitext
text/x-wiki
#REDIRECT [[:Roinn-seòrsa:Cànan Gàidhlig]]
29yx8zvh797vuehyidmxn86yttp5tmr
Teamplaid:auto cat
10
17706
88353
2024-11-11T19:22:31Z
en>Theknightwho
0
[[Module:auto cat]] merged into [[Module:category tree]].
88353
wikitext
text/x-wiki
{{safesubst:<noinclude/>#invoke:category tree|show}}<noinclude>{{documentation}}</noinclude>
j6zycuhqgb1iu335vq2dprah00g58ws
88354
88353
2026-07-27T00:10:08Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:auto_cat]]
88353
wikitext
text/x-wiki
{{safesubst:<noinclude/>#invoke:category tree|show}}<noinclude>{{documentation}}</noinclude>
j6zycuhqgb1iu335vq2dprah00g58ws
Mòideal:category tree
828
17707
88355
2026-05-27T05:42:27Z
en>Fenakhay
0
88355
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local category_tree_submodule_prefix = "Module:category tree/"
local category_tree_styles_css = "Module:category tree/styles.css"
local m_str_utils = require("Module:string utilities")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local ceil = math.ceil
local class_else_type = m_template_parser.class_else_type
local concat = table.concat
local deep_copy = require("Module:table").deepCopy
local full_url = mw.uri.fullUrl
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local log10 = math.log10 or require("Module:math").log10
local new_title = mw.title.new
local pages_in_category = mw.site.stats.pagesInCategory
local parse = m_template_parser.parse
local remove_comments = require("Module:string/removeComments")
local sort = table.sort
local split = m_str_utils.split
local string_compare = require("Module:string/compare")
local trim = m_str_utils.trim
local uupper = m_str_utils.upper
local yesno = require("Module:yesno")
local current_frame = mw.getCurrentFrame()
local current_title = mw.title.getCurrentTitle()
local namespace = current_title.namespace
local poscatboiler_subsystem = "poscatboiler"
local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category."
-- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages.
function export.numeral_sortkey(n, max_n)
max_n = max_n or require("Module:list of languages").count()
return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n)
end
function export.split_lang_label(title_text)
local getByCanonicalName = require("Module:languages").getByCanonicalName
-- Progressively remove a word from the potential canonical name until it
-- matches an actual canonical name.
local words = split(title_text, " ", true)
for i = #words - 1, 1, -1 do
local lang = getByCanonicalName(concat(words, " ", 1, i))
if lang then
return lang, concat(words, " ", i + 1)
end
end
return nil, title_text
end
local function show_error(text, title)
return require("Module:message box").maintenance(
"red",
"[[File:Codex icon Alert red.svg|40px|alt=alert]]",
title or "This category is not defined in Wiktionary's category tree.",
text
)
end
local function error_not_in_category_tree()
error(
"This category is not defined in Wiktionary's category tree. "
.. "Double-check the category name for typos. "
.. "Search existing categories or request definition at [[Wiktionary:Category and label treatment requests|WT:CLTR]]. "
.. "Affected category: " .. current_title.fullText,
2
)
end
-- Show the text that goes at the very top right of the page.
local function show_topright(current)
return current.getTopright and current:getTopright() or nil
end
local function link_box(content)
return ("<div class=\"noprint plainlinks\" style=\"float: right; clear: both; margin: 0 0 .5em 1em; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content)
end
local function show_editlink(current)
return link_box(("[%s Edit category data]"):format(tostring(full_url(current:getDataModule(), "action=edit"))))
end
function show_related_changes()
local title = current_title.fullText
return link_box(("[%s <span title=\"Recent edits and other changes to pages in %s\">Recent changes</span>]"):format(
tostring(full_url("Special:RecentChangesLinked", {
target = title,
showlinkedto = 0,
})),
title
))
end
local function show_pagelist(current)
local namespace = "namespace="
local info = current:getInfo()
local lang_code = info.code
if info.label == "citations" or info.label == "citations of undefined terms" then
namespace = namespace .. "Citations"
elseif lang_code then
local lang = require("Module:languages").getByCode(lang_code, true, true)
if lang then
-- Proto-Norse (gmq-pro) is probably the only language with a code ending in -pro
-- that's intended to have mostly non-reconstructed entries.
if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then
namespace = namespace .. "Reconstruction"
elseif lang:hasType("appendix-constructed") then
namespace = namespace .. "Appendix"
end
end
elseif info.label:match("templates") then
namespace = namespace .. "Template"
elseif info.label:match("modules") then
namespace = namespace .. "Module"
elseif info.label:match("^Wiktionary") or info.label:match("^Pages") then
namespace = ""
end
return ([=[
{| id="newest-and-oldest-pages" class="wikitable mw-collapsible" style="float: right; clear: both; margin: 0 0 .5em 1em;"
! Newest and oldest pages
|-
| id="recent-additions" style="font-size:0.9em;" | '''Newest pages ordered by last [[mw:Manual:Categorylinks table#cl_timestamp|category link update]]:'''
%s
|-
| id="oldest-pages" style="font-size:0.9em;" | '''Oldest pages ordered by last edit:'''
%s
|}]=]):format(
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=categoryadd
order=descending]=]
):format(current_title.text, namespace)
),
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=lastedit
order=ascending]=]
):format(current_title.text, namespace)
)
)
end
-- Show navigational "breadcrumbs" at the top of the page.
local function show_breadcrumbs(current)
local steps = {}
-- Start at the current label and move our way up the "chain" from child to parent, until we can't go further.
while current do
local category, display_name, nocap
if type(current) == "string" then
category = current
display_name = current:gsub("^Category:", "")
else
if not current.getCategoryName then
error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " ..
mw.dumpObject(current))
end
category = "Category:" .. current:getCategoryName()
display_name, nocap = current:getBreadcrumbName()
end
if not nocap then
display_name = mw.getContentLanguage():ucfirst(display_name)
end
insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name))
-- Move up the "chain" by one level.
if type(current) == "string" then
current = nil
else
current = current:getParents()
end
if current then
current = current[1].name
end
end
local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css)
local ol = mw.html.create("ol")
for i, step in ipairs(steps) do
local li = mw.html.create("li")
if i ~= 1 then
local span = mw.html.create("span")
:attr("aria-hidden", "true")
:addClass("ts-categoryBreadcrumbs-separator")
:wikitext(" » ")
li:node(span)
end
li:wikitext(step)
ol:node(li)
end
return templateStyles .. tostring(mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-categoryBreadcrumbs")
:node(ol))
end
local function show_also(current)
local also = current._info.also
if also and #also > 0 then
return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also))
end
return nil
end
-- Show a short description text for the category.
local function show_description(current)
return current.getDescription and current:getDescription() or nil
end
local function show_appendix(current)
local appendix = current.getAppendix and current:getAppendix()
return appendix and ("For more information, see [[%s]]."):format(appendix) or nil
end
local function sort_children(child1, child2)
return string_compare(uupper(child1.sort), uupper(child2.sort))
end
-- Show a list of child categories.
local function show_children(current)
local children = current.getChildren and current:getChildren() or nil
if not children then
return nil
end
sort(children, sort_children)
local children_list = {}
for _, child in ipairs(children) do
local child_name, child_pagetitle = child.name
if type(child_name) == "string" then
child_pagetitle = child_name
else
child_pagetitle = "Category:" .. child_name:getCategoryName()
end
if new_title(child_pagetitle).exists then
insert(children_list, ("* [[:%s]]: %s"):format(
child_pagetitle,
child.description or
type(child_name) == "string" and child_name:gsub("^Category:", "") .. "." or
child_name:getDescription("child")
))
end
end
return concat(children_list, "\n")
end
-- Show a table of contents with links to each letter in the language's script.
local function show_TOC(current)
local titleText = current_title.text
local inCategoryPages = pages_in_category(titleText, "pages")
local inCategorySubcats = pages_in_category(titleText, "subcats")
local TOC_type
-- Compute type of table of contents required.
if inCategoryPages > 2500 or inCategorySubcats > 2500 then
TOC_type = "full"
elseif inCategoryPages > 200 or inCategorySubcats > 200 then
TOC_type = "normal"
else
-- No (usual) need for a TOC if all pages or subcategories can fit on one page;
-- but allow this to be overridden by a custom TOC handler.
TOC_type = "none"
end
if current.getTOC then
local TOC_text = current:getTOC(TOC_type)
if TOC_text ~= true then
return TOC_text or nil
end
end
if TOC_type ~= "none" then
local templatename = current:getTOCTemplateName()
local TOC_template
if TOC_type == "full" then
-- This category is very large, see if there is a "full" version of the TOC.
local TOC_template_full = new_title(templatename .. "/full")
if TOC_template_full.exists then
TOC_template = TOC_template_full
end
end
if not TOC_template then
local TOC_template_normal = new_title(templatename)
if TOC_template_normal.exists then
TOC_template = TOC_template_normal
end
end
if TOC_template then
return current_frame:expandTemplate{title = TOC_template.text, args = {}}
end
end
return nil
end
-- Show the "catfix" that adds language attributes and script classes to the page.
local function show_catfix(current)
local lang, sc = current:getCatfixInfo()
return lang and m_utilities.catfix(lang, sc) or nil
end
-- Show the parent categories that the current category should be placed in.
local function show_categories(current, categories)
local parents = current.getParents and current:getParents() or nil
if not parents then
return nil
end
for _, parent in ipairs(parents) do
local parent_name = parent.name
local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort
if type(parent_name) == "string" then
insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey))
else
insert(categories, ("[[Category:%s|%s]]"):format(parent_name:getCategoryName(), sortkey))
end
end
-- Also put the category in its corresponding "umbrella" or "by language" category.
local umbrella = current:getUmbrella()
if umbrella then
-- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm.
local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName()
sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey)
if type(umbrella) == "string" then
insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey))
else
insert(categories, ("[[Category:%s|%s]]"):format(umbrella:getCategoryName(), sortkey))
end
end
-- Check for various unwanted parser functions, which should be integrated into the category tree data instead.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
local content = current_title:getContent()
if not content then
-- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page,
-- which is needed by Benwing's create_wanted_categories.py script.
return
end
local defaultsort, displaytitle, page_has_param
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "template" then
local name = node:get_name()
if name == "DEFAULTSORT:" and not defaultsort then
insert(categories, "[[Category:Pages with DEFAULTSORT conflicts]]")
defaultsort = true
elseif name == "DISPLAYTITLE:" and not displaytitle then
insert(categories,"[[Category:Pages with DISPLAYTITLE conflicts]]")
displaytitle = true
end
elseif node_class == "parameter" and not page_has_param then
insert(categories,"[[Category:Pages with raw triple-brace template parameters]]")
page_has_param = true
end
end
-- Check for raw category markup, which should also be integrated into the category tree data.
content = remove_comments(content, "BOTH")
local head = content:find("[[", 1, true)
while head do
local close = content:find("]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = content:find("[[", head + 2, true)
while open and open < close do
head = open
open = content:find("[[", head + 2, true)
end
local cat = content:sub(head + 2, close - 1)
local colon = cat:match("^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
local pipe = cat:find("|", colon + 1, true)
if pipe ~= #cat then
local title = new_title(pipe and cat:sub(1, pipe - 1) or cat)
if title and title.namespace == 14 then
insert(categories,"[[Category:Categories with categories using raw markup]]")
break
end
end
end
head = open
end
end
local function generate_output(current)
if current then
for _, functionName in pairs{
"getBreadcrumbName",
"getDataModule",
"canBeEmpty",
"getDescription",
"getParents",
"getChildren",
"getUmbrella",
"getAppendix",
"getTOCTemplateName",
} do
if not is_callable(current[functionName]) then
require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName}
end
end
end
local boxes, display, categories = {}, {}, {}
-- Categories should never show files as a gallery.
insert(categories, "__NOGALLERY__")
if current_frame:getParent():getTitle() == "Template:auto cat" then
insert(categories, "[[Category:Categories calling Template:auto cat]]")
end
-- Check if the category is empty
local totalPages = pages_in_category(current_title.text, "all")
local hugeCategory = totalPages > 1000000 -- 1 million
-- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible.
if hugeCategory then
insert(categories, "[[Category:Huge categories]]")
end
-- Are the parameters valid?
if not current then
-- Signal failure so export.show can try the next handler.
return nil, true
end
-- Does the category have the correct name?
local currentName = current:getCategoryName()
local correctName = current_title.text == currentName
if not correctName then
insert(categories, "[[Category:Categories with incorrect names]]")
insert(display, show_error(
("Based on the data in the category tree, this category should be called '''[[:Category:%s]]'''."):format(currentName),
"This category has an incorrect name."
))
end
-- Add cleanup category for empty categories.
local canBeEmpty = current:canBeEmpty()
if canBeEmpty and correctName then
insert(categories, " __EXPECTUNUSEDCATEGORY__")
elseif totalPages == 0 then
insert(categories, "[[Category:Empty categories]]")
end
if current:isHidden() then
insert(categories, " __HIDDENCAT__")
end
-- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and
-- description can go opposite the float-right stuff without vertical space.
insert(boxes, "<div style=\"float: right;\">")
insert(boxes, show_topright(current))
insert(boxes, show_editlink(current))
insert(boxes, show_related_changes())
-- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above).
if not hugeCategory then
insert(boxes, show_pagelist(current))
end
insert(boxes, "</div>")
-- Generate the displayed information
insert(display, show_breadcrumbs(current))
insert(display, show_also(current))
insert(display, show_description(current))
insert(display, show_appendix(current))
insert(display, show_children(current))
insert(display, show_TOC(current))
insert(display, show_catfix(current))
insert(display, '<br class="clear-both-in-vector-2022-only">')
show_categories(current, categories)
return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "")
end
--[==[
List of handler functions that try to match the page name. A handler should return the name of a submodule to
[[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not
recognize the page name, it should return nil. Note that the order of handlers matters!
]==]
local handlers = {}
-- Thesaurus per-language category
insert(handlers, function(title)
local code, label = title:match("^Thesaurus:(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Topic per-language category
insert(handlers, function(title)
local code, label = title:match("^(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]]
insert(handlers, function(title, args)
local lect = args.lect or args.dialect
if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]].
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end
end)
-- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]]
insert(handlers, function(title, args)
local lang, label = export.split_lang_label(title)
if not lang then
return
end
local baseLabel, script = label:match("(.+) in (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(script)
if scriptObj then
return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args}
end
end
return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args}
end)
-- poscatboiler label umbrella category
insert(handlers, function(title, args)
local label = title:match("(.+) by language$")
if label then
-- The poscatboiler code will appropriately lowercase if needed.
return poscatboiler_subsystem, {label = label, args = args}
end
end)
-- poscatboiler raw handlers
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end)
-- poscatboiler umbrella handlers without 'by language'
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args}
end)
function export.show(frame)
local args, other_args = require("Module:parameters").process(frame:getParent().args, {
["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14}
}, true)
if args.also then
for k, arg in next, args.also do
args.also[k] = arg.prefixedText
end
end
for k, arg in next, other_args do
other_args[k] = trim(arg)
end
if namespace == 10 then -- Template
return "(This template should be used on pages in the [[Help:Namespaces#Category|Category:]] namespace.)"
elseif namespace ~= 14 then -- Category
error("This template/module can only be used on pages in the [[mw:Help:Namespaces#Category|Category:]] namespace.")
end
local saw_tree_lookup_failure = false
local failure_consumed_args = false
-- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil,
-- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but
-- even then, that template might return an error, and we need to consider the next handler. This happens, for
-- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler
-- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and
-- previously, this blocked further handler consideration, but now we check for the error and continue checking
-- handlers; eventually, the topic umbrella handler will fire and correctly handle the category.
for _, handler in ipairs(handlers) do
-- Use a new title object and args table for each handler, to keep them isolated.
local submodule, info = handler(current_title.text, deep_copy(other_args))
if submodule then
info.also = deep_copy(args.also)
require("Module:debug").track("auto cat/" .. submodule)
-- `failed` is true if no match was found in the category tree.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
saw_tree_lookup_failure = true
failure_consumed_args = failure_consumed_args or not not info.args
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- No handler produced a valid category-tree match.
-- Preserve previous behavior: if no failing handler consumed args, surface extra-arg errors first.
if saw_tree_lookup_failure and not failure_consumed_args and next(other_args) then
error(extra_args_error)
end
error_not_in_category_tree()
end
-- TODO: new test entrypoint.
return export
2j1h1hc4wshkuoyhq2spiqve0rxq47i
88356
88355
2026-07-27T00:10:19Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree]]
88355
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local category_tree_submodule_prefix = "Module:category tree/"
local category_tree_styles_css = "Module:category tree/styles.css"
local m_str_utils = require("Module:string utilities")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local ceil = math.ceil
local class_else_type = m_template_parser.class_else_type
local concat = table.concat
local deep_copy = require("Module:table").deepCopy
local full_url = mw.uri.fullUrl
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local log10 = math.log10 or require("Module:math").log10
local new_title = mw.title.new
local pages_in_category = mw.site.stats.pagesInCategory
local parse = m_template_parser.parse
local remove_comments = require("Module:string/removeComments")
local sort = table.sort
local split = m_str_utils.split
local string_compare = require("Module:string/compare")
local trim = m_str_utils.trim
local uupper = m_str_utils.upper
local yesno = require("Module:yesno")
local current_frame = mw.getCurrentFrame()
local current_title = mw.title.getCurrentTitle()
local namespace = current_title.namespace
local poscatboiler_subsystem = "poscatboiler"
local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category."
-- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages.
function export.numeral_sortkey(n, max_n)
max_n = max_n or require("Module:list of languages").count()
return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n)
end
function export.split_lang_label(title_text)
local getByCanonicalName = require("Module:languages").getByCanonicalName
-- Progressively remove a word from the potential canonical name until it
-- matches an actual canonical name.
local words = split(title_text, " ", true)
for i = #words - 1, 1, -1 do
local lang = getByCanonicalName(concat(words, " ", 1, i))
if lang then
return lang, concat(words, " ", i + 1)
end
end
return nil, title_text
end
local function show_error(text, title)
return require("Module:message box").maintenance(
"red",
"[[File:Codex icon Alert red.svg|40px|alt=alert]]",
title or "This category is not defined in Wiktionary's category tree.",
text
)
end
local function error_not_in_category_tree()
error(
"This category is not defined in Wiktionary's category tree. "
.. "Double-check the category name for typos. "
.. "Search existing categories or request definition at [[Wiktionary:Category and label treatment requests|WT:CLTR]]. "
.. "Affected category: " .. current_title.fullText,
2
)
end
-- Show the text that goes at the very top right of the page.
local function show_topright(current)
return current.getTopright and current:getTopright() or nil
end
local function link_box(content)
return ("<div class=\"noprint plainlinks\" style=\"float: right; clear: both; margin: 0 0 .5em 1em; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content)
end
local function show_editlink(current)
return link_box(("[%s Edit category data]"):format(tostring(full_url(current:getDataModule(), "action=edit"))))
end
function show_related_changes()
local title = current_title.fullText
return link_box(("[%s <span title=\"Recent edits and other changes to pages in %s\">Recent changes</span>]"):format(
tostring(full_url("Special:RecentChangesLinked", {
target = title,
showlinkedto = 0,
})),
title
))
end
local function show_pagelist(current)
local namespace = "namespace="
local info = current:getInfo()
local lang_code = info.code
if info.label == "citations" or info.label == "citations of undefined terms" then
namespace = namespace .. "Citations"
elseif lang_code then
local lang = require("Module:languages").getByCode(lang_code, true, true)
if lang then
-- Proto-Norse (gmq-pro) is probably the only language with a code ending in -pro
-- that's intended to have mostly non-reconstructed entries.
if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then
namespace = namespace .. "Reconstruction"
elseif lang:hasType("appendix-constructed") then
namespace = namespace .. "Appendix"
end
end
elseif info.label:match("templates") then
namespace = namespace .. "Template"
elseif info.label:match("modules") then
namespace = namespace .. "Module"
elseif info.label:match("^Wiktionary") or info.label:match("^Pages") then
namespace = ""
end
return ([=[
{| id="newest-and-oldest-pages" class="wikitable mw-collapsible" style="float: right; clear: both; margin: 0 0 .5em 1em;"
! Newest and oldest pages
|-
| id="recent-additions" style="font-size:0.9em;" | '''Newest pages ordered by last [[mw:Manual:Categorylinks table#cl_timestamp|category link update]]:'''
%s
|-
| id="oldest-pages" style="font-size:0.9em;" | '''Oldest pages ordered by last edit:'''
%s
|}]=]):format(
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=categoryadd
order=descending]=]
):format(current_title.text, namespace)
),
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=lastedit
order=ascending]=]
):format(current_title.text, namespace)
)
)
end
-- Show navigational "breadcrumbs" at the top of the page.
local function show_breadcrumbs(current)
local steps = {}
-- Start at the current label and move our way up the "chain" from child to parent, until we can't go further.
while current do
local category, display_name, nocap
if type(current) == "string" then
category = current
display_name = current:gsub("^Category:", "")
else
if not current.getCategoryName then
error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " ..
mw.dumpObject(current))
end
category = "Category:" .. current:getCategoryName()
display_name, nocap = current:getBreadcrumbName()
end
if not nocap then
display_name = mw.getContentLanguage():ucfirst(display_name)
end
insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name))
-- Move up the "chain" by one level.
if type(current) == "string" then
current = nil
else
current = current:getParents()
end
if current then
current = current[1].name
end
end
local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css)
local ol = mw.html.create("ol")
for i, step in ipairs(steps) do
local li = mw.html.create("li")
if i ~= 1 then
local span = mw.html.create("span")
:attr("aria-hidden", "true")
:addClass("ts-categoryBreadcrumbs-separator")
:wikitext(" » ")
li:node(span)
end
li:wikitext(step)
ol:node(li)
end
return templateStyles .. tostring(mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-categoryBreadcrumbs")
:node(ol))
end
local function show_also(current)
local also = current._info.also
if also and #also > 0 then
return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also))
end
return nil
end
-- Show a short description text for the category.
local function show_description(current)
return current.getDescription and current:getDescription() or nil
end
local function show_appendix(current)
local appendix = current.getAppendix and current:getAppendix()
return appendix and ("For more information, see [[%s]]."):format(appendix) or nil
end
local function sort_children(child1, child2)
return string_compare(uupper(child1.sort), uupper(child2.sort))
end
-- Show a list of child categories.
local function show_children(current)
local children = current.getChildren and current:getChildren() or nil
if not children then
return nil
end
sort(children, sort_children)
local children_list = {}
for _, child in ipairs(children) do
local child_name, child_pagetitle = child.name
if type(child_name) == "string" then
child_pagetitle = child_name
else
child_pagetitle = "Category:" .. child_name:getCategoryName()
end
if new_title(child_pagetitle).exists then
insert(children_list, ("* [[:%s]]: %s"):format(
child_pagetitle,
child.description or
type(child_name) == "string" and child_name:gsub("^Category:", "") .. "." or
child_name:getDescription("child")
))
end
end
return concat(children_list, "\n")
end
-- Show a table of contents with links to each letter in the language's script.
local function show_TOC(current)
local titleText = current_title.text
local inCategoryPages = pages_in_category(titleText, "pages")
local inCategorySubcats = pages_in_category(titleText, "subcats")
local TOC_type
-- Compute type of table of contents required.
if inCategoryPages > 2500 or inCategorySubcats > 2500 then
TOC_type = "full"
elseif inCategoryPages > 200 or inCategorySubcats > 200 then
TOC_type = "normal"
else
-- No (usual) need for a TOC if all pages or subcategories can fit on one page;
-- but allow this to be overridden by a custom TOC handler.
TOC_type = "none"
end
if current.getTOC then
local TOC_text = current:getTOC(TOC_type)
if TOC_text ~= true then
return TOC_text or nil
end
end
if TOC_type ~= "none" then
local templatename = current:getTOCTemplateName()
local TOC_template
if TOC_type == "full" then
-- This category is very large, see if there is a "full" version of the TOC.
local TOC_template_full = new_title(templatename .. "/full")
if TOC_template_full.exists then
TOC_template = TOC_template_full
end
end
if not TOC_template then
local TOC_template_normal = new_title(templatename)
if TOC_template_normal.exists then
TOC_template = TOC_template_normal
end
end
if TOC_template then
return current_frame:expandTemplate{title = TOC_template.text, args = {}}
end
end
return nil
end
-- Show the "catfix" that adds language attributes and script classes to the page.
local function show_catfix(current)
local lang, sc = current:getCatfixInfo()
return lang and m_utilities.catfix(lang, sc) or nil
end
-- Show the parent categories that the current category should be placed in.
local function show_categories(current, categories)
local parents = current.getParents and current:getParents() or nil
if not parents then
return nil
end
for _, parent in ipairs(parents) do
local parent_name = parent.name
local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort
if type(parent_name) == "string" then
insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey))
else
insert(categories, ("[[Category:%s|%s]]"):format(parent_name:getCategoryName(), sortkey))
end
end
-- Also put the category in its corresponding "umbrella" or "by language" category.
local umbrella = current:getUmbrella()
if umbrella then
-- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm.
local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName()
sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey)
if type(umbrella) == "string" then
insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey))
else
insert(categories, ("[[Category:%s|%s]]"):format(umbrella:getCategoryName(), sortkey))
end
end
-- Check for various unwanted parser functions, which should be integrated into the category tree data instead.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
local content = current_title:getContent()
if not content then
-- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page,
-- which is needed by Benwing's create_wanted_categories.py script.
return
end
local defaultsort, displaytitle, page_has_param
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "template" then
local name = node:get_name()
if name == "DEFAULTSORT:" and not defaultsort then
insert(categories, "[[Category:Pages with DEFAULTSORT conflicts]]")
defaultsort = true
elseif name == "DISPLAYTITLE:" and not displaytitle then
insert(categories,"[[Category:Pages with DISPLAYTITLE conflicts]]")
displaytitle = true
end
elseif node_class == "parameter" and not page_has_param then
insert(categories,"[[Category:Pages with raw triple-brace template parameters]]")
page_has_param = true
end
end
-- Check for raw category markup, which should also be integrated into the category tree data.
content = remove_comments(content, "BOTH")
local head = content:find("[[", 1, true)
while head do
local close = content:find("]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = content:find("[[", head + 2, true)
while open and open < close do
head = open
open = content:find("[[", head + 2, true)
end
local cat = content:sub(head + 2, close - 1)
local colon = cat:match("^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
local pipe = cat:find("|", colon + 1, true)
if pipe ~= #cat then
local title = new_title(pipe and cat:sub(1, pipe - 1) or cat)
if title and title.namespace == 14 then
insert(categories,"[[Category:Categories with categories using raw markup]]")
break
end
end
end
head = open
end
end
local function generate_output(current)
if current then
for _, functionName in pairs{
"getBreadcrumbName",
"getDataModule",
"canBeEmpty",
"getDescription",
"getParents",
"getChildren",
"getUmbrella",
"getAppendix",
"getTOCTemplateName",
} do
if not is_callable(current[functionName]) then
require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName}
end
end
end
local boxes, display, categories = {}, {}, {}
-- Categories should never show files as a gallery.
insert(categories, "__NOGALLERY__")
if current_frame:getParent():getTitle() == "Template:auto cat" then
insert(categories, "[[Category:Categories calling Template:auto cat]]")
end
-- Check if the category is empty
local totalPages = pages_in_category(current_title.text, "all")
local hugeCategory = totalPages > 1000000 -- 1 million
-- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible.
if hugeCategory then
insert(categories, "[[Category:Huge categories]]")
end
-- Are the parameters valid?
if not current then
-- Signal failure so export.show can try the next handler.
return nil, true
end
-- Does the category have the correct name?
local currentName = current:getCategoryName()
local correctName = current_title.text == currentName
if not correctName then
insert(categories, "[[Category:Categories with incorrect names]]")
insert(display, show_error(
("Based on the data in the category tree, this category should be called '''[[:Category:%s]]'''."):format(currentName),
"This category has an incorrect name."
))
end
-- Add cleanup category for empty categories.
local canBeEmpty = current:canBeEmpty()
if canBeEmpty and correctName then
insert(categories, " __EXPECTUNUSEDCATEGORY__")
elseif totalPages == 0 then
insert(categories, "[[Category:Empty categories]]")
end
if current:isHidden() then
insert(categories, " __HIDDENCAT__")
end
-- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and
-- description can go opposite the float-right stuff without vertical space.
insert(boxes, "<div style=\"float: right;\">")
insert(boxes, show_topright(current))
insert(boxes, show_editlink(current))
insert(boxes, show_related_changes())
-- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above).
if not hugeCategory then
insert(boxes, show_pagelist(current))
end
insert(boxes, "</div>")
-- Generate the displayed information
insert(display, show_breadcrumbs(current))
insert(display, show_also(current))
insert(display, show_description(current))
insert(display, show_appendix(current))
insert(display, show_children(current))
insert(display, show_TOC(current))
insert(display, show_catfix(current))
insert(display, '<br class="clear-both-in-vector-2022-only">')
show_categories(current, categories)
return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "")
end
--[==[
List of handler functions that try to match the page name. A handler should return the name of a submodule to
[[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not
recognize the page name, it should return nil. Note that the order of handlers matters!
]==]
local handlers = {}
-- Thesaurus per-language category
insert(handlers, function(title)
local code, label = title:match("^Thesaurus:(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Topic per-language category
insert(handlers, function(title)
local code, label = title:match("^(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]]
insert(handlers, function(title, args)
local lect = args.lect or args.dialect
if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]].
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end
end)
-- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]]
insert(handlers, function(title, args)
local lang, label = export.split_lang_label(title)
if not lang then
return
end
local baseLabel, script = label:match("(.+) in (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(script)
if scriptObj then
return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args}
end
end
return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args}
end)
-- poscatboiler label umbrella category
insert(handlers, function(title, args)
local label = title:match("(.+) by language$")
if label then
-- The poscatboiler code will appropriately lowercase if needed.
return poscatboiler_subsystem, {label = label, args = args}
end
end)
-- poscatboiler raw handlers
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end)
-- poscatboiler umbrella handlers without 'by language'
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args}
end)
function export.show(frame)
local args, other_args = require("Module:parameters").process(frame:getParent().args, {
["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14}
}, true)
if args.also then
for k, arg in next, args.also do
args.also[k] = arg.prefixedText
end
end
for k, arg in next, other_args do
other_args[k] = trim(arg)
end
if namespace == 10 then -- Template
return "(This template should be used on pages in the [[Help:Namespaces#Category|Category:]] namespace.)"
elseif namespace ~= 14 then -- Category
error("This template/module can only be used on pages in the [[mw:Help:Namespaces#Category|Category:]] namespace.")
end
local saw_tree_lookup_failure = false
local failure_consumed_args = false
-- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil,
-- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but
-- even then, that template might return an error, and we need to consider the next handler. This happens, for
-- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler
-- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and
-- previously, this blocked further handler consideration, but now we check for the error and continue checking
-- handlers; eventually, the topic umbrella handler will fire and correctly handle the category.
for _, handler in ipairs(handlers) do
-- Use a new title object and args table for each handler, to keep them isolated.
local submodule, info = handler(current_title.text, deep_copy(other_args))
if submodule then
info.also = deep_copy(args.also)
require("Module:debug").track("auto cat/" .. submodule)
-- `failed` is true if no match was found in the category tree.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
saw_tree_lookup_failure = true
failure_consumed_args = failure_consumed_args or not not info.args
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- No handler produced a valid category-tree match.
-- Preserve previous behavior: if no failing handler consumed args, surface extra-arg errors first.
if saw_tree_lookup_failure and not failure_consumed_args and next(other_args) then
error(extra_args_error)
end
error_not_in_category_tree()
end
-- TODO: new test entrypoint.
return export
2j1h1hc4wshkuoyhq2spiqve0rxq47i
Mòideal:category tree/styles.css
828
17708
88357
2025-09-12T10:03:35Z
en>Surjection
0
88357
sanitized-css
text/css
.ts-categoryBreadcrumbs {
display: table;
margin-bottom: 1.5em;
padding-bottom: 0.2em;
border-bottom: 1px solid var(--wikt-palette-lightgrey,#c8ccd1);
font-size: 0.92857143em; /* 13 / 14 */
}
.ts-categoryBreadcrumbs ol {
margin: 0;
padding-left: 0;
list-style: none;
}
.ts-categoryBreadcrumbs li {
display: inline;
margin: 0;
}
.ts-categoryBreadcrumbs a {
white-space: nowrap;
}
.ts-categoryBreadcrumbs-separator {
margin: 0.07692309em; /* 1 / 13 */
color: var(--wikt-palette-dullblue, #49555f);
}
hxmwmpisj7qpf83cb9t2qdigj70czwb
88358
88357
2026-07-27T00:10:41Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/styles.css]]
88357
sanitized-css
text/css
.ts-categoryBreadcrumbs {
display: table;
margin-bottom: 1.5em;
padding-bottom: 0.2em;
border-bottom: 1px solid var(--wikt-palette-lightgrey,#c8ccd1);
font-size: 0.92857143em; /* 13 / 14 */
}
.ts-categoryBreadcrumbs ol {
margin: 0;
padding-left: 0;
list-style: none;
}
.ts-categoryBreadcrumbs li {
display: inline;
margin: 0;
}
.ts-categoryBreadcrumbs a {
white-space: nowrap;
}
.ts-categoryBreadcrumbs-separator {
margin: 0.07692309em; /* 1 / 13 */
color: var(--wikt-palette-dullblue, #49555f);
}
hxmwmpisj7qpf83cb9t2qdigj70czwb
Mòideal:category tree/characters
828
17709
88359
2026-06-05T07:54:47Z
en>Juwan
0
88359
Scribunto
text/plain
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local m_str_utils = require("Module:string utilities")
local insert = table.insert
local ulen = m_str_utils.len
local ulower = m_str_utils.lower
local umatch = m_str_utils.match
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local function track(page)
require("Module:debug/track")("category tree/characters/" .. page)
return true
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by their individual characters subcategories by language"] = {
description = "Umbrella categories covering terms categorized by unusual characters contained in them.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by their individual characters", is_label = true, sort = " "},
},
}
-- FIXME! This should probably be deleted.
raw_categories["Letters"] = {
description = "Categories specifying individual letters, containing the languages that use those letters.",
additional = "{{{umbrella_meta}}}",
parents = {
"Fundamental",
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- If char is a combining character, returns a version with a dotted circle before it.
local function add_dotted_circle(char, combining)
return combining and "◌" .. char or char
end
insert(handlers, function(data)
-- NOTE: The "character" in the title may actually be a description such as
-- "gershayim". In that case, char= is specified as a parameter indicating the
-- actual character.
local titlechar = data.label:match("^terms spelled with (.+)$")
if not titlechar then
return nil
end
local args = require("Module:parameters").process(data.args, {
["char"] = true,
["sort"] = true,
-- Not sure what used to be done with the following parameters.
["context"] = true,
["context2"] = true,
})
if args.context or args.context2 then
track("terms-spelled-with-context")
end
local special_cases = {
numbers = {
sort = "#",
desc = "numeric digits",
},
emoji = {
sort = "⌚", -- the first emoji in our list in [[Module:headword/data]]
},
parentheses = {
sort = "(",
},
["square brackets"] = {
sort = "[",
},
["angle brackets"] = {
sort = "<",
},
braces = {
sort = "{",
},
}
if special_cases[titlechar] then
local sortkey = args.sort or special_cases[titlechar].sort
return {
description = "{{{langname}}} terms spelled with one or more " .. (special_cases[titlechar].desc or titlechar) .. ".",
parents = {{name = "terms by their individual characters", sort = sortkey }},
breadcrumb = titlechar,
umbrella = {
breadcrumb = titlechar,
parents = {{name = "Terms by their individual characters subcategories by language", sort = " " .. sortkey }}
},
}, true
end
local char = args.char or titlechar
local titlechar_is_desc = args.char and args.char ~= titlechar
if titlechar_is_desc then
track("titlechar_is_desc")
end
local lang = data.lang or require("Module:languages").getByCode("mul")
local combining = ulen(char) == 1 and require("Module:Unicode_data").is_combining(char)
local specials = {["ß"] = "ẞ", ["ͅ"] = "ͅ"}
local upper = toNFD(char)
:gsub("[%z\1-\127\194-\244][\128-\191]*", function(m)
return specials[m] or m:uupper()
end)
upper = toNFC(upper)
local standard_chars = lang:getStandardCharacters()
-- FIXME: This should be able to handle non-atomic single characters (e.g. "Q̓").
if char ~= upper and ulen(char) == 1 then
-- We want uppercase characters; but unless we're careful, we run into an issue with
-- [[Category:English terms spelled with ı]] due to the weird behavior of this character,
-- which has standard "I" as its uppercase equivalent.
if standard_chars then
local function err()
error("Category titles should use uppercase characters: '" .. data.label .. "'", 2)
end
if lang:getCode() ~= "hi" and lang:getCode() ~= "lo" then
if not umatch(standard_chars, upper) then
err()
end
elseif not umatch(upper, "[" .. standard_chars .. "]") then
err()
end
end
end
-- Compute description.
local is_reconstructed = lang:hasType("reconstructed")
local character = require("Module:links").full_link(
{
term = is_reconstructed and "" or char,
alt = combining and add_dotted_circle(char, true) or is_reconstructed and "*" .. char or nil,
lang = lang,
tr = combining and "-" or nil,
},
"term"
)
-- If the letter has a lowercase form that's also not in the standard characters,
-- show it. This time, it's [[Category:English terms spelled with İ]] that causes
-- issues, because the lowercase equivalent is standard "i".
-- Note that ulower("İ") has a bug where it outputs "i" with a combining dot, instead
-- of plain "i", so this has to be accounted for.
local lower = ulower(char:gsub("İ", "I"))
if lower ~= char and not (standard_chars and umatch(lower, "[" .. standard_chars .. "]")) then
character = "upper case " .. character .. " or lower case " ..
require("Module:links").full_link(
{
term = is_reconstructed and "" or lower,
alt = is_reconstructed and "*" .. lower or nil,
lang = lang
},
"term"
)
end
if titlechar_is_desc then
character = character .. " (" .. titlechar .. ")"
end
local description = "{{{langname}}} terms spelled with " .. character .. "."
-- Set tagged character for displaytitle and breadcrumb.
local tagged_titlechar = not titlechar_is_desc and
require("Module:script utilities").tag_text(titlechar, lang, nil, "term") or nil
local tagged_char = titlechar_is_desc and titlechar or
require("Module:script utilities").tag_text(add_dotted_circle(char, combining), lang, nil, "term")
local han = umatch(char, "^[" .. require("Module:scripts").getByCode("Hani").characters .. "]+$")
-- Make the sortkey. Always use Hani-sortkey for Han characters, as this circumvents any reading-based sortkey methods.
local sortkey = args.sort or han and require("Module:Hani-sortkey").makeSortKey(char) or lang:makeSortKey(char)
-- Use the char as a fallback.
if sortkey == "" then
sortkey = char
end
return {
description = description,
-- The following doesn't apply to Sinitic or Japonic, where we categorize all characters.
additional = (
not lang:inFamily("zhx", "jpx")
and "Note that categories of the form '''''LANG terms spelled with CHAR''''' are intended for characters not part of the standard repertoire of a language (e.g. Cyrillic characters in English or Latin characters in Russian)."
or nil
),
displaytitle = (
not titlechar_is_desc
and "{{{langname}}} terms spelled with " .. tagged_titlechar
or nil
),
parents = {{
name = "terms by their individual characters",
sort = sortkey
}},
breadcrumb = tagged_char,
umbrella = {
displaytitle = (
not titlechar_is_desc
and "Terms spelled with " .. tagged_titlechar .. " by language"
or nil
),
breadcrumb = tagged_char,
parents = {{
name = "Terms by their individual characters subcategories by language",
sort = " " .. sortkey
}}
},
}, true
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Special-cased categories that we allow, for Turkish letters.
local letter_cat_allow_list = require("Module:table").listToSet {
"İi",
}
insert(raw_handlers, function(data)
-- Only recognize cases consisting of an uppercase letter followed by the
-- corresponding lowercase letter, either as the entire category name or
-- followed by a colon (for cases like [[Category:Gg: ⠛]]). Cases that
-- don't fit this profile (e.g. for Turkish [[Category:İi]] and
-- [[Category:Iı]]) need to call {{letter cat}} directly. Formerly this
-- handler was much less restrictive and would fire on categories named
-- [[Category:zh:]], [[Category:RFQ]], etc.
local upper, lower = umatch(data.category, "^(%u)(%l)%f[:%z]")
if not upper or not letter_cat_allow_list[data.category] and lower:uupper() ~= upper then
return nil
end
return {
description = ('Languages that use the uppercase letter "%s" (lowercase equivalent "%s").'):format(upper, lower),
parents = {"Letters"},
}
end)
return {RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
9b7ezu0bllyewvseuybwrn59lj732nk
88360
88359
2026-07-27T00:11:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/characters]]
88359
Scribunto
text/plain
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local m_str_utils = require("Module:string utilities")
local insert = table.insert
local ulen = m_str_utils.len
local ulower = m_str_utils.lower
local umatch = m_str_utils.match
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local function track(page)
require("Module:debug/track")("category tree/characters/" .. page)
return true
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by their individual characters subcategories by language"] = {
description = "Umbrella categories covering terms categorized by unusual characters contained in them.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by their individual characters", is_label = true, sort = " "},
},
}
-- FIXME! This should probably be deleted.
raw_categories["Letters"] = {
description = "Categories specifying individual letters, containing the languages that use those letters.",
additional = "{{{umbrella_meta}}}",
parents = {
"Fundamental",
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- If char is a combining character, returns a version with a dotted circle before it.
local function add_dotted_circle(char, combining)
return combining and "◌" .. char or char
end
insert(handlers, function(data)
-- NOTE: The "character" in the title may actually be a description such as
-- "gershayim". In that case, char= is specified as a parameter indicating the
-- actual character.
local titlechar = data.label:match("^terms spelled with (.+)$")
if not titlechar then
return nil
end
local args = require("Module:parameters").process(data.args, {
["char"] = true,
["sort"] = true,
-- Not sure what used to be done with the following parameters.
["context"] = true,
["context2"] = true,
})
if args.context or args.context2 then
track("terms-spelled-with-context")
end
local special_cases = {
numbers = {
sort = "#",
desc = "numeric digits",
},
emoji = {
sort = "⌚", -- the first emoji in our list in [[Module:headword/data]]
},
parentheses = {
sort = "(",
},
["square brackets"] = {
sort = "[",
},
["angle brackets"] = {
sort = "<",
},
braces = {
sort = "{",
},
}
if special_cases[titlechar] then
local sortkey = args.sort or special_cases[titlechar].sort
return {
description = "{{{langname}}} terms spelled with one or more " .. (special_cases[titlechar].desc or titlechar) .. ".",
parents = {{name = "terms by their individual characters", sort = sortkey }},
breadcrumb = titlechar,
umbrella = {
breadcrumb = titlechar,
parents = {{name = "Terms by their individual characters subcategories by language", sort = " " .. sortkey }}
},
}, true
end
local char = args.char or titlechar
local titlechar_is_desc = args.char and args.char ~= titlechar
if titlechar_is_desc then
track("titlechar_is_desc")
end
local lang = data.lang or require("Module:languages").getByCode("mul")
local combining = ulen(char) == 1 and require("Module:Unicode_data").is_combining(char)
local specials = {["ß"] = "ẞ", ["ͅ"] = "ͅ"}
local upper = toNFD(char)
:gsub("[%z\1-\127\194-\244][\128-\191]*", function(m)
return specials[m] or m:uupper()
end)
upper = toNFC(upper)
local standard_chars = lang:getStandardCharacters()
-- FIXME: This should be able to handle non-atomic single characters (e.g. "Q̓").
if char ~= upper and ulen(char) == 1 then
-- We want uppercase characters; but unless we're careful, we run into an issue with
-- [[Category:English terms spelled with ı]] due to the weird behavior of this character,
-- which has standard "I" as its uppercase equivalent.
if standard_chars then
local function err()
error("Category titles should use uppercase characters: '" .. data.label .. "'", 2)
end
if lang:getCode() ~= "hi" and lang:getCode() ~= "lo" then
if not umatch(standard_chars, upper) then
err()
end
elseif not umatch(upper, "[" .. standard_chars .. "]") then
err()
end
end
end
-- Compute description.
local is_reconstructed = lang:hasType("reconstructed")
local character = require("Module:links").full_link(
{
term = is_reconstructed and "" or char,
alt = combining and add_dotted_circle(char, true) or is_reconstructed and "*" .. char or nil,
lang = lang,
tr = combining and "-" or nil,
},
"term"
)
-- If the letter has a lowercase form that's also not in the standard characters,
-- show it. This time, it's [[Category:English terms spelled with İ]] that causes
-- issues, because the lowercase equivalent is standard "i".
-- Note that ulower("İ") has a bug where it outputs "i" with a combining dot, instead
-- of plain "i", so this has to be accounted for.
local lower = ulower(char:gsub("İ", "I"))
if lower ~= char and not (standard_chars and umatch(lower, "[" .. standard_chars .. "]")) then
character = "upper case " .. character .. " or lower case " ..
require("Module:links").full_link(
{
term = is_reconstructed and "" or lower,
alt = is_reconstructed and "*" .. lower or nil,
lang = lang
},
"term"
)
end
if titlechar_is_desc then
character = character .. " (" .. titlechar .. ")"
end
local description = "{{{langname}}} terms spelled with " .. character .. "."
-- Set tagged character for displaytitle and breadcrumb.
local tagged_titlechar = not titlechar_is_desc and
require("Module:script utilities").tag_text(titlechar, lang, nil, "term") or nil
local tagged_char = titlechar_is_desc and titlechar or
require("Module:script utilities").tag_text(add_dotted_circle(char, combining), lang, nil, "term")
local han = umatch(char, "^[" .. require("Module:scripts").getByCode("Hani").characters .. "]+$")
-- Make the sortkey. Always use Hani-sortkey for Han characters, as this circumvents any reading-based sortkey methods.
local sortkey = args.sort or han and require("Module:Hani-sortkey").makeSortKey(char) or lang:makeSortKey(char)
-- Use the char as a fallback.
if sortkey == "" then
sortkey = char
end
return {
description = description,
-- The following doesn't apply to Sinitic or Japonic, where we categorize all characters.
additional = (
not lang:inFamily("zhx", "jpx")
and "Note that categories of the form '''''LANG terms spelled with CHAR''''' are intended for characters not part of the standard repertoire of a language (e.g. Cyrillic characters in English or Latin characters in Russian)."
or nil
),
displaytitle = (
not titlechar_is_desc
and "{{{langname}}} terms spelled with " .. tagged_titlechar
or nil
),
parents = {{
name = "terms by their individual characters",
sort = sortkey
}},
breadcrumb = tagged_char,
umbrella = {
displaytitle = (
not titlechar_is_desc
and "Terms spelled with " .. tagged_titlechar .. " by language"
or nil
),
breadcrumb = tagged_char,
parents = {{
name = "Terms by their individual characters subcategories by language",
sort = " " .. sortkey
}}
},
}, true
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Special-cased categories that we allow, for Turkish letters.
local letter_cat_allow_list = require("Module:table").listToSet {
"İi",
}
insert(raw_handlers, function(data)
-- Only recognize cases consisting of an uppercase letter followed by the
-- corresponding lowercase letter, either as the entire category name or
-- followed by a colon (for cases like [[Category:Gg: ⠛]]). Cases that
-- don't fit this profile (e.g. for Turkish [[Category:İi]] and
-- [[Category:Iı]]) need to call {{letter cat}} directly. Formerly this
-- handler was much less restrictive and would fire on categories named
-- [[Category:zh:]], [[Category:RFQ]], etc.
local upper, lower = umatch(data.category, "^(%u)(%l)%f[:%z]")
if not upper or not letter_cat_allow_list[data.category] and lower:uupper() ~= upper then
return nil
end
return {
description = ('Languages that use the uppercase letter "%s" (lowercase equivalent "%s").'):format(upper, lower),
parents = {"Letters"},
}
end)
return {RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
9b7ezu0bllyewvseuybwrn59lj732nk
Mòideal:category tree/data
828
17710
88361
2026-05-30T20:34:39Z
en>Fenakhay
0
88361
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local subpages = {
-- It should not matter much what order we do the handlers in, but topic handling historically
-- preceded "poscatboiler" handling (i.e. everything else), so keep it that way for the moment.
"topic",
"affixes and compounds",
"characters",
"entry maintenance",
"etymology",
"families",
"figures of speech",
"grammatical classes",
"lang-specific-raw",
"languages",
"lects",
"lemmas",
"lexical properties",
"miscellaneous",
"modules",
"names",
"non-lemma forms",
"phrases",
"pragmatic properties",
"rhymes",
"scripts",
"semantic classes",
"shortenings",
"speech acts",
"symbols",
"templates",
"terms by script",
"transliterations",
"unicode",
"wiktionary maintenance",
"wiktionary users",
"wiktionary votes",
"word of the day",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "Module:category tree/" .. subpage
local retval = require(datamodule)
if retval["LABELS"] then
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
error("Label " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. labels[label].module .. "]].")
end
data.module = datamodule
labels[label] = data
end
end
if retval["RAW_CATEGORIES"] then
for category, data in pairs(retval["RAW_CATEGORIES"]) do
if raw_categories[category] and not retval["IGNOREDUP"] then
error("Raw category " .. category .. " defined in both [["
.. datamodule .. "]] and [[" .. raw_categories[category].module .. "]].")
end
data.module = datamodule
raw_categories[category] = data
end
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
if retval["RAW_HANDLERS"] then
for _, handler in ipairs(retval["RAW_HANDLERS"]) do
table.insert(raw_handlers, { module = datamodule, handler = handler })
end
end
end
-- Add child categories to their parents
local function add_children_to_parents(hierarchy, raw)
for key, data in pairs(hierarchy) do
local parents = data.parents
if parents then
if type(parents) ~= "table" then
parents = {parents}
end
if parents.name or parents.module then
parents = {parents}
end
for _, parent in ipairs(parents) do
if type(parent) ~= "table" or not parent.name and not parent.module then
parent = {name = parent}
end
if parent.name and not parent.module and type(parent.name) == "string" and not parent.name:find("^Category:") then
local parent_is_raw
if raw then
parent_is_raw = not parent.is_label
else
parent_is_raw = parent.raw
end
-- Don't do anything if the child is raw and the parent is lang-specific, otherwise e.g.
-- "Lemmas subcategories by language" will be listed as a child of every "LANG lemmas" category.
-- FIXME: We need to rethink this mechanism.
if not raw or parent_is_raw then
local child_hierarchy = parent_is_raw and raw_categories or labels
if child_hierarchy[parent.name] then
local child = {name = key, sort = parent.sort, raw = raw}
if child_hierarchy[parent.name].children then
table.insert(child_hierarchy[parent.name].children, child)
else
child_hierarchy[parent.name].children = {child}
end
end
end
end
end
end
end
end
add_children_to_parents(labels)
add_children_to_parents(raw_categories, true)
return {
LABELS = labels, RAW_CATEGORIES = raw_categories,
HANDLERS = handlers, RAW_HANDLERS = raw_handlers
}
pqzv4uw1m490ils7gqcdj2qwi5d3e27
88362
88361
2026-07-27T00:11:39Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/data]]
88361
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local subpages = {
-- It should not matter much what order we do the handlers in, but topic handling historically
-- preceded "poscatboiler" handling (i.e. everything else), so keep it that way for the moment.
"topic",
"affixes and compounds",
"characters",
"entry maintenance",
"etymology",
"families",
"figures of speech",
"grammatical classes",
"lang-specific-raw",
"languages",
"lects",
"lemmas",
"lexical properties",
"miscellaneous",
"modules",
"names",
"non-lemma forms",
"phrases",
"pragmatic properties",
"rhymes",
"scripts",
"semantic classes",
"shortenings",
"speech acts",
"symbols",
"templates",
"terms by script",
"transliterations",
"unicode",
"wiktionary maintenance",
"wiktionary users",
"wiktionary votes",
"word of the day",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "Module:category tree/" .. subpage
local retval = require(datamodule)
if retval["LABELS"] then
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
error("Label " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. labels[label].module .. "]].")
end
data.module = datamodule
labels[label] = data
end
end
if retval["RAW_CATEGORIES"] then
for category, data in pairs(retval["RAW_CATEGORIES"]) do
if raw_categories[category] and not retval["IGNOREDUP"] then
error("Raw category " .. category .. " defined in both [["
.. datamodule .. "]] and [[" .. raw_categories[category].module .. "]].")
end
data.module = datamodule
raw_categories[category] = data
end
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
if retval["RAW_HANDLERS"] then
for _, handler in ipairs(retval["RAW_HANDLERS"]) do
table.insert(raw_handlers, { module = datamodule, handler = handler })
end
end
end
-- Add child categories to their parents
local function add_children_to_parents(hierarchy, raw)
for key, data in pairs(hierarchy) do
local parents = data.parents
if parents then
if type(parents) ~= "table" then
parents = {parents}
end
if parents.name or parents.module then
parents = {parents}
end
for _, parent in ipairs(parents) do
if type(parent) ~= "table" or not parent.name and not parent.module then
parent = {name = parent}
end
if parent.name and not parent.module and type(parent.name) == "string" and not parent.name:find("^Category:") then
local parent_is_raw
if raw then
parent_is_raw = not parent.is_label
else
parent_is_raw = parent.raw
end
-- Don't do anything if the child is raw and the parent is lang-specific, otherwise e.g.
-- "Lemmas subcategories by language" will be listed as a child of every "LANG lemmas" category.
-- FIXME: We need to rethink this mechanism.
if not raw or parent_is_raw then
local child_hierarchy = parent_is_raw and raw_categories or labels
if child_hierarchy[parent.name] then
local child = {name = key, sort = parent.sort, raw = raw}
if child_hierarchy[parent.name].children then
table.insert(child_hierarchy[parent.name].children, child)
else
child_hierarchy[parent.name].children = {child}
end
end
end
end
end
end
end
end
add_children_to_parents(labels)
add_children_to_parents(raw_categories, true)
return {
LABELS = labels, RAW_CATEGORIES = raw_categories,
HANDLERS = handlers, RAW_HANDLERS = raw_handlers
}
pqzv4uw1m490ils7gqcdj2qwi5d3e27
Mòideal:category tree/etymology
828
17711
88363
2026-04-19T20:23:31Z
en>Fenakhay
0
88363
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local en_utilities_module = "Module:en-utilities"
local m_str_utils = require("Module:string utilities")
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local full_link = require("Module:links").full_link
local get_lang_by_name = require("Module:languages").getByCanonicalName
local insert = table.insert
local pattern_escape = m_str_utils.pattern_escape
local plain_gsub = m_str_utils.plain_gsub
local pluralize_pos = require("Module:headword").pluralize_pos
local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma
local serial_comma_join = require("Module:table").serialCommaJoin
local tag_text = require("Module:script utilities").tag_text
local umatch = mw.ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by etymology"] = {
description = "{{{langname}}} terms categorized by their etymologies.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["AABB-type reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.",
breadcrumb = "AABB-type",
parents = {"reduplications"},
}
labels["apophonic reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.",
breadcrumb = "apophonic",
parents = {"reduplications"},
}
labels["back-formations"] = {
description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.",
parents = {"terms by etymology"},
}
labels["blends"] = {
description = "{{{langname}}} terms formed by combinations of other words.",
parents = {"terms by etymology"},
}
labels["borrowed terms"] = {
description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.",
parents = {"terms by etymology"},
}
labels["catachreses"] = {
description = "{{{langname}}} terms derived from misuses or misapplications of other terms.",
parents = {"terms by etymology"},
}
labels["coinages"] = {
description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.",
parents = {"terms attributed to a specific source"},
umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "},
}
labels["coordinated pairs"] = {
description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].",
parents = {"terms by etymology"},
}
labels["coordinated triples"] = {
description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quadruples"] = {
description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quintuples"] = {
description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["denominals"] = {
description = "{{{langname}}} terms derived from a noun.",
parents = {"terms by etymology"},
}
labels["deverbals"] = {
description = "{{{langname}}} terms derived from a verb.",
parents = {"terms by etymology"},
}
labels["doublets"] = {
description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.",
parents = {"terms by etymology"},
}
labels["elongated forms"] = {
description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.",
parents = {"terms by etymology"},
}
labels["eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious individuals.",
parents = {"terms by etymology"},
}
labels["genericized trademarks"] = {
description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.",
parents = {"terms by etymology", "trademarks"},
}
labels["ghost words"] = {
description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.",
parents = {"terms by etymology"},
}
labels["gramograms"] = {
description = "{{{langname}}} [[gramogram]]s – terms that are partially or completely spelled with [[homophone|homophonous]] letters.",
parents = {"rebuses"},
}
labels["haplological words"] = {
description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.",
parents = {"terms by etymology"},
}
labels["homophonic translations"] = {
description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].",
parents = {"terms by etymology"}
}
labels["hybridisms"] = {
description = "{{{langname}}} terms formed by elements of different linguistic origins.",
parents = {"terms by etymology"},
}
labels["inherited terms"] = {
description = "{{{langname}}} terms that were inherited from an earlier stage of the language.",
parents = {"terms by etymology"},
}
labels["internationalisms"] = {
description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.",
additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.",
parents = {"terms by etymology"},
}
labels["legal doublets"] = {
description = "{{{langname}}} legal [[doublet]]s – a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.",
parents = {"coordinated pairs"},
}
labels["legal triplets"] = {
description = "{{{langname}}} legal [[triplet]]s – a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.",
parents = {"coordinated triples"},
}
labels["LLM coinages"] = {
description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.",
parents = {"terms by etymology"},
}
labels["merisms"] = {
description = "{{{langname}}} [[merism]]s – terms that are [[coordinate]]s that, combined, are a synonym for a totality.",
parents = {"coordinated pairs"},
}
labels["metonyms"] = {
description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.",
parents = {"terms by etymology"},
}
labels["neologisms"] = {
description = "{{{langname}}} terms that have been only recently acknowledged.",
parents = {"terms by etymology"},
}
labels["nominalizations"] = {
description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.",
parents = {"terms by etymology"},
}
labels["nonce terms"] = {
description = "{{{langname}}} terms that have been invented for a single occasion.",
parents = {"terms by etymology"},
}
labels["number homophones"] = {
description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.",
parents = {"rebuses", "terms spelled with numbers"},
}
labels["numerical contractions"] = {
description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).",
parents = {"contractions", "rebuses", "terms spelled with numbers"},
}
labels["onomatopoeias"] = {
description = "{{{langname}}} terms that were coined to sound like what they represent.",
parents = {"terms by etymology"},
}
labels["piecewise doublets"] = {
description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].",
parents = {"terms by etymology"},
}
for _, ism_and_langname in ipairs({
{"anglicisms", "English"},
{"Arabisms", "Arabic"},
{"Gallicisms", "French"},
{"Germanisms", "German"},
{"Hispanisms", "Spanish"},
{"Italianisms", "Italian"},
{"Latinisms", "Latin"},
{"Japonisms", "Japanese"},
}) do
local ism, langname = unpack(ism_and_langname)
labels["pseudo-" .. ism] = {
description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.",
parents = {"pseudo-loans"},
umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "},
}
end
labels["rebracketings"] = {
description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.",
parents = {"terms by etymology"}
}
labels["rebuses"] = {
description = "{{{langname}}} [[rebus]]es – terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.",
parents = {"terms by etymology"},
}
labels["reconstructed terms"] = {
description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.",
parents = {"terms by etymology"}
}
labels["reduplicated coordinated pairs"] = {
description = "{{{langname}}} reduplicated coordinated pairs.",
breadcrumb = "reduplicated",
parents = {"coordinated pairs", "reduplications"},
}
labels["reduplicated coordinated triples"] = {
description = "{{{langname}}} reduplicated coordinated triples.",
breadcrumb = "reduplicated",
parents = {"coordinated triples", "reduplications"},
}
labels["reduplicated coordinated quadruples"] = {
description = "{{{langname}}} reduplicated coordinated quadruples.",
breadcrumb = "reduplicated",
parents = {"coordinated quadruples", "reduplications"},
}
labels["reduplicated coordinated quintuples"] = {
description = "{{{langname}}} reduplicated coordinated quintuples.",
breadcrumb = "reduplicated",
parents = {"coordinated quintuples", "reduplications"},
}
labels["reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.",
parents = {"terms by etymology"},
}
labels["retronyms"] = {
description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.",
parents = {"terms by etymology"},
}
labels["roots"] = {
description = "Basic morphemes from which {{{langname}}} words are formed.",
parents = {"terms by etymology", "morphemes"},
}
labels["Sanskritic formations"] = {
description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.",
parents = {"terms by etymology", "terms derived from Sanskrit"},
}
labels["sound-symbolic terms"] = {
description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].",
parents = {"terms by etymology"},
}
labels["spelled-out initialisms"] = {
description = "{{{langname}}} initialisms in which the letter names are spelled out.",
parents = {"terms by etymology"},
}
labels["spelling pronunciations"] = {
description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.",
parents = {"terms by etymology"},
}
labels["spoonerisms"] = {
description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".",
parents = {"terms by etymology"},
}
labels["taxonomic eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].",
parents = {"eponyms"},
}
labels["terms attributed to a specific source"] = {
description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.",
parents = {"terms by etymology"},
}
labels["terms coined ex nihilo"] = {
description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.",
parents = {"terms by etymology"},
}
labels["terms containing fossilized case endings"] = {
description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.",
parents = {"terms by etymology"},
}
labels["terms derived from area codes"] = {
description = "{{{langname}}} terms derived from [[area code]]s.",
parents = {"terms by etymology"},
}
labels["terms derived from the shape of letters"] = {
description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.",
parents = {"terms by etymology"},
}
labels["terms by root"] = {
description = "{{{langname}}} terms categorized by the root they originate from.",
parents = {"terms by etymology", {name = "roots", sort = " "}},
}
labels["terms by word"] = {
description = "{{{langname}}} terms categorized by the word they originate from.",
parents = {"terms by etymology"},
}
labels["terms derived from fiction"] = {
description = "{{{langname}}} terms that originate from works of [[fiction]].",
breadcrumb = "fiction",
parents = {{name = "terms attributed to a specific source", sort = "fiction"}},
}
for _, data in ipairs {
{source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"},
{source="DC Comics", desc="[[w:DC Comics|DC Comics]]"},
{source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"},
{source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"},
{source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe",
topic_parent="Disney"},
{source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"},
{source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''",
topic_parent="Harry Potter"},
{source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"},
{source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''",
displaytitle="''Nineteen Eighty-Four''"},
{source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"},
{source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"},
{source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"},
{source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"},
{source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"},
{source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"},
{source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"},
} do
local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}}
local umbrella_parents = {"Terms by etymology subcategories by language"}
if data.topic_parent then
insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true})
insert(umbrella_parents, {name = data.topic_parent, raw = true})
end
labels["terms derived from " .. data.source] = {
description = "{{{langname}}} terms that originate from " .. data.desc .. ".",
breadcrumb = data.displaytitle or data.source,
parents = parents,
umbrella = {
parents = umbrella_parents,
displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil,
breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle,
},
displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil,
}
end
labels["terms derived from Greek mythology"] = {
description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.",
breadcrumb = "Greek mythology",
parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}},
}
labels["terms derived from occupations"] = {
description = "{{{langname}}} terms derived from names of occupations.",
parents = {"terms by etymology"},
}
labels["terms derived from other languages"] = {
description = "{{{langname}}} terms that originate from other languages.",
parents = {"terms by etymology"},
}
labels["terms derived from the Bible"] = {
description = "{{{langname}}} terms that originate from the [[Bible]].",
breadcrumb = {name = "the Bible", nocap = true},
parents = {{name = "terms attributed to a specific source", sort = "Bible"}},
}
labels["terms derived from Aesop's Fables"] = {
description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.",
breadcrumb = "Aesop's Fables",
parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}},
}
labels["terms derived from toponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious places.",
parents = {"terms by etymology"},
}
labels["terms derived through romanized wordplay"] = {
description = "{{{langname}}} terms derived through romanized wordplay.",
parents = {"terms by etymology"},
}
labels["terms making reference to character shapes"] = {
description = "{{{langname}}} terms making reference to character shapes.",
parents = {"terms by etymology"},
}
labels["terms derived from sports"] = {
description = "{{{langname}}} terms that originate from sports.",
breadcrumb = "sports",
parents = {{name = "terms attributed to a specific source", sort = "sports"}},
}
labels["terms derived from baseball"] = {
description = "{{{langname}}} terms that originate from baseball.",
breadcrumb = "baseball",
parents = {{name = "terms derived from sports", sort = "baseball"}},
}
labels["terms with Indo-Aryan extensions"] = {
description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
parents = {"terms by etymology"},
}
labels["terms with lemma and non-lemma form etymologies"] = {
description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.",
breadcrumb = "lemma and non-lemma form",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple etymologies"] = {
description = "{{{langname}}} terms that are derived from multiple origins.",
parents = {"terms by etymology"},
}
labels["terms with multiple lemma etymologies"] = {
description = "{{{langname}}} lemmas that are derived from multiple origins.",
breadcrumb = "multiple lemmas",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple non-lemma form etymologies"] = {
description = "{{{langname}}} non-lemma forms that are derived from multiple origins.",
breadcrumb = "multiple non-lemma forms",
parents = {"terms with multiple etymologies"},
}
labels["terms with unknown etymologies"] = {
description = "{{{langname}}} terms whose etymologies have not yet been established.",
parents = {{name = "terms by etymology", sort = "unknown etymology"}},
}
labels["univerbations"] = {
description = "{{{langname}}} terms that result from the agglutination of two or more words.",
parents = {"terms by etymology"},
}
labels["words derived through corruption"] = {
description = "{{{langname}}} words that result from a non-specific or sporadic change.",
parents = {{name = "terms by etymology", sort = "corruption"}},
}
labels["words derived through metathesis"] = {
description = "{{{langname}}} words that were created through [[metathesis]] from another word.",
parents = {{name = "terms by etymology", sort = "metathesis"}},
}
labels["words that have undergone semantic shift"] = {
description = "{{{langname}}} words that show senses explained by [[semantic shift]].",
parents = {{name = "terms by etymology", sort = "semantic shift"}},
}
labels["words that have undergone semantic broadening"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}},
}
labels["words that have undergone semantic narrowing"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}},
}
labels["words that have undergone amelioration"] = {
description = "{{{langname}}} words that have gained a positive [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}},
}
labels["words that have undergone pejoration"] = {
description = "{{{langname}}} words that have gained a negative [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}},
}
labels["terms with origins in folklore"] = {
description = "{{{langname}}} terms that have an etymology rooted in folklore.",
breadcrumb = "Folklore",
parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}},
umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}}
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Terms by etymology subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by etymology", is_label = true, sort = " "},
},
}
raw_categories["Borrowed terms subcategories by language"] = {
description = "Umbrella categories covering topics related to borrowed terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "borrowed terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Inherited terms subcategories by language"] = {
description = "Umbrella categories covering topics related to inherited terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "inherited terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Indo-Aryan extensions"] = {
description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Multiple etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms with multiple etymologies.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Terms borrowed back into the same language"] = {
description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.",
additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}",
parents = "Terms by etymology subcategories by language",
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_source(source_name, allow_family, name_type)
local source = get_lang_by_name(source_name, nil, true, allow_family)
if source == nil then
return nil
end
-- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc).
if source[name_type](source) == source_name then
return source
end
end
local function get_source_and_type_desc(source, term_type)
if source:getCode() == "ine-pro" and term_type:find("^roots?$") then
return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]"
end
return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type
end
local function get_source_and_source_desc(source_name)
-- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name
-- before calling getByCanonicalName(). We need a more general solution here.
local source_desc
if source_name == "taxonomic names" then
source_name = "taxonomic name"
source_desc = "[[w:taxonomic nomenclature|taxonomic names]]"
end
local source = get_source(source_name, true, "getDisplayForm")
if source == nil then
return
end
source_desc = source_desc or source:makeCategoryLink()
if source:hasType("family") then
source_desc = "one of the " .. source_desc
end
return source, source_desc
end
-----------------------------------------------------------------------------
------------------------------- word handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Sources whose roots are linked to `Appendix:<language> roots/<root>`.
-- `appendix_root_lang_codes` is for exact language-code matches.
-- `appendix_root_family_codes` is for language families.
local appendix_root_lang_codes = {
["eo"] = true,
}
local appendix_root_family_codes = {
["sem"] = true,
}
local function lang_uses_appendix_roots(lang)
if appendix_root_lang_codes[lang:getCode()] then
return true
end
for family_code in pairs(appendix_root_family_codes) do
if lang:inFamily(family_code) then
return true
end
end
return false
end
insert(handlers, function(data)
local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$")
if not word_and_id then
return
end
local word, id = word_and_id:match("^(.+) %((.-)%)$")
if not word then
word = word_and_id
end
local is_semitic = data.lang:inFamily("sem")
local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word"
local parents = {}
if id then
insert(parents, {name = labelpref .. word, sort = id})
end
insert(parents, {name = "terms by word", sort = word_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style words)
local word_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, ""))
local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, word, tag_text(word, lang, nil, "term"))
end
local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) word$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source:getDisplayForm())
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
-----------------------------------------------------------------------------
------------------------------- Root handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella
-- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(handlers, function(data)
local source_name, term_type, term_and_id
for _, tt in ipairs{"root", "word", "term"} do
source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$")
if source_name then
term_type = tt
break
end
end
if not source_name then
return
end
local term, id = term_and_id:match("^(.+) %((.-)%)$")
if not term then
term = term_and_id
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {
{
name = "terms by " .. source_name .. " " .. term_type,
sort = (source:makeSortKey(term)),
}
}
local umbrella_parents = {
{
name = "Terms derived from " .. source_name .. " " .. term_type .. "s",
sort = (source:makeSortKey(term)),
}
}
if id then
insert(parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
sort = " "
})
insert(umbrella_parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
is_label = true,
sort = " "
})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, term, tag_text(term, source, nil, "term"))
end
local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "")
local term_page, alt_form
if term_type == "root" and lang_uses_appendix_roots(source) then
term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term)
alt_form = term
else
term_page = term
end
return {
description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({
term = term_page,
alt = alt_form,
lang = source,
gloss = id,
id = id
}, "term") .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
no_by_language = true,
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = umbrella_parents,
}
}
end)
insert(handlers, function(data)
local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$")
if not root_and_id then
return
end
local root, id = root_and_id:match("^(.+) %((.-)%)$")
if not root then
root = root_and_id
end
local is_semitic = data.lang:inFamily("sem")
local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root"
local parents = {}
if id then
insert(parents, {name = labelpref .. root, sort = id})
end
insert(parents, {name = "terms by root", sort = root_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style roots)
local root_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, ""))
local root_page, alt_form
if lang_uses_appendix_roots(data.lang) then
root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root)
alt_form = root
else
root_page = root
end
local linked_root = data.lang and full_link(
{ term = root_page, alt = alt_form, lang = data.lang, gloss = id, id = id }, "term") or root_page
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id})
end
-- Italicize the root/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, root, tag_text(root, lang, nil, "term"))
end
local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) root$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source_name)
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
insert(handlers, function(data)
local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$")
if not root_shape then
return
elseif data.lang and data.lang:getCode() == "ine-pro" then
additional = [=[
* '''e''' stands for the vowel of the root.
* '''C''' stands for any stop or ''s''.
* '''R''' stands for any resonant.
* '''H''' stands for any laryngeal.
* '''M''' stands for ''m'' or ''w'', when followed by a resonant.
* '''s''' stands for ''s'', when next to a stop.]=]
end
if root_shape == "irregularly" and post == " " then
return {
breadcrumb = "irregular",
description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.",
additional = additional,
parents = {{name = "roots by shape", sort = "*"}},
umbrella = false,
}
elseif post == " " then
return
end
return {
breadcrumb = root_shape,
description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.",
additional = additional,
parents = {{name = "roots by shape", sort = root_shape}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
-------------------- Derived/inherited/borrowed handlers --------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language
-- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form
-- "Terms derived from SOURCE".
insert(handlers, function(data)
local source_name = data.label:match("^terms derived from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- Compute description.
local desc = "{{{langname}}} terms that originate from " .. source_desc .. "."
local additional
if source:hasType("family") then
additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " ..
"If you know the exact language from which an entry categorized here is derived, please edit its respective entry."
end
-- Compute parents.
local derived_from_variety_of_self = false
local parent
local sortkey = source:getDisplayForm()
if source:hasType("etymology-only") then
-- By default, `parent` is the source's parent.
parent = source:getParent()
-- Check if the source is a variety (or subvariety) of the language.
if data.lang and source:hasParent(data.lang) then
derived_from_variety_of_self = true
end
-- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead.
if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then
parent = source:getFamily()
end
-- Regular language or family.
else
local fam = source:getFamily()
if fam then
parent = fam
end
end
-- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it.
if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or
parent:getCode() == "qfa-unc" then
parent = nil
derived_from_variety_of_self = false
-- Otherwise, get the display form.
else
parent = parent:getDisplayForm()
end
parent = parent and "terms derived from " .. parent or "terms derived from other languages"
local parents = {{name = parent, sort = sortkey}}
if derived_from_variety_of_self then
insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language")
end
-- Compute umbrella parents.
local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName()
-- If the source is etymology-only, its category will be handled by the lect handler in
-- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like
-- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so
-- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly
-- named categories.
if source:hasType("etymology-only") then
require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name)
end
local umbrella_parents = {
(source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or
{name = cat_name, raw = true, sort = "terms derived from"}
}
-- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages »
-- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages »
-- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French
-- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create
-- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category
-- [[Category:Javanese terms derived from Arabic]], we end up with
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic »
-- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic
-- because "Arabic" is ambiguous between family and language (and script, for that matter).
local breadcrumb = source_name
if source:hasType("family") and breadcrumb:find(" languages$") then
local truncated_breadcrumb = breadcrumb:gsub(" languages$", "")
if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then
breadcrumb = truncated_breadcrumb
end
end
return {
description = desc,
additional = additional,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
description = "Categories with terms that originate from " .. source_desc .. ".",
parents = umbrella_parents,
},
}
end)
-- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language,
-- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form
-- "Terms inherited/borrowed from SOURCE".
local function inherited_borrowed_handler(etymtype)
return function(data)
local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
return {
description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".",
breadcrumb = source_name,
parents = {
{name = etymtype .. " terms", sort = source_name},
{name = "terms derived from " .. source_name, sort = " "},
},
umbrella = {
parents = {
{ name = "terms derived from " .. source_name, is_label = true, sort = " " },
etymtype == "inherited" and
{ name = "Inherited terms subcategories by language", sort = source_name }
-- There are several types of borrowings mixed into the following holding category,
-- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just
-- 'SOURCE_NAME'.
or "Borrowed terms subcategories by language",
}
},
}
end
end
insert(handlers, inherited_borrowed_handler("borrowed"))
insert(handlers, inherited_borrowed_handler("inherited"))
-----------------------------------------------------------------------------
------------------------ Borrowing subtype handlers -------------------------
-----------------------------------------------------------------------------
-- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings.
local function borrowing_subtype_handler(dest, source_name, parent_cat, spec)
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- normally uses of UNKNOWN should not show up to the end user
local dest_name = dest and dest:getCanonicalName() or "UNKNOWN"
local additional, umbrella_additional
if spec.additional then
if dest then
additional = spec.additional(source, dest)
else
umbrella_additional = spec.umbrella_additional(source)
end
else
if not spec.categorizing_templates then
error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec")
end
local extra_templates = {}
local extra_template_text
for i, template in ipairs(spec.categorizing_templates) do
if i > 1 then
insert(extra_templates, ("{{tl|%s|...}}"):format(template))
end
end
if #extra_templates > 0 then
extra_template_text = (" (or %s, using the same syntax)"):format(
serial_comma_join(extra_templates, {conj = "or"}))
else
extra_template_text = ""
end
if dest then
additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " ..
"where <code><var>source_term</var></code> is the %s term that the term in question " ..
"was borrowed from."):format(
spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name)
else
umbrella_additional = ("To categorize a term into a language-specific subcategory, use " ..
"{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " ..
"is the language code of the language in question (see [[Wiktionary:List of languages]]), and " ..
"<code><var>source_term</var></code> is the %s term that the term in question was " ..
"borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name)
end
end
return {
description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name),
additional = additional,
breadcrumb = source_name,
parents = {
{ name = parent_cat, sort = source_name },
{ name = "terms borrowed from " .. source_name, sort = " " },
},
umbrella = {
additional = umbrella_additional,
parents = {
{ name = "terms borrowed from " .. source_name, is_label = true, sort = " " },
"Borrowed terms subcategories by language",
}
},
}
end
-- Specs describing types of borrowings.
-- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE",
-- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language.
-- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g.
-- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories.
-- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is
-- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to
-- create a BORTYPE-specific handler.
-- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE".
-- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME:
-- Review whether this is correct.)
-- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning.
-- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$".
-- If omitted, it is generated from BORTYPE.
-- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to
-- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified
-- templates are used to form the `additional` text displayed on the language-specific category page and
-- corresponding umbrella category page describing how to categorize into the category in question. In more complex
-- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done
-- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and
-- `umbrella_additional`.
-- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate
-- the `additional` text displayed on the language-specific category page that describes how to categorize into the
-- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases
-- (currently, with adapted borrowings).
-- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the
-- `additional` text displayed on the umbrella category page that describes how to categorize into the category in
-- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently,
-- with adapted borrowings).
local borrowing_specs = {
["learned borrowings"] = {
from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.",
umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.",
uses_subtype_handler = true,
categorizing_templates = {"lbor", "learned borrowing"},
},
["semi-learned borrowings"] = {
from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
uses_subtype_handler = true,
categorizing_templates = {"slbor", "semi-learned borrowing"},
},
["orthographic borrowings"] = {
from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.",
umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.",
uses_subtype_handler = true,
categorizing_templates = {"obor", "orthographic borrowing"},
},
["unadapted borrowings"] = {
from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.",
umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.",
uses_subtype_handler = true,
categorizing_templates = {"ubor", "unadapted borrowing"},
},
["adapted borrowings"] = {
from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.",
umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.",
uses_subtype_handler = true,
additional = function(source, dest)
return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " ..
"the %s term that the term in question was borrowed from and <code><var>affix</var></code> " ..
"is the %s affix used to adapt the %s term. An example is " ..
"{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " ..
"that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " ..
"{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(),
source:getCanonicalName())
end,
umbrella_additional = function(source)
return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " ..
"<code><var>destcode</var></code> is the language code of the target language in question (see " ..
"[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " ..
"that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " ..
"affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " ..
"would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " ..
"{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format(
source:getCode(), source:getCanonicalName(), source:getCanonicalName())
end,
},
["semantic loans"] = {
from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.",
umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.",
umbrella_parent = "terms by etymology",
categorizing_templates = {"sl", "semantic loan"},
},
["partial calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.",
umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms partially calqued from (.+)$",
categorizing_templates = {"pcal", "pclq", "partial calque"},
},
["calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.",
umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms calqued from (.+)$",
categorizing_templates = {"cal", "clq", "calque"},
},
["phono-semantic matchings"] = {
from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
categorizing_templates = {"psm", "phono-semantic matching"},
},
["pseudo-loans"] = {
from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.",
umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.",
categorizing_templates = {"pl", "pseudo-loan"},
},
}
for bortype, spec in pairs(borrowing_specs) do
labels[bortype] = {
description = "{{{langname}}} " .. spec.umbrella_desc,
parents = {spec.umbrella_parent or "borrowed terms"},
umbrella_parents = "Terms by etymology subcategories by language",
}
if not spec.uses_subtype_handler then
-- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to
-- escape hyphens in the pattern.
local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$"
insert(handlers, function(data)
local source_name = data.label:match(label_pattern)
if source_name then
return borrowing_subtype_handler(data.lang, source_name, bortype, spec)
end
end)
end
end
insert(handlers, function(data)
local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$")
if borrowing_type then
local spec = borrowing_specs[borrowing_type]
return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec)
end
end)
-----------------------------------------------------------------------------
---------------------- Indo-Aryan extension handlers ------------------------
-----------------------------------------------------------------------------
-- FIXME: Put this in a family-specific module.
insert(handlers, function(data)
local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$")
if not extension then
return
end
local lang_inc_ash = require("Module:languages").getByCode("inc-ash")
local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term")
local tagged_term = tag_text(extension, lang_inc_ash, nil, "term")
return {
description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".",
displaytitle = "{{{langname}}} " .. labelpref .. tagged_term,
breadcrumb = tagged_term,
parents = {{name = "terms with Indo-Aryan extensions", sort = extension}},
umbrella = {
no_by_language = true,
parents = "Indo-Aryan extensions",
displaytitle = "Terms extended with Indo-Aryan " .. tagged_term,
}
}
end)
-----------------------------------------------------------------------------
---------------------------- Coined-by handlers -----------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local coiner = data.label:match("^terms coined by (.+)$")
if not coiner then
return
end
-- Sort by last name per request from [[User:Metaknowledge]]
local last_name = umatch(coiner, ".-%s(%S+)$")
return {
description = "{{{langname}}} terms coined by " .. coiner .. ".",
breadcrumb = coiner,
parents = {{
name = "coinages",
sort = last_name and last_name .. ", " .. coiner or coiner,
}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
------------------------ Multiple etymology handlers ------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local pos = data.label:match("^terms with multiple (.+) etymologies$")
if not pos then
return
end
local plpos = pluralize_pos(pos)
local postype = pos_lemma_or_nonlemma(plpos)
if not postype then
return
end
return {
description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = "multiple " .. plpos,
parents = {{
name = "terms with multiple " .. postype .. " etymologies",
sort = pos,
}},
}
end)
insert(handlers, function(data)
local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$")
if not pos1 then
return
end
local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1))
local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2))
if not (pos1type and pos2type) then
return
end
return {
description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " ..
add_indefinite_article(pos2) .. " of a different origin.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = pos1 .. " and " .. pos2,
parents = {{
name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or
"terms with lemma and non-lemma form etymologies",
sort = pos1 .. " and " .. pos2,
}},
}
end)
-----------------------------------------------------------------------------
--------------------------- Borrowed-back handlers --------------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler
-- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a
-- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the
-- built-in umbrella mechanism.
insert(handlers, function(data)
local lang = data.lang
if not lang then
return
end
local source_name = data.label:match("^terms borrowed back into (.+)$")
if not (source_name and source_name == lang:getDisplayForm()) then
return
end
return {
description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".",
parents = {"terms by etymology", "borrowed terms", {
name = "Terms borrowed back into the same language",
raw = true,
sort = "{{{langname}}}"
}},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]]
-- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(raw_handlers, function(data)
local source_name, terms_type
for _, tt in ipairs{"roots", "words", "terms"} do
source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$")
if source_name then
terms_type = tt
break
end
end
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
return {
description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{ name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " },
{ name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type },
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
f5rghe0vjrrchf5lr2vpelx8xitkpdb
88364
88363
2026-07-27T00:11:48Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/etymology]]
88363
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local en_utilities_module = "Module:en-utilities"
local m_str_utils = require("Module:string utilities")
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local full_link = require("Module:links").full_link
local get_lang_by_name = require("Module:languages").getByCanonicalName
local insert = table.insert
local pattern_escape = m_str_utils.pattern_escape
local plain_gsub = m_str_utils.plain_gsub
local pluralize_pos = require("Module:headword").pluralize_pos
local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma
local serial_comma_join = require("Module:table").serialCommaJoin
local tag_text = require("Module:script utilities").tag_text
local umatch = mw.ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by etymology"] = {
description = "{{{langname}}} terms categorized by their etymologies.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["AABB-type reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.",
breadcrumb = "AABB-type",
parents = {"reduplications"},
}
labels["apophonic reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.",
breadcrumb = "apophonic",
parents = {"reduplications"},
}
labels["back-formations"] = {
description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.",
parents = {"terms by etymology"},
}
labels["blends"] = {
description = "{{{langname}}} terms formed by combinations of other words.",
parents = {"terms by etymology"},
}
labels["borrowed terms"] = {
description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.",
parents = {"terms by etymology"},
}
labels["catachreses"] = {
description = "{{{langname}}} terms derived from misuses or misapplications of other terms.",
parents = {"terms by etymology"},
}
labels["coinages"] = {
description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.",
parents = {"terms attributed to a specific source"},
umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "},
}
labels["coordinated pairs"] = {
description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].",
parents = {"terms by etymology"},
}
labels["coordinated triples"] = {
description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quadruples"] = {
description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quintuples"] = {
description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["denominals"] = {
description = "{{{langname}}} terms derived from a noun.",
parents = {"terms by etymology"},
}
labels["deverbals"] = {
description = "{{{langname}}} terms derived from a verb.",
parents = {"terms by etymology"},
}
labels["doublets"] = {
description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.",
parents = {"terms by etymology"},
}
labels["elongated forms"] = {
description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.",
parents = {"terms by etymology"},
}
labels["eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious individuals.",
parents = {"terms by etymology"},
}
labels["genericized trademarks"] = {
description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.",
parents = {"terms by etymology", "trademarks"},
}
labels["ghost words"] = {
description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.",
parents = {"terms by etymology"},
}
labels["gramograms"] = {
description = "{{{langname}}} [[gramogram]]s – terms that are partially or completely spelled with [[homophone|homophonous]] letters.",
parents = {"rebuses"},
}
labels["haplological words"] = {
description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.",
parents = {"terms by etymology"},
}
labels["homophonic translations"] = {
description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].",
parents = {"terms by etymology"}
}
labels["hybridisms"] = {
description = "{{{langname}}} terms formed by elements of different linguistic origins.",
parents = {"terms by etymology"},
}
labels["inherited terms"] = {
description = "{{{langname}}} terms that were inherited from an earlier stage of the language.",
parents = {"terms by etymology"},
}
labels["internationalisms"] = {
description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.",
additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.",
parents = {"terms by etymology"},
}
labels["legal doublets"] = {
description = "{{{langname}}} legal [[doublet]]s – a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.",
parents = {"coordinated pairs"},
}
labels["legal triplets"] = {
description = "{{{langname}}} legal [[triplet]]s – a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.",
parents = {"coordinated triples"},
}
labels["LLM coinages"] = {
description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.",
parents = {"terms by etymology"},
}
labels["merisms"] = {
description = "{{{langname}}} [[merism]]s – terms that are [[coordinate]]s that, combined, are a synonym for a totality.",
parents = {"coordinated pairs"},
}
labels["metonyms"] = {
description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.",
parents = {"terms by etymology"},
}
labels["neologisms"] = {
description = "{{{langname}}} terms that have been only recently acknowledged.",
parents = {"terms by etymology"},
}
labels["nominalizations"] = {
description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.",
parents = {"terms by etymology"},
}
labels["nonce terms"] = {
description = "{{{langname}}} terms that have been invented for a single occasion.",
parents = {"terms by etymology"},
}
labels["number homophones"] = {
description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.",
parents = {"rebuses", "terms spelled with numbers"},
}
labels["numerical contractions"] = {
description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).",
parents = {"contractions", "rebuses", "terms spelled with numbers"},
}
labels["onomatopoeias"] = {
description = "{{{langname}}} terms that were coined to sound like what they represent.",
parents = {"terms by etymology"},
}
labels["piecewise doublets"] = {
description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].",
parents = {"terms by etymology"},
}
for _, ism_and_langname in ipairs({
{"anglicisms", "English"},
{"Arabisms", "Arabic"},
{"Gallicisms", "French"},
{"Germanisms", "German"},
{"Hispanisms", "Spanish"},
{"Italianisms", "Italian"},
{"Latinisms", "Latin"},
{"Japonisms", "Japanese"},
}) do
local ism, langname = unpack(ism_and_langname)
labels["pseudo-" .. ism] = {
description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.",
parents = {"pseudo-loans"},
umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "},
}
end
labels["rebracketings"] = {
description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.",
parents = {"terms by etymology"}
}
labels["rebuses"] = {
description = "{{{langname}}} [[rebus]]es – terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.",
parents = {"terms by etymology"},
}
labels["reconstructed terms"] = {
description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.",
parents = {"terms by etymology"}
}
labels["reduplicated coordinated pairs"] = {
description = "{{{langname}}} reduplicated coordinated pairs.",
breadcrumb = "reduplicated",
parents = {"coordinated pairs", "reduplications"},
}
labels["reduplicated coordinated triples"] = {
description = "{{{langname}}} reduplicated coordinated triples.",
breadcrumb = "reduplicated",
parents = {"coordinated triples", "reduplications"},
}
labels["reduplicated coordinated quadruples"] = {
description = "{{{langname}}} reduplicated coordinated quadruples.",
breadcrumb = "reduplicated",
parents = {"coordinated quadruples", "reduplications"},
}
labels["reduplicated coordinated quintuples"] = {
description = "{{{langname}}} reduplicated coordinated quintuples.",
breadcrumb = "reduplicated",
parents = {"coordinated quintuples", "reduplications"},
}
labels["reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.",
parents = {"terms by etymology"},
}
labels["retronyms"] = {
description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.",
parents = {"terms by etymology"},
}
labels["roots"] = {
description = "Basic morphemes from which {{{langname}}} words are formed.",
parents = {"terms by etymology", "morphemes"},
}
labels["Sanskritic formations"] = {
description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.",
parents = {"terms by etymology", "terms derived from Sanskrit"},
}
labels["sound-symbolic terms"] = {
description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].",
parents = {"terms by etymology"},
}
labels["spelled-out initialisms"] = {
description = "{{{langname}}} initialisms in which the letter names are spelled out.",
parents = {"terms by etymology"},
}
labels["spelling pronunciations"] = {
description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.",
parents = {"terms by etymology"},
}
labels["spoonerisms"] = {
description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".",
parents = {"terms by etymology"},
}
labels["taxonomic eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].",
parents = {"eponyms"},
}
labels["terms attributed to a specific source"] = {
description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.",
parents = {"terms by etymology"},
}
labels["terms coined ex nihilo"] = {
description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.",
parents = {"terms by etymology"},
}
labels["terms containing fossilized case endings"] = {
description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.",
parents = {"terms by etymology"},
}
labels["terms derived from area codes"] = {
description = "{{{langname}}} terms derived from [[area code]]s.",
parents = {"terms by etymology"},
}
labels["terms derived from the shape of letters"] = {
description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.",
parents = {"terms by etymology"},
}
labels["terms by root"] = {
description = "{{{langname}}} terms categorized by the root they originate from.",
parents = {"terms by etymology", {name = "roots", sort = " "}},
}
labels["terms by word"] = {
description = "{{{langname}}} terms categorized by the word they originate from.",
parents = {"terms by etymology"},
}
labels["terms derived from fiction"] = {
description = "{{{langname}}} terms that originate from works of [[fiction]].",
breadcrumb = "fiction",
parents = {{name = "terms attributed to a specific source", sort = "fiction"}},
}
for _, data in ipairs {
{source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"},
{source="DC Comics", desc="[[w:DC Comics|DC Comics]]"},
{source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"},
{source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"},
{source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe",
topic_parent="Disney"},
{source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"},
{source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''",
topic_parent="Harry Potter"},
{source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"},
{source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''",
displaytitle="''Nineteen Eighty-Four''"},
{source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"},
{source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"},
{source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"},
{source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"},
{source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"},
{source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"},
{source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"},
} do
local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}}
local umbrella_parents = {"Terms by etymology subcategories by language"}
if data.topic_parent then
insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true})
insert(umbrella_parents, {name = data.topic_parent, raw = true})
end
labels["terms derived from " .. data.source] = {
description = "{{{langname}}} terms that originate from " .. data.desc .. ".",
breadcrumb = data.displaytitle or data.source,
parents = parents,
umbrella = {
parents = umbrella_parents,
displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil,
breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle,
},
displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil,
}
end
labels["terms derived from Greek mythology"] = {
description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.",
breadcrumb = "Greek mythology",
parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}},
}
labels["terms derived from occupations"] = {
description = "{{{langname}}} terms derived from names of occupations.",
parents = {"terms by etymology"},
}
labels["terms derived from other languages"] = {
description = "{{{langname}}} terms that originate from other languages.",
parents = {"terms by etymology"},
}
labels["terms derived from the Bible"] = {
description = "{{{langname}}} terms that originate from the [[Bible]].",
breadcrumb = {name = "the Bible", nocap = true},
parents = {{name = "terms attributed to a specific source", sort = "Bible"}},
}
labels["terms derived from Aesop's Fables"] = {
description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.",
breadcrumb = "Aesop's Fables",
parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}},
}
labels["terms derived from toponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious places.",
parents = {"terms by etymology"},
}
labels["terms derived through romanized wordplay"] = {
description = "{{{langname}}} terms derived through romanized wordplay.",
parents = {"terms by etymology"},
}
labels["terms making reference to character shapes"] = {
description = "{{{langname}}} terms making reference to character shapes.",
parents = {"terms by etymology"},
}
labels["terms derived from sports"] = {
description = "{{{langname}}} terms that originate from sports.",
breadcrumb = "sports",
parents = {{name = "terms attributed to a specific source", sort = "sports"}},
}
labels["terms derived from baseball"] = {
description = "{{{langname}}} terms that originate from baseball.",
breadcrumb = "baseball",
parents = {{name = "terms derived from sports", sort = "baseball"}},
}
labels["terms with Indo-Aryan extensions"] = {
description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
parents = {"terms by etymology"},
}
labels["terms with lemma and non-lemma form etymologies"] = {
description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.",
breadcrumb = "lemma and non-lemma form",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple etymologies"] = {
description = "{{{langname}}} terms that are derived from multiple origins.",
parents = {"terms by etymology"},
}
labels["terms with multiple lemma etymologies"] = {
description = "{{{langname}}} lemmas that are derived from multiple origins.",
breadcrumb = "multiple lemmas",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple non-lemma form etymologies"] = {
description = "{{{langname}}} non-lemma forms that are derived from multiple origins.",
breadcrumb = "multiple non-lemma forms",
parents = {"terms with multiple etymologies"},
}
labels["terms with unknown etymologies"] = {
description = "{{{langname}}} terms whose etymologies have not yet been established.",
parents = {{name = "terms by etymology", sort = "unknown etymology"}},
}
labels["univerbations"] = {
description = "{{{langname}}} terms that result from the agglutination of two or more words.",
parents = {"terms by etymology"},
}
labels["words derived through corruption"] = {
description = "{{{langname}}} words that result from a non-specific or sporadic change.",
parents = {{name = "terms by etymology", sort = "corruption"}},
}
labels["words derived through metathesis"] = {
description = "{{{langname}}} words that were created through [[metathesis]] from another word.",
parents = {{name = "terms by etymology", sort = "metathesis"}},
}
labels["words that have undergone semantic shift"] = {
description = "{{{langname}}} words that show senses explained by [[semantic shift]].",
parents = {{name = "terms by etymology", sort = "semantic shift"}},
}
labels["words that have undergone semantic broadening"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}},
}
labels["words that have undergone semantic narrowing"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}},
}
labels["words that have undergone amelioration"] = {
description = "{{{langname}}} words that have gained a positive [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}},
}
labels["words that have undergone pejoration"] = {
description = "{{{langname}}} words that have gained a negative [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}},
}
labels["terms with origins in folklore"] = {
description = "{{{langname}}} terms that have an etymology rooted in folklore.",
breadcrumb = "Folklore",
parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}},
umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}}
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Terms by etymology subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by etymology", is_label = true, sort = " "},
},
}
raw_categories["Borrowed terms subcategories by language"] = {
description = "Umbrella categories covering topics related to borrowed terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "borrowed terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Inherited terms subcategories by language"] = {
description = "Umbrella categories covering topics related to inherited terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "inherited terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Indo-Aryan extensions"] = {
description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Multiple etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms with multiple etymologies.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Terms borrowed back into the same language"] = {
description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.",
additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}",
parents = "Terms by etymology subcategories by language",
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_source(source_name, allow_family, name_type)
local source = get_lang_by_name(source_name, nil, true, allow_family)
if source == nil then
return nil
end
-- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc).
if source[name_type](source) == source_name then
return source
end
end
local function get_source_and_type_desc(source, term_type)
if source:getCode() == "ine-pro" and term_type:find("^roots?$") then
return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]"
end
return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type
end
local function get_source_and_source_desc(source_name)
-- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name
-- before calling getByCanonicalName(). We need a more general solution here.
local source_desc
if source_name == "taxonomic names" then
source_name = "taxonomic name"
source_desc = "[[w:taxonomic nomenclature|taxonomic names]]"
end
local source = get_source(source_name, true, "getDisplayForm")
if source == nil then
return
end
source_desc = source_desc or source:makeCategoryLink()
if source:hasType("family") then
source_desc = "one of the " .. source_desc
end
return source, source_desc
end
-----------------------------------------------------------------------------
------------------------------- word handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Sources whose roots are linked to `Appendix:<language> roots/<root>`.
-- `appendix_root_lang_codes` is for exact language-code matches.
-- `appendix_root_family_codes` is for language families.
local appendix_root_lang_codes = {
["eo"] = true,
}
local appendix_root_family_codes = {
["sem"] = true,
}
local function lang_uses_appendix_roots(lang)
if appendix_root_lang_codes[lang:getCode()] then
return true
end
for family_code in pairs(appendix_root_family_codes) do
if lang:inFamily(family_code) then
return true
end
end
return false
end
insert(handlers, function(data)
local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$")
if not word_and_id then
return
end
local word, id = word_and_id:match("^(.+) %((.-)%)$")
if not word then
word = word_and_id
end
local is_semitic = data.lang:inFamily("sem")
local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word"
local parents = {}
if id then
insert(parents, {name = labelpref .. word, sort = id})
end
insert(parents, {name = "terms by word", sort = word_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style words)
local word_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, ""))
local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, word, tag_text(word, lang, nil, "term"))
end
local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) word$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source:getDisplayForm())
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
-----------------------------------------------------------------------------
------------------------------- Root handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella
-- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(handlers, function(data)
local source_name, term_type, term_and_id
for _, tt in ipairs{"root", "word", "term"} do
source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$")
if source_name then
term_type = tt
break
end
end
if not source_name then
return
end
local term, id = term_and_id:match("^(.+) %((.-)%)$")
if not term then
term = term_and_id
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {
{
name = "terms by " .. source_name .. " " .. term_type,
sort = (source:makeSortKey(term)),
}
}
local umbrella_parents = {
{
name = "Terms derived from " .. source_name .. " " .. term_type .. "s",
sort = (source:makeSortKey(term)),
}
}
if id then
insert(parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
sort = " "
})
insert(umbrella_parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
is_label = true,
sort = " "
})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, term, tag_text(term, source, nil, "term"))
end
local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "")
local term_page, alt_form
if term_type == "root" and lang_uses_appendix_roots(source) then
term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term)
alt_form = term
else
term_page = term
end
return {
description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({
term = term_page,
alt = alt_form,
lang = source,
gloss = id,
id = id
}, "term") .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
no_by_language = true,
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = umbrella_parents,
}
}
end)
insert(handlers, function(data)
local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$")
if not root_and_id then
return
end
local root, id = root_and_id:match("^(.+) %((.-)%)$")
if not root then
root = root_and_id
end
local is_semitic = data.lang:inFamily("sem")
local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root"
local parents = {}
if id then
insert(parents, {name = labelpref .. root, sort = id})
end
insert(parents, {name = "terms by root", sort = root_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style roots)
local root_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, ""))
local root_page, alt_form
if lang_uses_appendix_roots(data.lang) then
root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root)
alt_form = root
else
root_page = root
end
local linked_root = data.lang and full_link(
{ term = root_page, alt = alt_form, lang = data.lang, gloss = id, id = id }, "term") or root_page
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id})
end
-- Italicize the root/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, root, tag_text(root, lang, nil, "term"))
end
local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) root$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source_name)
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
insert(handlers, function(data)
local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$")
if not root_shape then
return
elseif data.lang and data.lang:getCode() == "ine-pro" then
additional = [=[
* '''e''' stands for the vowel of the root.
* '''C''' stands for any stop or ''s''.
* '''R''' stands for any resonant.
* '''H''' stands for any laryngeal.
* '''M''' stands for ''m'' or ''w'', when followed by a resonant.
* '''s''' stands for ''s'', when next to a stop.]=]
end
if root_shape == "irregularly" and post == " " then
return {
breadcrumb = "irregular",
description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.",
additional = additional,
parents = {{name = "roots by shape", sort = "*"}},
umbrella = false,
}
elseif post == " " then
return
end
return {
breadcrumb = root_shape,
description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.",
additional = additional,
parents = {{name = "roots by shape", sort = root_shape}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
-------------------- Derived/inherited/borrowed handlers --------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language
-- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form
-- "Terms derived from SOURCE".
insert(handlers, function(data)
local source_name = data.label:match("^terms derived from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- Compute description.
local desc = "{{{langname}}} terms that originate from " .. source_desc .. "."
local additional
if source:hasType("family") then
additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " ..
"If you know the exact language from which an entry categorized here is derived, please edit its respective entry."
end
-- Compute parents.
local derived_from_variety_of_self = false
local parent
local sortkey = source:getDisplayForm()
if source:hasType("etymology-only") then
-- By default, `parent` is the source's parent.
parent = source:getParent()
-- Check if the source is a variety (or subvariety) of the language.
if data.lang and source:hasParent(data.lang) then
derived_from_variety_of_self = true
end
-- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead.
if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then
parent = source:getFamily()
end
-- Regular language or family.
else
local fam = source:getFamily()
if fam then
parent = fam
end
end
-- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it.
if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or
parent:getCode() == "qfa-unc" then
parent = nil
derived_from_variety_of_self = false
-- Otherwise, get the display form.
else
parent = parent:getDisplayForm()
end
parent = parent and "terms derived from " .. parent or "terms derived from other languages"
local parents = {{name = parent, sort = sortkey}}
if derived_from_variety_of_self then
insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language")
end
-- Compute umbrella parents.
local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName()
-- If the source is etymology-only, its category will be handled by the lect handler in
-- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like
-- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so
-- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly
-- named categories.
if source:hasType("etymology-only") then
require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name)
end
local umbrella_parents = {
(source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or
{name = cat_name, raw = true, sort = "terms derived from"}
}
-- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages »
-- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages »
-- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French
-- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create
-- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category
-- [[Category:Javanese terms derived from Arabic]], we end up with
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic »
-- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic
-- because "Arabic" is ambiguous between family and language (and script, for that matter).
local breadcrumb = source_name
if source:hasType("family") and breadcrumb:find(" languages$") then
local truncated_breadcrumb = breadcrumb:gsub(" languages$", "")
if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then
breadcrumb = truncated_breadcrumb
end
end
return {
description = desc,
additional = additional,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
description = "Categories with terms that originate from " .. source_desc .. ".",
parents = umbrella_parents,
},
}
end)
-- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language,
-- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form
-- "Terms inherited/borrowed from SOURCE".
local function inherited_borrowed_handler(etymtype)
return function(data)
local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
return {
description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".",
breadcrumb = source_name,
parents = {
{name = etymtype .. " terms", sort = source_name},
{name = "terms derived from " .. source_name, sort = " "},
},
umbrella = {
parents = {
{ name = "terms derived from " .. source_name, is_label = true, sort = " " },
etymtype == "inherited" and
{ name = "Inherited terms subcategories by language", sort = source_name }
-- There are several types of borrowings mixed into the following holding category,
-- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just
-- 'SOURCE_NAME'.
or "Borrowed terms subcategories by language",
}
},
}
end
end
insert(handlers, inherited_borrowed_handler("borrowed"))
insert(handlers, inherited_borrowed_handler("inherited"))
-----------------------------------------------------------------------------
------------------------ Borrowing subtype handlers -------------------------
-----------------------------------------------------------------------------
-- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings.
local function borrowing_subtype_handler(dest, source_name, parent_cat, spec)
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- normally uses of UNKNOWN should not show up to the end user
local dest_name = dest and dest:getCanonicalName() or "UNKNOWN"
local additional, umbrella_additional
if spec.additional then
if dest then
additional = spec.additional(source, dest)
else
umbrella_additional = spec.umbrella_additional(source)
end
else
if not spec.categorizing_templates then
error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec")
end
local extra_templates = {}
local extra_template_text
for i, template in ipairs(spec.categorizing_templates) do
if i > 1 then
insert(extra_templates, ("{{tl|%s|...}}"):format(template))
end
end
if #extra_templates > 0 then
extra_template_text = (" (or %s, using the same syntax)"):format(
serial_comma_join(extra_templates, {conj = "or"}))
else
extra_template_text = ""
end
if dest then
additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " ..
"where <code><var>source_term</var></code> is the %s term that the term in question " ..
"was borrowed from."):format(
spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name)
else
umbrella_additional = ("To categorize a term into a language-specific subcategory, use " ..
"{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " ..
"is the language code of the language in question (see [[Wiktionary:List of languages]]), and " ..
"<code><var>source_term</var></code> is the %s term that the term in question was " ..
"borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name)
end
end
return {
description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name),
additional = additional,
breadcrumb = source_name,
parents = {
{ name = parent_cat, sort = source_name },
{ name = "terms borrowed from " .. source_name, sort = " " },
},
umbrella = {
additional = umbrella_additional,
parents = {
{ name = "terms borrowed from " .. source_name, is_label = true, sort = " " },
"Borrowed terms subcategories by language",
}
},
}
end
-- Specs describing types of borrowings.
-- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE",
-- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language.
-- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g.
-- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories.
-- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is
-- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to
-- create a BORTYPE-specific handler.
-- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE".
-- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME:
-- Review whether this is correct.)
-- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning.
-- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$".
-- If omitted, it is generated from BORTYPE.
-- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to
-- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified
-- templates are used to form the `additional` text displayed on the language-specific category page and
-- corresponding umbrella category page describing how to categorize into the category in question. In more complex
-- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done
-- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and
-- `umbrella_additional`.
-- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate
-- the `additional` text displayed on the language-specific category page that describes how to categorize into the
-- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases
-- (currently, with adapted borrowings).
-- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the
-- `additional` text displayed on the umbrella category page that describes how to categorize into the category in
-- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently,
-- with adapted borrowings).
local borrowing_specs = {
["learned borrowings"] = {
from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.",
umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.",
uses_subtype_handler = true,
categorizing_templates = {"lbor", "learned borrowing"},
},
["semi-learned borrowings"] = {
from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
uses_subtype_handler = true,
categorizing_templates = {"slbor", "semi-learned borrowing"},
},
["orthographic borrowings"] = {
from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.",
umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.",
uses_subtype_handler = true,
categorizing_templates = {"obor", "orthographic borrowing"},
},
["unadapted borrowings"] = {
from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.",
umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.",
uses_subtype_handler = true,
categorizing_templates = {"ubor", "unadapted borrowing"},
},
["adapted borrowings"] = {
from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.",
umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.",
uses_subtype_handler = true,
additional = function(source, dest)
return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " ..
"the %s term that the term in question was borrowed from and <code><var>affix</var></code> " ..
"is the %s affix used to adapt the %s term. An example is " ..
"{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " ..
"that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " ..
"{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(),
source:getCanonicalName())
end,
umbrella_additional = function(source)
return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " ..
"<code><var>destcode</var></code> is the language code of the target language in question (see " ..
"[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " ..
"that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " ..
"affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " ..
"would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " ..
"{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format(
source:getCode(), source:getCanonicalName(), source:getCanonicalName())
end,
},
["semantic loans"] = {
from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.",
umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.",
umbrella_parent = "terms by etymology",
categorizing_templates = {"sl", "semantic loan"},
},
["partial calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.",
umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms partially calqued from (.+)$",
categorizing_templates = {"pcal", "pclq", "partial calque"},
},
["calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.",
umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms calqued from (.+)$",
categorizing_templates = {"cal", "clq", "calque"},
},
["phono-semantic matchings"] = {
from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
categorizing_templates = {"psm", "phono-semantic matching"},
},
["pseudo-loans"] = {
from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.",
umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.",
categorizing_templates = {"pl", "pseudo-loan"},
},
}
for bortype, spec in pairs(borrowing_specs) do
labels[bortype] = {
description = "{{{langname}}} " .. spec.umbrella_desc,
parents = {spec.umbrella_parent or "borrowed terms"},
umbrella_parents = "Terms by etymology subcategories by language",
}
if not spec.uses_subtype_handler then
-- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to
-- escape hyphens in the pattern.
local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$"
insert(handlers, function(data)
local source_name = data.label:match(label_pattern)
if source_name then
return borrowing_subtype_handler(data.lang, source_name, bortype, spec)
end
end)
end
end
insert(handlers, function(data)
local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$")
if borrowing_type then
local spec = borrowing_specs[borrowing_type]
return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec)
end
end)
-----------------------------------------------------------------------------
---------------------- Indo-Aryan extension handlers ------------------------
-----------------------------------------------------------------------------
-- FIXME: Put this in a family-specific module.
insert(handlers, function(data)
local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$")
if not extension then
return
end
local lang_inc_ash = require("Module:languages").getByCode("inc-ash")
local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term")
local tagged_term = tag_text(extension, lang_inc_ash, nil, "term")
return {
description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".",
displaytitle = "{{{langname}}} " .. labelpref .. tagged_term,
breadcrumb = tagged_term,
parents = {{name = "terms with Indo-Aryan extensions", sort = extension}},
umbrella = {
no_by_language = true,
parents = "Indo-Aryan extensions",
displaytitle = "Terms extended with Indo-Aryan " .. tagged_term,
}
}
end)
-----------------------------------------------------------------------------
---------------------------- Coined-by handlers -----------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local coiner = data.label:match("^terms coined by (.+)$")
if not coiner then
return
end
-- Sort by last name per request from [[User:Metaknowledge]]
local last_name = umatch(coiner, ".-%s(%S+)$")
return {
description = "{{{langname}}} terms coined by " .. coiner .. ".",
breadcrumb = coiner,
parents = {{
name = "coinages",
sort = last_name and last_name .. ", " .. coiner or coiner,
}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
------------------------ Multiple etymology handlers ------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local pos = data.label:match("^terms with multiple (.+) etymologies$")
if not pos then
return
end
local plpos = pluralize_pos(pos)
local postype = pos_lemma_or_nonlemma(plpos)
if not postype then
return
end
return {
description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = "multiple " .. plpos,
parents = {{
name = "terms with multiple " .. postype .. " etymologies",
sort = pos,
}},
}
end)
insert(handlers, function(data)
local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$")
if not pos1 then
return
end
local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1))
local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2))
if not (pos1type and pos2type) then
return
end
return {
description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " ..
add_indefinite_article(pos2) .. " of a different origin.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = pos1 .. " and " .. pos2,
parents = {{
name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or
"terms with lemma and non-lemma form etymologies",
sort = pos1 .. " and " .. pos2,
}},
}
end)
-----------------------------------------------------------------------------
--------------------------- Borrowed-back handlers --------------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler
-- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a
-- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the
-- built-in umbrella mechanism.
insert(handlers, function(data)
local lang = data.lang
if not lang then
return
end
local source_name = data.label:match("^terms borrowed back into (.+)$")
if not (source_name and source_name == lang:getDisplayForm()) then
return
end
return {
description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".",
parents = {"terms by etymology", "borrowed terms", {
name = "Terms borrowed back into the same language",
raw = true,
sort = "{{{langname}}}"
}},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]]
-- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(raw_handlers, function(data)
local source_name, terms_type
for _, tt in ipairs{"roots", "words", "terms"} do
source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$")
if source_name then
terms_type = tt
break
end
end
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
return {
description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{ name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " },
{ name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type },
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
f5rghe0vjrrchf5lr2vpelx8xitkpdb
Mòideal:category tree/fam
828
17712
88365
2026-04-15T09:17:31Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/fam]]" ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88365
Scribunto
text/plain
-- This module contains a list of families with family-specific modules.
local families_with_modules = {
["alg"] = true,
["gem"] = true,
["jpx"] = true,
["qfa-kor"] = true,
["roa-ibe"] = true,
["sem-ara"] = true,
["sla"] = true,
["trk"] = true,
["tup"] = true,
["zhx"] = true,
}
return families_with_modules
i4uemo2elq7n14h8788ftpa3rouz69z
88366
88365
2026-07-27T00:11:54Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/fam]]
88365
Scribunto
text/plain
-- This module contains a list of families with family-specific modules.
local families_with_modules = {
["alg"] = true,
["gem"] = true,
["jpx"] = true,
["qfa-kor"] = true,
["roa-ibe"] = true,
["sem-ara"] = true,
["sla"] = true,
["trk"] = true,
["tup"] = true,
["zhx"] = true,
}
return families_with_modules
i4uemo2elq7n14h8788ftpa3rouz69z
Mòideal:category tree/families
828
17713
88367
2026-04-15T09:16:36Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/families]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88367
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["All language families"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category lists all [[language family|language families]].",
parents = {"Fundamental"},
}
raw_categories["Languages by family"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category contains all languages categorized hierarchically according to the [[language family]] they belong to.",
additional = "Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].",
parents = {
{name = "All languages", sort = " "},
{name = "All language families", sort = " "},
},
}
raw_categories["Unassigned languages"] = {
description = "Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.",
additional = [=[This should be distinguished from:
* [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it);
* [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and
* [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=],
parents = {
{name = "Languages by family", sort = "*"},
"All language families",
},
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function family_is_not_a_family(fam)
if not fam then
return false
elseif fam:getCode() == "qfa-not" then
return true
else
return family_is_not_a_family(fam:getFamily())
end
end
local function family_has_no_category(fam)
local famcode = fam:getCode()
if famcode == "paa" then
return false -- Papuan languages are not a family but have a category
elseif famcode == "qfa-iso" or famcode == "qfa-not" then
return true
else
local parfam = fam:getFamily()
if parfam and parfam:getCode() == "qfa-not" then
-- Constructed languages, sign languages, etc.; no category for them
return true
end
end
return false
end
-- Currently all Papuan families begin with "paa" or "ngf",
local function family_is_papuan(fam)
local famcode = fam:getCode()
return famcode ~= "paa" and (famcode:find("^paa") or famcode:find("^ngf"))
end
local function infobox(fam)
local ret = {}
insert(ret, "<table class=\"wikitable\">\n")
insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//en.wiktionary.org/w/index.php?title=Module:families/data&action=edit Edit family data]</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = fam: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>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = fam: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>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = fam: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>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>")
local protoLanguage = fam:getProtoLanguage()
if protoLanguage then
insert(ret, "[[:Category:" .. protoLanguage:getCategoryName() .. "|" .. protoLanguage:getCanonicalName() .. "]]")
else
insert(ret, "none")
end
insert(ret, "</td>\n")
insert(ret, "\n</tr>\n")
local parent = fam:getFamily()
if not parent then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "unassigned")
elseif parent:getCode() == "qfa-not" then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "not a family")
else
local chain = {}
while parent do
if family_has_no_category(parent) then
break
end
insert(chain, "[[:Category:" .. parent:getCategoryName() .. "|" .. parent:getCanonicalName() .. "]]")
parent = parent:getFamily()
end
if #chain == 0 then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "no parents")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent famil"
.. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>")
for i = #chain, 1, -1 do
insert(ret, "<ul><li>" .. chain[i])
end
insert(ret, string.rep("</li></ul>", #chain))
end
end
insert(ret, "</td>\n</tr>\n")
if fam:getWikidataItem() and mw.wikibase then
local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']'
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. content
.. '</div></div>'
end
local additional_information = {
["qfa-dis"] = "These are languages where there is no consensus concerning which family, if any, they belong to.",
["qfa-iso"] = "These are languages where there is general agreement that the language has no known relatives.",
["qfa-mix"] = "A [[mixed language]] is a language which is composed of two different languages.",
["qfa-unc"] = "These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. " ..
"They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between " ..
"languages that cannot be classified (due to insufficient data) and those that merely have not been classified " ..
"(due to insufficient research).",
}
local preceding_information = {
["qfa-dis"] = "{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}",
["qfa-iso"] = "{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}",
["qfa-unc"] = "{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}",
["qfa-mix"] = "{{also|Category:Creole or pidgin languages}}",
["crp"] = "{{also|Category:Mixed languages}}",
}
local specially_named_families = {
["Languages of disputed affiliation"] = "qfa-dis",
["Language isolates"] = "qfa-iso",
}
local specially_named_family_sort_keys = {
["Languages of disputed affiliation"] = "Disputed affiliation",
["Language isolates"] = "Isolate",
}
insert(raw_handlers, function(data)
local family = require("Module:families").getByCategoryName(data.category)
if not family then
local special_code = specially_named_families[data.category]
if special_code then
family = require("Module:families").getByCode(special_code)
if not family then
error(("Internal error: Family code '%s' is an invalid family code."):format(special_code))
end
end
end
if not family then
return nil
end
local parent_fam = family:getFamily()
local first_parent, parent_sort_key, first_parent_sort_key
if not parent_fam or family_has_no_category(parent_fam) then
first_parent = "Languages by family"
parent_sort_key = specially_named_family_sort_keys[data.category]
first_parent_sort_key = "*" .. (parent_sort_key or "")
else
first_parent = parent_fam:getCategoryName()
end
local description, additional = "", ""
local topright
local preceding = preceding_information[family:getCode()]
local additional_preface = additional_information[family:getCode()]
if additional_preface then
additional_preface = additional_preface .. "\n\n"
else
additional_preface = ""
end
if family_is_not_a_family(family) then
additional_preface = additional_preface ..
"This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] " ..
"(i.e. a set of linguistically related languages descending from a common parent).\n\n" ..
"Information about this family:\n\n"
else
additional_preface = "Information about " .. family:getCanonicalName() .. ":\n\n"
end
if not data.called_from_inside then
topright = {}
local wikipedia_art = family:getWikipediaArticle("noCategoryFallback")
if wikipedia_art then
insert(topright, "{{wp|" .. wikipedia_art .. "}}")
end
local commons_cat = family:getCommonsCategory()
if commons_cat then
insert(topright, "{{commonscat|" .. commons_cat:gsub("^Category:", "") .. "}}")
end
topright = #topright > 0 and concat(topright, "\n") or nil
description = "This is the main category of the '''" .. family:getDisplayForm() .. "'''."
additional = additional_preface .. infobox(family)
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
family:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
additional = additional .. NavFrame_for_family_tree(
tree_of_descendants,
"Family tree")
else
additional = additional .. "\n\n" .. ucfirst(family:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
local parents = {
{name = first_parent, sort = first_parent_sort_key},
{name = "All language families", sort = parent_sort_key},
}
if parent_fam and parent_fam:getCode() == "sgn" then
insert(parents, "All sign languages")
end
if family_is_papuan(family) then
insert(parents, "Papuan languages")
end
return {
preceding = preceding,
topright = topright,
description = description,
additional = additional,
parents = parents,
breadcrumb = family:getCanonicalName(),
can_be_empty = true,
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
6919n0du14bef3ubqiam4jk09u8y1k1
88368
88367
2026-07-27T00:12:04Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/families]]
88367
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["All language families"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category lists all [[language family|language families]].",
parents = {"Fundamental"},
}
raw_categories["Languages by family"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category contains all languages categorized hierarchically according to the [[language family]] they belong to.",
additional = "Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].",
parents = {
{name = "All languages", sort = " "},
{name = "All language families", sort = " "},
},
}
raw_categories["Unassigned languages"] = {
description = "Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.",
additional = [=[This should be distinguished from:
* [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it);
* [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and
* [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=],
parents = {
{name = "Languages by family", sort = "*"},
"All language families",
},
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function family_is_not_a_family(fam)
if not fam then
return false
elseif fam:getCode() == "qfa-not" then
return true
else
return family_is_not_a_family(fam:getFamily())
end
end
local function family_has_no_category(fam)
local famcode = fam:getCode()
if famcode == "paa" then
return false -- Papuan languages are not a family but have a category
elseif famcode == "qfa-iso" or famcode == "qfa-not" then
return true
else
local parfam = fam:getFamily()
if parfam and parfam:getCode() == "qfa-not" then
-- Constructed languages, sign languages, etc.; no category for them
return true
end
end
return false
end
-- Currently all Papuan families begin with "paa" or "ngf",
local function family_is_papuan(fam)
local famcode = fam:getCode()
return famcode ~= "paa" and (famcode:find("^paa") or famcode:find("^ngf"))
end
local function infobox(fam)
local ret = {}
insert(ret, "<table class=\"wikitable\">\n")
insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//en.wiktionary.org/w/index.php?title=Module:families/data&action=edit Edit family data]</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = fam: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>Other names</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = fam: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>Aliases</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = fam: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>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>")
local protoLanguage = fam:getProtoLanguage()
if protoLanguage then
insert(ret, "[[:Category:" .. protoLanguage:getCategoryName() .. "|" .. protoLanguage:getCanonicalName() .. "]]")
else
insert(ret, "none")
end
insert(ret, "</td>\n")
insert(ret, "\n</tr>\n")
local parent = fam:getFamily()
if not parent then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "unassigned")
elseif parent:getCode() == "qfa-not" then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "not a family")
else
local chain = {}
while parent do
if family_has_no_category(parent) then
break
end
insert(chain, "[[:Category:" .. parent:getCategoryName() .. "|" .. parent:getCanonicalName() .. "]]")
parent = parent:getFamily()
end
if #chain == 0 then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "no parents")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent famil"
.. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>")
for i = #chain, 1, -1 do
insert(ret, "<ul><li>" .. chain[i])
end
insert(ret, string.rep("</li></ul>", #chain))
end
end
insert(ret, "</td>\n</tr>\n")
if fam:getWikidataItem() and mw.wikibase then
local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']'
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. content
.. '</div></div>'
end
local additional_information = {
["qfa-dis"] = "These are languages where there is no consensus concerning which family, if any, they belong to.",
["qfa-iso"] = "These are languages where there is general agreement that the language has no known relatives.",
["qfa-mix"] = "A [[mixed language]] is a language which is composed of two different languages.",
["qfa-unc"] = "These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. " ..
"They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between " ..
"languages that cannot be classified (due to insufficient data) and those that merely have not been classified " ..
"(due to insufficient research).",
}
local preceding_information = {
["qfa-dis"] = "{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}",
["qfa-iso"] = "{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}",
["qfa-unc"] = "{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}",
["qfa-mix"] = "{{also|Category:Creole or pidgin languages}}",
["crp"] = "{{also|Category:Mixed languages}}",
}
local specially_named_families = {
["Languages of disputed affiliation"] = "qfa-dis",
["Language isolates"] = "qfa-iso",
}
local specially_named_family_sort_keys = {
["Languages of disputed affiliation"] = "Disputed affiliation",
["Language isolates"] = "Isolate",
}
insert(raw_handlers, function(data)
local family = require("Module:families").getByCategoryName(data.category)
if not family then
local special_code = specially_named_families[data.category]
if special_code then
family = require("Module:families").getByCode(special_code)
if not family then
error(("Internal error: Family code '%s' is an invalid family code."):format(special_code))
end
end
end
if not family then
return nil
end
local parent_fam = family:getFamily()
local first_parent, parent_sort_key, first_parent_sort_key
if not parent_fam or family_has_no_category(parent_fam) then
first_parent = "Languages by family"
parent_sort_key = specially_named_family_sort_keys[data.category]
first_parent_sort_key = "*" .. (parent_sort_key or "")
else
first_parent = parent_fam:getCategoryName()
end
local description, additional = "", ""
local topright
local preceding = preceding_information[family:getCode()]
local additional_preface = additional_information[family:getCode()]
if additional_preface then
additional_preface = additional_preface .. "\n\n"
else
additional_preface = ""
end
if family_is_not_a_family(family) then
additional_preface = additional_preface ..
"This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] " ..
"(i.e. a set of linguistically related languages descending from a common parent).\n\n" ..
"Information about this family:\n\n"
else
additional_preface = "Information about " .. family:getCanonicalName() .. ":\n\n"
end
if not data.called_from_inside then
topright = {}
local wikipedia_art = family:getWikipediaArticle("noCategoryFallback")
if wikipedia_art then
insert(topright, "{{wp|" .. wikipedia_art .. "}}")
end
local commons_cat = family:getCommonsCategory()
if commons_cat then
insert(topright, "{{commonscat|" .. commons_cat:gsub("^Category:", "") .. "}}")
end
topright = #topright > 0 and concat(topright, "\n") or nil
description = "This is the main category of the '''" .. family:getDisplayForm() .. "'''."
additional = additional_preface .. infobox(family)
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
family:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
additional = additional .. NavFrame_for_family_tree(
tree_of_descendants,
"Family tree")
else
additional = additional .. "\n\n" .. ucfirst(family:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
local parents = {
{name = first_parent, sort = first_parent_sort_key},
{name = "All language families", sort = parent_sort_key},
}
if parent_fam and parent_fam:getCode() == "sgn" then
insert(parents, "All sign languages")
end
if family_is_papuan(family) then
insert(parents, "Papuan languages")
end
return {
preceding = preceding,
topright = topright,
description = description,
additional = additional,
parents = parents,
breadcrumb = family:getCanonicalName(),
can_be_empty = true,
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
6919n0du14bef3ubqiam4jk09u8y1k1
Mòideal:category tree/lang
828
17714
88369
2026-04-13T15:14:38Z
en>Mellohi!
0
88369
Scribunto
text/plain
-- This module contains a list of languages with lang-specific modules.
local langs_with_modules = {
["acm"] = true,
["acw"] = true,
["acy"] = true,
["aeb"] = true,
["afb"] = true,
["aii"] = true,
["ajp"] = true,
["akk"] = true,
["akl"] = true,
["ang"] = true,
["apc"] = true,
["apd"] = true,
["ar"] = true,
["arn"] = true,
["ars"] = true,
["ary"] = true,
["arz"] = true,
["ayl"] = true,
["az"] = true,
["bbl"] = true,
["be"] = true,
["bcl"] = true,
["bg"] = true,
["bku"] = true,
["ca"] = true,
["cbk"] = true,
["ce"] = true,
["ceb"] = true,
["cpi"] = true,
["cs"] = true,
["csb"] = true,
["cu"] = true,
["cy"] = true,
["de"] = true,
["egy"] = true,
["el"] = true,
["en"] = true,
["enm"] = true,
["eo"] = true,
["es"] = true,
["et"] = true,
["eu"] = true,
["fa"] = true,
["fax"] = true,
["fi"] = true,
["fr"] = true,
["fro"] = true,
["fy"] = true,
["gl"] = true,
["gmh"] = true,
["goh"] = true,
["got"] = true,
["grk-pro"] = true,
["gmq-osw"] = true,
["gmw-pro"] = true,
["gu"] = true,
["gug"] = true,
["he"] = true,
["hi"] = true,
["hil"] = true,
["hnn"] = true,
["hrx"] = true,
["hsb"] = true,
["hu"] = true,
["id"] = true,
["ilo"] = true,
["inc-apa"] = true,
["inc-ash"] = true,
["ine-bsl-pro"] = true,
["ine-pro"] = true,
["ira-pro"] = true,
["is"] = true,
["it"] = true,
["ja"] = true,
["jbo"] = true,
["jv"] = true,
["ket"] = true,
["klj"] = true,
["kn"] = true,
["kne"] = true,
["ko"] = true,
["krj"] = true,
["ky"] = true,
["la"] = true,
["lo"] = true,
["mdh"] = true,
["mhr"] = true,
["mk"] = true,
["moh"] = true,
["mr"] = true,
["mrw"] = true,
["ms"] = true,
["mt"] = true,
["mul"] = true,
["mvi"] = true,
["mwl"] = true,
["nan-hbl"] = true,
["nb"] = true,
["ne"] = true,
["nl"] = true,
["nn"] = true,
["non"] = true,
["ny"] = true,
["odt"] = true,
["orv"] = true,
["osx"] = true,
["pag"] = true,
["pam"] = true,
["phl"] = true,
["pi"] = true,
["pl"] = true,
["pra"] = true,
["pt"] = true,
["ro"] = true,
["roa-opt"] = true,
["rsk"] = true,
["ru"] = true,
["rue"] = true,
["sa"] = true,
["sc"] = true,
["sd"] = true,
["sei"] = true,
["sga"] = true,
["sh"] = true,
["shn"] = true,
["shu"] = true,
["sk"] = true,
["skr"] = true,
["sw"] = true,
["syc"] = true,
["szl"] = true,
["te"] = true,
["tg"] = true,
["th"] = true,
["tl"] = true,
["tpw"] = true,
["tsg"] = true,
["uk"] = true,
["ulw"] = true,
["ur"] = true,
["vec"] = true,
["vep"] = true,
["vi"] = true,
["war"] = true,
["yrl"] = true,
["zhx"] = true,
["zle-ono"] = true,
["zle-ort"] = true,
["zlw-ocs"] = true,
}
return langs_with_modules
mzoxgt494umbm0vdse25cln2salqsc1
88370
88369
2026-07-27T00:12:13Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/lang]]
88369
Scribunto
text/plain
-- This module contains a list of languages with lang-specific modules.
local langs_with_modules = {
["acm"] = true,
["acw"] = true,
["acy"] = true,
["aeb"] = true,
["afb"] = true,
["aii"] = true,
["ajp"] = true,
["akk"] = true,
["akl"] = true,
["ang"] = true,
["apc"] = true,
["apd"] = true,
["ar"] = true,
["arn"] = true,
["ars"] = true,
["ary"] = true,
["arz"] = true,
["ayl"] = true,
["az"] = true,
["bbl"] = true,
["be"] = true,
["bcl"] = true,
["bg"] = true,
["bku"] = true,
["ca"] = true,
["cbk"] = true,
["ce"] = true,
["ceb"] = true,
["cpi"] = true,
["cs"] = true,
["csb"] = true,
["cu"] = true,
["cy"] = true,
["de"] = true,
["egy"] = true,
["el"] = true,
["en"] = true,
["enm"] = true,
["eo"] = true,
["es"] = true,
["et"] = true,
["eu"] = true,
["fa"] = true,
["fax"] = true,
["fi"] = true,
["fr"] = true,
["fro"] = true,
["fy"] = true,
["gl"] = true,
["gmh"] = true,
["goh"] = true,
["got"] = true,
["grk-pro"] = true,
["gmq-osw"] = true,
["gmw-pro"] = true,
["gu"] = true,
["gug"] = true,
["he"] = true,
["hi"] = true,
["hil"] = true,
["hnn"] = true,
["hrx"] = true,
["hsb"] = true,
["hu"] = true,
["id"] = true,
["ilo"] = true,
["inc-apa"] = true,
["inc-ash"] = true,
["ine-bsl-pro"] = true,
["ine-pro"] = true,
["ira-pro"] = true,
["is"] = true,
["it"] = true,
["ja"] = true,
["jbo"] = true,
["jv"] = true,
["ket"] = true,
["klj"] = true,
["kn"] = true,
["kne"] = true,
["ko"] = true,
["krj"] = true,
["ky"] = true,
["la"] = true,
["lo"] = true,
["mdh"] = true,
["mhr"] = true,
["mk"] = true,
["moh"] = true,
["mr"] = true,
["mrw"] = true,
["ms"] = true,
["mt"] = true,
["mul"] = true,
["mvi"] = true,
["mwl"] = true,
["nan-hbl"] = true,
["nb"] = true,
["ne"] = true,
["nl"] = true,
["nn"] = true,
["non"] = true,
["ny"] = true,
["odt"] = true,
["orv"] = true,
["osx"] = true,
["pag"] = true,
["pam"] = true,
["phl"] = true,
["pi"] = true,
["pl"] = true,
["pra"] = true,
["pt"] = true,
["ro"] = true,
["roa-opt"] = true,
["rsk"] = true,
["ru"] = true,
["rue"] = true,
["sa"] = true,
["sc"] = true,
["sd"] = true,
["sei"] = true,
["sga"] = true,
["sh"] = true,
["shn"] = true,
["shu"] = true,
["sk"] = true,
["skr"] = true,
["sw"] = true,
["syc"] = true,
["szl"] = true,
["te"] = true,
["tg"] = true,
["th"] = true,
["tl"] = true,
["tpw"] = true,
["tsg"] = true,
["uk"] = true,
["ulw"] = true,
["ur"] = true,
["vec"] = true,
["vep"] = true,
["vi"] = true,
["war"] = true,
["yrl"] = true,
["zhx"] = true,
["zle-ono"] = true,
["zle-ort"] = true,
["zlw-ocs"] = true,
}
return langs_with_modules
mzoxgt494umbm0vdse25cln2salqsc1
Mòideal:category tree/poscatboiler
828
17715
88371
2026-02-16T05:03:55Z
en>Benwing2
0
allow etym langs as specified lang for categories like [[Category:Hazaragi reference templates]]
88371
Scribunto
text/plain
local lang_independent_data = require("Module:category tree/data")
local lang_specific_module = "Module:category tree/lang"
local lang_specific_module_prefix = lang_specific_module .. "/"
local family_specific_module = "Module:category tree/fam"
local family_specific_module_prefix = family_specific_module .. "/"
local labels_utilities_module = "Module:labels/utilities"
local template_parser_module = "Module:template parser"
local concat = table.concat
local dump = mw.dumpObject
local expand_template = require("Module:frame").expandTemplate
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local lcfirst = require("Module:string utilities").lcfirst
local list_to_set = require("Module:table").listToSet
local make_title = mw.title.makeTitle
local new_title = mw.title.new
local parse = require(template_parser_module).parse
local sparse_concat = require("Module:table").sparseConcat
local tostring = tostring
local type = type
local ucfirst = require("Module:string utilities").ucfirst
local uupper = require("Module:string utilities").upper
local function internal_error(msg)
error("Internal error: " .. msg)
end
local function get_lang(...)
local _get_lang = require("Module:languages").getByCode
function get_lang(...)
return _get_lang(...) or require("Module:languages/errorGetBy").code(...)
end
return get_lang(...)
end
local function get_script(...)
local _get_script = require("Module:scripts").getByCode
function get_script(code)
return _get_script(code) or require("Module:languages/error")(code, true, "script code")
end
return get_script(...)
end
-- Category object
local Category = {}
Category.__index = Category
function Category:get_originating_info()
local originating_info = ""
if self._info.originating_label then
originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])"
end
return originating_info
end
local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"}
function Category.new(info)
for key in pairs(info) do
if not valid_keys[key] then
internal_error("The parameter \"" .. key .. "\" was not recognized.")
end
end
local self = setmetatable({}, Category)
self._info = info
if not self._info.label then
internal_error("No label was specified.")
end
self:initCommon()
if not self._data then
internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".")
end
return self
end
function Category:initCommon()
local function patch_args(args)
-- This fixes the issue with Scribunto automatically converting keys
-- in a table as numbers to strings, which in turn causes a circular
-- error for having argument parameter names as numbers as strings.
if type(args) ~= "table" then
return args
end
local new_args = {}
for k, v in pairs(args) do
if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then
new_args[tonumber(k)] = patch_args(v)
else
new_args[k] = patch_args(v)
end
end
return new_args
end
local args_handled = false
if self._info.raw then
-- Check if the category exists
local raw_categories = lang_independent_data["RAW_CATEGORIES"]
self._data = raw_categories[self._info.label]
if self._data then
if self._data.lang then
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
else
-- Go through raw handlers
local data = {
category = self._info.label,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if self._data then
-- Update the label if the handler specified a canonical name for it.
if self._data.canonical_name then
self._info.canonical_name = self._data.canonical_name
end
if self._data.lang then
if type(self._data.lang) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
if type(self._data.sc) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
end
end
else
-- Already parsed into language + label
if self._info.code then
self._lang = get_lang(self._info.code, nil, true)
else
self._lang = nil
end
if self._info.sc then
self._sc = get_script(self._info.sc)
else
self._sc = nil
end
self._info.orig_label = self._info.label
if not self._lang then
-- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be
-- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]];
-- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language
-- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella
-- categories, storing the original into `orig_label`, and correct it later if needed.
self._info.label = lcfirst(self._info.label)
end
-- First, check lang-specific labels and handlers if this is not an umbrella category.
if self._lang then
local objects_with_modules = require(lang_specific_module)
local obj, seen = self._lang, {}
local object_specific_module_prefix = lang_specific_module_prefix
local is_family = false
repeat
if objects_with_modules[obj:getCode()] then
local module = object_specific_module_prefix .. obj:getCode()
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
self._data = labels_and_handlers.LABELS[self._info.label]
if self._data then
if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
end
end
if not self._data and labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
if not is_family and self._data.umbrella == nil and
self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
seen[obj:getCode()] = true
obj = obj:getFamily()
if not is_family then
is_family = true
object_specific_module_prefix = family_specific_module_prefix
objects_with_modules = require(family_specific_module)
end
until not obj or seen[obj:getCode()]
end
local function fetch_label_data(labels)
self._data = labels[self._info.label]
-- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable
-- in umbrella categories.
if not self._data then
self._data = labels[self._info.orig_label]
if self._data then
self._info.label = self._info.orig_label
end
end
end
-- Then check lang-independent labels.
if not self._data then
-- lang_independent_data.LABELS should always exist.
fetch_label_data(lang_independent_data.LABELS)
if not self._data and not self._lang then
-- Check family-specific labels for umbrella label.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
fetch_label_data(labels_and_handlers.LABELS)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
end
end
-- Then check lang-independent handlers.
if not self._data then
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if not self._data and not self._lang then
-- Check family-specific labels for umbrella handler.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
end
end
end
if not args_handled and self._data and self._info.args and next(self._info.args) then
local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])"
local args_text = {}
for k, v in pairs(self._info.args) do
insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v)))
end
error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " ..
concat(args_text, ", "))
end
if self._sc and not self._lang then
internal_error("Umbrella categories cannot have a script specified.")
end
end
function Category:convert_spec_to_string(desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc))
end
desc = desc {
lang = self._lang,
sc = self._sc,
label = self._info.label,
raw = self._info.raw,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc))
end
local function add_obj_args(args, obj, obj_type)
if obj then
args[obj_type .. "code"] = obj:getCode()
args[obj_type .. "name"] = obj:getCanonicalName()
args[obj_type .. "disp"] = obj:getDisplayForm()
args[obj_type .. "cat"] = obj:getCategoryName()
args[obj_type .. "link"] = obj:makeCategoryLink()
end
end
-- Expands `desc` like a template, passing values for specs like {{{langname}}}.
function Category:substitute_template_specs(desc)
-- This may end up happening twice but that's OK as the function is (usually) idempotent.
-- FIXME: Not idempotent if a preprocessed template returns wikicode.
desc = self:convert_spec_to_string(desc)
if not desc then
return nil
end
-- Populate the substitution arguments.
local args = {}
args.umbrella_msg = "This is an umbrella category. It contains no dictionary entries, but only other, language-specific categories, which in turn contain relevant terms in a given language."
args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic."
add_obj_args(args, self._lang, "lang")
add_obj_args(args, self._sc, "sc")
return parse(desc, true):expand(args)
end
function Category:substitute_template_specs_in_args(args)
if not args then
return args
end
local pinfo = {}
for k, v in pairs(args) do
pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v)
end
return pinfo
end
function Category:make_new(info)
info.originating_label = self._info.label
info.originating_module = self._data.module
info.called_from_inside = true
return Category.new(info)
end
function Category:getBreadcrumbName()
local ret
if self._lang or self._info.raw then
ret = self._data.breadcrumb or self._data.breadcrumb_and_first_sort_key or
self._data.breadcrumb_and_first_sort_base or nil
else
ret = self._data.umbrella and (self._data.umbrella.breadcrumb or
self._data.umbrella.breadcrumb_and_first_sort_key or self._data.umbrella.breadcrumb_and_first_sort_base) or
nil
end
if not ret then
ret = self._info.label
end
if type(ret) ~= "table" then
ret = {name = ret}
end
local name = self:substitute_template_specs(ret.name)
local nocap = ret.nocap
if self._sc then
name = name .. " in " .. self._sc:getDisplayForm()
end
return name, nocap
end
local function expand_toc_template_if(template)
local template_obj = new_title(template, 10)
if template_obj.exists then
return expand_template{title = template_obj.text}
end
return nil
end
-- Return the textual expansion of the first existing template among the given templates, first performing
-- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any).
-- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in,
-- treat it like a one-element list consisting of that string.
function Category:get_template_text(templates)
if templates == nil then
return nil
elseif type(templates) ~= "table" then
templates = {templates}
end
for _, template in ipairs(templates) do
if template == false then
return false
end
template = self:substitute_template_specs(template)
return expand_toc_template_if(template)
end
return nil
end
function Category:getTOC(toc_type)
-- Type "none" means everything fits on a single page; in that case, display nothing.
if toc_type == "none" then
return nil
end
local templates, fallback_templates
-- If TOC type is "full" (more than 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. look up and expand the `toc_template` templates (normal or umbrella, as above);
-- 3. do the default behavior, which is as follows:
-- 3a. look up a language-specific "full" template according to the current language (using English if there
-- is no current language);
-- 3b. look up a script-specific "full" template according to the first script of current language (using English
-- if there is no current language);
-- 3c. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 3d. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 3e. display nothing.
--
-- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. do the default behavior, which is as follows:
-- 2a. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 2b. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 2c. display nothing.
local data_source
if self._lang or self._info.raw then
data_source = self._data
else
data_source = self._data.umbrella
end
if data_source then
if toc_type == "full" then
templates = data_source.toc_template_full
fallback_templates = data_source.toc_template
else
templates = data_source.toc_template
end
end
local text = self:get_template_text(templates)
if text then
return text
elseif text == false then
return nil
end
text = self:get_template_text(fallback_templates)
if text then
return text
elseif text == false then
return nil
end
local default_toc_templates_to_check = {}
local lang, sc = self:getCatfixInfo()
local langcode = lang and lang:getCode() or "en"
local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn"
-- FIXME: What is toctemplateprefix used for?
local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC"
if toc_type == "full" then
insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname))
end
insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname))
for _, toc_template in ipairs(default_toc_templates_to_check) do
local toc_template_text = expand_toc_template_if(toc_template)
if toc_template_text then
return toc_template_text
end
end
return nil
end
function Category:getInfo()
return self._info
end
function Category:getDataModule()
return self._data.module
end
function Category:canBeEmpty()
if self._lang or self._info.raw then
return self._data.can_be_empty
end
return self._data.umbrella and self._data.umbrella.can_be_empty
end
function Category:isHidden()
if self._lang or self._info.raw then
return self._data.hidden
end
return self._data.umbrella and self._data.umbrella.hidden
end
function Category:getCategoryName()
if self._info.raw then
return self._info.canonical_name or self._info.label
elseif self._lang then
local ret = self._lang:getCanonicalName() .. " " .. self._info.label
if self._sc then
ret = ret .. " in " .. self._sc:getDisplayForm()
end
return ucfirst(ret)
end
local ret = ucfirst(self._info.label)
if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then
ret = ret .. " by language"
end
return ret
end
function Category:getTopright()
if self._lang or self._info.raw then
return self:substitute_template_specs(self._data.topright)
end
return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright)
end
function Category:display_title(displaytitle, lang)
if type(displaytitle) == "string" then
displaytitle = self:substitute_template_specs(displaytitle)
else
displaytitle = displaytitle(self:getCategoryName(), lang)
end
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Category:" .. displaytitle)
end
function Category:get_labels_categorizing()
local m_labels_utilities = require(labels_utilities_module)
local pos_cat_labels, sense_cat_labels, use_tlb
pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang)
local sense_label = self._info.label:match("^(.*) terms$")
if sense_label then
use_tlb = true
else
sense_label = self._info.label:match("^terms with (.*) senses$")
end
if not sense_label then
return nil
end
sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang)
if use_tlb then
return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang)
end
local all_labels = pos_cat_labels
for k, v in pairs(sense_cat_labels) do
all_labels[k] = v
end
return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang)
end
-- FIXME: this is clunky.
local function remove_lang_params(desc)
-- Simply remove a language name/code/category from the beginning of the string, but replace the language name
-- in the middle of the string with either "specific languages" or "specific-language" depending on whether the
-- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong,
-- in which case the category in question should supply its own umbrella description.
desc = desc:gsub("^{{{langname}}} ", "")
:gsub("{{{langname}}} %(", "specific languages (")
:gsub("{{{langname}}}([.,])", "specific languages%1")
:gsub("{{{langname}}} ", "specific-language ")
:gsub("{{{langdisp}}}", "specific languages")
:gsub("{{{langlink}}}", "specific languages")
return desc
end
function Category:getDescription(isChild)
-- Allows different text in the list of a category's children
local isChild = isChild == "child"
if self._lang or self._info.raw then
if not isChild and self._data.displaytitle then
self:display_title(self._data.displaytitle, self._lang)
end
if self._sc then
return self:getCategoryName() .. "."
end
local desc = self:substitute_template_specs(self._data.description)
if not desc then
return nil
elseif isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(self._data.preceding),
desc,
self:substitute_template_specs(self._data.additional),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
local umbrella = self._data.umbrella
if not isChild and umbrella and umbrella.displaytitle then
self:display_title(umbrella.displaytitle)
end
local desc = self:substitute_template_specs(umbrella and umbrella.description)
local has_umbrella_desc = not not desc
if not desc then
desc = self:convert_spec_to_string(self._data.description)
if desc then
desc = remove_lang_params(desc)
desc = lcfirst(desc)
desc = desc:gsub("%.$", "")
desc = "Categories with " .. desc .. "."
else
desc = "Categories with " .. self._info.label .. " in various specific languages."
end
desc = self:substitute_template_specs(desc)
end
if isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding),
desc,
self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional),
self:substitute_template_specs("{{{umbrella_msg}}}"),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
function Category:new_sortkey(sortkey)
local sortkey_type = type(sortkey)
if sortkey_type == "string" then
sortkey = uupper(sortkey)
elseif sortkey_type == "table" then
function sortkey:makeSortKey()
local sort_func = self.sort_func
if sort_func ~= nil then
return sort_func(self.sort_base)
end
local lang = self.lang
if lang == nil then
return self.sort_base
end
lang = get_lang(lang, nil, true)
if lang == nil then
return self.sort_base
end
local sc = self.sc
if sc ~= nil then
sc = get_script(sc)
end
return lang:makeSortKey(self.sort_base, sc)
end
end
return sortkey
end
function Category:inherit_spec(spec, parent_spec, substitute_result)
if spec == false then
return nil
end
local retval = spec or parent_spec
if substitute_result then
retval = self:substitute_template_specs(retval)
end
return retval
end
function Category:canonicalize_parents_children(cats, is_children, fallback_sort_key, fallback_sort_base)
if not cats then
return nil
elseif type(cats) == "table" then
if cats.name or cats.module then
cats = {cats}
elseif #cats == 0 then
return nil
end
else
cats = {cats}
end
local ret = {}
for _, cat in ipairs(cats) do
if type(cat) ~= "table" or not cat.name and not cat.module then
cat = {name = cat}
end
insert(ret, cat)
end
local is_umbrella = not self._lang and not self._info.raw
local table_type = is_children and "extra_children" or "parents"
for i, cat in ipairs(ret) do
local raw
if self._info.raw or is_umbrella then
raw = not cat.is_label
else
raw = cat.raw
end
local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute")
local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute")
-- Get the sortkey.
local sortkey = self:inherit_spec(cat.sort, i == 1 and (fallback_sort_key or fallback_sort_base and {sort_base = fallback_sort_base}) or nil)
if type(sortkey) == "table" then
sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or
internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
if sortkey.sort_func then
-- Not allowed to give a lang and/or script if sort_func is given.
local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil
if bad_spec then
internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type ..
"' .sort table for '" .. self._info.label .. "' category entry in module '" ..
(self._data.module or "unknown") .. "'")
end
else
sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute")
sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute")
end
else
sortkey = self:substitute_template_specs(sortkey)
end
local name
if cat.module then
-- A reference to a category using another category tree module.
if not cat.args then
internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
end
name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args))
else
name = cat.name
if not name then
internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly
name = self:substitute_template_specs(name)
if name:find("^Category:") then
-- It's a non-poscatboiler category name.
sortkey = sortkey or is_children and name:gsub("^Category:", "") or self:getCategoryName()
else
-- It's a label.
sortkey = sortkey or is_children and name or self._info.label
name = self:make_new{
label = name, code = lang, sc = sc,
raw = raw, args = self:substitute_template_specs_in_args(cat.args)
}
end
end
end
sortkey = sortkey or is_children and " " or self._info.label
ret[i] = {
name = name,
description = is_children and self:substitute_template_specs(cat.description) or nil,
sort = self:new_sortkey(sortkey)
}
end
return ret
end
function Category:getParents()
local is_umbrella, ret = not self._lang and not self._info.raw
if self._sc then
local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getCanonicalName() .. " script"}
local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args}
ret = {
{name = parent1, sort = self._sc:getCanonicalName()},
{name = parent2, sort = self._sc:getCanonicalName()},
}
else
local parents, fallback_sort_key, fallback_sort_base
if is_umbrella then
parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents
fallback_sort_key = self._data.umbrella and self._data.umbrella.breadcrumb_and_first_sort_key or nil
fallback_sort_base = self._data.umbrella and self._data.umbrella.breadcrumb_and_first_sort_base or nil
else
parents = self._data.parents
fallback_sort_key = self._data.breadcrumb_and_first_sort_key
fallback_sort_base = self._data.breadcrumb_and_first_sort_base
end
ret = self:canonicalize_parents_children(parents, nil, fallback_sort_key, fallback_sort_base)
if not ret then
return nil
end
end
local self_cat = self:getCategoryName()
for _, parent in ipairs(ret) do
local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName()
if self_cat == parent_cat then
internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat))
end
end
return ret
end
function Category:getChildren()
local is_umbrella = not self._lang and not self._info.raw
local children = self._data.children
local ret = {}
if not is_umbrella and children then
for _, child in ipairs(children) do
child = mw.clone(child)
if type(child) ~= "table" then
child = {name = child}
end
if not child.sort then
child.sort = child.name
end
-- FIXME, is preserving the script correct?
child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc}
insert(ret, child)
end
end
local extra_children
if is_umbrella then
extra_children = self._data.umbrella and self._data.umbrella.extra_children
else
extra_children = self._data.extra_children
end
extra_children = self:canonicalize_parents_children(extra_children, "children")
if extra_children then
for _, child in ipairs(extra_children) do
insert(ret, child)
end
end
return #ret > 0 and ret or nil
end
function Category:getUmbrella()
local umbrella = self._data.umbrella
if umbrella == false or self._info.raw or not self._lang or self._sc then
return nil
end
-- If `umbrella` is a string, use that; otherwise, use the label.
return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label})
end
function Category:getAppendix()
-- FIXME, this should be customizable.
local lang, label = self._lang, self._info.label
if self._info.raw or not (lang and label) then
return nil
end
local appendix = make_title(100, lang:getCanonicalName() .. " " .. label)
return appendix.exists and appendix.fullText or nil
end
function Category:getCatfixInfo()
if self._lang or self._sc or self._info.raw then
local langcode, sccode = self._data.catfix, self._data.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
elseif langcode == nil then -- not false
lang = self._lang
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
elseif sccode == nil then -- not false
sc = self._sc
end
if lang then
lang = lang:getFull()
end
return lang, sc
elseif not self._data.umbrella then
return
end
-- umbrella
local langcode, sccode = self._data.umbrella.catfix, self._data.umbrella.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
end
if lang then
lang = lang:getFull()
end
return lang, sc
end
function Category:getTOCTemplateName()
-- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC()
-- implements its own default algorithm.
internal_error("This should never get called")
end
local export = {}
function export.main(info)
local self = setmetatable({_info = info}, Category)
self:initCommon()
return self._data and self or nil
end
export.new = Category.new
return export
0zckqnbqsykzp6uxaf5jmsdxpi6jme6
88372
88371
2026-07-27T00:13:30Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/poscatboiler]]
88371
Scribunto
text/plain
local lang_independent_data = require("Module:category tree/data")
local lang_specific_module = "Module:category tree/lang"
local lang_specific_module_prefix = lang_specific_module .. "/"
local family_specific_module = "Module:category tree/fam"
local family_specific_module_prefix = family_specific_module .. "/"
local labels_utilities_module = "Module:labels/utilities"
local template_parser_module = "Module:template parser"
local concat = table.concat
local dump = mw.dumpObject
local expand_template = require("Module:frame").expandTemplate
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local lcfirst = require("Module:string utilities").lcfirst
local list_to_set = require("Module:table").listToSet
local make_title = mw.title.makeTitle
local new_title = mw.title.new
local parse = require(template_parser_module).parse
local sparse_concat = require("Module:table").sparseConcat
local tostring = tostring
local type = type
local ucfirst = require("Module:string utilities").ucfirst
local uupper = require("Module:string utilities").upper
local function internal_error(msg)
error("Internal error: " .. msg)
end
local function get_lang(...)
local _get_lang = require("Module:languages").getByCode
function get_lang(...)
return _get_lang(...) or require("Module:languages/errorGetBy").code(...)
end
return get_lang(...)
end
local function get_script(...)
local _get_script = require("Module:scripts").getByCode
function get_script(code)
return _get_script(code) or require("Module:languages/error")(code, true, "script code")
end
return get_script(...)
end
-- Category object
local Category = {}
Category.__index = Category
function Category:get_originating_info()
local originating_info = ""
if self._info.originating_label then
originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])"
end
return originating_info
end
local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"}
function Category.new(info)
for key in pairs(info) do
if not valid_keys[key] then
internal_error("The parameter \"" .. key .. "\" was not recognized.")
end
end
local self = setmetatable({}, Category)
self._info = info
if not self._info.label then
internal_error("No label was specified.")
end
self:initCommon()
if not self._data then
internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".")
end
return self
end
function Category:initCommon()
local function patch_args(args)
-- This fixes the issue with Scribunto automatically converting keys
-- in a table as numbers to strings, which in turn causes a circular
-- error for having argument parameter names as numbers as strings.
if type(args) ~= "table" then
return args
end
local new_args = {}
for k, v in pairs(args) do
if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then
new_args[tonumber(k)] = patch_args(v)
else
new_args[k] = patch_args(v)
end
end
return new_args
end
local args_handled = false
if self._info.raw then
-- Check if the category exists
local raw_categories = lang_independent_data["RAW_CATEGORIES"]
self._data = raw_categories[self._info.label]
if self._data then
if self._data.lang then
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
else
-- Go through raw handlers
local data = {
category = self._info.label,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if self._data then
-- Update the label if the handler specified a canonical name for it.
if self._data.canonical_name then
self._info.canonical_name = self._data.canonical_name
end
if self._data.lang then
if type(self._data.lang) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
if type(self._data.sc) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
end
end
else
-- Already parsed into language + label
if self._info.code then
self._lang = get_lang(self._info.code, nil, true)
else
self._lang = nil
end
if self._info.sc then
self._sc = get_script(self._info.sc)
else
self._sc = nil
end
self._info.orig_label = self._info.label
if not self._lang then
-- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be
-- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]];
-- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language
-- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella
-- categories, storing the original into `orig_label`, and correct it later if needed.
self._info.label = lcfirst(self._info.label)
end
-- First, check lang-specific labels and handlers if this is not an umbrella category.
if self._lang then
local objects_with_modules = require(lang_specific_module)
local obj, seen = self._lang, {}
local object_specific_module_prefix = lang_specific_module_prefix
local is_family = false
repeat
if objects_with_modules[obj:getCode()] then
local module = object_specific_module_prefix .. obj:getCode()
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
self._data = labels_and_handlers.LABELS[self._info.label]
if self._data then
if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
end
end
if not self._data and labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
if not is_family and self._data.umbrella == nil and
self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
seen[obj:getCode()] = true
obj = obj:getFamily()
if not is_family then
is_family = true
object_specific_module_prefix = family_specific_module_prefix
objects_with_modules = require(family_specific_module)
end
until not obj or seen[obj:getCode()]
end
local function fetch_label_data(labels)
self._data = labels[self._info.label]
-- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable
-- in umbrella categories.
if not self._data then
self._data = labels[self._info.orig_label]
if self._data then
self._info.label = self._info.orig_label
end
end
end
-- Then check lang-independent labels.
if not self._data then
-- lang_independent_data.LABELS should always exist.
fetch_label_data(lang_independent_data.LABELS)
if not self._data and not self._lang then
-- Check family-specific labels for umbrella label.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
fetch_label_data(labels_and_handlers.LABELS)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
end
end
-- Then check lang-independent handlers.
if not self._data then
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if not self._data and not self._lang then
-- Check family-specific labels for umbrella handler.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
end
end
end
if not args_handled and self._data and self._info.args and next(self._info.args) then
local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])"
local args_text = {}
for k, v in pairs(self._info.args) do
insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v)))
end
error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " ..
concat(args_text, ", "))
end
if self._sc and not self._lang then
internal_error("Umbrella categories cannot have a script specified.")
end
end
function Category:convert_spec_to_string(desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc))
end
desc = desc {
lang = self._lang,
sc = self._sc,
label = self._info.label,
raw = self._info.raw,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc))
end
local function add_obj_args(args, obj, obj_type)
if obj then
args[obj_type .. "code"] = obj:getCode()
args[obj_type .. "name"] = obj:getCanonicalName()
args[obj_type .. "disp"] = obj:getDisplayForm()
args[obj_type .. "cat"] = obj:getCategoryName()
args[obj_type .. "link"] = obj:makeCategoryLink()
end
end
-- Expands `desc` like a template, passing values for specs like {{{langname}}}.
function Category:substitute_template_specs(desc)
-- This may end up happening twice but that's OK as the function is (usually) idempotent.
-- FIXME: Not idempotent if a preprocessed template returns wikicode.
desc = self:convert_spec_to_string(desc)
if not desc then
return nil
end
-- Populate the substitution arguments.
local args = {}
args.umbrella_msg = "This is an umbrella category. It contains no dictionary entries, but only other, language-specific categories, which in turn contain relevant terms in a given language."
args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic."
add_obj_args(args, self._lang, "lang")
add_obj_args(args, self._sc, "sc")
return parse(desc, true):expand(args)
end
function Category:substitute_template_specs_in_args(args)
if not args then
return args
end
local pinfo = {}
for k, v in pairs(args) do
pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v)
end
return pinfo
end
function Category:make_new(info)
info.originating_label = self._info.label
info.originating_module = self._data.module
info.called_from_inside = true
return Category.new(info)
end
function Category:getBreadcrumbName()
local ret
if self._lang or self._info.raw then
ret = self._data.breadcrumb or self._data.breadcrumb_and_first_sort_key or
self._data.breadcrumb_and_first_sort_base or nil
else
ret = self._data.umbrella and (self._data.umbrella.breadcrumb or
self._data.umbrella.breadcrumb_and_first_sort_key or self._data.umbrella.breadcrumb_and_first_sort_base) or
nil
end
if not ret then
ret = self._info.label
end
if type(ret) ~= "table" then
ret = {name = ret}
end
local name = self:substitute_template_specs(ret.name)
local nocap = ret.nocap
if self._sc then
name = name .. " in " .. self._sc:getDisplayForm()
end
return name, nocap
end
local function expand_toc_template_if(template)
local template_obj = new_title(template, 10)
if template_obj.exists then
return expand_template{title = template_obj.text}
end
return nil
end
-- Return the textual expansion of the first existing template among the given templates, first performing
-- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any).
-- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in,
-- treat it like a one-element list consisting of that string.
function Category:get_template_text(templates)
if templates == nil then
return nil
elseif type(templates) ~= "table" then
templates = {templates}
end
for _, template in ipairs(templates) do
if template == false then
return false
end
template = self:substitute_template_specs(template)
return expand_toc_template_if(template)
end
return nil
end
function Category:getTOC(toc_type)
-- Type "none" means everything fits on a single page; in that case, display nothing.
if toc_type == "none" then
return nil
end
local templates, fallback_templates
-- If TOC type is "full" (more than 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. look up and expand the `toc_template` templates (normal or umbrella, as above);
-- 3. do the default behavior, which is as follows:
-- 3a. look up a language-specific "full" template according to the current language (using English if there
-- is no current language);
-- 3b. look up a script-specific "full" template according to the first script of current language (using English
-- if there is no current language);
-- 3c. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 3d. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 3e. display nothing.
--
-- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. do the default behavior, which is as follows:
-- 2a. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 2b. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 2c. display nothing.
local data_source
if self._lang or self._info.raw then
data_source = self._data
else
data_source = self._data.umbrella
end
if data_source then
if toc_type == "full" then
templates = data_source.toc_template_full
fallback_templates = data_source.toc_template
else
templates = data_source.toc_template
end
end
local text = self:get_template_text(templates)
if text then
return text
elseif text == false then
return nil
end
text = self:get_template_text(fallback_templates)
if text then
return text
elseif text == false then
return nil
end
local default_toc_templates_to_check = {}
local lang, sc = self:getCatfixInfo()
local langcode = lang and lang:getCode() or "en"
local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn"
-- FIXME: What is toctemplateprefix used for?
local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC"
if toc_type == "full" then
insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname))
end
insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname))
for _, toc_template in ipairs(default_toc_templates_to_check) do
local toc_template_text = expand_toc_template_if(toc_template)
if toc_template_text then
return toc_template_text
end
end
return nil
end
function Category:getInfo()
return self._info
end
function Category:getDataModule()
return self._data.module
end
function Category:canBeEmpty()
if self._lang or self._info.raw then
return self._data.can_be_empty
end
return self._data.umbrella and self._data.umbrella.can_be_empty
end
function Category:isHidden()
if self._lang or self._info.raw then
return self._data.hidden
end
return self._data.umbrella and self._data.umbrella.hidden
end
function Category:getCategoryName()
if self._info.raw then
return self._info.canonical_name or self._info.label
elseif self._lang then
local ret = self._lang:getCanonicalName() .. " " .. self._info.label
if self._sc then
ret = ret .. " in " .. self._sc:getDisplayForm()
end
return ucfirst(ret)
end
local ret = ucfirst(self._info.label)
if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then
ret = ret .. " by language"
end
return ret
end
function Category:getTopright()
if self._lang or self._info.raw then
return self:substitute_template_specs(self._data.topright)
end
return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright)
end
function Category:display_title(displaytitle, lang)
if type(displaytitle) == "string" then
displaytitle = self:substitute_template_specs(displaytitle)
else
displaytitle = displaytitle(self:getCategoryName(), lang)
end
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Category:" .. displaytitle)
end
function Category:get_labels_categorizing()
local m_labels_utilities = require(labels_utilities_module)
local pos_cat_labels, sense_cat_labels, use_tlb
pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang)
local sense_label = self._info.label:match("^(.*) terms$")
if sense_label then
use_tlb = true
else
sense_label = self._info.label:match("^terms with (.*) senses$")
end
if not sense_label then
return nil
end
sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang)
if use_tlb then
return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang)
end
local all_labels = pos_cat_labels
for k, v in pairs(sense_cat_labels) do
all_labels[k] = v
end
return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang)
end
-- FIXME: this is clunky.
local function remove_lang_params(desc)
-- Simply remove a language name/code/category from the beginning of the string, but replace the language name
-- in the middle of the string with either "specific languages" or "specific-language" depending on whether the
-- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong,
-- in which case the category in question should supply its own umbrella description.
desc = desc:gsub("^{{{langname}}} ", "")
:gsub("{{{langname}}} %(", "specific languages (")
:gsub("{{{langname}}}([.,])", "specific languages%1")
:gsub("{{{langname}}} ", "specific-language ")
:gsub("{{{langdisp}}}", "specific languages")
:gsub("{{{langlink}}}", "specific languages")
return desc
end
function Category:getDescription(isChild)
-- Allows different text in the list of a category's children
local isChild = isChild == "child"
if self._lang or self._info.raw then
if not isChild and self._data.displaytitle then
self:display_title(self._data.displaytitle, self._lang)
end
if self._sc then
return self:getCategoryName() .. "."
end
local desc = self:substitute_template_specs(self._data.description)
if not desc then
return nil
elseif isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(self._data.preceding),
desc,
self:substitute_template_specs(self._data.additional),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
local umbrella = self._data.umbrella
if not isChild and umbrella and umbrella.displaytitle then
self:display_title(umbrella.displaytitle)
end
local desc = self:substitute_template_specs(umbrella and umbrella.description)
local has_umbrella_desc = not not desc
if not desc then
desc = self:convert_spec_to_string(self._data.description)
if desc then
desc = remove_lang_params(desc)
desc = lcfirst(desc)
desc = desc:gsub("%.$", "")
desc = "Categories with " .. desc .. "."
else
desc = "Categories with " .. self._info.label .. " in various specific languages."
end
desc = self:substitute_template_specs(desc)
end
if isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding),
desc,
self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional),
self:substitute_template_specs("{{{umbrella_msg}}}"),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
function Category:new_sortkey(sortkey)
local sortkey_type = type(sortkey)
if sortkey_type == "string" then
sortkey = uupper(sortkey)
elseif sortkey_type == "table" then
function sortkey:makeSortKey()
local sort_func = self.sort_func
if sort_func ~= nil then
return sort_func(self.sort_base)
end
local lang = self.lang
if lang == nil then
return self.sort_base
end
lang = get_lang(lang, nil, true)
if lang == nil then
return self.sort_base
end
local sc = self.sc
if sc ~= nil then
sc = get_script(sc)
end
return lang:makeSortKey(self.sort_base, sc)
end
end
return sortkey
end
function Category:inherit_spec(spec, parent_spec, substitute_result)
if spec == false then
return nil
end
local retval = spec or parent_spec
if substitute_result then
retval = self:substitute_template_specs(retval)
end
return retval
end
function Category:canonicalize_parents_children(cats, is_children, fallback_sort_key, fallback_sort_base)
if not cats then
return nil
elseif type(cats) == "table" then
if cats.name or cats.module then
cats = {cats}
elseif #cats == 0 then
return nil
end
else
cats = {cats}
end
local ret = {}
for _, cat in ipairs(cats) do
if type(cat) ~= "table" or not cat.name and not cat.module then
cat = {name = cat}
end
insert(ret, cat)
end
local is_umbrella = not self._lang and not self._info.raw
local table_type = is_children and "extra_children" or "parents"
for i, cat in ipairs(ret) do
local raw
if self._info.raw or is_umbrella then
raw = not cat.is_label
else
raw = cat.raw
end
local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute")
local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute")
-- Get the sortkey.
local sortkey = self:inherit_spec(cat.sort, i == 1 and (fallback_sort_key or fallback_sort_base and {sort_base = fallback_sort_base}) or nil)
if type(sortkey) == "table" then
sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or
internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
if sortkey.sort_func then
-- Not allowed to give a lang and/or script if sort_func is given.
local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil
if bad_spec then
internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type ..
"' .sort table for '" .. self._info.label .. "' category entry in module '" ..
(self._data.module or "unknown") .. "'")
end
else
sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute")
sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute")
end
else
sortkey = self:substitute_template_specs(sortkey)
end
local name
if cat.module then
-- A reference to a category using another category tree module.
if not cat.args then
internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
end
name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args))
else
name = cat.name
if not name then
internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly
name = self:substitute_template_specs(name)
if name:find("^Category:") then
-- It's a non-poscatboiler category name.
sortkey = sortkey or is_children and name:gsub("^Category:", "") or self:getCategoryName()
else
-- It's a label.
sortkey = sortkey or is_children and name or self._info.label
name = self:make_new{
label = name, code = lang, sc = sc,
raw = raw, args = self:substitute_template_specs_in_args(cat.args)
}
end
end
end
sortkey = sortkey or is_children and " " or self._info.label
ret[i] = {
name = name,
description = is_children and self:substitute_template_specs(cat.description) or nil,
sort = self:new_sortkey(sortkey)
}
end
return ret
end
function Category:getParents()
local is_umbrella, ret = not self._lang and not self._info.raw
if self._sc then
local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getCanonicalName() .. " script"}
local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args}
ret = {
{name = parent1, sort = self._sc:getCanonicalName()},
{name = parent2, sort = self._sc:getCanonicalName()},
}
else
local parents, fallback_sort_key, fallback_sort_base
if is_umbrella then
parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents
fallback_sort_key = self._data.umbrella and self._data.umbrella.breadcrumb_and_first_sort_key or nil
fallback_sort_base = self._data.umbrella and self._data.umbrella.breadcrumb_and_first_sort_base or nil
else
parents = self._data.parents
fallback_sort_key = self._data.breadcrumb_and_first_sort_key
fallback_sort_base = self._data.breadcrumb_and_first_sort_base
end
ret = self:canonicalize_parents_children(parents, nil, fallback_sort_key, fallback_sort_base)
if not ret then
return nil
end
end
local self_cat = self:getCategoryName()
for _, parent in ipairs(ret) do
local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName()
if self_cat == parent_cat then
internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat))
end
end
return ret
end
function Category:getChildren()
local is_umbrella = not self._lang and not self._info.raw
local children = self._data.children
local ret = {}
if not is_umbrella and children then
for _, child in ipairs(children) do
child = mw.clone(child)
if type(child) ~= "table" then
child = {name = child}
end
if not child.sort then
child.sort = child.name
end
-- FIXME, is preserving the script correct?
child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc}
insert(ret, child)
end
end
local extra_children
if is_umbrella then
extra_children = self._data.umbrella and self._data.umbrella.extra_children
else
extra_children = self._data.extra_children
end
extra_children = self:canonicalize_parents_children(extra_children, "children")
if extra_children then
for _, child in ipairs(extra_children) do
insert(ret, child)
end
end
return #ret > 0 and ret or nil
end
function Category:getUmbrella()
local umbrella = self._data.umbrella
if umbrella == false or self._info.raw or not self._lang or self._sc then
return nil
end
-- If `umbrella` is a string, use that; otherwise, use the label.
return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label})
end
function Category:getAppendix()
-- FIXME, this should be customizable.
local lang, label = self._lang, self._info.label
if self._info.raw or not (lang and label) then
return nil
end
local appendix = make_title(100, lang:getCanonicalName() .. " " .. label)
return appendix.exists and appendix.fullText or nil
end
function Category:getCatfixInfo()
if self._lang or self._sc or self._info.raw then
local langcode, sccode = self._data.catfix, self._data.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
elseif langcode == nil then -- not false
lang = self._lang
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
elseif sccode == nil then -- not false
sc = self._sc
end
if lang then
lang = lang:getFull()
end
return lang, sc
elseif not self._data.umbrella then
return
end
-- umbrella
local langcode, sccode = self._data.umbrella.catfix, self._data.umbrella.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
end
if lang then
lang = lang:getFull()
end
return lang, sc
end
function Category:getTOCTemplateName()
-- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC()
-- implements its own default algorithm.
internal_error("This should never get called")
end
local export = {}
function export.main(info)
local self = setmetatable({_info = info}, Category)
self:initCommon()
return self._data and self or nil
end
export.new = Category.new
return export
0zckqnbqsykzp6uxaf5jmsdxpi6jme6
Mòideal:category tree/topic
828
17716
88373
2026-07-23T19:28:36Z
en>Benwing2
0
make sure that {{{topic}}} references correctly handle missing description and treat it like "default"
88373
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
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 split = require(string_utilities_module).split
local type_data = {
["related-to"] = {
desc = "terms related to",
additional = "'''NOTE''': This is a \"related-to\" category. It should contain terms directly related to " ..
"{{{topic}}}. Please do not include terms that merely have a tangential connection to {{{topic}}}. " ..
"Be aware that terms for types or instances of this topic often go in a separate category.",
},
set = {
desc = "terms for types or instances of",
additional = "'''NOTE''': This is a set category. It should contain terms for {{{topic}}}, not merely " ..
"terms related to {{{topic}}}. It may contain more general terms (e.g. types of {{{topic}}}) or more " ..
"specific terms (e.g. names of specific {{{topic}}}), although there may be related categories "..
"specifically for these types of terms.",
},
name = {
desc = "names of specific",
additional = "'''NOTE''': This is a name category. It should contain names of specific {{{topic}}}, not " ..
"merely terms related to {{{topic}}}, and should also not contain general terms for types of {{{topic}}}.",
},
type = {
desc = "terms for types of",
additional = "'''NOTE''': This is a type category. It should contain terms for types of {{{topic}}}, not " ..
"merely terms related to {{{topic}}}, and should also not contain names of specific {{{topic}}}.",
},
grouping = {
desc = "categories concerning more specific variants of",
additional = "'''NOTE''': This is a grouping category. It should not directly contain any terms, but " ..
"only subcategories. If there are any terms directly in this category, please move them to a subcategory.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTE''': This is a top-level list category. It should not directly contain any terms, but " ..
"only a {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "related-to"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "related-to"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
insert(desc_parts, type_data[typ].desc .. " " .. desc)
end
return "{{{langname}}} " .. require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_first_sort_key
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_first_sort_key or
format_displaytitle(data, false, "upcase") or label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "the " .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "the " .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"This category contains no dictionary entries, only other categories. The subcategories are of two " ..
"sorts:\n\n* Subcategories named like \"{{{thespref}}}aa:" .. catname ..
"\" (with a prefixed language code) are categories of terms in specific languages. " ..
"You may be interested especially in [[:Category:{{{thespref}}}en:" .. catname .. "]], for English terms.\n" ..
"* Subcategories of this one named without the prefixed language code are further categories just like " ..
"this one, but devoted to finer topics."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
if desc then
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
end
end
topic = topic or get_displaytitle_or_label(data)
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Thesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wp|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wp|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "all topics" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "all topics" then
desc = "This is the topmost topic category for all languages."
additional = "It contains no dictionary entries, only other categories. The subcategories are of two " ..
"sorts:\n\n" ..
"* Subcategories listed at the beginning, without a prefixed language code, are grouping " ..
"categories similar to this category, but are devoted to general subject areas. Under them are " ..
"finer-grained subject areas.\n" ..
"* Subcategories named like \"aa:All topics\" (with a prefixed language code) are top-level " ..
"categories like this one, but for specific languages. You may be interested especially in " ..
"[[:Category:en:All topics]], for English terms.\n" ..
"Note that categories under this tree categorize terms semantically rather than grammatically. " ..
"Grammatical categories (such as all French verbs, or all English irregular plural forms) " ..
"have a different naming structure, with the language name spelled out, such as " ..
"[[:Category:French verbs]] or [[:Category:English irregular plurals]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "This category concerns the topic: " .. desc .. "."
end
end
if not desc then
desc = "Categories concerning " .. label .. " in various specific languages."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort, parent_index)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or parent_index == 1 and (not lang and topdata.umbrella and
topdata.umbrella.breadcrumb_and_first_sort_key or topdata.breadcrumb_and_first_sort_key) or nil
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "all topics" then
return {{ name = "Category:Fundamental", sort = "topics" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for i, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort, i)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Category:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("list of %s categories"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("mixed"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for i, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort, i)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Category:") or parent.nontopic then
-- skip
elseif parent.name == "all topics" or parent_substitutions[parent.name] == "all topics" then
if not lang then
insert(ret, {
name = "Thesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Thesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Thesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
local uppercase_label = mw.getContentLanguage():ucfirst(upcase_label)
-- Make sure that the label is either uppercase or caseless.
-- FIXME: Will this run into weirdness if this code is used on the Turkish Wiktionary?
if lowercase_label ~= uppercase_label and upcase_label ~= uppercase_label then
error(("Topic category label '%s' needs to be uppercase in the category name"):format(
upcase_label))
end
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
local topdata = labels[label]
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Thesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Thesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Thesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Category:Fundamental",
"Category:Wiktionary projects",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
1jbu8e0cuaf0oi78w9r1k79lswab8sk
88374
88373
2026-07-27T00:13:42Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic]]
88373
Scribunto
text/plain
local raw_handlers = {}
local raw_categories = {}
--[=[
This module implements the topic category subsystem. It is currently implemented with a single raw handler that
handlers both language-specific and umbrella topic categories, and a corresponding handler for thesaurus categories.
The topmost topic category [[:Category:All topics]] is special and potentially could be handled as a separate raw
category, but currently it's handled as part of the raw topic handler. The topmost thesaurus category
[[:Category:Thesaurus]] is in fact handled as a raw category.
]=]
local functions_module = "Module:fun"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local topic_data_module = "Module:category tree/topic/data"
local topic_utilities_module = "Module:category tree/topic/utilities"
local thesaurus_data_module = "Module:category tree/topic/thesaurus data"
local concat = table.concat
local insert = table.insert
local dump = mw.dumpObject
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 split = require(string_utilities_module).split
local type_data = {
["related-to"] = {
desc = "terms related to",
additional = "'''NOTE''': This is a \"related-to\" category. It should contain terms directly related to " ..
"{{{topic}}}. Please do not include terms that merely have a tangential connection to {{{topic}}}. " ..
"Be aware that terms for types or instances of this topic often go in a separate category.",
},
set = {
desc = "terms for types or instances of",
additional = "'''NOTE''': This is a set category. It should contain terms for {{{topic}}}, not merely " ..
"terms related to {{{topic}}}. It may contain more general terms (e.g. types of {{{topic}}}) or more " ..
"specific terms (e.g. names of specific {{{topic}}}), although there may be related categories "..
"specifically for these types of terms.",
},
name = {
desc = "names of specific",
additional = "'''NOTE''': This is a name category. It should contain names of specific {{{topic}}}, not " ..
"merely terms related to {{{topic}}}, and should also not contain general terms for types of {{{topic}}}.",
},
type = {
desc = "terms for types of",
additional = "'''NOTE''': This is a type category. It should contain terms for types of {{{topic}}}, not " ..
"merely terms related to {{{topic}}}, and should also not contain names of specific {{{topic}}}.",
},
grouping = {
desc = "categories concerning more specific variants of",
additional = "'''NOTE''': This is a grouping category. It should not directly contain any terms, but " ..
"only subcategories. If there are any terms directly in this category, please move them to a subcategory.",
},
toplevel = {
desc = "UNUSED", -- all categories of this type hardcode their description
additional = "'''NOTE''': This is a top-level list category. It should not directly contain any terms, but " ..
"only a {{{topic}}}.",
},
}
local function invalid_type(types)
local valid_types = {}
for typ, _ in pairs(type_data) do
insert(valid_types, ("'%s'"):format(typ))
end
error(("Invalid type '%s', should be one or more of %s, comma-separated")
:format(types, mw.text.listToText(valid_types)))
end
local function split_types(types)
types = types or "related-to"
local splitvals = split(types, "%s*,%s*")
for i, typ in ipairs(splitvals) do
-- FIXME: Temporary
if typ == "topic" then
typ = "related-to"
end
if not type_data[typ] then
invalid_type(types)
end
splitvals[i] = typ
end
return splitvals
end
local function gsub_escaping_replacement(str, from, to)
return (str:gsub(pattern_escape(from), replacement_escape(to)))
end
function ucfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():ucfirst(raw_txt)
end
function lcfirst(txt)
local italics, raw_txt = txt:match("^('*)(.-)$")
return italics .. mw.getContentLanguage():lcfirst(raw_txt)
end
local function convert_spec_to_string(data, desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " ..
desc_type)
end
desc = desc {
lang = data.lang,
sc = data.sc,
label = data.label,
category = data.category,
topic_data = data.topdata,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function get_and_cache(data, obj, key)
local val = convert_spec_to_string(data, obj[key])
obj[key] = val
return val
end
local function process_default(desc)
local stripped_desc = desc
local no_singularize, wikify, add_the
while true do
local new_stripped_desc = stripped_desc:match("^(.+) no singularize$")
if new_stripped_desc then
no_singularize = true
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) wikify$")
if new_stripped_desc then
wikify = true
end
end
if not new_stripped_desc then
new_stripped_desc = stripped_desc:match("^(.+) with the$")
if new_stripped_desc then
add_the = true
end
end
if new_stripped_desc then
stripped_desc = new_stripped_desc
else
break
end
end
if stripped_desc == "default" then
return true, no_singularize, wikify, add_the
else
return false
end
end
local function format_desc(data, desc)
local desc_parts = {}
local types = split_types(data.topdata.type)
for _, typ in ipairs(types) do
insert(desc_parts, type_data[typ].desc .. " " .. desc)
end
return "{{{langname}}} " .. require(table_module).serialCommaJoin(desc_parts) .. "."
end
local substitute_template_specs
local function format_displaytitle(data, include_lang_prefix, upcase)
local topdata, lang, label = data.topdata, data.lang, data.label
local displaytitle = substitute_template_specs(data, topdata.displaytitle)
if not displaytitle then
return nil
end
if upcase then
displaytitle = ucfirst(displaytitle)
end
if include_lang_prefix and lang then
displaytitle = ("%s:%s"):format(lang:getCode(), displaytitle)
end
return displaytitle
end
local function get_breadcrumb(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local ret
if not lang and topdata.umbrella then
ret = topdata.umbrella.breadcrumb or topdata.umbrella.breadcrumb_and_first_sort_key
end
if not ret then
ret = topdata.breadcrumb or topdata.breadcrumb_and_first_sort_key or
format_displaytitle(data, false, "upcase") or label
end
if type(ret) == "string" or type(ret) == "number" then
ret = {name = ret}
end
local name = substitute_template_specs(data, ret.name)
local nocap = ret.nocap
return {name = name, nocap = nocap}
end
local function make_category_name(lang, label)
if lang then
return lang:getCode() .. ":" .. ucfirst(label)
else
return ucfirst(label)
end
end
local function replace_special_descriptions(data, desc)
if not desc then
return desc
end
if desc:find("^=") then
desc = desc:gsub("^=", "")
return format_desc(data, desc)
end
local is_default, no_singularize, wikify, add_the = process_default(desc)
if is_default then
local linked_label = require(topic_utilities_module).link_label(data.label, no_singularize, wikify)
if add_the then
linked_label = "the " .. linked_label
end
return format_desc(data, linked_label)
else
return desc
end
end
local function get_displaytitle_or_label(data)
return format_displaytitle(data, false) or data.label
end
local function process_default_add_the(data, topic)
local is_default, _, _, add_the = process_default(topic)
if is_default then
topic = get_displaytitle_or_label(data)
if add_the then
topic = "the " .. topic
end
end
return topic, is_default
end
substitute_template_specs = function(data, desc)
desc = convert_spec_to_string(data, desc)
if not desc then
return nil
end
local topdata, lang, label = data.topdata, data.lang, data.label
if desc:find("{{{umbrella_msg}}}") then
local catname = ucfirst(label)
desc = gsub_escaping_replacement(desc, "{{{umbrella_msg}}}",
"This category contains no dictionary entries, only other categories. The subcategories are of two " ..
"sorts:\n\n* Subcategories named like \"{{{thespref}}}aa:" .. catname ..
"\" (with a prefixed language code) are categories of terms in specific languages. " ..
"You may be interested especially in [[:Category:{{{thespref}}}en:" .. catname .. "]], for English terms.\n" ..
"* Subcategories of this one named without the prefixed language code are further categories just like " ..
"this one, but devoted to finer topics."
)
end
if desc:find("{{{topic}}}") then
-- Compute the value for {{{topic}}}. If the user specified `topic`, use it. (If we're an umbrella category,
-- allow a separate value for `umbrella.topic`, falling back to `topic`.) Otherwise, see if the description
-- was specified as 'default' or a variant; if so, parse it to determine whether to add "the" to the label.
-- Otherwise, just use the label directly.
local topic = not lang and topdata.umbrella and topdata.umbrella.topic or topdata.topic
if topic then
topic = process_default_add_the(data, topic)
else
local desc
if not lang then
desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
end
desc = desc or get_and_cache(data, topdata, "description")
if desc then
local defaulted_desc, is_default = process_default_add_the(data, desc)
if is_default then
topic = defaulted_desc
end
end
topic = topic or get_displaytitle_or_label(data)
end
desc = gsub_escaping_replacement(desc, "{{{topic}}}", topic)
end
desc = desc:gsub("{{{thespref}}}", data.thesaurus_data and "Thesaurus:" or "")
return desc
end
local function process_box(data, def_topright_parts, val, pattern)
if not val then
return
end
local defval = ucfirst(data.label)
if type(val) ~= "table" then
val = {val}
end
for _, v in ipairs(val) do
if v == true then
insert(def_topright_parts, pattern:format(defval))
else
insert(def_topright_parts, pattern:format(v))
end
end
end
local function get_topright(data)
local topdata, lang = data.topdata, data.lang
local def_topright_parts = {}
process_box(data, def_topright_parts, topdata.wp, "{{wp|%s}}")
process_box(data, def_topright_parts, topdata.wpcat, "{{wp|cat=%s}}")
process_box(data, def_topright_parts, topdata.commonscat, "{{commonscat|%s}}")
local def_topright
if #def_topright_parts > 0 then
def_topright = concat(def_topright_parts, "\n")
end
if lang then
return substitute_template_specs(data, topdata.topright or def_topright)
else
return topdata.umbrella and substitute_template_specs(data, topdata.umbrella.topright) or
substitute_template_specs(data, def_topright)
end
end
local function remove_lang_params(desc)
desc = desc:gsub("^{{{langname}}} ", "")
desc = desc:gsub("{{{langcode}}}:", "")
desc = desc:gsub("^{{{langcode}}} ", "")
desc = desc:gsub("^{{{langcat}}} ", "")
return desc
end
local function get_additional_msg(data)
local types = split_types(data.topdata.type)
if #types > 1 then
local parts = {"'''NOTE''': This is a mixed category. It may contain terms of any of the following category types:"}
for i, typ in ipairs(types) do
insert(parts, ("* %s {{{topic}}}%s"):format(type_data[typ].desc, i == #types and "." or ";"))
end
insert(parts, "'''WARNING''': Such categories are strongly dispreferred and should be split into separate per-type categories.")
return concat(parts, "\n")
elseif label == "all topics" then
return "'''NOTE''': This is the topmost topic category for {{{langname}}}. It should not directly contain " ..
"any terms, but only lists of topic categories organized by type."
else
return type_data[types[1]].additional
end
end
local function get_labels_categorizing(data)
local m_labels_utilities = require(labels_utilities_module)
return m_labels_utilities.format_labels_categorizing(
m_labels_utilities.find_labels_for_category(data.label, "topic", data.lang), nil, data.lang)
end
-- Return the description along with the text following and preceding the description. The description and additional
-- (i.e. following) text are returned in the form of closures so the work of calculating the text (which can be
-- expensive, especially in the case of the additional text, where get_labels_categorizing() scans the entire set of
-- labels for any that categorize into this category) is not done when not needed, e.g. in higher levels of the
-- breadcrumb chain, where only the breadcrumb and parents (in fact, really just the first parent) are actually needed.
local function get_description_additional_preceding(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local desc, additional, preceding
-- This is kind of hacky, but it works for now.
local function postprocess_thesaurus(txt)
if not txt then
return nil
end
if not data.thesaurus_data then
return txt
end
txt = txt:gsub(" terms([ .,])", " thesaurus entries%1")
return txt
end
if lang then
desc = function()
return postprocess_thesaurus(substitute_template_specs(data,
replace_special_descriptions(data, get_and_cache(data, topdata, "description"))))
end
preceding = topdata.preceding
additional = function()
local additional_parts = {}
if topdata.additional then
insert(additional_parts, topdata.additional)
end
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
else
if label == "all topics" then
desc = "This is the topmost topic category for all languages."
additional = "It contains no dictionary entries, only other categories. The subcategories are of two " ..
"sorts:\n\n" ..
"* Subcategories listed at the beginning, without a prefixed language code, are grouping " ..
"categories similar to this category, but are devoted to general subject areas. Under them are " ..
"finer-grained subject areas.\n" ..
"* Subcategories named like \"aa:All topics\" (with a prefixed language code) are top-level " ..
"categories like this one, but for specific languages. You may be interested especially in " ..
"[[:Category:en:All topics]], for English terms.\n" ..
"Note that categories under this tree categorize terms semantically rather than grammatically. " ..
"Grammatical categories (such as all French verbs, or all English irregular plural forms) " ..
"have a different naming structure, with the language name spelled out, such as " ..
"[[:Category:French verbs]] or [[:Category:English irregular plurals]]."
return desc, additional
end
-- Assume that if the description field contains a function, the function will return non-nil, so we don't
-- have to call the function at this point (in case it is heavyweight).
local has_umbrella_desc = topdata.umbrella and topdata.umbrella.description or topdata.umbrella_description
desc = function()
local desc = topdata.umbrella and get_and_cache(data, topdata.umbrella, "description") or
get_and_cache(data, topdata, "umbrella_description")
if not desc then
desc = get_and_cache(data, topdata, "description")
if desc then
desc = replace_special_descriptions(data, desc)
desc = remove_lang_params(desc)
desc = desc:gsub("%.$", "")
desc = "This category concerns the topic: " .. desc .. "."
end
end
if not desc then
desc = "Categories concerning " .. label .. " in various specific languages."
end
return postprocess_thesaurus(substitute_template_specs(data, desc))
end
preceding = topdata.umbrella and topdata.umbrella.preceding or not has_umbrella_desc and topdata.preceding
if preceding then
preceding = remove_lang_params(preceding)
end
additional = function()
local additional_parts = {}
local topdata_additional = topdata.umbrella and topdata.umbrella.additional or
not has_umbrella_desc and topdata.additional
if topdata_additional then
insert(additional_parts, remove_lang_params(topdata_additional))
end
insert(additional_parts, "{{{umbrella_msg}}}")
if not data.thesaurus_data then
insert(additional_parts, get_additional_msg(data))
local labels_msg = get_labels_categorizing(data)
if labels_msg then
insert(additional_parts, labels_msg)
end
end
return postprocess_thesaurus(substitute_template_specs(data, concat(additional_parts, "\n\n")))
end
end
preceding = substitute_template_specs(data, preceding)
return desc, additional, preceding
end
local function normalize_sort_key(data, sort, parent_index)
local topdata, lang, label = data.topdata, data.lang, data.label
sort = sort or parent_index == 1 and (not lang and topdata.umbrella and
topdata.umbrella.breadcrumb_and_first_sort_key or topdata.breadcrumb_and_first_sort_key) or nil
if not sort then
-- When defaulting sort key to label, strip 'The ' (e.g. in 'The Matrix', 'The Hunger Games')
-- and 'A ' (e.g. in 'A Song of Ice and Fire', 'A Christmas Carol') from label.
local stripped_sort = label:match("^[Tt]he (.*)$")
if stripped_sort then
sort = stripped_sort
end
if not stripped_sort then
stripped_sort = label:match("^[Aa] (.*)$")
if stripped_sort then
sort = stripped_sort
end
end
if not stripped_sort then
sort = label
end
end
sort = substitute_template_specs(data, sort)
if not lang then
sort = " " .. sort
end
return sort
end
local function get_topic_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parents = topdata.parents
if not lang and label == "all topics" then
return {{ name = "Category:Fundamental", sort = "topics" }}
end
if not parents or #parents == 0 then
return nil
end
local ret = {}
for i, parent in ipairs(parents) do
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort, i)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Category:") or parent.nontopic then
-- leave as-is
parent.nontopic = nil
else
parent.name = make_category_name(lang, parent.name)
end
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
local function make_list_of_type_parent(typ)
return {
name = make_category_name(lang, ("list of %s categories"):format(typ)),
sort = (not lang and " " or "") .. label,
}
end
if topdata.type ~= "toplevel" then
local types = split_types(topdata.type)
for _, typ in ipairs(types) do
insert(ret, make_list_of_type_parent(typ))
end
if #types > 1 then
insert(ret, make_list_of_type_parent("mixed"))
end
end
-- Add umbrella category.
if lang then
insert(ret, {
name = make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function get_thesaurus_parents(data)
local topdata, lang, label = data.topdata, data.lang, data.label
local parent_substitutions = data.thesaurus_data.parent_substitutions
local parents = topdata.parents
if not parents or #parents == 0 then
return nil
end
local ret = {}
for i, parent in ipairs(parents) do
-- Process parent categories as follows:
-- 1. skip non-topic cats and meta-categories that start with "List of"
-- 2. map "en:All topics" to "English thesaurus entries" (and same for other languages), but map "All topics" itself to the root "Thesaurus" category
-- 3. check if this parent is to be substituted, if so, substitute it
-- 4. prepend "Thesaurus:" to all other category names
parent = mw.clone(parent)
if type(parent) ~= "table" then
parent = {name = parent}
end
parent.sort = normalize_sort_key(data, parent.sort, i)
if type(parent.name) ~= "string" then
error(("Internal error: parent.name is not a string: parent = %s"):format(dump(parent)))
end
if parent.name:find("^Category:") or parent.nontopic then
-- skip
elseif parent.name == "all topics" or parent_substitutions[parent.name] == "all topics" then
if not lang then
insert(ret, {
name = "Thesaurus",
sort = label,
})
else
insert(ret, {
name = "thesaurus entries",
sort = parent.sort,
lang = lang:getCode(),
is_label = true,
})
end
else
parent.name = "Thesaurus:" .. make_category_name(lang, parent_substitutions[parent.name] or parent.name)
parent.name = substitute_template_specs(data, parent.name)
insert(ret, parent)
end
end
-- Add the non-thesaurus version of this category as a parent, unless it is a thesaurus-only category.
if not topdata.thesaurusonly then
insert(ret, { name = make_category_name(lang, label), sort = " " })
end
-- Add umbrella category.
if lang then
insert(ret, {
name = "Thesaurus:" .. make_category_name(nil, label),
sort = lang:getCanonicalName(),
})
end
return ret
end
local function generate_spec(category, lang, upcase_label, thesaurus_data)
local label_data = require(topic_data_module)
local label
-- Convert label to lowercase if possible
local lowercase_label = mw.getContentLanguage():lcfirst(upcase_label)
local uppercase_label = mw.getContentLanguage():ucfirst(upcase_label)
-- Make sure that the label is either uppercase or caseless.
-- FIXME: Will this run into weirdness if this code is used on the Turkish Wiktionary?
if lowercase_label ~= uppercase_label and upcase_label ~= uppercase_label then
error(("Topic category label '%s' needs to be uppercase in the category name"):format(
upcase_label))
end
-- Check if the label exists
local labels = label_data["LABELS"]
if labels[lowercase_label] then
label = lowercase_label
else
label = upcase_label
end
local topdata = labels[label]
-- Go through handlers
if not topdata then
for _, handler in ipairs(label_data["HANDLERS"]) do
topdata = handler.handler(label)
if topdata then
topdata.module = handler.module
break
end
end
end
if not topdata then
return nil
end
local data = {
category = category,
lang = lang,
label = label,
topdata = topdata,
thesaurus_data = thesaurus_data,
}
local description, additional, preceding = get_description_additional_preceding(data)
local parents
if thesaurus_data then
parents = get_thesaurus_parents(data)
else
parents = get_topic_parents(data)
end
return {
lang = lang and lang:getCode() or nil,
description = description,
additional = additional,
preceding = preceding,
parents = parents,
breadcrumb = get_breadcrumb(data),
displaytitle = format_displaytitle(data, "include lang prefix", "upcase"),
topright = get_topright(data),
module = topdata.module,
can_be_empty = not lang,
hidden = false,
}
end
-- Handler for `Thesaurus:...` categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^Thesaurus:(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific thesaurus category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category:match("^Thesaurus:(.+)$")
end
if upcase_label then
local thesaurus_data = require(thesaurus_data_module)
-- substituted category names are not allowed
if thesaurus_data.parent_substitutions[lcfirst(upcase_label)] then
error(("Category is not allowed as a Thesaurus category: %s (see the list of parent substitutions at " ..
"[[Module:category tree/topic/thesaurus]])"):format(data.category))
end
return generate_spec(data.category, lang, upcase_label, thesaurus_data)
end
end)
-- Handler for regular topic categories.
table.insert(raw_handlers, function(data)
local code, upcase_label = data.category:match("^(%l[%a-]*%a):(.+)$")
local lang
if code then
lang = require(languages_module).getByCode(code)
if not lang then
mw.log(("Category '%s' looks like a language-specific topic category but unable to match language prefix"):
format(data.category))
return nil
end
else
upcase_label = data.category
end
return generate_spec(data.category, lang, upcase_label)
end)
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Thesaurus"] = {
description = "Category for entries of the Wiktionary thesaurus, located in a separate namespace.",
additional = [=[
There are '''three ways to browse''' the thesaurus:
* Look under '''[[:Category:Thesaurus entries by language]]''' to get started.
* Use the search box below.
* Browse the thesaurus by topic using the links under "Subcategories" below.
The main project page is [[Wiktionary:Thesaurus]].
{{ws header|<nowiki/>|link=}}]=],
parents = {
"Category:Fundamental",
"Category:Wiktionary projects",
},
}
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
1jbu8e0cuaf0oi78w9r1k79lswab8sk
Mòideal:category tree/affixes and compounds
828
17717
88375
2026-06-09T22:15:16Z
en>-sche
0
88375
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["alliterative compounds"] = {
description = "{{{langname}}} noun phrases composed of two or more stems that alliterate.",
parents = {"compound terms", "alliterative phrases"},
}
labels["antonymous compounds"] = {
description = "{{{langname}}} compounds in which one part is an antonym of the other.",
parents = {"dvandva compounds", sort = "antonym"},
}
labels["bahuvrihi compounds"] = {
description = "{{{langname}}} compounds in which the first part (A) modifies the second (B), and whose meaning follows a [[metonymic]] pattern: “<person> having a B that is A.”",
parents = {"compound terms", "exocentric compounds"},
}
-- Add "compound POS" categories for various parts of speech.
local compound_poses = {
"adjectives",
"adverbs",
"conjunctions",
"determiners",
"interjections",
"nouns",
"numerals",
"particles",
"postpositions",
"prefixes",
"prepositions",
"pronouns",
"proper nouns",
"suffixes",
"verbs",
}
for _, pos in ipairs(compound_poses) do
labels["compound " .. pos] = {
description = "{{{langname}}} " .. pos .. " composed of two or more stems.",
parents = {{name = "compound terms", sort = " "}, pos},
}
end
labels["compound determinatives"] = {
description = "{{{langname}}} determinatives composed of two or more stems.",
parents = {"compound terms", "determiners"},
}
labels["compound terms"] = {
description = "{{{langname}}} terms composed of two or more stems.",
umbrella_parents = "Terms by etymology subcategories by language",
parents = {"terms by etymology"},
}
labels["dvandva compounds"] = {
description = "{{{langname}}} terms composed of two or more stems whose stems could be connected by an 'and'.",
parents = {"compound terms"},
}
labels["dvigu compounds"] = {
description = "{{{langname}}} [[tatpuruṣa]] compounds where the modifying member is a number",
parents = {"tatpurusa compounds"},
}
labels["endocentric compounds"] = {
description = "{{{langname}}} terms composed of two or more stems, one of which is the [[w:head (linguistics)|head]] of that compound.",
parents = {"compound terms"},
}
labels["endocentric noun-noun compounds"] = {
description = "{{{langname}}} terms composed of two or more stems, one of which is the [[w:head (linguistics)|head]] of that compound.",
breadcrumb = "noun-noun",
parents = {"endocentric compounds", "compound terms"},
}
labels["endocentric verb-noun compounds"] = {
description = "{{{langname}}} compounds in which the first element is a verbal stem, the second a nominal stem and the head of the compound.",
breadcrumb = "verb-noun",
parents = {"endocentric compounds", "verb-noun compounds"},
}
labels["exocentric compounds"] = {
description = "{{{langname}}} terms composed of two or more stems, none of which is the [[w:head (linguistics)|head]] of that compound.",
parents = {"compound terms"},
}
labels["exocentric verb-noun compounds"] = {
description = "{{{langname}}} compounds in which the first element is a transitive verb, the second a noun functioning as its direct object, and whose referent is the person or thing doing the action.",
breadcrumb = "verb-noun",
parents = {"exocentric compounds", "verb-noun compounds"},
}
labels["karmadharaya compounds"] = {
description = "{{{langname}}} terms composed of two or more stems in which the main stem determines the case endings.",
parents = {"tatpurusa compounds"},
}
labels["itaretara dvandva compounds"] = {
description = "{{{langname}}} terms composed of two or more stems whose stems could be connected by an 'and'.",
breadcrumb = "itaretara",
parents = {"dvandva compounds"},
}
labels["rhyming compounds"] = {
description = "{{{langname}}} compounds composed of two or more components that rhyme.",
parents = {"compound terms", "rhyming phrases"},
}
labels["samahara dvandva compounds"] = {
description = "{{{langname}}} terms composed of two or more stems whose stems could be connected by an 'and'.",
breadcrumb = "samahara",
parents = {"dvandva compounds"},
}
labels["shitgibbons"] = {
description = "{{{langname}}} terms that consist of a single-syllable [[expletive]] followed by a two-syllable [[trochee]] that serves as a [[nominalizer]] or [[intensifier]].",
parents = {"endocentric compounds"},
}
labels["synonymous compounds"] = {
description = "{{{langname}}} compounds in which one part is a synonym of the other.",
parents = {"dvandva compounds", sort = "synonym"},
}
labels["tatpurusa compounds"] = {
description = "{{{langname}}} terms composed of two or more stems",
parents = {"compound terms"},
}
labels["verb-noun compounds"] = {
description = "{{{langname}}} compounds in which the first element is a transitive verb, the second a noun functioning as its direct object, and whose referent is the person or thing doing the action, or an adjective describing such a person or thing.",
parents = {"verb-object compounds"},
}
labels["verb-object compounds"] = {
description = "{{{langname}}} compounds in which the first element is a transitive verb, the second a term (usually but not always a noun) functioning as its (normally direct) object, and whose referent is the person or thing doing the action, or an adjective describing such a person or thing.",
additional = "Examples in English are {{m|en|pickpocket|lit=someone who picks pockets}} and {{m|en|catch-all|lit=something that catches everything}}.",
parents = {"compound terms"},
}
labels["verb-verb compounds"] = {
description = "{{{langname}}} compounds composed of two or more verbs in apposition, often either synonyms or antonyms, and whose referent refers to the result of performing those actions.",
parents = {"compound terms"},
}
labels["vrddhi derivatives"] = {
description = "{{{langname}}} terms derived from a Proto-Indo-European root by the process of [[w:vṛddhi|vṛddhi]] derivation.",
parents = {"terms by etymology"},
}
labels["vrddhi gerundives"] = {
description = "{{{langname}}} [[gerundive]]s derived from a Proto-Indo-European root by the process of [[w:vṛddhi|vṛddhi]] derivation.",
parents = {"vrddhi derivatives"},
}
labels["vyadhikarana compounds"] = {
description = "{{{langname}}} terms composed of two or more stems in which the non-main stem determines the case endings.",
parents = {"tatpurusa compounds"},
}
for _, fixtype in ipairs({"circumfix", "infix", "interfix", "prefix", "suffix",}) do
labels["terms by " .. fixtype] = {
description = "{{{langname}}} terms categorized by their " .. fixtype .. "es.",
umbrella_parents = "Terms by etymology subcategories by language",
parents = {{name = "terms by etymology", sort = fixtype}, fixtype .. "es"},
}
end
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Types of compound terms by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Types of compound terms by language"] = {
description = "Umbrella categories covering topics related to types of compound terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "compound terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
------------------------------ Affix handlers -------------------------------
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local labelpref, pos, affixtype, term_and_id = data.label:match("^(([a-z -]+) ([a-z]+fix)ed with )(.+)$")
if affixtype then
local term, id = term_and_id:match("^(.+) %(([^()]+)%)$")
term = term or term_and_id
-- Convert term/alt into affixes if needed
local desc = {
["prefix"] = "beginning with the prefix",
["suffix"] = "ending with the suffix",
["circumfix"] = "bookended with the circumfix",
["infix"] = "spliced with the infix",
["interfix"] = "joined with the interfix",
-- Transfixes not supported currently.
-- ["transfix"] = "patterned with the transfix",
}
if not desc[affixtype] then
return nil
end
-- Here, {LANG} is replaced with the actual language, {TERM_AND_ID} with the actual term (or with 'TERM<id:ID>'
-- if there is an ID), {BASE} with '<var>base</var>', {BASE2} with '<var>base2</var>', {BASE_EXPL} with an
-- explanation of what "base" means, {BASE_BASE2_EXPL} with an explanation of what "base" and "base2" mean, and
-- {POS} with '|pos=POS' if there is a `pos` other than "terms", otherwise a blank string.
local what_categorizes = {
["prefix"] = "{{tl|af|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} or {{tl|affix|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} (or the more specific and less-preferred equivalents {{tl|pre}} or {{tl|prefix}}), where {BASE_EXPL}",
["suffix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} (or the more specific and less-preferred equivalents {{tl|suf}} or {{tl|suffix}}), where {BASE_EXPL}",
["circumfix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, where {BASE_EXPL}",
["infix"] = "{{tl|infix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, where {BASE_EXPL}",
["interfix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}|{BASE2}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}|{BASE2}{POS}}}, where {BASE_BASE2_EXPL}",
}
local args = require("Module:parameters").process(data.args, {
["alt"] = true,
["sc"] = true,
["sort"] = true,
["tr"] = true,
["ts"] = true,
})
local sc = data.sc or args.sc and require("Module:scripts").getByCode(args.sc, "sc") or nil
local m_affix = require("Module:affix")
-- Call make_affix to add display hyphens if they're not already present.
local _, display_term, lookup_term = m_affix.make_affix(term, data.lang, sc, affixtype, nil, true)
local _, display_alt = m_affix.make_affix(args.alt, data.lang, sc, affixtype)
local _, display_tr = m_affix.make_affix(args.tr, data.lang, require("Module:scripts").getByCode("Latn"), affixtype)
local _, display_ts = m_affix.make_affix(args.ts, data.lang, require("Module:scripts").getByCode("Latn"), affixtype)
local m_script_utilities = require("Module:script utilities")
local id_text = id and " (" .. id .. ")" or ""
-- Compute parents.
local parents = {}
if id then
if pos == "words" then
-- don't allow formerly-named categories with "words"
return nil
end
if pos == "terms" then
table.insert(parents, {name = labelpref .. term, sort = id, args = args})
else
table.insert(parents, {name = "terms " .. affixtype .. "ed with " .. term_and_id, sort = id .. ", " .. pos, args = args})
table.insert(parents, {name = labelpref .. term, sort = id, args = args})
end
elseif pos == "words" then
-- don't allow formerly-named categories with "words"
return nil
elseif pos ~= "terms" then
table.insert(parents, {name = "terms " .. affixtype .. "ed with " .. term, sort = pos, args = args})
end
table.insert(parents, {name = "terms by " .. affixtype, sort = (data.lang:makeSortKey(data.lang:stripDiacritics(args.sort or term)))})
-- If other affixes are mapped to this one, show them.
local additional
if data.lang then
local langcode = data.lang:getCode()
if m_affix.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(m_affix.affix_lang_data_module_prefix .. langcode)
local variants = {}
if langdata.affix_mappings then
for variant, canonical in pairs(langdata.affix_mappings) do
-- Above, we converted the stripped link term as we received it to the lookup form, so we
-- can look up the variants that are mapped to this term. Once we find them, map them to
-- display form.
local is_variant = false
if type(canonical) == "table" then
for _, canonical_v in pairs(canonical) do
if canonical_v == lookup_term then
is_variant = true
break
end
end
else
is_variant = canonical == lookup_term
end
if is_variant then
local _, display_variant = m_affix.make_affix(variant, data.lang, sc, affixtype)
table.insert(variants, "{{m|" .. langcode .. "|" .. display_variant .. "}}")
end
end
if #variants > 0 then
table.sort(variants)
additional = ("This category also includes terms %sed with %s."):format(affixtype,
require("Module:table").serialCommaJoin(variants))
end
end
end
end
if data.lang then
local m_str_utils = require("Module:string utilities")
local what_categorizes_msg = what_categorizes[affixtype]
if not what_categorizes_msg then
error(("Internal error: No what_categorizes value for affixtype '%s' for label '%s', lang '%s'"):
format(affixtype, data.label, data.lang:getCode()))
end
what_categorizes_msg = "Terms are placed in this category using " .. (what_categorizes_msg
:gsub("{LANG}", data.lang:getCode())
:gsub("{TERM_AND_ID}", m_str_utils.replacement_escape(
id and ("%s<id:%s>"):format(term, id) or term))
:gsub("{POS}", m_str_utils.replacement_escape(
pos == "terms" and "" or ("|pos=%s"):format(pos)))
:gsub("{BASE}", "<var>base</var>")
:gsub("{BASE2}", "<var>base2</var>")
:gsub("{BASE_EXPL}", "<code><var>base</var></code> is the base lemma from which this term is derived")
:gsub("{BASE_BASE2_EXPL}", "<code><var>base</var></code> and <code><var>base2</var></code> are the " ..
"base lemmas from which this term is derived")
) .. "."
if data.lang:getCode() == "ja" then
what_categorizes_msg =
require("Module:category tree/fam/jpx/what-categorizes-msg")
.get_what_categorizes_msg(term, nil, affixtype)
end
if what_categorizes_msg and what_categorizes_msg ~= "" then
if additional then
additional = additional .. "\n\n" .. what_categorizes_msg
else
additional = what_categorizes_msg
end
end
end
return {
description = "{{{langname}}} " .. pos .. " " .. desc[affixtype] .. " " .. require("Module:links").full_link({
lang = data.lang, term = display_term, alt = display_alt, sc = sc, id = id, tr = display_tr, ts = display_ts}, "term") .. ".",
additional = additional,
breadcrumb = pos == "terms" and m_script_utilities.tag_text(display_alt or display_term, data.lang, sc, "term") .. id_text or pos,
displaytitle = "{{{langname}}} " .. labelpref .. m_script_utilities.tag_text(term, data.lang, sc, "term") .. id_text,
parents = parents,
umbrella = false,
}, true -- true = args handled
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
j34dyw3hu26ax0hq0dgbkcaac8z4cvw
88376
88375
2026-07-27T00:14:00Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/affixes_and_compounds]]
88375
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["alliterative compounds"] = {
description = "{{{langname}}} noun phrases composed of two or more stems that alliterate.",
parents = {"compound terms", "alliterative phrases"},
}
labels["antonymous compounds"] = {
description = "{{{langname}}} compounds in which one part is an antonym of the other.",
parents = {"dvandva compounds", sort = "antonym"},
}
labels["bahuvrihi compounds"] = {
description = "{{{langname}}} compounds in which the first part (A) modifies the second (B), and whose meaning follows a [[metonymic]] pattern: “<person> having a B that is A.”",
parents = {"compound terms", "exocentric compounds"},
}
-- Add "compound POS" categories for various parts of speech.
local compound_poses = {
"adjectives",
"adverbs",
"conjunctions",
"determiners",
"interjections",
"nouns",
"numerals",
"particles",
"postpositions",
"prefixes",
"prepositions",
"pronouns",
"proper nouns",
"suffixes",
"verbs",
}
for _, pos in ipairs(compound_poses) do
labels["compound " .. pos] = {
description = "{{{langname}}} " .. pos .. " composed of two or more stems.",
parents = {{name = "compound terms", sort = " "}, pos},
}
end
labels["compound determinatives"] = {
description = "{{{langname}}} determinatives composed of two or more stems.",
parents = {"compound terms", "determiners"},
}
labels["compound terms"] = {
description = "{{{langname}}} terms composed of two or more stems.",
umbrella_parents = "Terms by etymology subcategories by language",
parents = {"terms by etymology"},
}
labels["dvandva compounds"] = {
description = "{{{langname}}} terms composed of two or more stems whose stems could be connected by an 'and'.",
parents = {"compound terms"},
}
labels["dvigu compounds"] = {
description = "{{{langname}}} [[tatpuruṣa]] compounds where the modifying member is a number",
parents = {"tatpurusa compounds"},
}
labels["endocentric compounds"] = {
description = "{{{langname}}} terms composed of two or more stems, one of which is the [[w:head (linguistics)|head]] of that compound.",
parents = {"compound terms"},
}
labels["endocentric noun-noun compounds"] = {
description = "{{{langname}}} terms composed of two or more stems, one of which is the [[w:head (linguistics)|head]] of that compound.",
breadcrumb = "noun-noun",
parents = {"endocentric compounds", "compound terms"},
}
labels["endocentric verb-noun compounds"] = {
description = "{{{langname}}} compounds in which the first element is a verbal stem, the second a nominal stem and the head of the compound.",
breadcrumb = "verb-noun",
parents = {"endocentric compounds", "verb-noun compounds"},
}
labels["exocentric compounds"] = {
description = "{{{langname}}} terms composed of two or more stems, none of which is the [[w:head (linguistics)|head]] of that compound.",
parents = {"compound terms"},
}
labels["exocentric verb-noun compounds"] = {
description = "{{{langname}}} compounds in which the first element is a transitive verb, the second a noun functioning as its direct object, and whose referent is the person or thing doing the action.",
breadcrumb = "verb-noun",
parents = {"exocentric compounds", "verb-noun compounds"},
}
labels["karmadharaya compounds"] = {
description = "{{{langname}}} terms composed of two or more stems in which the main stem determines the case endings.",
parents = {"tatpurusa compounds"},
}
labels["itaretara dvandva compounds"] = {
description = "{{{langname}}} terms composed of two or more stems whose stems could be connected by an 'and'.",
breadcrumb = "itaretara",
parents = {"dvandva compounds"},
}
labels["rhyming compounds"] = {
description = "{{{langname}}} compounds composed of two or more components that rhyme.",
parents = {"compound terms", "rhyming phrases"},
}
labels["samahara dvandva compounds"] = {
description = "{{{langname}}} terms composed of two or more stems whose stems could be connected by an 'and'.",
breadcrumb = "samahara",
parents = {"dvandva compounds"},
}
labels["shitgibbons"] = {
description = "{{{langname}}} terms that consist of a single-syllable [[expletive]] followed by a two-syllable [[trochee]] that serves as a [[nominalizer]] or [[intensifier]].",
parents = {"endocentric compounds"},
}
labels["synonymous compounds"] = {
description = "{{{langname}}} compounds in which one part is a synonym of the other.",
parents = {"dvandva compounds", sort = "synonym"},
}
labels["tatpurusa compounds"] = {
description = "{{{langname}}} terms composed of two or more stems",
parents = {"compound terms"},
}
labels["verb-noun compounds"] = {
description = "{{{langname}}} compounds in which the first element is a transitive verb, the second a noun functioning as its direct object, and whose referent is the person or thing doing the action, or an adjective describing such a person or thing.",
parents = {"verb-object compounds"},
}
labels["verb-object compounds"] = {
description = "{{{langname}}} compounds in which the first element is a transitive verb, the second a term (usually but not always a noun) functioning as its (normally direct) object, and whose referent is the person or thing doing the action, or an adjective describing such a person or thing.",
additional = "Examples in English are {{m|en|pickpocket|lit=someone who picks pockets}} and {{m|en|catch-all|lit=something that catches everything}}.",
parents = {"compound terms"},
}
labels["verb-verb compounds"] = {
description = "{{{langname}}} compounds composed of two or more verbs in apposition, often either synonyms or antonyms, and whose referent refers to the result of performing those actions.",
parents = {"compound terms"},
}
labels["vrddhi derivatives"] = {
description = "{{{langname}}} terms derived from a Proto-Indo-European root by the process of [[w:vṛddhi|vṛddhi]] derivation.",
parents = {"terms by etymology"},
}
labels["vrddhi gerundives"] = {
description = "{{{langname}}} [[gerundive]]s derived from a Proto-Indo-European root by the process of [[w:vṛddhi|vṛddhi]] derivation.",
parents = {"vrddhi derivatives"},
}
labels["vyadhikarana compounds"] = {
description = "{{{langname}}} terms composed of two or more stems in which the non-main stem determines the case endings.",
parents = {"tatpurusa compounds"},
}
for _, fixtype in ipairs({"circumfix", "infix", "interfix", "prefix", "suffix",}) do
labels["terms by " .. fixtype] = {
description = "{{{langname}}} terms categorized by their " .. fixtype .. "es.",
umbrella_parents = "Terms by etymology subcategories by language",
parents = {{name = "terms by etymology", sort = fixtype}, fixtype .. "es"},
}
end
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Types of compound terms by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Types of compound terms by language"] = {
description = "Umbrella categories covering topics related to types of compound terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "compound terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
------------------------------ Affix handlers -------------------------------
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local labelpref, pos, affixtype, term_and_id = data.label:match("^(([a-z -]+) ([a-z]+fix)ed with )(.+)$")
if affixtype then
local term, id = term_and_id:match("^(.+) %(([^()]+)%)$")
term = term or term_and_id
-- Convert term/alt into affixes if needed
local desc = {
["prefix"] = "beginning with the prefix",
["suffix"] = "ending with the suffix",
["circumfix"] = "bookended with the circumfix",
["infix"] = "spliced with the infix",
["interfix"] = "joined with the interfix",
-- Transfixes not supported currently.
-- ["transfix"] = "patterned with the transfix",
}
if not desc[affixtype] then
return nil
end
-- Here, {LANG} is replaced with the actual language, {TERM_AND_ID} with the actual term (or with 'TERM<id:ID>'
-- if there is an ID), {BASE} with '<var>base</var>', {BASE2} with '<var>base2</var>', {BASE_EXPL} with an
-- explanation of what "base" means, {BASE_BASE2_EXPL} with an explanation of what "base" and "base2" mean, and
-- {POS} with '|pos=POS' if there is a `pos` other than "terms", otherwise a blank string.
local what_categorizes = {
["prefix"] = "{{tl|af|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} or {{tl|affix|{LANG}|{TERM_AND_ID}|{BASE}{POS}}} (or the more specific and less-preferred equivalents {{tl|pre}} or {{tl|prefix}}), where {BASE_EXPL}",
["suffix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} (or the more specific and less-preferred equivalents {{tl|suf}} or {{tl|suffix}}), where {BASE_EXPL}",
["circumfix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, where {BASE_EXPL}",
["infix"] = "{{tl|infix|{LANG}|{BASE}|{TERM_AND_ID}{POS}}}, where {BASE_EXPL}",
["interfix"] = "{{tl|af|{LANG}|{BASE}|{TERM_AND_ID}{POS}|{BASE2}}} or {{tl|affix|{LANG}|{BASE}|{TERM_AND_ID}|{BASE2}{POS}}}, where {BASE_BASE2_EXPL}",
}
local args = require("Module:parameters").process(data.args, {
["alt"] = true,
["sc"] = true,
["sort"] = true,
["tr"] = true,
["ts"] = true,
})
local sc = data.sc or args.sc and require("Module:scripts").getByCode(args.sc, "sc") or nil
local m_affix = require("Module:affix")
-- Call make_affix to add display hyphens if they're not already present.
local _, display_term, lookup_term = m_affix.make_affix(term, data.lang, sc, affixtype, nil, true)
local _, display_alt = m_affix.make_affix(args.alt, data.lang, sc, affixtype)
local _, display_tr = m_affix.make_affix(args.tr, data.lang, require("Module:scripts").getByCode("Latn"), affixtype)
local _, display_ts = m_affix.make_affix(args.ts, data.lang, require("Module:scripts").getByCode("Latn"), affixtype)
local m_script_utilities = require("Module:script utilities")
local id_text = id and " (" .. id .. ")" or ""
-- Compute parents.
local parents = {}
if id then
if pos == "words" then
-- don't allow formerly-named categories with "words"
return nil
end
if pos == "terms" then
table.insert(parents, {name = labelpref .. term, sort = id, args = args})
else
table.insert(parents, {name = "terms " .. affixtype .. "ed with " .. term_and_id, sort = id .. ", " .. pos, args = args})
table.insert(parents, {name = labelpref .. term, sort = id, args = args})
end
elseif pos == "words" then
-- don't allow formerly-named categories with "words"
return nil
elseif pos ~= "terms" then
table.insert(parents, {name = "terms " .. affixtype .. "ed with " .. term, sort = pos, args = args})
end
table.insert(parents, {name = "terms by " .. affixtype, sort = (data.lang:makeSortKey(data.lang:stripDiacritics(args.sort or term)))})
-- If other affixes are mapped to this one, show them.
local additional
if data.lang then
local langcode = data.lang:getCode()
if m_affix.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(m_affix.affix_lang_data_module_prefix .. langcode)
local variants = {}
if langdata.affix_mappings then
for variant, canonical in pairs(langdata.affix_mappings) do
-- Above, we converted the stripped link term as we received it to the lookup form, so we
-- can look up the variants that are mapped to this term. Once we find them, map them to
-- display form.
local is_variant = false
if type(canonical) == "table" then
for _, canonical_v in pairs(canonical) do
if canonical_v == lookup_term then
is_variant = true
break
end
end
else
is_variant = canonical == lookup_term
end
if is_variant then
local _, display_variant = m_affix.make_affix(variant, data.lang, sc, affixtype)
table.insert(variants, "{{m|" .. langcode .. "|" .. display_variant .. "}}")
end
end
if #variants > 0 then
table.sort(variants)
additional = ("This category also includes terms %sed with %s."):format(affixtype,
require("Module:table").serialCommaJoin(variants))
end
end
end
end
if data.lang then
local m_str_utils = require("Module:string utilities")
local what_categorizes_msg = what_categorizes[affixtype]
if not what_categorizes_msg then
error(("Internal error: No what_categorizes value for affixtype '%s' for label '%s', lang '%s'"):
format(affixtype, data.label, data.lang:getCode()))
end
what_categorizes_msg = "Terms are placed in this category using " .. (what_categorizes_msg
:gsub("{LANG}", data.lang:getCode())
:gsub("{TERM_AND_ID}", m_str_utils.replacement_escape(
id and ("%s<id:%s>"):format(term, id) or term))
:gsub("{POS}", m_str_utils.replacement_escape(
pos == "terms" and "" or ("|pos=%s"):format(pos)))
:gsub("{BASE}", "<var>base</var>")
:gsub("{BASE2}", "<var>base2</var>")
:gsub("{BASE_EXPL}", "<code><var>base</var></code> is the base lemma from which this term is derived")
:gsub("{BASE_BASE2_EXPL}", "<code><var>base</var></code> and <code><var>base2</var></code> are the " ..
"base lemmas from which this term is derived")
) .. "."
if data.lang:getCode() == "ja" then
what_categorizes_msg =
require("Module:category tree/fam/jpx/what-categorizes-msg")
.get_what_categorizes_msg(term, nil, affixtype)
end
if what_categorizes_msg and what_categorizes_msg ~= "" then
if additional then
additional = additional .. "\n\n" .. what_categorizes_msg
else
additional = what_categorizes_msg
end
end
end
return {
description = "{{{langname}}} " .. pos .. " " .. desc[affixtype] .. " " .. require("Module:links").full_link({
lang = data.lang, term = display_term, alt = display_alt, sc = sc, id = id, tr = display_tr, ts = display_ts}, "term") .. ".",
additional = additional,
breadcrumb = pos == "terms" and m_script_utilities.tag_text(display_alt or display_term, data.lang, sc, "term") .. id_text or pos,
displaytitle = "{{{langname}}} " .. labelpref .. m_script_utilities.tag_text(term, data.lang, sc, "term") .. id_text,
parents = parents,
umbrella = false,
}, true -- true = args handled
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
j34dyw3hu26ax0hq0dgbkcaac8z4cvw
Mòideal:category tree/entry maintenance
828
17718
88377
2026-06-11T06:18:56Z
en>Fenakhay
0
88377
Scribunto
text/plain
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 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["entry maintenance"] = {
description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella_parents = "Fundamental",
}
labels["entries with incorrect language header"] = {
description = "{{{langname}}} entries that have been placed under the wrong language header.",
additional = "This can happen for several reasons:\n" ..
"* Typos.\n" ..
"* Vandalism.\n" ..
"* Using the wrong language code.\n" ..
"* Using an alternative name for the language.\n" ..
"* Using special characters which haven't been used in the name given in the language data modules.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References header"] = {
description = "{{{langname}}} entries without a References header.",
parents = {"entry maintenance"},
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 = {"entry maintenance"},
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 = {"entry maintenance"},
umbrella_parents = "Fundamental",
}
labels["entries with etymology trees"] = {
description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymon"] = {
description = "{{{langname}}} entries that use the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology text stop language not in chain"] = {
description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing ambiguous etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons with mismatched IDs"] = {
description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with multiple etymons missing IDs"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with etymology sections missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without this term in Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with language name categories using raw markup"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with topic categories using raw markup"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with outdated source"] = {
description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.",
parents = {"entry maintenance"},
}
labels["entries with inflection not matching pagename"] = {
description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.",
additional = "This is usually the result of incorrect or missing parameters.",
breadcrumb_and_first_sort_key = "inflection not matching pagename",
parents = {"entry maintenance"},
hidden = true,
can_be_empty = true,
}
labels["undefined derivations"] = {
description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.",
parents = {"entry maintenance"},
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["term requests"] = {
description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["redlinks"] = {
description = "Links to {{{langname}}} entries that have not been created yet.",
parents = {"entry maintenance"},
catfix = false,
can_be_empty = true,
hidden = true,
}
labels["terms with IPA pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of IPA.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with enPR pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of enPR.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with Indic pronunciation"] = {
description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["IPA pronunciations with invalid separators"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with hyphenation"] = {
description = "{{{langname}}} terms that include hyphenation.",
parents = {"entry maintenance"},
}
labels["terms with audio pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.",
additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with nonstandard or incorrect audio pronunciations"] = {
description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.",
parents = {"terms with audio pronunciation"},
can_be_empty = true,
hidden = true,
}
labels["entries missing Template:reconstructed"] = {
description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation)
labels[label] = {
description = desc or "Pages containing {{{langname}}} " .. label .. ".",
additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" ..
"Note that the pages in this category are not necessarily the same as the actual term in question. This " ..
"frequently happens, for example, with English pages with translation sections, where the term that " ..
"triggers the addition of the category is one of the translations."),
parents = {"entry maintenance"},
-- Set catfix = false because the page will have a mixture of native-language and
-- non-native-language pages, but include the normal native-language table of contents headers
-- because most pages are in the native language.
catfix = false,
toc_template = "{{{langcode}}}-categoryTOC",
toc_template_full = "{{{langcode}}}-categoryTOC/full",
can_be_empty = true,
hidden = true,
}
end
add_manual_param_category("terms in nonstandard scripts", nil,
"Pages are placed here if they contain terms written in a script that isn't in the language's " ..
"list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.",
true)
add_manual_param_category("terms with non-redundant manual transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with redundant transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant manual script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.",
true)
add_manual_param_category("terms with redundant script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant non-automated sortkeys",
"{{{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.")
add_manual_param_category("terms with redundant sortkeys",
"{{{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.")
add_manual_param_category("links with redundant target parameters",
"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("links with ignored alt parameters",
"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("links with redundant alt parameters",
"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("links with ignored id parameters",
"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("links with redundant wikilinks",
"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}}}}")
add_manual_param_category("links with manual fragments",
"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 = {"entry maintenance"},
}
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 = {"entry maintenance"},
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 = {"entry maintenance"},
}
]=]
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 = {"entry maintenance"},
}
labels["terms with usage examples"] = {
description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.",
additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].",
parents = {"entry maintenance"},
}
labels["terms with quotations"] = {
description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.",
additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
}
labels["terms with interlinear glossed text"] = {
description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.",
parents = {"entry maintenance"},
}
labels["terms with redundant head parameter"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their headword lines"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their inflection tables"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"redlinks"},
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
for _, quot_type in ipairs { "quotations", "usage examples" } do
labels[quot_type .. " with omitted translation"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do
labels[pos .. " with red links in their headword lines"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"terms with red links in their headword lines"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
labels[pos .. " with red links in their inflection tables"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"terms with red links in their inflection tables"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
local label = pos .. " with unknown or uncertain plurals"
labels[label] = {
description = "{{{langname}}} " .. label .. ".",
additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " ..
"is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " ..
"using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " ..
"that a plural cannot be attested but the noun is theoretically countable.",
breadcrumb = "with unknown or uncertain plurals",
parents = {
{name = pos, sort = "unknown or uncertain plurals"},
"entry maintenance",
},
}
end
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Entry maintenance subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Entry maintenance subcategories by language"] = {
description = "Umbrella categories covering topics related to entry maintenance.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "entry maintenance", is_label = true, sort = " "},
},
}
raw_categories["Requests"] = {
topright = "{{shortcut|WT:CR|WT:RQ}}",
description = "A parent category for the various request categories.",
parents = {"Category:Wiktionary"},
}
raw_categories["Requests by language"] = {
description = "Categories with requests in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "Request subcategories by language", sort = " "},
{name = "Requests", sort = " "},
},
breadcrumb = "By language",
}
raw_categories["Request subcategories by language"] = {
description = "Umbrella categories covering topics related to requests.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Requests", sort = " "},
},
}
raw_categories["Requests for quotations by source"] = {
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 = "Requests for quotations", sort = "source"}},
breadcrumb = "By source",
}
raw_categories["Requests for quotations"] = {
-- FIXME
description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.",
parents = {{name = "Requests", sort = "quotations"}},
breadcrumb = "Quotations",
}
raw_categories["Requests for date"] = {
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 = "Requests", sort = "date"}},
breadcrumb = "Date",
}
raw_categories["Requests for translations in user-competency categories by number of users"] = {
description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.",
parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}},
breadcrumb = "Translations in user-competency categories by number of users",
}
raw_categories["Requests for translations in user-competency categories by language"] = {
description = "Requests for translations to be added to user-competency categories, sorted by language.",
parents = {{name = "Requests", sort = "translations in user-competency categories by language"}},
breadcrumb = "Translations in user-competency categories by language",
hidden = true,
}
raw_categories["Terms with translations by language"] = {
description = "Terms with translations, sorted by language.",
parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}},
breadcrumb = "Translations",
}
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 = "entry maintenance", 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 "Request subcategories by language" 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 = "^Requests concerning (.+)$",
allow_etym_lang = true,
description = "Categories with {{{1}}} entries that need the attention of experienced editors.",
parents = {{name = "entry maintenance", is_label = true, sort = "requests"}},
etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"},
{name = "{{{1}}}", sort = "Requests"}},
umbrella = "Requests by language",
breadcrumb = "Requests",
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 = "^Requests for quotations in (.+)$",
umbrella = "Requests for quotations by language",
template_name = "rfquote",
},
{
regex = "^Requests for translations into (.+)$",
allow_etym_lang = true,
umbrella = "Requests for translations by language",
template_name = "t-needed",
catfix = "en",
},
{
regex = "^Requests for translations of (.+) usage examples$",
allow_etym_lang = true,
umbrella = "Requests for translations of usage examples by language",
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 = "^Requests for translations of (.+) quotations$",
allow_etym_lang = true,
umbrella = "Requests for translations of quotations by language",
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 = "en",
},
{
regex = "^Requests for transliteration of (.+) terms$",
umbrella = "Requests for transliteration by language",
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 = "^Requests for transliteration of (.+) usage examples$",
umbrella = "Requests for transliteration of usage examples by language",
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 = "^Requests for transliteration of (.+) quotations$",
umbrella = "Requests for transliteration of quotations by language",
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 = "Requests concerning {{{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 = "Requests concerning {{{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 = "^Requests for attention concerning (.+)$",
umbrella = "Requests for attention by language",
breadcrumb = "Attention",
template_name = "attention",
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 = "Requests for attention by language"
},
{
regex = "^Requests for quotations/(.+)$",
description = "Requests for a quotation or for quotations from {{{1}}}.",
parents = {{name = "Requests for quotations by source", 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 = "Requests for date by source", 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 = "Requests for translations in user-competency categories by number of users",
sort = function(items)
return " " .. ("%010d"):format(items["1"])
end,
}}
extend(requests_categories, {
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}-{{{2}}}",
nolang = true,
},
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{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 = "en"}
end
else
local umbrella_type = items.pagename:match("^Requests for (.+) by language$")
if umbrella_type then
breadcrumb = breadcrumb or umbrella_type
parents = {{name = "Request subcategories by language", 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("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "")
local requests_concerning_parent =
{
name = "Requests concerning " .. items.language_name,
sort = {sort_base = requests_concerning_breadcrumb, lang = "en"}
}
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 = "en"}},
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 = "en"}
})
end
local additional = expand_items_value("full_text_about_the_template")
if items.pagename:find(" by language$") 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("^Terms with (.+) translations$")
local lang = langname and require(languages_module).getByCanonicalName(langname, true, true)
if lang then
local langcode = lang:getCode()
local parents, breadcrumb_and_first_sort_key
if lang:hasType("etymology-only") then
parents = {
"Terms with " .. lang:getFullName() .. " translations",
{name = langname, sort = "Translations"},
}
breadcrumb_and_first_sort_key = lang:getCanonicalName()
else
parents = {
{name = "entry maintenance", is_label = true, lang = langcode},
{
name = "Terms with translations by language",
sort = {sort_base = langname, lang = "en"}
},
}
breadcrumb_and_first_sort_key = "Translations"
end
return {
description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.",
parents = parents,
breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key,
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 = "en"}}},
breadcrumb = taxtype,
hidden = true,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
r9pdvc14rskl9f9aflifah46vgik4lu
88378
88377
2026-07-27T00:14:23Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/entry_maintenance]]
88377
Scribunto
text/plain
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 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["entry maintenance"] = {
description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella_parents = "Fundamental",
}
labels["entries with incorrect language header"] = {
description = "{{{langname}}} entries that have been placed under the wrong language header.",
additional = "This can happen for several reasons:\n" ..
"* Typos.\n" ..
"* Vandalism.\n" ..
"* Using the wrong language code.\n" ..
"* Using an alternative name for the language.\n" ..
"* Using special characters which haven't been used in the name given in the language data modules.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References header"] = {
description = "{{{langname}}} entries without a References header.",
parents = {"entry maintenance"},
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 = {"entry maintenance"},
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 = {"entry maintenance"},
umbrella_parents = "Fundamental",
}
labels["entries with etymology trees"] = {
description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymon"] = {
description = "{{{langname}}} entries that use the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology text stop language not in chain"] = {
description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing ambiguous etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons with mismatched IDs"] = {
description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with multiple etymons missing IDs"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with etymology sections missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without this term in Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with language name categories using raw markup"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with topic categories using raw markup"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with outdated source"] = {
description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.",
parents = {"entry maintenance"},
}
labels["entries with inflection not matching pagename"] = {
description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.",
additional = "This is usually the result of incorrect or missing parameters.",
breadcrumb_and_first_sort_key = "inflection not matching pagename",
parents = {"entry maintenance"},
hidden = true,
can_be_empty = true,
}
labels["undefined derivations"] = {
description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.",
parents = {"entry maintenance"},
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["term requests"] = {
description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["redlinks"] = {
description = "Links to {{{langname}}} entries that have not been created yet.",
parents = {"entry maintenance"},
catfix = false,
can_be_empty = true,
hidden = true,
}
labels["terms with IPA pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of IPA.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with enPR pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of enPR.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with Indic pronunciation"] = {
description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["IPA pronunciations with invalid separators"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with hyphenation"] = {
description = "{{{langname}}} terms that include hyphenation.",
parents = {"entry maintenance"},
}
labels["terms with audio pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.",
additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with nonstandard or incorrect audio pronunciations"] = {
description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.",
parents = {"terms with audio pronunciation"},
can_be_empty = true,
hidden = true,
}
labels["entries missing Template:reconstructed"] = {
description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation)
labels[label] = {
description = desc or "Pages containing {{{langname}}} " .. label .. ".",
additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" ..
"Note that the pages in this category are not necessarily the same as the actual term in question. This " ..
"frequently happens, for example, with English pages with translation sections, where the term that " ..
"triggers the addition of the category is one of the translations."),
parents = {"entry maintenance"},
-- Set catfix = false because the page will have a mixture of native-language and
-- non-native-language pages, but include the normal native-language table of contents headers
-- because most pages are in the native language.
catfix = false,
toc_template = "{{{langcode}}}-categoryTOC",
toc_template_full = "{{{langcode}}}-categoryTOC/full",
can_be_empty = true,
hidden = true,
}
end
add_manual_param_category("terms in nonstandard scripts", nil,
"Pages are placed here if they contain terms written in a script that isn't in the language's " ..
"list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.",
true)
add_manual_param_category("terms with non-redundant manual transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with redundant transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant manual script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.",
true)
add_manual_param_category("terms with redundant script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant non-automated sortkeys",
"{{{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.")
add_manual_param_category("terms with redundant sortkeys",
"{{{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.")
add_manual_param_category("links with redundant target parameters",
"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("links with ignored alt parameters",
"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("links with redundant alt parameters",
"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("links with ignored id parameters",
"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("links with redundant wikilinks",
"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}}}}")
add_manual_param_category("links with manual fragments",
"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 = {"entry maintenance"},
}
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 = {"entry maintenance"},
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 = {"entry maintenance"},
}
]=]
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 = {"entry maintenance"},
}
labels["terms with usage examples"] = {
description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.",
additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].",
parents = {"entry maintenance"},
}
labels["terms with quotations"] = {
description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.",
additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
}
labels["terms with interlinear glossed text"] = {
description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.",
parents = {"entry maintenance"},
}
labels["terms with redundant head parameter"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their headword lines"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their inflection tables"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"redlinks"},
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
for _, quot_type in ipairs { "quotations", "usage examples" } do
labels[quot_type .. " with omitted translation"] = {
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 = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do
labels[pos .. " with red links in their headword lines"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"terms with red links in their headword lines"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
labels[pos .. " with red links in their inflection tables"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"terms with red links in their inflection tables"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
local label = pos .. " with unknown or uncertain plurals"
labels[label] = {
description = "{{{langname}}} " .. label .. ".",
additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " ..
"is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " ..
"using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " ..
"that a plural cannot be attested but the noun is theoretically countable.",
breadcrumb = "with unknown or uncertain plurals",
parents = {
{name = pos, sort = "unknown or uncertain plurals"},
"entry maintenance",
},
}
end
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Entry maintenance subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Entry maintenance subcategories by language"] = {
description = "Umbrella categories covering topics related to entry maintenance.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "entry maintenance", is_label = true, sort = " "},
},
}
raw_categories["Requests"] = {
topright = "{{shortcut|WT:CR|WT:RQ}}",
description = "A parent category for the various request categories.",
parents = {"Category:Wiktionary"},
}
raw_categories["Requests by language"] = {
description = "Categories with requests in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "Request subcategories by language", sort = " "},
{name = "Requests", sort = " "},
},
breadcrumb = "By language",
}
raw_categories["Request subcategories by language"] = {
description = "Umbrella categories covering topics related to requests.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Requests", sort = " "},
},
}
raw_categories["Requests for quotations by source"] = {
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 = "Requests for quotations", sort = "source"}},
breadcrumb = "By source",
}
raw_categories["Requests for quotations"] = {
-- FIXME
description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.",
parents = {{name = "Requests", sort = "quotations"}},
breadcrumb = "Quotations",
}
raw_categories["Requests for date"] = {
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 = "Requests", sort = "date"}},
breadcrumb = "Date",
}
raw_categories["Requests for translations in user-competency categories by number of users"] = {
description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.",
parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}},
breadcrumb = "Translations in user-competency categories by number of users",
}
raw_categories["Requests for translations in user-competency categories by language"] = {
description = "Requests for translations to be added to user-competency categories, sorted by language.",
parents = {{name = "Requests", sort = "translations in user-competency categories by language"}},
breadcrumb = "Translations in user-competency categories by language",
hidden = true,
}
raw_categories["Terms with translations by language"] = {
description = "Terms with translations, sorted by language.",
parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}},
breadcrumb = "Translations",
}
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 = "entry maintenance", 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 "Request subcategories by language" 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 = "^Requests concerning (.+)$",
allow_etym_lang = true,
description = "Categories with {{{1}}} entries that need the attention of experienced editors.",
parents = {{name = "entry maintenance", is_label = true, sort = "requests"}},
etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"},
{name = "{{{1}}}", sort = "Requests"}},
umbrella = "Requests by language",
breadcrumb = "Requests",
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 = "^Requests for quotations in (.+)$",
umbrella = "Requests for quotations by language",
template_name = "rfquote",
},
{
regex = "^Requests for translations into (.+)$",
allow_etym_lang = true,
umbrella = "Requests for translations by language",
template_name = "t-needed",
catfix = "en",
},
{
regex = "^Requests for translations of (.+) usage examples$",
allow_etym_lang = true,
umbrella = "Requests for translations of usage examples by language",
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 = "^Requests for translations of (.+) quotations$",
allow_etym_lang = true,
umbrella = "Requests for translations of quotations by language",
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 = "en",
},
{
regex = "^Requests for transliteration of (.+) terms$",
umbrella = "Requests for transliteration by language",
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 = "^Requests for transliteration of (.+) usage examples$",
umbrella = "Requests for transliteration of usage examples by language",
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 = "^Requests for transliteration of (.+) quotations$",
umbrella = "Requests for transliteration of quotations by language",
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 = "Requests concerning {{{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 = "Requests concerning {{{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 = "^Requests for attention concerning (.+)$",
umbrella = "Requests for attention by language",
breadcrumb = "Attention",
template_name = "attention",
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 = "Requests for attention by language"
},
{
regex = "^Requests for quotations/(.+)$",
description = "Requests for a quotation or for quotations from {{{1}}}.",
parents = {{name = "Requests for quotations by source", 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 = "Requests for date by source", 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 = "Requests for translations in user-competency categories by number of users",
sort = function(items)
return " " .. ("%010d"):format(items["1"])
end,
}}
extend(requests_categories, {
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}-{{{2}}}",
nolang = true,
},
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{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 = "en"}
end
else
local umbrella_type = items.pagename:match("^Requests for (.+) by language$")
if umbrella_type then
breadcrumb = breadcrumb or umbrella_type
parents = {{name = "Request subcategories by language", 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("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "")
local requests_concerning_parent =
{
name = "Requests concerning " .. items.language_name,
sort = {sort_base = requests_concerning_breadcrumb, lang = "en"}
}
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 = "en"}},
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 = "en"}
})
end
local additional = expand_items_value("full_text_about_the_template")
if items.pagename:find(" by language$") 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("^Terms with (.+) translations$")
local lang = langname and require(languages_module).getByCanonicalName(langname, true, true)
if lang then
local langcode = lang:getCode()
local parents, breadcrumb_and_first_sort_key
if lang:hasType("etymology-only") then
parents = {
"Terms with " .. lang:getFullName() .. " translations",
{name = langname, sort = "Translations"},
}
breadcrumb_and_first_sort_key = lang:getCanonicalName()
else
parents = {
{name = "entry maintenance", is_label = true, lang = langcode},
{
name = "Terms with translations by language",
sort = {sort_base = langname, lang = "en"}
},
}
breadcrumb_and_first_sort_key = "Translations"
end
return {
description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.",
parents = parents,
breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key,
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 = "en"}}},
breadcrumb = taxtype,
hidden = true,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
r9pdvc14rskl9f9aflifah46vgik4lu
Mòideal:category tree/figures of speech
828
17719
88379
2026-04-15T09:16:37Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/figures of speech]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88379
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["figures of speech"] = {
description = "{{{langname}}} terms whose interpretation is not strictly literal, but are used in figurative ways or for special effect.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["abbreviated euphemisms"] = {
description = "{{{langname}}} shortened euphemisms for profane, blasphemous, or taboo terms.",
parents = {"euphemisms"},
}
labels["aphorisms"] = {
description = "{{{langname}}} phrases that convey basic concepts in a manner short and easily memorable. Typically conveying a concise statement of a scientific principle or truth.",
parents = {"figures of speech"},
}
labels["catchphrases"] = {
description = "{{{langname}}} phrases that are popularized through repeated use.",
parents = {"figures of speech"},
}
labels["dysphemisms"] = {
description = "{{{langname}}} [[dysphemism]]s (offensive, vulgar or otherwise negative terms used in place of a neutral alternative).",
parents = {"figures of speech"},
}
labels["euphemisms"] = {
description = "{{{langname}}} terms that indirectly refer to something unpleasant or controversial.",
parents = {"figures of speech"},
}
labels["chengyu"] = {
description = "{{{langname}}} phrases originating in Classical Chinese, typically four characters in length.",
parents = {"idioms"},
}
labels["hyperboles"] = {
description = "{{{langname}}} terms used as exaggerations for emphasis, rather than being taken literally.",
parents = {"figures of speech"},
}
labels["idioms"] = {
description = "{{{langname}}} phrases understood by subjective, as opposed to literal meanings.",
parents = {"figures of speech", "multiword terms"},
}
labels["litotes"] = {
description = "{{{langname}}} litotical expressions or terms commonly used in [[litotes]] (stating something by denying its opposite).",
parents = {"figures of speech"},
}
labels["meioses"] = {
description = "{{{langname}}} meiotic expressions or terms commonly used in [[meiosis]] (downplaying the focal point of a statement for effect).",
parents = {"figures of speech"},
}
labels["metaphors"] = {
description = "{{{langname}}} phrases that invoke a similarity with something else.",
parents = {"figures of speech"},
}
labels["minced oaths"] = {
description = "{{{langname}}} euphemisms for profane, blasphemous, or taboo terms.",
parents = {"euphemisms"},
}
labels["proverbs"] = {
description = "{{{langname}}} phrases popularly known as representations of common sense.",
parents = {"figures of speech", "phrases"},
}
labels["sarcastic terms"] = {
description = "{{{langname}}} terms that are used sarcastically.",
parents = {"figures of speech"},
}
labels["similes"] = {
description = "{{{langname}}} figures of speech in which one thing is compared to another.",
parents = {"figures of speech"},
}
labels["set phrases"] = {
description = "{{{langname}}} An established expression whose wording is subject to little or no variation.",
parents = {"figures of speech"},
}
labels["snowclones"] = {
description = "{{{langname}}} clichés using old idioms with varying words in new contexts.",
parents = {"idioms"},
}
labels["synecdoches"] = {
description = "{{{langname}}} figures of speech in which a term for a part of something is used to refer to the whole [[pars pro toto]], or vice versa [[totum pro parte]].",
parents = {"figures of speech"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Figures of speech subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Figures of speech subcategories by language"] = {
description = "Umbrella categories covering topics related to figures of speech.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "figures of speech", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
mk8clef6mptsatg72gj2iku54dt8xmj
88380
88379
2026-07-27T00:14:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/figures_of_speech]]
88379
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["figures of speech"] = {
description = "{{{langname}}} terms whose interpretation is not strictly literal, but are used in figurative ways or for special effect.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["abbreviated euphemisms"] = {
description = "{{{langname}}} shortened euphemisms for profane, blasphemous, or taboo terms.",
parents = {"euphemisms"},
}
labels["aphorisms"] = {
description = "{{{langname}}} phrases that convey basic concepts in a manner short and easily memorable. Typically conveying a concise statement of a scientific principle or truth.",
parents = {"figures of speech"},
}
labels["catchphrases"] = {
description = "{{{langname}}} phrases that are popularized through repeated use.",
parents = {"figures of speech"},
}
labels["dysphemisms"] = {
description = "{{{langname}}} [[dysphemism]]s (offensive, vulgar or otherwise negative terms used in place of a neutral alternative).",
parents = {"figures of speech"},
}
labels["euphemisms"] = {
description = "{{{langname}}} terms that indirectly refer to something unpleasant or controversial.",
parents = {"figures of speech"},
}
labels["chengyu"] = {
description = "{{{langname}}} phrases originating in Classical Chinese, typically four characters in length.",
parents = {"idioms"},
}
labels["hyperboles"] = {
description = "{{{langname}}} terms used as exaggerations for emphasis, rather than being taken literally.",
parents = {"figures of speech"},
}
labels["idioms"] = {
description = "{{{langname}}} phrases understood by subjective, as opposed to literal meanings.",
parents = {"figures of speech", "multiword terms"},
}
labels["litotes"] = {
description = "{{{langname}}} litotical expressions or terms commonly used in [[litotes]] (stating something by denying its opposite).",
parents = {"figures of speech"},
}
labels["meioses"] = {
description = "{{{langname}}} meiotic expressions or terms commonly used in [[meiosis]] (downplaying the focal point of a statement for effect).",
parents = {"figures of speech"},
}
labels["metaphors"] = {
description = "{{{langname}}} phrases that invoke a similarity with something else.",
parents = {"figures of speech"},
}
labels["minced oaths"] = {
description = "{{{langname}}} euphemisms for profane, blasphemous, or taboo terms.",
parents = {"euphemisms"},
}
labels["proverbs"] = {
description = "{{{langname}}} phrases popularly known as representations of common sense.",
parents = {"figures of speech", "phrases"},
}
labels["sarcastic terms"] = {
description = "{{{langname}}} terms that are used sarcastically.",
parents = {"figures of speech"},
}
labels["similes"] = {
description = "{{{langname}}} figures of speech in which one thing is compared to another.",
parents = {"figures of speech"},
}
labels["set phrases"] = {
description = "{{{langname}}} An established expression whose wording is subject to little or no variation.",
parents = {"figures of speech"},
}
labels["snowclones"] = {
description = "{{{langname}}} clichés using old idioms with varying words in new contexts.",
parents = {"idioms"},
}
labels["synecdoches"] = {
description = "{{{langname}}} figures of speech in which a term for a part of something is used to refer to the whole [[pars pro toto]], or vice versa [[totum pro parte]].",
parents = {"figures of speech"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Figures of speech subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Figures of speech subcategories by language"] = {
description = "Umbrella categories covering topics related to figures of speech.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "figures of speech", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
mk8clef6mptsatg72gj2iku54dt8xmj
Mòideal:category tree/grammatical classes
828
17720
88381
2026-04-15T09:16:37Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/grammatical classes]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88381
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by grammatical category"] = {
description = "{{{langname}}} terms categorized by their grammatical category.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["indeclinable terms"] = {
description = "Indeclinable {{{langname}}} terms categorized by their part of speech.",
umbrella_parents = "Indeclinable terms subcategories by language",
parents = {{name = "terms by grammatical category"}},
}
labels["suppletive terms"] = {
description = "Suppletive {{{langname}}} terms categorized by their part of speech.",
umbrella_parents = "Suppletion subcategories by language",
parents = {{name = "terms by grammatical category"}},
}
------- GENDER -------
for _, pos in ipairs { "nouns", "pronouns", "proper nouns", "suffixes" } do
labels[pos .. " by gender"] = {
description = "{{{langname}}} " .. pos .. " organized by the gender they belong to.",
breadcrumb = "by gender",
parents = {{name = pos, sort = "gender"}},
}
labels[pos .. " with irregular gender"] = {
description = "{{{langname}}} " .. pos .. " whose ending is not typical for " .. pos .. " of their gender.",
breadcrumb = "with irregular gender",
parents = {{name = "irregular " .. pos, sort = "irregular gender"}},
}
labels[pos .. " with multiple genders"] = {
description = "{{{langname}}} " .. pos .. " that belong to more than one gender.",
breadcrumb = "with multiple genders",
parents = {{name = pos .. " by gender", sort = "multiple genders"}},
}
labels["common-gender " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|common gender}}, i.e. belonging to a gender category that combines the function of {{glossary|masculine}} and {{glossary|feminine}} and is opposed to the {{glossary|neuter}} gender.",
breadcrumb = "common-gender",
parents = {pos .. " by gender"},
}
labels["feminine " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|feminine}} gender, i.e. belonging to a gender category that contains (among other things) female beings.",
breadcrumb = "feminine",
parents = {pos .. " by gender"},
}
labels["masculine " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|masculine}} gender, i.e. belonging to a gender category that contains (among other things) male beings.",
breadcrumb = "masculine",
parents = {pos .. " by gender"},
}
labels["masculine and feminine " .. pos .. " by sense"] = {
description = "{{{langname}}} " .. pos .. " that may be either {{glossary|masculine}} or {{glossary|feminine}} depending on whether they refer to male or female beings.",
breadcrumb = "masculine and feminine by sense",
parents = {pos .. " by gender"},
}
labels["neuter " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|neuter}} gender, i.e. belonging to a gender category that does not usually contain male or female beings.",
breadcrumb = "neuter",
parents = {pos .. " by gender"},
}
labels["gender-neutral " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are applicable to all people, independent of gender.",
breadcrumb = "gender-neutral",
parents = {pos .. " by gender", "gender-neutral terms"},
}
end
for _, pos in ipairs({"adjectives", "determiners", "numerals", "participles", "suffixes"}) do
labels["epicene " .. pos] = {
description = "{{{langname}}} " .. pos .. " whose form is the same for both {{glossary|masculine}} and {{glossary|feminine}}, in languages whose " .. pos .. " normally distinguish gender.",
breadcrumb = "epicene",
parents = {pos .. " by inflection type"},
}
end
------- NOUN CLASSES -------
labels["nouns by class"] = {
description = "{{{langname}}} nouns organized by the class they belong to.",
breadcrumb = "by class",
parents = {{name = "nouns", sort = "class"}},
}
labels["alienable nouns"] = {
description = "{{{langname}}} nouns that are [[w:Inalienable possession|alienably possessed]].",
breadcrumb = "alienable",
parents = {"nouns"},
}
labels["inalienable nouns"] = {
description = "{{{langname}}} nouns that are [[w:Inalienable possession|inalienably possessed]].",
breadcrumb = "inalienable",
parents = {"nouns"},
}
------- ANIMACY -------
for _, pos in ipairs({"nouns", "suffixes", "verbs"}) do
labels["animate " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to humans or animals.",
breadcrumb = "animate",
parents = {pos},
}
labels["inanimate " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to inanimate objects (not humans or animals).",
breadcrumb = "inanimate",
parents = {pos},
}
labels[pos .. " with multiple animacies"] = {
description = "{{{langname}}} " .. pos .. " that belong to more than one animacy.",
breadcrumb = "with multiple animacies",
parents = {{name = pos, sort = "multiple animacies"}},
}
end
for _, pos in ipairs({"nouns", "suffixes"}) do
-- This category should be used particularly in languages that have
-- grammatical distinctions related to animals, such as Ukrainian.
labels["animal " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to animals.",
breadcrumb = "animal",
parents = {"animate " .. pos},
}
-- This category should be used particularly in languages that have
-- grammatical distinctions related to men, such as Polish.
labels["nonvirile " .. pos] = {
description = "{{{langname}}} plural " .. pos .. " that refer to a group without male humans.",
breadcrumb = "nonvirile",
parents = {pos, "pluralia tantum"},
}
labels["personal " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to humans.",
breadcrumb = "personal",
parents = {"animate " .. pos},
}
-- This category should be used particularly in languages that have
-- grammatical distinctions related to men, such as Polish.
labels["virile " .. pos] = {
description = "{{{langname}}} plural " .. pos .. " that refer to a group with at least one male human.",
breadcrumb = "virile",
parents = {pos, "pluralia tantum"},
}
end
------- INFLECTED PARTS OF SPEECH -------
-- Add "POS by inflection type", "irregular POS" and "POS by tone"
-- categories for (potentially) inflected parts of speech.
local inflected_poses = {
"adjectives",
"adverbs",
"determiners",
"nouns",
"numerals",
"participles",
"pronouns",
"proper nouns",
"suffixes",
"verbs",
}
for _, pos in ipairs(inflected_poses) do
labels[pos .. " by inflection type"] = {
description = "{{{langname}}} " .. pos .. " organized by the type of inflection they follow.",
breadcrumb = "by inflection type",
parents = {{name = pos, sort = "inflection"}},
}
labels["irregular " .. pos] = {
description = "{{{langname}}} " .. pos .. " that follow non-standard patterns of inflection.",
breadcrumb = "irregular",
parents = {pos .. " by inflection type"},
}
labels["defective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that lack one or more forms in their inflections.",
breadcrumb = "defective",
parents = {pos, "irregular " .. pos},
}
labels["suppletive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that have inflected forms from different roots.",
breadcrumb = "suppletive",
umbrella_parents = "Suppletion subcategories by language",
parents = {
"irregular " .. pos,
"suppletive terms",
},
}
if pos ~= "verbs" and pos ~= "adverbs" then
labels["indeclinable " .. pos] = {
description = "{{{langname}}} " .. pos .. " that do not display additional grammatical relations by means of declension.",
breadcrumb = "indeclinable",
umbrella_parents = "Indeclinable terms subcategories by language",
parents = {
pos .. " by inflection type",
"indeclinable terms",
},
}
labels[pos .. " with multiple declensions"] = {
description = "{{{langname}}} " .. pos .. " that follow more than one type of inflection.",
breadcrumb = "with multiple declensions",
parents = {{name = pos .. " by inflection type", sort = "multiple declensions"}},
}
labels[pos .. " with multiple plurals"] = {
description = "{{{langname}}} " .. pos .. " that have more than one possible plural (sometimes with distinct meanings).",
breadcrumb = "with multiple plurals",
parents = {{name = pos .. " by inflection type", sort = "multiple plurals"}},
}
end
labels[pos .. " by tone"] = {
description = "{{{langname}}} " .. pos .. " organized by the tone they follow.",
breadcrumb = "by tone",
parents = {{name = pos .. " by inflection type", sort = "tone"}},
}
labels[pos .. " by vowel harmony"] = {
description = "{{{langname}}} " .. pos .. " organized by the vowel harmony they follow.",
breadcrumb = "by vowel harmony",
parents = {{name = pos .. " by inflection type", sort = "vowel harmony"}},
}
end
-- FIXME: Only used currently for Arabic; probably should be removed as a general category.
labels["irregular elative adjectives"] = {
description = "{{{langname}}} elative adjectives that follow non-standard patterns of inflection.",
parents = {"adjectives by inflection type"},
}
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
labels[pos .. " with irregular plurals"] = {
description = "{{{langname}}} " .. pos .. " whose plural is formed irregularly.",
breadcrumb = "with irregular plurals",
parents = {{name = "irregular " .. pos, sort = "irregular plurals"}},
}
labels[pos .. " with unattested plurals"] = {
description = "{{{langname}}} " .. pos .. " whose plural is unattested.",
breadcrumb = "with unattested plurals",
parents = {{name = pos, sort = "unattested plurals"}},
}
labels["definite " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are inherently definite and have definite concord.",
breadcrumb = "definite",
parents = {pos .. " by inflection type"},
}
end
local labels2 = {}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Terms by grammatical category subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by grammatical category subcategories by language"] = {
description = "Umbrella categories covering topics related to grammatical categories, such as gender, animacy and noun and verb classes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by grammatical category", is_label = true, sort = " "},
},
}
raw_categories["Indeclinable terms subcategories by language"] = {
description = "Umbrella categories covering indeclinable terms in specific part-of-speech categories.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
"Terms by grammatical category subcategories by language",
},
}
raw_categories["Suppletion subcategories by language"] = {
description = "Umbrella categories covering suppletive terms in specific part-of-speech categories.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
"Terms by grammatical category subcategories by language",
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local class = data.label:match("^class (.+) nouns$")
if class then
local classnum, suffix = class:match("^(%d+)(.*)$")
return {
description =
"{{{langname}}} nouns that belong to class " .. class .. ".",
breadcrumb = {name = class, nocap = true},
umbrella = false,
parents = {{
name = "nouns by class",
sort = classnum and ("#%03d"):format(classnum) .. suffix or class,
}},
}
end
end)
table.insert(handlers, function(data)
local pos, tone = data.label:match("^(.+) with tone ([^ ]+)$")
if pos then
return {
description = "{{{langname}}} " .. pos .. " with tone " .. tone .. ".",
breadcrumb = tone,
-- FIXME, should there be an umbrella category e.g. 'Adjectives with tone H by language'?
umbrella = false,
parents = {{
name = pos .. " by tone",
sort = "" .. tone:len() .. tone,
}},
}
end
end)
table.insert(handlers, function(data)
local vh, pos = data.label:match("^(.+)-harmonic ([^ ]+)$")
if pos then
return {
description = "{{{langname}}} " .. pos .. " with vowel harmony in " .. vh .. ".",
breadcrumb = vh,
umbrella = false,
parents = {{
name = pos .. " by vowel harmony",
sort = "" .. vh:len() .. vh,
}},
}
end
end)
table.insert(handlers, function(data)
local pos, classifier = data.label:match("^(nouns) classified by (.+)$")
if pos then
local linktext
if data.lang then
-- Chinese classifiers may take the form TRAD/SIMP. This will cause problems if passed directly to [[Module:links]],
-- but the module can accept links of the form TRAD//SIMP and display them correctly.
if data.lang:getCode() == "zh" then
classifier = classifier:gsub("/", "//")
end
linktext = require("Module:links").full_link({ term = classifier, lang = data.lang }, "term")
else
linktext = classifier
end
return {
description = "{{{langname}}} " .. pos .. " using " .. linktext .. " as their classifier.",
breadcrumb = classifier,
umbrella = false,
parents = {{
name = pos .. " by classifier",
sort = (data.lang:makeSortKey(classifier)),
}},
}
end
end)
return {LABELS = labels2, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
0e6gyly5v26j3dy24of5trwu88u37j9
88382
88381
2026-07-27T00:14:48Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/grammatical_classes]]
88381
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by grammatical category"] = {
description = "{{{langname}}} terms categorized by their grammatical category.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["indeclinable terms"] = {
description = "Indeclinable {{{langname}}} terms categorized by their part of speech.",
umbrella_parents = "Indeclinable terms subcategories by language",
parents = {{name = "terms by grammatical category"}},
}
labels["suppletive terms"] = {
description = "Suppletive {{{langname}}} terms categorized by their part of speech.",
umbrella_parents = "Suppletion subcategories by language",
parents = {{name = "terms by grammatical category"}},
}
------- GENDER -------
for _, pos in ipairs { "nouns", "pronouns", "proper nouns", "suffixes" } do
labels[pos .. " by gender"] = {
description = "{{{langname}}} " .. pos .. " organized by the gender they belong to.",
breadcrumb = "by gender",
parents = {{name = pos, sort = "gender"}},
}
labels[pos .. " with irregular gender"] = {
description = "{{{langname}}} " .. pos .. " whose ending is not typical for " .. pos .. " of their gender.",
breadcrumb = "with irregular gender",
parents = {{name = "irregular " .. pos, sort = "irregular gender"}},
}
labels[pos .. " with multiple genders"] = {
description = "{{{langname}}} " .. pos .. " that belong to more than one gender.",
breadcrumb = "with multiple genders",
parents = {{name = pos .. " by gender", sort = "multiple genders"}},
}
labels["common-gender " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|common gender}}, i.e. belonging to a gender category that combines the function of {{glossary|masculine}} and {{glossary|feminine}} and is opposed to the {{glossary|neuter}} gender.",
breadcrumb = "common-gender",
parents = {pos .. " by gender"},
}
labels["feminine " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|feminine}} gender, i.e. belonging to a gender category that contains (among other things) female beings.",
breadcrumb = "feminine",
parents = {pos .. " by gender"},
}
labels["masculine " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|masculine}} gender, i.e. belonging to a gender category that contains (among other things) male beings.",
breadcrumb = "masculine",
parents = {pos .. " by gender"},
}
labels["masculine and feminine " .. pos .. " by sense"] = {
description = "{{{langname}}} " .. pos .. " that may be either {{glossary|masculine}} or {{glossary|feminine}} depending on whether they refer to male or female beings.",
breadcrumb = "masculine and feminine by sense",
parents = {pos .. " by gender"},
}
labels["neuter " .. pos] = {
description = "{{{langname}}} " .. pos .. " of {{glossary|neuter}} gender, i.e. belonging to a gender category that does not usually contain male or female beings.",
breadcrumb = "neuter",
parents = {pos .. " by gender"},
}
labels["gender-neutral " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are applicable to all people, independent of gender.",
breadcrumb = "gender-neutral",
parents = {pos .. " by gender", "gender-neutral terms"},
}
end
for _, pos in ipairs({"adjectives", "determiners", "numerals", "participles", "suffixes"}) do
labels["epicene " .. pos] = {
description = "{{{langname}}} " .. pos .. " whose form is the same for both {{glossary|masculine}} and {{glossary|feminine}}, in languages whose " .. pos .. " normally distinguish gender.",
breadcrumb = "epicene",
parents = {pos .. " by inflection type"},
}
end
------- NOUN CLASSES -------
labels["nouns by class"] = {
description = "{{{langname}}} nouns organized by the class they belong to.",
breadcrumb = "by class",
parents = {{name = "nouns", sort = "class"}},
}
labels["alienable nouns"] = {
description = "{{{langname}}} nouns that are [[w:Inalienable possession|alienably possessed]].",
breadcrumb = "alienable",
parents = {"nouns"},
}
labels["inalienable nouns"] = {
description = "{{{langname}}} nouns that are [[w:Inalienable possession|inalienably possessed]].",
breadcrumb = "inalienable",
parents = {"nouns"},
}
------- ANIMACY -------
for _, pos in ipairs({"nouns", "suffixes", "verbs"}) do
labels["animate " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to humans or animals.",
breadcrumb = "animate",
parents = {pos},
}
labels["inanimate " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to inanimate objects (not humans or animals).",
breadcrumb = "inanimate",
parents = {pos},
}
labels[pos .. " with multiple animacies"] = {
description = "{{{langname}}} " .. pos .. " that belong to more than one animacy.",
breadcrumb = "with multiple animacies",
parents = {{name = pos, sort = "multiple animacies"}},
}
end
for _, pos in ipairs({"nouns", "suffixes"}) do
-- This category should be used particularly in languages that have
-- grammatical distinctions related to animals, such as Ukrainian.
labels["animal " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to animals.",
breadcrumb = "animal",
parents = {"animate " .. pos},
}
-- This category should be used particularly in languages that have
-- grammatical distinctions related to men, such as Polish.
labels["nonvirile " .. pos] = {
description = "{{{langname}}} plural " .. pos .. " that refer to a group without male humans.",
breadcrumb = "nonvirile",
parents = {pos, "pluralia tantum"},
}
labels["personal " .. pos] = {
description = "{{{langname}}} " .. pos .. " that refer to humans.",
breadcrumb = "personal",
parents = {"animate " .. pos},
}
-- This category should be used particularly in languages that have
-- grammatical distinctions related to men, such as Polish.
labels["virile " .. pos] = {
description = "{{{langname}}} plural " .. pos .. " that refer to a group with at least one male human.",
breadcrumb = "virile",
parents = {pos, "pluralia tantum"},
}
end
------- INFLECTED PARTS OF SPEECH -------
-- Add "POS by inflection type", "irregular POS" and "POS by tone"
-- categories for (potentially) inflected parts of speech.
local inflected_poses = {
"adjectives",
"adverbs",
"determiners",
"nouns",
"numerals",
"participles",
"pronouns",
"proper nouns",
"suffixes",
"verbs",
}
for _, pos in ipairs(inflected_poses) do
labels[pos .. " by inflection type"] = {
description = "{{{langname}}} " .. pos .. " organized by the type of inflection they follow.",
breadcrumb = "by inflection type",
parents = {{name = pos, sort = "inflection"}},
}
labels["irregular " .. pos] = {
description = "{{{langname}}} " .. pos .. " that follow non-standard patterns of inflection.",
breadcrumb = "irregular",
parents = {pos .. " by inflection type"},
}
labels["defective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that lack one or more forms in their inflections.",
breadcrumb = "defective",
parents = {pos, "irregular " .. pos},
}
labels["suppletive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that have inflected forms from different roots.",
breadcrumb = "suppletive",
umbrella_parents = "Suppletion subcategories by language",
parents = {
"irregular " .. pos,
"suppletive terms",
},
}
if pos ~= "verbs" and pos ~= "adverbs" then
labels["indeclinable " .. pos] = {
description = "{{{langname}}} " .. pos .. " that do not display additional grammatical relations by means of declension.",
breadcrumb = "indeclinable",
umbrella_parents = "Indeclinable terms subcategories by language",
parents = {
pos .. " by inflection type",
"indeclinable terms",
},
}
labels[pos .. " with multiple declensions"] = {
description = "{{{langname}}} " .. pos .. " that follow more than one type of inflection.",
breadcrumb = "with multiple declensions",
parents = {{name = pos .. " by inflection type", sort = "multiple declensions"}},
}
labels[pos .. " with multiple plurals"] = {
description = "{{{langname}}} " .. pos .. " that have more than one possible plural (sometimes with distinct meanings).",
breadcrumb = "with multiple plurals",
parents = {{name = pos .. " by inflection type", sort = "multiple plurals"}},
}
end
labels[pos .. " by tone"] = {
description = "{{{langname}}} " .. pos .. " organized by the tone they follow.",
breadcrumb = "by tone",
parents = {{name = pos .. " by inflection type", sort = "tone"}},
}
labels[pos .. " by vowel harmony"] = {
description = "{{{langname}}} " .. pos .. " organized by the vowel harmony they follow.",
breadcrumb = "by vowel harmony",
parents = {{name = pos .. " by inflection type", sort = "vowel harmony"}},
}
end
-- FIXME: Only used currently for Arabic; probably should be removed as a general category.
labels["irregular elative adjectives"] = {
description = "{{{langname}}} elative adjectives that follow non-standard patterns of inflection.",
parents = {"adjectives by inflection type"},
}
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
labels[pos .. " with irregular plurals"] = {
description = "{{{langname}}} " .. pos .. " whose plural is formed irregularly.",
breadcrumb = "with irregular plurals",
parents = {{name = "irregular " .. pos, sort = "irregular plurals"}},
}
labels[pos .. " with unattested plurals"] = {
description = "{{{langname}}} " .. pos .. " whose plural is unattested.",
breadcrumb = "with unattested plurals",
parents = {{name = pos, sort = "unattested plurals"}},
}
labels["definite " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are inherently definite and have definite concord.",
breadcrumb = "definite",
parents = {pos .. " by inflection type"},
}
end
local labels2 = {}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Terms by grammatical category subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by grammatical category subcategories by language"] = {
description = "Umbrella categories covering topics related to grammatical categories, such as gender, animacy and noun and verb classes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by grammatical category", is_label = true, sort = " "},
},
}
raw_categories["Indeclinable terms subcategories by language"] = {
description = "Umbrella categories covering indeclinable terms in specific part-of-speech categories.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
"Terms by grammatical category subcategories by language",
},
}
raw_categories["Suppletion subcategories by language"] = {
description = "Umbrella categories covering suppletive terms in specific part-of-speech categories.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
"Terms by grammatical category subcategories by language",
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local class = data.label:match("^class (.+) nouns$")
if class then
local classnum, suffix = class:match("^(%d+)(.*)$")
return {
description =
"{{{langname}}} nouns that belong to class " .. class .. ".",
breadcrumb = {name = class, nocap = true},
umbrella = false,
parents = {{
name = "nouns by class",
sort = classnum and ("#%03d"):format(classnum) .. suffix or class,
}},
}
end
end)
table.insert(handlers, function(data)
local pos, tone = data.label:match("^(.+) with tone ([^ ]+)$")
if pos then
return {
description = "{{{langname}}} " .. pos .. " with tone " .. tone .. ".",
breadcrumb = tone,
-- FIXME, should there be an umbrella category e.g. 'Adjectives with tone H by language'?
umbrella = false,
parents = {{
name = pos .. " by tone",
sort = "" .. tone:len() .. tone,
}},
}
end
end)
table.insert(handlers, function(data)
local vh, pos = data.label:match("^(.+)-harmonic ([^ ]+)$")
if pos then
return {
description = "{{{langname}}} " .. pos .. " with vowel harmony in " .. vh .. ".",
breadcrumb = vh,
umbrella = false,
parents = {{
name = pos .. " by vowel harmony",
sort = "" .. vh:len() .. vh,
}},
}
end
end)
table.insert(handlers, function(data)
local pos, classifier = data.label:match("^(nouns) classified by (.+)$")
if pos then
local linktext
if data.lang then
-- Chinese classifiers may take the form TRAD/SIMP. This will cause problems if passed directly to [[Module:links]],
-- but the module can accept links of the form TRAD//SIMP and display them correctly.
if data.lang:getCode() == "zh" then
classifier = classifier:gsub("/", "//")
end
linktext = require("Module:links").full_link({ term = classifier, lang = data.lang }, "term")
else
linktext = classifier
end
return {
description = "{{{langname}}} " .. pos .. " using " .. linktext .. " as their classifier.",
breadcrumb = classifier,
umbrella = false,
parents = {{
name = pos .. " by classifier",
sort = (data.lang:makeSortKey(classifier)),
}},
}
end
end)
return {LABELS = labels2, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
0e6gyly5v26j3dy24of5trwu88u37j9
Mòideal:category tree/lang-specific-raw
828
17721
88383
2025-12-09T05:09:36Z
en>Octahedron80
0
88383
Scribunto
text/plain
local raw_categories = {}
-- This module contains definitions of language-specific categories that do not begin with the language in question.
-- Specifying such definitions in the language-specific modules themselves is not supported (because all modules would
-- have to be loaded to find the definitions).
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
------------------- Albanian -----------------
raw_categories["Arvanitika Albanian letters"] = {
lang = "sq",
description = "{{w|Arvanitika}} Albanian symbols that represent single sounds.",
parents = {
{name = "Arvanitika Albanian", sort = "letters"},
{name = "letters", is_label = true, lang = "sq"},
},
breadcrumb = "letters",
}
------------------- Korean -----------------
raw_categories["Sino-Korean words"] = {
lang = "ko",
description = "{{w|Sino-Korean vocabulary|Sino-Korean}} words, i.e. words of Chinese origin, as contrasted with native Korean, etc.",
parents = {
{name = "terms by etymology", is_label = true, lang = "ko"},
{name = "borrowed terms", is_label = true, lang = "ko"},
},
preceding = "{{also|:Category:Sino-Vietnamese words}}",
}
raw_categories["Sino-Korean words with compound tensing"] = {
lang = "ko",
description = "{{w|Sino-Korean vocabulary|Sino-Korean}} words where the initial consonant of the second component is converted to its {{w|Korean phonology#Tense|tense}} equivalent.",
breadcrumb = "with compound tensing",
parents = {
{name = "Sino-Korean words", sort = "compound tensing"},
},
preceding = "{{also|:Category:Korean terms interfixed with -ㅅ-|Appendix:Sino-Korean tensing}}",
}
------------------- Portuguese -------------------
raw_categories["Brazilian Portuguese forms"] = {
lang = "pt",
description = "Spellings used in {{w|Brazilian Portuguese}}, but not {{w|European Portuguese}}.",
additional = "Adding {{tl|lb|pt|Brazilian Portuguese spelling}} to an entry page adds the entry to this category.",
breadcrumb = "forms",
parents = {
{name = "Brazilian Portuguese", sort = "forms", args = {lect = "1"}},
},
preceding = "{{also|:Category:European Portuguese forms}}",
}
raw_categories["Brazilian Portuguese verb forms"] = {
lang = "pt",
description = "Verb form spellings used in {{w|Brazilian Portuguese}}, but not {{w|European Portuguese}}.",
additional = "These spellings are official in Brazil but not in Portugal or its former African and Asian colonies. The category is automatically added by {{tl|pt-verb form of}}.",
breadcrumb = "verb forms",
parents = {
{name = "Brazilian Portuguese forms", sort = "verb forms"},
{name = "verb forms", is_label = true, lang = "pt"},
},
preceding = "{{also|:Category:European Portuguese verb forms}}",
}
raw_categories["European Portuguese forms"] = {
lang = "pt",
description = "Spellings used in {{w|European Portuguese}}, but not {{w|Brazilian Portuguese}}.",
additional = "These spellings are official in Portugal and often applied in Angola, Cabo Verde, Mozambique, Guinea-Bissau, Macau, São Tomé and Principe, and Timor-Leste, but not in Brazil." ..
"\n\nAdding {{tl|lb|pt|European Portuguese spelling}} to an entry page adds the entry to this category.",
breadcrumb = "forms",
parents = {
{name = "European Portuguese", sort = "forms", args = {lect = "1"}},
{name = "African Portuguese", args = {lect = "1"}},
{name = "Asian Portuguese", args = {lect = "1"}},
},
preceding = "{{also|:Category:Brazilian Portuguese forms}}",
}
raw_categories["European Portuguese verb forms"] = {
lang = "pt",
description = "Verb form spellings used in {{w|European Portuguese}}, but not {{w|Brazilian Portuguese}}.",
additional = "These spellings are official in Portugal and often applied in former Portuguese colonies other than Brazil. The category is automatically added by {{tl|pt-verb form of}}.",
breadcrumb = "verb forms",
parents = {
{name = "European Portuguese forms", sort = "verb forms"},
{name = "verb forms", is_label = true, lang = "pt"},
},
preceding = "{{also|:Category:Brazilian Portuguese verb forms}}",
}
raw_categories["Brazilian Portuguese forms superseded by AO1990"] = {
lang = "pt",
description = "Brazilian Portuguese terms superseded by the {{w|Portuguese Language Orthographic Agreement of 1990}}.",
additional = "These terms were officially used in Brazilian Portuguese — but not European Portuguese — until December 2015, when the period of transition between the previous spelling standard and the [[w:Portuguese Language Orthographic Agreement of 1990|Orthographic Agreement achieved in 1990]] ended.",
breadcrumb = "Brazilian Portuguese",
parents = {
{name = "forms superseded by AO1990", is_label = true, lang = "pt"},
{name = "Brazilian Portuguese forms", sort = "superseded by AO1990"},
},
}
raw_categories["European Portuguese forms superseded by AO1990"] = {
lang = "pt",
description = "European Portuguese terms superseded by the {{w|Portuguese Language Orthographic Agreement of 1990}}.",
additional = "These terms were officially used in European Portuguese — but not Brazilian Portuguese — until October 2015, when the period of transition between the previous spelling reform and the [[w:Portuguese Language Orthographic Agreement of 1990|Orthographic Agreement achieved in 1990]] ended in Cape Verde. Portugal’s transition period ended in May 2015.",
breadcrumb = "European Portuguese",
parents = {
{name = "forms superseded by AO1990", is_label = true, lang = "pt"},
{name = "European Portuguese forms", sort = "superseded by AO1990"},
},
}
------------------- Vietnamese -----------------
raw_categories["Sino-Vietnamese readings"] = {
lang = "vi",
description = "{{w|Sino-Vietnamese vocabulary|Sino-Vietnamese}} readings of Chinese terms.",
parents = {"Vietnamese language"},
}
raw_categories["Sino-Vietnamese words"] = {
lang = "vi",
description = "{{w|Sino-Vietnamese vocabulary|Sino-Vietnamese}} words, i.e. words of Chinese origin, as contrasted with native Vietnamese, Euro-Vietnamese, etc.",
parents = {
{name = "terms by etymology", is_label = "true", lang = "vi"},
{name = "borrowed terms", is_label = "true", lang = "vi"},
},
preceding = "{{also|:Category:Sino-Korean words}}",
}
raw_categories["Sino-Vietnamese words with uncreated Han etymology"] = {
lang = "vi",
description = "{{w|Sino-Vietnamese vocabulary|Sino-Vietnamese}} words whose equivalent Chinese-origin word does not exist.",
additional = "This category is added by {{tl|vi-etym-sino}} when the concatenation of the specified Chinese components does not form a term that currently exists.",
parents = {
{name = "entry maintenance", is_label = "true", lang = "vi"},
{name = "term requests", is_label = "true", lang = "zh"},
},
hidden = true,
}
return {RAW_CATEGORIES = raw_categories}
lkgkpwh03qfhaagr1e8v82uigg1s6v1
88384
88383
2026-07-27T00:15:01Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/lang-specific-raw]]
88383
Scribunto
text/plain
local raw_categories = {}
-- This module contains definitions of language-specific categories that do not begin with the language in question.
-- Specifying such definitions in the language-specific modules themselves is not supported (because all modules would
-- have to be loaded to find the definitions).
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
------------------- Albanian -----------------
raw_categories["Arvanitika Albanian letters"] = {
lang = "sq",
description = "{{w|Arvanitika}} Albanian symbols that represent single sounds.",
parents = {
{name = "Arvanitika Albanian", sort = "letters"},
{name = "letters", is_label = true, lang = "sq"},
},
breadcrumb = "letters",
}
------------------- Korean -----------------
raw_categories["Sino-Korean words"] = {
lang = "ko",
description = "{{w|Sino-Korean vocabulary|Sino-Korean}} words, i.e. words of Chinese origin, as contrasted with native Korean, etc.",
parents = {
{name = "terms by etymology", is_label = true, lang = "ko"},
{name = "borrowed terms", is_label = true, lang = "ko"},
},
preceding = "{{also|:Category:Sino-Vietnamese words}}",
}
raw_categories["Sino-Korean words with compound tensing"] = {
lang = "ko",
description = "{{w|Sino-Korean vocabulary|Sino-Korean}} words where the initial consonant of the second component is converted to its {{w|Korean phonology#Tense|tense}} equivalent.",
breadcrumb = "with compound tensing",
parents = {
{name = "Sino-Korean words", sort = "compound tensing"},
},
preceding = "{{also|:Category:Korean terms interfixed with -ㅅ-|Appendix:Sino-Korean tensing}}",
}
------------------- Portuguese -------------------
raw_categories["Brazilian Portuguese forms"] = {
lang = "pt",
description = "Spellings used in {{w|Brazilian Portuguese}}, but not {{w|European Portuguese}}.",
additional = "Adding {{tl|lb|pt|Brazilian Portuguese spelling}} to an entry page adds the entry to this category.",
breadcrumb = "forms",
parents = {
{name = "Brazilian Portuguese", sort = "forms", args = {lect = "1"}},
},
preceding = "{{also|:Category:European Portuguese forms}}",
}
raw_categories["Brazilian Portuguese verb forms"] = {
lang = "pt",
description = "Verb form spellings used in {{w|Brazilian Portuguese}}, but not {{w|European Portuguese}}.",
additional = "These spellings are official in Brazil but not in Portugal or its former African and Asian colonies. The category is automatically added by {{tl|pt-verb form of}}.",
breadcrumb = "verb forms",
parents = {
{name = "Brazilian Portuguese forms", sort = "verb forms"},
{name = "verb forms", is_label = true, lang = "pt"},
},
preceding = "{{also|:Category:European Portuguese verb forms}}",
}
raw_categories["European Portuguese forms"] = {
lang = "pt",
description = "Spellings used in {{w|European Portuguese}}, but not {{w|Brazilian Portuguese}}.",
additional = "These spellings are official in Portugal and often applied in Angola, Cabo Verde, Mozambique, Guinea-Bissau, Macau, São Tomé and Principe, and Timor-Leste, but not in Brazil." ..
"\n\nAdding {{tl|lb|pt|European Portuguese spelling}} to an entry page adds the entry to this category.",
breadcrumb = "forms",
parents = {
{name = "European Portuguese", sort = "forms", args = {lect = "1"}},
{name = "African Portuguese", args = {lect = "1"}},
{name = "Asian Portuguese", args = {lect = "1"}},
},
preceding = "{{also|:Category:Brazilian Portuguese forms}}",
}
raw_categories["European Portuguese verb forms"] = {
lang = "pt",
description = "Verb form spellings used in {{w|European Portuguese}}, but not {{w|Brazilian Portuguese}}.",
additional = "These spellings are official in Portugal and often applied in former Portuguese colonies other than Brazil. The category is automatically added by {{tl|pt-verb form of}}.",
breadcrumb = "verb forms",
parents = {
{name = "European Portuguese forms", sort = "verb forms"},
{name = "verb forms", is_label = true, lang = "pt"},
},
preceding = "{{also|:Category:Brazilian Portuguese verb forms}}",
}
raw_categories["Brazilian Portuguese forms superseded by AO1990"] = {
lang = "pt",
description = "Brazilian Portuguese terms superseded by the {{w|Portuguese Language Orthographic Agreement of 1990}}.",
additional = "These terms were officially used in Brazilian Portuguese — but not European Portuguese — until December 2015, when the period of transition between the previous spelling standard and the [[w:Portuguese Language Orthographic Agreement of 1990|Orthographic Agreement achieved in 1990]] ended.",
breadcrumb = "Brazilian Portuguese",
parents = {
{name = "forms superseded by AO1990", is_label = true, lang = "pt"},
{name = "Brazilian Portuguese forms", sort = "superseded by AO1990"},
},
}
raw_categories["European Portuguese forms superseded by AO1990"] = {
lang = "pt",
description = "European Portuguese terms superseded by the {{w|Portuguese Language Orthographic Agreement of 1990}}.",
additional = "These terms were officially used in European Portuguese — but not Brazilian Portuguese — until October 2015, when the period of transition between the previous spelling reform and the [[w:Portuguese Language Orthographic Agreement of 1990|Orthographic Agreement achieved in 1990]] ended in Cape Verde. Portugal’s transition period ended in May 2015.",
breadcrumb = "European Portuguese",
parents = {
{name = "forms superseded by AO1990", is_label = true, lang = "pt"},
{name = "European Portuguese forms", sort = "superseded by AO1990"},
},
}
------------------- Vietnamese -----------------
raw_categories["Sino-Vietnamese readings"] = {
lang = "vi",
description = "{{w|Sino-Vietnamese vocabulary|Sino-Vietnamese}} readings of Chinese terms.",
parents = {"Vietnamese language"},
}
raw_categories["Sino-Vietnamese words"] = {
lang = "vi",
description = "{{w|Sino-Vietnamese vocabulary|Sino-Vietnamese}} words, i.e. words of Chinese origin, as contrasted with native Vietnamese, Euro-Vietnamese, etc.",
parents = {
{name = "terms by etymology", is_label = "true", lang = "vi"},
{name = "borrowed terms", is_label = "true", lang = "vi"},
},
preceding = "{{also|:Category:Sino-Korean words}}",
}
raw_categories["Sino-Vietnamese words with uncreated Han etymology"] = {
lang = "vi",
description = "{{w|Sino-Vietnamese vocabulary|Sino-Vietnamese}} words whose equivalent Chinese-origin word does not exist.",
additional = "This category is added by {{tl|vi-etym-sino}} when the concatenation of the specified Chinese components does not form a term that currently exists.",
parents = {
{name = "entry maintenance", is_label = "true", lang = "vi"},
{name = "term requests", is_label = "true", lang = "zh"},
},
hidden = true,
}
return {RAW_CATEGORIES = raw_categories}
lkgkpwh03qfhaagr1e8v82uigg1s6v1
Mòideal:category tree/languages
828
17722
88385
2026-06-07T02:17:46Z
en>Saph
0
don't show link to nonexistent wikipedia article on language cat
88385
Scribunto
text/plain
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["All languages"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Fundamental",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"All languages",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"All languages",
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
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("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and
-- canonicalizes them.
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("^the (.*)$")
local bare_location = location_no_the or location
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
local location_link = concat(bare_location_parts, ", ")
if location_no_the then location_link = "the " .. 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(true)
setwiki = not wikipediaArticle and "-"
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 "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
-- Avoid showing Wiktionary links section for reconstructed languages,
-- as they are ineligible for Wiktionary editions
local wiktionarylinks_chunk = concat{
[=[|-
| 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|Wiktionary]]
|style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
]=]}
if lang:hasType('reconstructed') then
wiktionarylinks_chunk = ''
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{ -- FIXME: Bare wikicode
[=[<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">''']=], canonicalName, [=[ language links'''</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);" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Commons-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
]=], wiktionarylinks_chunk, [=[
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Codex icon articles color-progressive.svg|35px|none|Entry]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Codex icon book color-progressive.svg|35px|none|Resources]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
</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(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</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>Other names</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>Aliases</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>Varieties</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
insert(ret, (
"<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>"
.. lang:getCode()
.. "</code></td>\n</tr>\n"
)
)
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>[[:Category:Unassigned languages|unassigned]]</td>")
elseif famCode == "qfa-dis" then
insert(ret, "<td>[[:Category:Languages of disputed affiliation|disputed affiliation]]</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "qfa-unc" then
insert(ret, "<td>[[:Category:Unclassifiable languages|unclassifiable language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</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('Special:Search', {
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>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</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,
("[[Module:%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,
("[[Module:%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>: [[Module:%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, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[[d:' .. wikidataItem .. '|' .. wikidataItem .. ']]'
else
link = '<span class="error">Invalid Wikidata item: <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_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. 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 =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
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, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken",
prep, location_link_text
)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local entry_guidelines_page = "Wiktionary:" .. canonicalName .. " entry guidelines"
local entry_guidelines = new_title(entry_guidelines_page)
if entry_guidelines.exists then
add = add .. "\n\n" ..
"Please see '''[[" .. entry_guidelines_page .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
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_for_family_tree(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
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 = "en"}
local ret = {{name = "All languages", 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 = "Category:Unassigned languages", sort = sortkey})
elseif famCode == "qfa-dis" then
insert(ret, {name = "Category:Languages of disputed affiliation", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "qfa-unc" then
insert(ret, {name = "Category:Unclassifiable languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", 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 = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", 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 = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:" .. sc:getCategoryName() .. " languages", 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 = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. 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 = "Category:All extinct languages", 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 = "Category:Languages not sorted into a location category", 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({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
insert(ret, {name = label, is_label = true})
end
insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
insert(ret, {name = "Varieties of {{{langname}}}"})
insert(ret, {name = "Requests concerning {{{langname}}}"})
insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{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:find("[Ll]anguage$") or category:find("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^(.*) language$")
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("^Languages of (.*)$")
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("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") 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 = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
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 = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%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 = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):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("(.*)%-based creole or pidgin languages$")
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 = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {
RAW_CATEGORIES = raw_categories,
RAW_HANDLERS = raw_handlers
}
pxumxz7hst5qqkh18vzbnigxb7bw3lr
88386
88385
2026-07-27T00:15:11Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/languages]]
88385
Scribunto
text/plain
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["All languages"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"Fundamental",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"All languages",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"All languages",
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
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("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and
-- canonicalizes them.
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("^the (.*)$")
local bare_location = location_no_the or location
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
local location_link = concat(bare_location_parts, ", ")
if location_no_the then location_link = "the " .. 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(true)
setwiki = not wikipediaArticle and "-"
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 "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
-- Avoid showing Wiktionary links section for reconstructed languages,
-- as they are ineligible for Wiktionary editions
local wiktionarylinks_chunk = concat{
[=[|-
| 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|Wiktionary]]
|style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
]=]}
if lang:hasType('reconstructed') then
wiktionarylinks_chunk = ''
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{ -- FIXME: Bare wikicode
[=[<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">''']=], canonicalName, [=[ language links'''</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);" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Commons-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
]=], wiktionarylinks_chunk, [=[
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Codex icon articles color-progressive.svg|35px|none|Entry]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Codex icon book color-progressive.svg|35px|none|Resources]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
</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(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</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>Other names</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>Aliases</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>Varieties</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
insert(ret, (
"<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>"
.. lang:getCode()
.. "</code></td>\n</tr>\n"
)
)
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>[[:Category:Unassigned languages|unassigned]]</td>")
elseif famCode == "qfa-dis" then
insert(ret, "<td>[[:Category:Languages of disputed affiliation|disputed affiliation]]</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "qfa-unc" then
insert(ret, "<td>[[:Category:Unclassifiable languages|unclassifiable language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</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('Special:Search', {
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>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</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,
("[[Module:%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,
("[[Module:%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>: [[Module:%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, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[[d:' .. wikidataItem .. '|' .. wikidataItem .. ']]'
else
link = '<span class="error">Invalid Wikidata item: <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_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. 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 =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
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, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken",
prep, location_link_text
)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local entry_guidelines_page = "Wiktionary:" .. canonicalName .. " entry guidelines"
local entry_guidelines = new_title(entry_guidelines_page)
if entry_guidelines.exists then
add = add .. "\n\n" ..
"Please see '''[[" .. entry_guidelines_page .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
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_for_family_tree(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
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 = "en"}
local ret = {{name = "All languages", 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 = "Category:Unassigned languages", sort = sortkey})
elseif famCode == "qfa-dis" then
insert(ret, {name = "Category:Languages of disputed affiliation", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "qfa-unc" then
insert(ret, {name = "Category:Unclassifiable languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", 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 = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", 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 = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:" .. sc:getCategoryName() .. " languages", 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 = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. 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 = "Category:All extinct languages", 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 = "Category:Languages not sorted into a location category", 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({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
insert(ret, {name = label, is_label = true})
end
insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
insert(ret, {name = "Varieties of {{{langname}}}"})
insert(ret, {name = "Requests concerning {{{langname}}}"})
insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{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:find("[Ll]anguage$") or category:find("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^(.*) language$")
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("^Languages of (.*)$")
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("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") 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 = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
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 = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%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 = "Languages"})
end
end
local description = ("Categories for languages of %s (including sublects)."):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("(.*)%-based creole or pidgin languages$")
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 = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {
RAW_CATEGORIES = raw_categories,
RAW_HANDLERS = raw_handlers
}
pxumxz7hst5qqkh18vzbnigxb7bw3lr
Mòideal:category tree/lects
828
17723
88387
2026-02-08T02:57:53Z
en>Benwing2
0
if lect is extinct, reconstructed or unattested, verb should be "formerly spoken" not "spoken"
88387
Scribunto
text/plain
local export = {}
local raw_categories = {}
local raw_handlers = {}
local labels_module = "Module:labels"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local parse_utilities_module = "Module:parse utilities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local m_table = require(table_module)
local get_lang = require(languages_module).getByCode
local insert_if_not = m_table.insertIfNot
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local serial_comma_join = m_table.serialCommaJoin
local split = require(string_utilities_module).split
local split_on_comma = require(parse_utilities_module).split_on_comma
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/lects/PAGE]]
return require("Module:debug/track")("category tree/lects/" .. page)
end
-- This module handles lect/variety categories of all sorts, e.g. regional lect categories such as
-- [[:Category:American English]] and [[:Category:Provençal]]; temporal lect categories such as
-- [[:Category:Early Modern English]]; sociolect categories such as [[:Category:Polari]]; and umbrella categories of the
-- form e.g. [[:Category:Varieties of English]] and [[:Category:Regional French]].
-- FIXME: Eliminate the word "dialect" here and in the {{auto cat}} parameter in favor of "lect" or "variety". [DONE]
--[=[
FIXME:
1. Support multiple parents. [DONE]
2. Support cat: in parents to indicate a category. [DONE]
3. When linking a description without embedded links, use the equivalent of {{wtorw}} to auto-link to Wikipedia. [DONE]
4. Support the = true. [DONE]
]=]
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Language varieties"] = {
description = "Categories that group terms in varieties of various languages (regional, temporal, sociolectal, etc.).",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Fundamental",
},
}
raw_categories["Regionalisms"] = {
description = "Categories that group terms in regional varieties of various languages.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Fundamental",
"Language varieties",
},
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function ucfirst(text)
return mw.getContentLanguage():ucfirst(text)
end
local function lcfirst(text)
return mw.getContentLanguage():lcfirst(text)
end
local function page_exists(page)
local title = mw.title.new(page)
return title and title.exists
end
-- Handle categories such as [[:Category:Varieties of French]] and [[:Category:Varieties of Ancient Greek]].
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Varieties of (.*)$")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Categories containing terms in varieties of " .. lang:makeCategoryLink() .. " (regional, temporal, sociolectal, etc.).",
parents = {
"{{{langcat}}}",
{name = "Language varieties", sort = langname},
},
breadcrumb = "Varieties",
}
end
end
end)
-- Handle categories such as [[:Category:Regional French]] and [[:Category:Regional Ancient Greek]].
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Regional (.*)$")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Categories containing terms in regional varieties of " .. lang:makeCategoryLink() .. ".",
additional = "This category sometimes also directly contains terms that are uncategorized regionalisms: such terms should be recategorized by the particular regional variety they belong to, or categorized as dialectal.",
parents = {
"Varieties of {{{langname}}}",
{name = "Regionalisms", sort = langname},
},
breadcrumb = "Regional",
}
end
end
end)
-- Fancy version of ine() (if-not-empty). Converts empty string to nil, but also strips leading/trailing space.
local function ine(arg)
if not arg then return nil end
arg = mw.text.trim(arg)
if arg == "" then return nil end
return arg
end
-- Get the full language to use e.g. in the settings.
local function get_returnable_lang(lang)
if lang:hasType("family") then
return nil
else
return lang:getFull()
end
end
-- Get the full language code to return in the settings.
local function get_returnable_lang_code(lang)
if lang:hasType("family") then
return "und"
else
return lang:getFullCode()
end
end
local memoizing_lect_handler
local function category_to_lang_name(category)
local getByCanonicalName = require("Module:languages").getByCanonicalName
local lang
lang = getByCanonicalName(category, nil, "allow etym", "allow family")
if not lang then
-- Some languages have lowercase-initial names e.g. 'the BMAC substrate', but the category begins with an
-- uppercase letter.
lang = getByCanonicalName(lcfirst(category), nil, "allow etym", "allow family")
end
return lang
end
-- 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.
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
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
-- Try to figure out if this variety is extinct or reconstructed, if type= not given.
local function determine_lect_type(category, lang, default_parent_cat)
if category:find("^Proto%-") or lang:getCanonicalName():find("^Proto%-") or lang:hasType("reconstructed") then
-- Is it reconstructed?
return "reconstructed"
end
if lang:getCode():find("^qsb%-") then
-- Substrate.
return "unattested"
end
if lang:hasType("full") then
-- If a full language, scrape the {{auto cat}} call and check for extinct=1.
local parent_args = scrape_category_for_auto_cat_args(lang:getCategoryName())
if parent_args and ine(parent_args.extinct) and require("Module:yesno")(parent_args.extinct, false) then
return "extinct"
end
end
-- Otherwise, call the lect handler recursively for the parent category. This is correct e.g. for
-- things like subvarieties of Classical Persian, where the lang itself (Persian) isn't extinct but the
-- parent category refers to an extinct variety. If the lect handler fails to return a type, it's because
-- the parent category doesn't exist or isn't defined using {{auto cat}}, and doesn't have a language as a
-- suffix. In that case, if we're dealing with an etymology-only language, check the parent language. Finally,
-- fall back to returning "extant" if all else fails.
local parent_type
if default_parent_cat then
export.register_likely_lect_parent_cat(default_parent_cat)
parent_type = select(2, memoizing_lect_handler(default_parent_cat, nil, true))
end
if parent_type then
return parent_type
end
local parent_lang = lang:getParent()
if parent_lang then
return determine_lect_type(category, parent_lang, nil)
end
return "extant"
end
-- Try to figure out the region (used as the default breadcrumb and region description) from the language. If the
-- language name is an etymology-only language, try to derive a region based on a parent etymology-only or full
-- language. For example, if the pagename is '[[:Category:British English]]', the language is 'en-GB' (British English)
-- and the same as the pagename, but we'd like to return a region 'British'. This is also called in cases where the
-- language is explicitly given but we need to infer the region from the parent language; e.g.
-- [[:Category:Lucerne Alemmanic German]] is a type of High Alemannic German but we want to infer 'Lucerne' based on
-- the parent 'Alemannic German'. If this doesn't work and the language name has a space in it, we try using
-- progressively smaller suffixes of the language. For example, for [[:Category:Walser German]]', the language is
-- 'wae' (Walser German), but the parent is 'Highest Alemannic German', whose parent is 'Alemannic German' (a full
-- language), and just "German" is nowhere in the parent-child relationships but found as a suffix in the parent
-- language. Another such case is with [[:Category:Ionic Greek]], whose parent is 'Ancient Greek'.
local function infer_region_from_lang(pagename, lang)
local langname = lang:getCanonicalName()
local lang_to_check = lang
if ucfirst(langname) == pagename then
lang_to_check = lang_to_check:getParent()
end
-- First check against the language name and progressively smaller suffixes; then repeat for any parents (of
-- etymology languages). If the language name is the same as the page name, we need to start with the parent;
-- otherwise we will always match against a suffix, but that's not what we want.
while lang_to_check do
local suffix = lang_to_check:getCanonicalName()
while true do
local region = pagename:match("^(.*) " .. pattern_escape(suffix) .. "$")
if region then
return region
end
suffix = suffix:match("^.- (.*)$")
if not suffix then
break
end
end
lang_to_check = lang_to_check:getParent()
end
return nil
end
-- Modeled after splitLabelLang() in [[Module:category tree]]. Try to split off a maximally long language (full or
-- etymology-only) on the right, and return the resulting language object and the region preceding it. We need to
-- check the maximally long language because of cases like 'English' vs 'Middle English' and 'Chinese Pidgin English';
-- [[:Category:Late Middle English]] should split as 'Late' and 'Middle English', not as 'Late Middle' and 'English'.
local function split_region_lang(pagename)
local lang
local region
-- Try the entire title as a language; if not, chop off a word on the left and repeat.
local words = split(pagename, " ")
for i = 1, #words do
lang = category_to_lang_name(table.concat(words, " ", i, #words))
if lang then
if i == 1 then
region = nil
else
region = table.concat(words, " ", 1, i - 1)
end
break
end
end
if not region and lang then
-- The pagename is the same as a language name. Try to infer the region from the parent. See comment at
-- function.
region = infer_region_from_lang(pagename, lang)
end
return lang, region
end
-- Return the default parent cat for the given language and category. If the language and category are the same, we're
-- dealing with the overall cat for an etymology-only language, so use the category of the parent language; otherwise
-- we're dealing with a subcategory of a regular or etymology-only language (e.g. [[:Category:Issime Walser]], a
-- subcategory of [[:Category:Walser German]]), so use the language's category itself. If the resulting language is an
-- etymology-only language or a family, the parent category is that language or family's category, which for
-- etymology-only languages is named the same as the etymology-only language, and for families is named
-- "FAMILY languages"; otherwise, use "Regional LANG" as the category unless `noreg` is given, in which case we use
-- "Varieties of LANG".
local function get_default_parent_cat_from_category(category, lang, noreg)
if lang:getCode():find("^qsb%-") then
-- substrate
return "Substrate languages"
end
local lang_for_cat
if ucfirst(lang:getCanonicalName()) == category then
lang_for_cat = lang:getParent()
if not lang_for_cat then
error(("Category '%s' has a name the same as a full language; you probably need to explicitly specify a different language using |lang="):format(category))
end
else
lang_for_cat = lang
end
if lang_for_cat:hasType("etymology-only") or lang_for_cat:hasType("family") then
return lang_for_cat:getCategoryName()
elseif noreg then
return "Varieties of " .. lang_for_cat:getCanonicalName()
else
return "Regional " .. lang_for_cat:getCanonicalName()
end
end
-- Find the labels that categorize into `category`. Only categories specified using the `regional_categories` and
-- `plain_categories` fields will be returned. `lang` is the language object to use when looking up categories specified
-- using the `regional_categories` field, which append the language onto the specified category prefix. If `lang` is a
-- family or is omitted, no categories specified using `regional_categories` will be returned. Lang-specific modules for
-- all languages will be checked for matching labels that specify `category` as their category using `plain_categories`;
-- this helps e.g. with varieties of Chinese, whose labels are found in [[Module:labels/data/lang/zh]]. The return value
-- is a table in the same format as returned by `find_labels_for_category` in [[Module:labels/utilities]].
--
-- FIXME: It should be possible to check for categories specified using `regional_categories` even when `lang` is nil.
local function find_labels_for_category(category, lang)
local regional_cat_labels, plain_cat_labels
local full_lang
local m_labels_utilities = require(labels_utilities_module)
if lang and lang:hasType("language") then
full_lang = lang:getFull()
local regional_component = category:match("^(.-) " .. pattern_escape(full_lang:getCanonicalName()) .. "$")
if regional_component then
regional_cat_labels = m_labels_utilities.find_labels_for_category(regional_component,
"regional", full_lang)
end
end
plain_cat_labels = m_labels_utilities.find_labels_for_category(category, "plain", full_lang, "check all langs")
local all_labels
if regional_cat_labels and plain_cat_labels then
all_labels = regional_cat_labels
for k, v in pairs(plain_cat_labels) do
all_labels[k] = v
end
else
all_labels = regional_cat_labels or plain_cat_labels
end
return all_labels
end
-- Find the labels for category `category` and language object `lang` (which can be nil or a family, but in that case,
-- no labels on a category specified using `regional_categories`; FIXME: it should be possible to implement this). Then
-- filter them down to those that are specified using a lang-specific module and sort them for use in checking
-- properties such as parent and description. We filter down to only lang-specific labels because those specified in a
-- general module (especially [[Module:labels/data/regional]]) won't be able to have proper descriptions and especially
-- parents, which tend to be language-specific. The sort order prioritizes labels that match the category exactly
-- (either through the canonical version or any alias); this is followed by labels that are a prefix of the category
-- (again, either through the canonical version or any alias), so that labels whose categories are specified using
-- `regional_categories` are prioritized. Any other labels are sorted last, so that e.g. if both the label "Alberta" and
-- "Canada" (with alias "Canadian") for lang=en categorize into [[:Category:Canadian English]], we prefer the label
-- "Canada". For cases where e.g. both labels match the category as prefixes, ties are broken by prioritizing the labels
-- found in the lang-specific module whose language matches `lang`.
--
-- Returns two items. The first is a table of all labels categorizing into `category` (subject to the provisos described
-- in `find_labels_for_category()`), in the same format as returned by `find_labels_for_category` in
-- [[Module:labels/utilities]]. (Specifically, the values are objects containing all relevant information on a given
-- label, and the keys are less important.) The second is a list of label objects after filtering and sorting, in the
-- same format as the values in the `all_labels` table. The first return value will be nil if no labels could be found
-- categorizing into `category`, and the second return value will be nil if no labels remain after filtering.
local function get_sorted_labels(category, lang)
local all_labels = find_labels_for_category(category, lang)
if not all_labels then
return nil
end
local m_labels = require(labels_module)
local lang_specific_pattern = "^" .. pattern_escape(m_labels.lang_specific_data_modules_prefix)
local sorted_labels = {}
for _, labelobj in pairs(all_labels) do
if labelobj.module:find(lang_specific_pattern) then
table.insert(sorted_labels, labelobj)
end
end
local function sort_labelobj(a, b)
local function matches_exactly(labelobj)
if labelobj.canonical == category then
return true
end
for _, alias in ipairs(labelobj.aliases) do
if alias == category then
return true
end
end
return false
end
local function matches_as_prefix(labelobj)
if category:find("^" .. pattern_escape(labelobj.canonical) .. " ") then
return true
end
for _, alias in ipairs(labelobj.aliases) do
if category:find("^" .. pattern_escape(alias) .. " ") then
return true
end
end
return false
end
local function tiebreak()
local a_matches_lang = lang and a.lang:getFullCode() == lang:getFullCode()
local b_matches_lang = lang and b.lang:getFullCode() == lang:getFullCode()
if a_matches_lang and not b_matches_lang then
return true
elseif b_matches_lang and not a_matches_lang then
return false
else
return a.canonical < b.canonical
end
end
local a_matches_exactly = matches_exactly(a)
local b_matches_exactly = matches_exactly(b)
if a_matches_exactly and not b_matches_exactly then
return true
elseif b_matches_exactly and not a_matches_exactly then
return false
elseif a_matches_exactly and b_matches_exactly then
return tiebreak()
end
local a_matches_as_prefix = matches_as_prefix(a)
local b_matches_as_prefix = matches_as_prefix(b)
if a_matches_as_prefix and not b_matches_as_prefix then
return true
elseif b_matches_as_prefix and not a_matches_as_prefix then
return false
else
return tiebreak()
end
end
table.sort(sorted_labels, sort_labelobj)
if #sorted_labels > 0 then
return all_labels, sorted_labels
else
return all_labels, nil
end
end
-- Find the categories (only of type `regional_categories` and `plain_categories`) that label `label` categorizes into.
-- Return value is nil if the label couldn't be located at all, otherwise a list of categories (which may be empty).
local function get_categories_for_label(label, lang)
local m_labels = require(labels_module)
local labret = m_labels.get_label_info { label = label, lang = lang }
if not labret.recognized then
return nil
end
local categories = m_labels.fetch_categories(labret.canonical or label, labret.data, lang, nil, nil,
{["plain_categories"] = true})
local reg_cats = m_labels.fetch_categories(labret.canonical or label, labret.data, lang, nil, nil,
{["regional_categories"] = true})
if #reg_cats > 0 then
for _, cat in ipairs(reg_cats) do
table.insert(categories, cat)
end
end
return categories
end
-- Given the sorted labels that categorize into `category`, return the parent categories for the first label that specifies
-- any parents. `default` is the default parent category, usually "Regional LANG" or (if noreg=1 is specified) "Varieties of LANG";
-- it is used if the parent is explicitly given as `true` or "+" (or one of these values occurs among others), or if a parent label
-- was given but didn't categorize into any regional or plain categories, or if no labels with parents could be found. If
-- `all_cats` is specified, all categories associated with all specified parent labels (if more than one is present) are returned;
-- otherwise, only the categories for the first parent label are returned.
--
-- Returns two values: the list of parent categories and the label object from which the categories were derived (or nil if no
-- label object could be found with a `parent` field, in which case the return value of the list of categories is a simple-element
-- list consisting of `default`). The format of the parent category list is such that the list can directly be specified as the
-- value of the `parents` field returned by the raw handler. This means that usually the individual list elements are strings
-- (referring to raw poscat labels), but they may be strings prefixed by "Category:" (for arbitrary categories), or objects of the
-- form {name = "CATEGORY", lang = "LANGCODE", is_label = true} for poscat language labels.
local function get_parents_from_sorted_labels(sorted_labels, category, all_cats)
for _, labobj in ipairs(sorted_labels) do
local parent = labobj.labdata.parent
if parent == true then
parent = {parent}
elseif parent and type(parent) == "string" then
parent = split_on_comma(parent)
end
local function get_parent_cats(par)
if par == true or par == "+" then
return {"+"}
end
if par:find("^cat:") then
return {"Category:" .. par:gsub("^cat:", "")}
end
if par:find("^Category:") then
return {par}
end
if par:find("^rawposcat:") then
return {(par:gsub("^rawposcat:", ""))}
end
if par:find("^poscat:") then
local langcode, label = par:match("^poscat:([^:]+):(.*)$")
if not langcode then
error(("Parent poscatboiler language label '%s' for label '%s' for category '%s' (defined in module [[%s]]) needs to be of the form 'poscat:LANGCODE:LABEL'"):format(
par, labobj.canonical, category, labobj.module))
end
return {{name = label, lang = langcode, is_label = true}}
end
local this_cats = get_categories_for_label(par, labobj.lang)
if not this_cats then
error(("Parent label '%s' for label '%s' for category '%s' (defined in module [[%s]]) couldn't be located"):format(
par, labobj.canonical, category, labobj.module))
end
return this_cats
end
if parent then
if type(parent) ~= "table" then
error(("Internal error: Expected a string, boolean `true` or list for the value of the parent field for label '%s' for category '%s' (defined in module [[%s]]), but saw type '%s': %s"):format(
labobj.canonical, category, labobj.module, type(parent), mw.dumpObject(parent)))
end
local cats
if all_cats then
cats = {}
for _, par in ipairs(parent) do
local this_cats = get_parent_cats(par)
for _, this_cat in ipairs(this_cats) do
insert_if_not(cats, this_cat)
end
end
else
cats = get_parent_cats(parent[1])
end
if #cats > 0 then
return cats, labobj
end
-- FIXME: If the parent doesn't specify any categories, should we try the next parent or fall back
-- to the parent determined through get_default_parent_cat_from_category() (which is what we currently
-- do)?
return {"+"}, labobj
end
end
return {"+"}, nil
end
local likely_lect_parent_cat = {}
-- Register that `cat` is likely to be a lect cat, so we try to handle it as such in the lect handler when
-- we are called on that category. This avoids the need to have manual allow-lists of nonstandardly-named parent
-- lect categories to handle, such as [[:Category:Assyrian]], [[:Category:Ripuarian Franconian]] ("Franconian" is
-- not a language) and [[:Category:Limburgan-Ripuarian transitional dialects]].
function export.register_likely_lect_parent_cat(cat)
if type(cat) == "string" and not cat:find("^Category:") then
likely_lect_parent_cat[cat] = true
end
end
-- Handle lect categories such as [[:Category:New Zealand English]], [[:Category:Late Middle English]],
-- [[:Category:Arbëresh Albanian]], [[:Category:Provençal]] or arbitrarily-named categories like
-- [[:Category:Issime Walser]]. We currently require that lect=1 is specified to the call to {{auto cat}} to avoid
-- overfiring. However, if called from inside, we are processing the breadcrumb for the parent (or conceivably the
-- child) of a lect category, and won't have any params set, so we can't rely on lect=1. In that case, only fire
-- if the category is or ends in the name of a full or etymology-only language, and scrape the category's call to
-- {{auto cat}} to get the appropriate params. This means that nonstandardly-named categories like
-- [[:Category:Issime Walser]] can't be parents of other lect categories. To work around this, either we have to
-- relax the code below to operate on all raw categories (not necessarily a good idea), or we rename the
-- nonstandardly-named categories (e.g. in the case above, to [[:Category:Issime Walser German]], since Walser German
-- is a recognized etymology-only language).
--
-- NOTE: We are able to handle categories for etymology-only families (currently only [[:Category:Middle Iranian]] and
-- [[:Category:Old Iranian]]) and for etymology-only substrate languages (e.g. [[:Category:BMAC substrate]]).
-- There is some special "family" code for the former.
local function lect_handler(category, raw_args, called_from_inside)
if called_from_inside then
-- Avoid infinite loops from wrongly processing non-lect categories. We have a check around line 344 below
-- for categories whose {{auto cat}} doesn't say lect=1, but we still need the following in case of
-- non-existent categories we're being asked to process (e.g. [[:Category:User bcc]] ->
-- [[:Category:Southern Balochi]] (nonexistent) -> [[:Category:Regional Baluchi]] (nonexistent), which
-- causes an infinite loop without the check below.
if category:find("^Regional ") or category:find("^Varieties of ") or category:find("^Rhymes:") then
return nil
end
-- If called from inside we won't have any params available. See comment above about this. We scrape the
-- category page's call to {{auto cat}} to get the appropriate params, and if that fails, we currently fall back
-- to defaults based on the label(s) that categorize(s) into the category or the name of the category. Since the
-- call from inside is only to get the parent category and breadcrumb, these defaults actually work in most
-- cases but not all; e.g. in the chain [[:Category:Regional Yoruba]] -> [[:Category:Central Yoruba]] ->
-- [[:Category:Ekiti Yoruba]] -> [[:Category:Akurẹ Yoruba]], if we are forced to use default values, we will
-- produce the right parent for [[:Category:Central Yoruba]] but not for [[:Category:Ekiti Yoruba]], where the
-- default parent would be [[:Category:Regional Yoruba]] instead of the correct [[:Category:Central Yoruba]].
local lang, breadcrumb = split_region_lang(category)
if lang or likely_lect_parent_cat[category] then
raw_args = scrape_category_for_auto_cat_args(category)
if raw_args and not ine(raw_args.lect) then
-- We are scraping something like [[:Category:American Sign Language]] that ends in a valid language but is not
-- a lect.
return nil
end
if not raw_args then
-- If we can't parse the scraped {{auto cat}} spec, return default values. This helps e.g. in converting
-- from the old {{dialectboiler}} template and generally when adding new varieties.
local parents, label_with_parent
local function getprop(prop)
return -- ine(raw_args[prop]) or
label_with_parent and label_with_parent.labdata[prop]
end
local sorted_labels = select(2, get_sorted_labels(category, lang))
if sorted_labels then
parents, label_with_parent = get_parents_from_sorted_labels(sorted_labels, category)
if not lang and label_with_parent then
lang = label_with_parent.lang
end
else
parents = {"+"}
end
if not lang then
-- We were instructed to scrape by virtue of `register_likely_lect_parent_cat`, but couldn't scrape
-- anything.
return nil
end
local default_parent_cat_from_category = get_default_parent_cat_from_category(category, lang,
getprop("noreg"))
for i, parent in ipairs(parents) do
if parent == "+" then
parents[i] = default_parent_cat_from_category
end
end
local first_parent_cat = parents[1]
if type(first_parent_cat) ~= "string" or first_parent_cat:find("^Category:") then
-- Only keep `first_parent_cat` if it refers to a raw poscat label (which is probably a lect
-- handler label).
first_parent_cat = nil
end
track("lect")
export.register_likely_lect_parent_cat(parents[1])
-- NOTE: When called from inside, the description doesn't matter; nor do any parents other than the
-- first. This is because called_from_inside is only set when computing the breadcrumb trail, which
-- only needs the language, first parent and breadcrumb.
return {
-- FIXME, allow etymological codes here
lang = get_returnable_lang_code(lang),
description = "Foo",
parents = parents,
breadcrumb = breadcrumb or lang:getCanonicalName(),
umbrella = false,
can_be_empty = true,
}, determine_lect_type(category, lang, first_parent_cat)
end
else
return nil
end
end
if not called_from_inside and not ine(raw_args.lect) then
return nil
end
-------------------- 1. Process parameters. -------------------
local boolean = {type = "boolean"}
local sublist = {sublist = "comma without whitespace"}
local args = require("Module:parameters").process(raw_args, {
[1] = true,
lect = boolean,
lang = true,
verb = true,
prep = true,
the = boolean,
def = true,
fulldef = true,
addl = true,
nolink = boolean,
noreg = boolean, -- don't make the default parent be "Regional LANG"; instead, "Varieties of LANG"
type = {set = {"extinct", "extant", "reconstructed", "unattested", "constructed"}},
cat = true,
othercat = sublist,
country = sublist,
wp = true,
wikidata = true,
breadcrumb = true,
also = {type = "title", sublist = "comma without whitespace", namespace = 14},
pagename = true, -- for testing or demonstration
})
-------------------- 2. Initialize breadcrumb, regiondesc and language from category. -------------------
-- They may be overridden later.
local lang, breadcrumb, regiondesc, langname
category = args.pagename or category
if not args.lang then
lang, breadcrumb = split_region_lang(category)
if lang then
langname = lang:getCanonicalName()
end
-- The lang and/or breadcrumb may be nil at this point (e.g. we're processing a category like
-- [[:Category:Singlish]] or [[:Category:Polari]] that doesn't have a language in it). We don't throw an error
-- yet because we may be able to fetch the lang, regiondesc and breadcrumb from a label that categorizes into
-- the category.
regiondesc = breadcrumb
else
lang = get_lang(args.lang, "lang", "allow etym")
langname = lang:getCanonicalName()
if category == ucfirst(langname) then
-- breadcrumb and regiondesc should stay nil; breadcrumb will get `category` as a default, and the lack of
-- regiondesc will cause an error to be thrown unless the user gave it explicitly or specified def=.
else
breadcrumb = category:match("^(.*) " .. pattern_escape(langname) .. "$")
if not breadcrumb then
-- Try to infer the region from the parent. See comment at function.
breadcrumb = infer_region_from_lang(category, lang)
end
regiondesc = breadcrumb
end
end
-------------------- 3. Determine labels categorizing into this category. -------------------
local all_labels, sorted_labels = get_sorted_labels(category, lang)
-------------------- 4. Determine parent categories and initialize additional properties. -------------------
-- The first label with a parent is used to fetch additional properties, such as region= and addl=.
local parents
local first_parent_cat = args.cat
local label_with_parent
local function getprop(prop)
return args[prop] or label_with_parent and label_with_parent.labdata[prop]
end
if first_parent_cat then
parents = {first_parent_cat}
if not lang then
error(("lang= not given and unable to parse language from category '%s' (didn't check labels categorizing into the category because cat= explicitly given)"):format(category))
end
else
if sorted_labels then
parents, label_with_parent = get_parents_from_sorted_labels(sorted_labels, category, "all cats")
if not lang and label_with_parent then
lang = label_with_parent.lang
langname = lang:getCanonicalName()
end
else
parents = {"+"}
end
if not lang then
error(("lang= not given, unable to parse language from category '%s' and can't find a label categorizing into the category"):format(category))
end
local default_parent_cat_from_category = get_default_parent_cat_from_category(category, lang, getprop("noreg"))
for i, parent in ipairs(parents) do
if parent == "+" then
parents[i] = default_parent_cat_from_category
end
end
first_parent_cat = parents[1]
end
if type(first_parent_cat) ~= "string" or first_parent_cat:find("^Category:") then
-- Only keep `first_parent_cat` if it refers to a raw poscat label (which is probably a lect handler label).
-- WARNING: Code below using `first_parent_cat` must handle nil.
first_parent_cat = nil
end
local othercat = getprop("othercat")
if type(othercat) == "string" then
othercat = split_on_comma(othercat)
end
if othercat then
for _, cat in ipairs(othercat) do
if not cat:find("^Category:") then
cat = "Category:" .. cat
end
table.insert(parents, cat)
end
end
local countries = getprop("country") or {}
if type(countries) == "string" then
countries = split_on_comma(countries)
end
-- If no breadcrumb, this often happens when the langname and category are the same (happens only with etym-only
-- languages), and the parent category is set below to the full parent, so the breadcrumb should show the
-- language name (or equivalently, the category). If the langname and category are different, we should fall back to
-- the category. E.g. for Singlish, lang=en is specified and we can't infer a breadcrumb because the lect name
-- doesn't end in "English"; in this case we want the breadcrumb to show "Singlish".
breadcrumb = getprop("breadcrumb") or breadcrumb or category
local the_prefix
if args[1] then
regiondesc = args[1]
else
local regionprop = getprop("region")
if regionprop then
regiondesc = regionprop
elseif label_with_parent then
-- It's not clear which of the following two are better. The second one uses the actual label display form,
-- which might be argued to be better, except that it will often be linked to a Wikipedia article about the
-- lect rather than the place. The first one just uses the canonical label directly (which will later be
-- linked to itself if unlinked). A third possibility is to use `label_with_parent.display` if present,
-- otherwise `label_with_parent.canonical`.
regiondesc = label_with_parent.canonical
if label_with_parent.display and regiondesc ~= label_with_parent.display then
track("display-different-from-canonical")
end
-- regiondesc = require(labels_module).get_displayed_label(label_with_parent.canonical, label_with_parent.labdata, lang)
end
end
the_prefix = the_prefix or getprop("the") and "the " or ""
if #countries == 0 then
countries[1] = regiondesc and the_prefix .. regiondesc or nil
end
for _, country in ipairs(countries) do
if not country:find("[<=]") then
country = require("Module:links").remove_links(country)
local cat = "Category:Languages of " .. country
if page_exists(cat) then
table.insert(parents, cat)
end
end
end
-------------------- 5. Refine the language to an etymology-only child if possible. -------------------
-- Now that we've determined the parent, we look up the parent hierarchy until we find a category naming an
-- etymology-only language. If we find one and it's a child of the language we've determined, use it.
local ancestral_cat = first_parent_cat
local refined_lang
while true do
refined_lang = category_to_lang_name(ancestral_cat)
if refined_lang then
break
end
export.register_likely_lect_parent_cat(ancestral_cat)
local settings, _ = memoizing_lect_handler(ancestral_cat, nil, true)
if not settings then
break
end
ancestral_cat = settings.parents[1]
end
if refined_lang and refined_lang:hasParent(lang) then
lang = refined_lang
langname = lang:getCanonicalName()
end
-------------------- 6. Initialize `additional` with user-specified text and info about labels. -------------------
local additional = getprop("addl")
local function append_addl(addl_text)
if not addl_text then
return
end
if additional then
additional = additional .. "\n\n" .. addl_text
else
additional = addl_text
end
end
if all_labels then
local m_labels_utilities = require(labels_utilities_module)
append_addl(m_labels_utilities.format_labels_categorizing(all_labels, nil,
get_returnable_lang(lang)))
end
-------------------- 7. Augment `additional` with information about etymology-only codes. -------------------
local langname_for_desc
local etymcodes = {}
local function make_code(code)
return ("<code>%s</code>"):format(code)
end
if lang:hasType("etymology-only") and ucfirst(langname) == category then
langname_for_desc = lang:getParentName()
local langcode = lang:getCode()
table.insert(etymcodes, make_code(langcode))
-- Find all alias codes for the etymology-only language.
-- FIXME: There should be a better/easier way of doing this.
local ety_code_to_name = mw.loadData("Module:etymology languages/code to canonical name")
for code, canon_name in pairs(ety_code_to_name) do
if canon_name == langname and code ~= langcode then
table.insert(etymcodes, make_code(code))
end
end
local addl_etym_codes = ("[[Module:etymology_languages/data|Etymology-only language]] code: %s."):format(
serial_comma_join(etymcodes, {conj = "or"}))
append_addl(addl_etym_codes)
else
langname_for_desc = langname
end
-------------------- 8. Try to figure out if this variety is extinct or reconstructed. -------------------
local lect_type = getprop("type")
if not lect_type then
lect_type = determine_lect_type(category, lang, first_parent_cat)
end
local function prefix_addl(addl_text)
if additional then
additional = addl_text .. "\n\n" .. additional
else
additional = addl_text
end
end
if lect_type == "extinct" then
prefix_addl("This lect is [[extinct language|extinct]].")
table.insert(parents, "Category:All extinct languages")
elseif lect_type == "reconstructed" then
prefix_addl("This lect is [[reconstructed language|reconstructed]].")
table.insert(parents, "Category:Reconstructed languages")
elseif lect_type == "unattested" then
prefix_addl("This lect is {{w|unattested language|unattested}}.")
table.insert(parents, "Category:Unattested languages")
elseif lect_type == "constructed" then
prefix_addl("This lect is [[constructed language|constructed]].")
table.insert(parents, "Category:Constructed languages")
end
-------------------- 9. Compute `description`. -------------------
local description
local fulldef = getprop("fulldef")
if fulldef then
description = fulldef .. "."
end
if not description then
local def = getprop("def")
if def then
description = ("Terms or senses in %s."):format(def)
end
end
if not description then
if not regiondesc then
-- We need regiondesc for the description unless def= or fulldef= is given, which overrides the part that needs it.
error(("1= (region) not given and unable to infer region from category '%s' given language name '%s'"):
format(category, langname))
end
local lang_en = get_lang("en", true)
local linked_regiondesc = regiondesc
-- Don't try to link if HTML, = sign, template call or embedded link found in text. Embedded links will
-- automatically be converted to English links by JavaScript.
local function linkable(text)
return not text:find("[<={}%[%]|]")
end
if linked_regiondesc:find("<country>") then
if not countries then
error(("Can't specify <country> in region description '%s' when country= not given"):format(linked_regiondesc))
end
-- Link the countries individually before calling serialCommaJoin(), which inserts HTML.
local linked_countries = {}
for _, country in ipairs(countries) do
if linkable(country) then
country = require("Module:links").full_link { lang = lang_en, term = country }
end
table.insert(linked_countries, country)
end
linked_countries = serial_comma_join(linked_countries)
linked_regiondesc = linked_regiondesc:gsub("<country>", replacement_escape(linked_countries))
elseif not getprop("nolink") and linkable(linked_regiondesc) then
-- Even if nolink not given, don't try to link if HTML or = sign found in linked_regiondesc, otherwise
-- we're likely to get an error.
if page_exists(linked_regiondesc) then
-- Only construct a Wiktionary link if the page exists; otherwise construct a Wikipedia link.
linked_regiondesc = require("Module:links").full_link { lang = lang_en, term = linked_regiondesc }
else
linked_regiondesc = ("[[w:%s|%s]]"):format(linked_regiondesc, linked_regiondesc)
end
end
linked_regiondesc = the_prefix .. linked_regiondesc
local no_longer_spoken = lect_type == "extinct" or lect_type == "reconstructed" or lect_type == "unattested"
local verb = getprop("verb") or no_longer_spoken and "formerly spoken" or "spoken"
local prep = getprop("prep")
if not langname_for_desc then
error(category)
end
description = ("Terms or senses in %s as %s%s %s."):format(
langname_for_desc, verb, prep == "-" and "" or " " .. (prep or "in"), linked_regiondesc)
end
-------------------- 10. Compute the Wikipedia articles that go into `topright`. -------------------
local topright_parts = {}
-- Insert Wikipedia article `article` for Wikimedia language `wmcode` into `topright_parts`, avoiding duplication.
local function insert_wikipedia_article(wmcode, article)
if wmcode == "commons" then
insert_if_not(topright_parts, ("{{commons%s}}"):format(
article == category and "" or "|" .. article
))
else
local wparg = ("%s%s"):format(
wmcode == "en" and "" or wmcode .. ":",
article == category and "" or article
)
insert_if_not(topright_parts, ("{{wp%s}}"):format(
wparg == "" and wparg or "|" .. wparg
))
end
end
local function insert_wikipedia_articles_for_wikipedia_specs(specs, default)
for _, article in ipairs(specs) do
local foreign_wiki
if article == true then
article = default
else
if article:find(":[^ ]") then
local actual_article
foreign_wiki, actual_article = article:match("^([a-z][a-z][a-z-]*):([^ ].*)$")
if actual_article then
article = actual_article
end
end
if article == "+" then
article = default
elseif article == "-" then
article = nil
else
article = require("Module:yesno")(article, article)
if article == true then
article = default
end
end
end
if article then
insert_wikipedia_article(foreign_wiki or "en", article)
end
end
end
local function insert_wikipedia_articles_for_wikidata_specs(specs, lang)
if not mw.wikibase then
error(("Unable to retrieve data from Wikidata ID's '%s'; `mw.wikibase` not defined"):format(args.wikidata))
end
local wikipedia_langs = require(labels_module).get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
local ids_without_wmcodes = {}
local ids_with_wmcodes = {}
for _, id in ipairs(specs) do
if id:find(":") then
table.insert(ids_with_wmcodes, id)
else
table.insert(ids_without_wmcodes, id)
end
end
for _, wmcode in ipairs(wikipedia_langs) do
for _, id in ipairs(ids_without_wmcodes) do
local article = mw.wikibase.sitelink(id, wmcode .. "wiki")
if article then
insert_wikipedia_article(wmcode, article)
end
end
end
for _, id in ipairs(ids_with_wmcodes) do
local wmcode, wikidata_id = id:match("^(.-):(.*)$")
local article = mw.wikibase.sitelink(wikidata_id, wmcode .. "wiki")
if article then
insert_wikipedia_article(wmcode, article)
end
end
end
if args.wp or args.wikidata then
if args.wp then
insert_wikipedia_articles_for_wikipedia_specs(split_on_comma(args.wp), category)
end
if args.wikidata then
insert_wikipedia_articles_for_wikidata_specs(split(args.wikidata, "%s*,%s*"), lang)
end
elseif category == ucfirst(langname) then
local wikipedia_langs = require(labels_module).get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
for _, wmcode in ipairs(wikipedia_langs) do
local article = lang:getWikipediaArticle("no category fallback", wmcode .. "wiki")
if article then
insert_wikipedia_article(wmcode, article)
end
end
end
if #topright_parts == 0 and sorted_labels then
for _, labobj in pairs(all_labels) do
local wp_specs = labobj.labdata.Wikipedia
if wp_specs then
if type(wp_specs) ~= "table" then
wp_specs = {wp_specs}
end
insert_wikipedia_articles_for_wikipedia_specs(wp_specs, labobj.canonical)
end
local wikidata_specs = labobj.labdata.Wikidata
if wikidata_specs then
if type(wikidata_specs) ~= "table" then
wikidata_specs = {wikidata_specs}
end
insert_wikipedia_articles_for_wikidata_specs(wikidata_specs, labobj.lang)
end
end
end
local topright
if #topright_parts > 0 then
topright = table.concat(topright_parts)
end
-------------------- 11. Return the combined structure of all information. -------------------
track("lect")
export.register_likely_lect_parent_cat(parents[1])
return {
-- FIXME, allow etymological codes here
lang = get_returnable_lang_code(lang),
topright = topright,
description = description,
additional = additional,
parents = parents,
breadcrumb = {name = breadcrumb, nocap = true},
umbrella = false,
can_be_empty = true,
}, lect_type
end
local memoized_responses = {}
memoizing_lect_handler = function(category, raw_args, called_from_inside)
mw.log(category)
local retval = memoized_responses[category]
if not retval then
retval = {lect_handler(category, raw_args, called_from_inside)}
memoized_responses[category] = retval
end
local obj, lect_type = retval[1], retval[2]
return obj, lect_type
end
-- Actual handler for lect categories. See lect_handler() above.
table.insert(raw_handlers, function(data)
local settings, _ = memoizing_lect_handler(data.category, data.args, data.called_from_inside)
return settings, not not settings
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers, export = export}
9eqve9mdsmiu5rw4z3joqt6q5l5suxl
88388
88387
2026-07-27T00:15:20Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/lects]]
88387
Scribunto
text/plain
local export = {}
local raw_categories = {}
local raw_handlers = {}
local labels_module = "Module:labels"
local labels_utilities_module = "Module:labels/utilities"
local languages_module = "Module:languages"
local parse_utilities_module = "Module:parse utilities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local m_table = require(table_module)
local get_lang = require(languages_module).getByCode
local insert_if_not = m_table.insertIfNot
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local serial_comma_join = m_table.serialCommaJoin
local split = require(string_utilities_module).split
local split_on_comma = require(parse_utilities_module).split_on_comma
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/lects/PAGE]]
return require("Module:debug/track")("category tree/lects/" .. page)
end
-- This module handles lect/variety categories of all sorts, e.g. regional lect categories such as
-- [[:Category:American English]] and [[:Category:Provençal]]; temporal lect categories such as
-- [[:Category:Early Modern English]]; sociolect categories such as [[:Category:Polari]]; and umbrella categories of the
-- form e.g. [[:Category:Varieties of English]] and [[:Category:Regional French]].
-- FIXME: Eliminate the word "dialect" here and in the {{auto cat}} parameter in favor of "lect" or "variety". [DONE]
--[=[
FIXME:
1. Support multiple parents. [DONE]
2. Support cat: in parents to indicate a category. [DONE]
3. When linking a description without embedded links, use the equivalent of {{wtorw}} to auto-link to Wikipedia. [DONE]
4. Support the = true. [DONE]
]=]
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Language varieties"] = {
description = "Categories that group terms in varieties of various languages (regional, temporal, sociolectal, etc.).",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Fundamental",
},
}
raw_categories["Regionalisms"] = {
description = "Categories that group terms in regional varieties of various languages.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Fundamental",
"Language varieties",
},
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function ucfirst(text)
return mw.getContentLanguage():ucfirst(text)
end
local function lcfirst(text)
return mw.getContentLanguage():lcfirst(text)
end
local function page_exists(page)
local title = mw.title.new(page)
return title and title.exists
end
-- Handle categories such as [[:Category:Varieties of French]] and [[:Category:Varieties of Ancient Greek]].
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Varieties of (.*)$")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Categories containing terms in varieties of " .. lang:makeCategoryLink() .. " (regional, temporal, sociolectal, etc.).",
parents = {
"{{{langcat}}}",
{name = "Language varieties", sort = langname},
},
breadcrumb = "Varieties",
}
end
end
end)
-- Handle categories such as [[:Category:Regional French]] and [[:Category:Regional Ancient Greek]].
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Regional (.*)$")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Categories containing terms in regional varieties of " .. lang:makeCategoryLink() .. ".",
additional = "This category sometimes also directly contains terms that are uncategorized regionalisms: such terms should be recategorized by the particular regional variety they belong to, or categorized as dialectal.",
parents = {
"Varieties of {{{langname}}}",
{name = "Regionalisms", sort = langname},
},
breadcrumb = "Regional",
}
end
end
end)
-- Fancy version of ine() (if-not-empty). Converts empty string to nil, but also strips leading/trailing space.
local function ine(arg)
if not arg then return nil end
arg = mw.text.trim(arg)
if arg == "" then return nil end
return arg
end
-- Get the full language to use e.g. in the settings.
local function get_returnable_lang(lang)
if lang:hasType("family") then
return nil
else
return lang:getFull()
end
end
-- Get the full language code to return in the settings.
local function get_returnable_lang_code(lang)
if lang:hasType("family") then
return "und"
else
return lang:getFullCode()
end
end
local memoizing_lect_handler
local function category_to_lang_name(category)
local getByCanonicalName = require("Module:languages").getByCanonicalName
local lang
lang = getByCanonicalName(category, nil, "allow etym", "allow family")
if not lang then
-- Some languages have lowercase-initial names e.g. 'the BMAC substrate', but the category begins with an
-- uppercase letter.
lang = getByCanonicalName(lcfirst(category), nil, "allow etym", "allow family")
end
return lang
end
-- 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.
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
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
-- Try to figure out if this variety is extinct or reconstructed, if type= not given.
local function determine_lect_type(category, lang, default_parent_cat)
if category:find("^Proto%-") or lang:getCanonicalName():find("^Proto%-") or lang:hasType("reconstructed") then
-- Is it reconstructed?
return "reconstructed"
end
if lang:getCode():find("^qsb%-") then
-- Substrate.
return "unattested"
end
if lang:hasType("full") then
-- If a full language, scrape the {{auto cat}} call and check for extinct=1.
local parent_args = scrape_category_for_auto_cat_args(lang:getCategoryName())
if parent_args and ine(parent_args.extinct) and require("Module:yesno")(parent_args.extinct, false) then
return "extinct"
end
end
-- Otherwise, call the lect handler recursively for the parent category. This is correct e.g. for
-- things like subvarieties of Classical Persian, where the lang itself (Persian) isn't extinct but the
-- parent category refers to an extinct variety. If the lect handler fails to return a type, it's because
-- the parent category doesn't exist or isn't defined using {{auto cat}}, and doesn't have a language as a
-- suffix. In that case, if we're dealing with an etymology-only language, check the parent language. Finally,
-- fall back to returning "extant" if all else fails.
local parent_type
if default_parent_cat then
export.register_likely_lect_parent_cat(default_parent_cat)
parent_type = select(2, memoizing_lect_handler(default_parent_cat, nil, true))
end
if parent_type then
return parent_type
end
local parent_lang = lang:getParent()
if parent_lang then
return determine_lect_type(category, parent_lang, nil)
end
return "extant"
end
-- Try to figure out the region (used as the default breadcrumb and region description) from the language. If the
-- language name is an etymology-only language, try to derive a region based on a parent etymology-only or full
-- language. For example, if the pagename is '[[:Category:British English]]', the language is 'en-GB' (British English)
-- and the same as the pagename, but we'd like to return a region 'British'. This is also called in cases where the
-- language is explicitly given but we need to infer the region from the parent language; e.g.
-- [[:Category:Lucerne Alemmanic German]] is a type of High Alemannic German but we want to infer 'Lucerne' based on
-- the parent 'Alemannic German'. If this doesn't work and the language name has a space in it, we try using
-- progressively smaller suffixes of the language. For example, for [[:Category:Walser German]]', the language is
-- 'wae' (Walser German), but the parent is 'Highest Alemannic German', whose parent is 'Alemannic German' (a full
-- language), and just "German" is nowhere in the parent-child relationships but found as a suffix in the parent
-- language. Another such case is with [[:Category:Ionic Greek]], whose parent is 'Ancient Greek'.
local function infer_region_from_lang(pagename, lang)
local langname = lang:getCanonicalName()
local lang_to_check = lang
if ucfirst(langname) == pagename then
lang_to_check = lang_to_check:getParent()
end
-- First check against the language name and progressively smaller suffixes; then repeat for any parents (of
-- etymology languages). If the language name is the same as the page name, we need to start with the parent;
-- otherwise we will always match against a suffix, but that's not what we want.
while lang_to_check do
local suffix = lang_to_check:getCanonicalName()
while true do
local region = pagename:match("^(.*) " .. pattern_escape(suffix) .. "$")
if region then
return region
end
suffix = suffix:match("^.- (.*)$")
if not suffix then
break
end
end
lang_to_check = lang_to_check:getParent()
end
return nil
end
-- Modeled after splitLabelLang() in [[Module:category tree]]. Try to split off a maximally long language (full or
-- etymology-only) on the right, and return the resulting language object and the region preceding it. We need to
-- check the maximally long language because of cases like 'English' vs 'Middle English' and 'Chinese Pidgin English';
-- [[:Category:Late Middle English]] should split as 'Late' and 'Middle English', not as 'Late Middle' and 'English'.
local function split_region_lang(pagename)
local lang
local region
-- Try the entire title as a language; if not, chop off a word on the left and repeat.
local words = split(pagename, " ")
for i = 1, #words do
lang = category_to_lang_name(table.concat(words, " ", i, #words))
if lang then
if i == 1 then
region = nil
else
region = table.concat(words, " ", 1, i - 1)
end
break
end
end
if not region and lang then
-- The pagename is the same as a language name. Try to infer the region from the parent. See comment at
-- function.
region = infer_region_from_lang(pagename, lang)
end
return lang, region
end
-- Return the default parent cat for the given language and category. If the language and category are the same, we're
-- dealing with the overall cat for an etymology-only language, so use the category of the parent language; otherwise
-- we're dealing with a subcategory of a regular or etymology-only language (e.g. [[:Category:Issime Walser]], a
-- subcategory of [[:Category:Walser German]]), so use the language's category itself. If the resulting language is an
-- etymology-only language or a family, the parent category is that language or family's category, which for
-- etymology-only languages is named the same as the etymology-only language, and for families is named
-- "FAMILY languages"; otherwise, use "Regional LANG" as the category unless `noreg` is given, in which case we use
-- "Varieties of LANG".
local function get_default_parent_cat_from_category(category, lang, noreg)
if lang:getCode():find("^qsb%-") then
-- substrate
return "Substrate languages"
end
local lang_for_cat
if ucfirst(lang:getCanonicalName()) == category then
lang_for_cat = lang:getParent()
if not lang_for_cat then
error(("Category '%s' has a name the same as a full language; you probably need to explicitly specify a different language using |lang="):format(category))
end
else
lang_for_cat = lang
end
if lang_for_cat:hasType("etymology-only") or lang_for_cat:hasType("family") then
return lang_for_cat:getCategoryName()
elseif noreg then
return "Varieties of " .. lang_for_cat:getCanonicalName()
else
return "Regional " .. lang_for_cat:getCanonicalName()
end
end
-- Find the labels that categorize into `category`. Only categories specified using the `regional_categories` and
-- `plain_categories` fields will be returned. `lang` is the language object to use when looking up categories specified
-- using the `regional_categories` field, which append the language onto the specified category prefix. If `lang` is a
-- family or is omitted, no categories specified using `regional_categories` will be returned. Lang-specific modules for
-- all languages will be checked for matching labels that specify `category` as their category using `plain_categories`;
-- this helps e.g. with varieties of Chinese, whose labels are found in [[Module:labels/data/lang/zh]]. The return value
-- is a table in the same format as returned by `find_labels_for_category` in [[Module:labels/utilities]].
--
-- FIXME: It should be possible to check for categories specified using `regional_categories` even when `lang` is nil.
local function find_labels_for_category(category, lang)
local regional_cat_labels, plain_cat_labels
local full_lang
local m_labels_utilities = require(labels_utilities_module)
if lang and lang:hasType("language") then
full_lang = lang:getFull()
local regional_component = category:match("^(.-) " .. pattern_escape(full_lang:getCanonicalName()) .. "$")
if regional_component then
regional_cat_labels = m_labels_utilities.find_labels_for_category(regional_component,
"regional", full_lang)
end
end
plain_cat_labels = m_labels_utilities.find_labels_for_category(category, "plain", full_lang, "check all langs")
local all_labels
if regional_cat_labels and plain_cat_labels then
all_labels = regional_cat_labels
for k, v in pairs(plain_cat_labels) do
all_labels[k] = v
end
else
all_labels = regional_cat_labels or plain_cat_labels
end
return all_labels
end
-- Find the labels for category `category` and language object `lang` (which can be nil or a family, but in that case,
-- no labels on a category specified using `regional_categories`; FIXME: it should be possible to implement this). Then
-- filter them down to those that are specified using a lang-specific module and sort them for use in checking
-- properties such as parent and description. We filter down to only lang-specific labels because those specified in a
-- general module (especially [[Module:labels/data/regional]]) won't be able to have proper descriptions and especially
-- parents, which tend to be language-specific. The sort order prioritizes labels that match the category exactly
-- (either through the canonical version or any alias); this is followed by labels that are a prefix of the category
-- (again, either through the canonical version or any alias), so that labels whose categories are specified using
-- `regional_categories` are prioritized. Any other labels are sorted last, so that e.g. if both the label "Alberta" and
-- "Canada" (with alias "Canadian") for lang=en categorize into [[:Category:Canadian English]], we prefer the label
-- "Canada". For cases where e.g. both labels match the category as prefixes, ties are broken by prioritizing the labels
-- found in the lang-specific module whose language matches `lang`.
--
-- Returns two items. The first is a table of all labels categorizing into `category` (subject to the provisos described
-- in `find_labels_for_category()`), in the same format as returned by `find_labels_for_category` in
-- [[Module:labels/utilities]]. (Specifically, the values are objects containing all relevant information on a given
-- label, and the keys are less important.) The second is a list of label objects after filtering and sorting, in the
-- same format as the values in the `all_labels` table. The first return value will be nil if no labels could be found
-- categorizing into `category`, and the second return value will be nil if no labels remain after filtering.
local function get_sorted_labels(category, lang)
local all_labels = find_labels_for_category(category, lang)
if not all_labels then
return nil
end
local m_labels = require(labels_module)
local lang_specific_pattern = "^" .. pattern_escape(m_labels.lang_specific_data_modules_prefix)
local sorted_labels = {}
for _, labelobj in pairs(all_labels) do
if labelobj.module:find(lang_specific_pattern) then
table.insert(sorted_labels, labelobj)
end
end
local function sort_labelobj(a, b)
local function matches_exactly(labelobj)
if labelobj.canonical == category then
return true
end
for _, alias in ipairs(labelobj.aliases) do
if alias == category then
return true
end
end
return false
end
local function matches_as_prefix(labelobj)
if category:find("^" .. pattern_escape(labelobj.canonical) .. " ") then
return true
end
for _, alias in ipairs(labelobj.aliases) do
if category:find("^" .. pattern_escape(alias) .. " ") then
return true
end
end
return false
end
local function tiebreak()
local a_matches_lang = lang and a.lang:getFullCode() == lang:getFullCode()
local b_matches_lang = lang and b.lang:getFullCode() == lang:getFullCode()
if a_matches_lang and not b_matches_lang then
return true
elseif b_matches_lang and not a_matches_lang then
return false
else
return a.canonical < b.canonical
end
end
local a_matches_exactly = matches_exactly(a)
local b_matches_exactly = matches_exactly(b)
if a_matches_exactly and not b_matches_exactly then
return true
elseif b_matches_exactly and not a_matches_exactly then
return false
elseif a_matches_exactly and b_matches_exactly then
return tiebreak()
end
local a_matches_as_prefix = matches_as_prefix(a)
local b_matches_as_prefix = matches_as_prefix(b)
if a_matches_as_prefix and not b_matches_as_prefix then
return true
elseif b_matches_as_prefix and not a_matches_as_prefix then
return false
else
return tiebreak()
end
end
table.sort(sorted_labels, sort_labelobj)
if #sorted_labels > 0 then
return all_labels, sorted_labels
else
return all_labels, nil
end
end
-- Find the categories (only of type `regional_categories` and `plain_categories`) that label `label` categorizes into.
-- Return value is nil if the label couldn't be located at all, otherwise a list of categories (which may be empty).
local function get_categories_for_label(label, lang)
local m_labels = require(labels_module)
local labret = m_labels.get_label_info { label = label, lang = lang }
if not labret.recognized then
return nil
end
local categories = m_labels.fetch_categories(labret.canonical or label, labret.data, lang, nil, nil,
{["plain_categories"] = true})
local reg_cats = m_labels.fetch_categories(labret.canonical or label, labret.data, lang, nil, nil,
{["regional_categories"] = true})
if #reg_cats > 0 then
for _, cat in ipairs(reg_cats) do
table.insert(categories, cat)
end
end
return categories
end
-- Given the sorted labels that categorize into `category`, return the parent categories for the first label that specifies
-- any parents. `default` is the default parent category, usually "Regional LANG" or (if noreg=1 is specified) "Varieties of LANG";
-- it is used if the parent is explicitly given as `true` or "+" (or one of these values occurs among others), or if a parent label
-- was given but didn't categorize into any regional or plain categories, or if no labels with parents could be found. If
-- `all_cats` is specified, all categories associated with all specified parent labels (if more than one is present) are returned;
-- otherwise, only the categories for the first parent label are returned.
--
-- Returns two values: the list of parent categories and the label object from which the categories were derived (or nil if no
-- label object could be found with a `parent` field, in which case the return value of the list of categories is a simple-element
-- list consisting of `default`). The format of the parent category list is such that the list can directly be specified as the
-- value of the `parents` field returned by the raw handler. This means that usually the individual list elements are strings
-- (referring to raw poscat labels), but they may be strings prefixed by "Category:" (for arbitrary categories), or objects of the
-- form {name = "CATEGORY", lang = "LANGCODE", is_label = true} for poscat language labels.
local function get_parents_from_sorted_labels(sorted_labels, category, all_cats)
for _, labobj in ipairs(sorted_labels) do
local parent = labobj.labdata.parent
if parent == true then
parent = {parent}
elseif parent and type(parent) == "string" then
parent = split_on_comma(parent)
end
local function get_parent_cats(par)
if par == true or par == "+" then
return {"+"}
end
if par:find("^cat:") then
return {"Category:" .. par:gsub("^cat:", "")}
end
if par:find("^Category:") then
return {par}
end
if par:find("^rawposcat:") then
return {(par:gsub("^rawposcat:", ""))}
end
if par:find("^poscat:") then
local langcode, label = par:match("^poscat:([^:]+):(.*)$")
if not langcode then
error(("Parent poscatboiler language label '%s' for label '%s' for category '%s' (defined in module [[%s]]) needs to be of the form 'poscat:LANGCODE:LABEL'"):format(
par, labobj.canonical, category, labobj.module))
end
return {{name = label, lang = langcode, is_label = true}}
end
local this_cats = get_categories_for_label(par, labobj.lang)
if not this_cats then
error(("Parent label '%s' for label '%s' for category '%s' (defined in module [[%s]]) couldn't be located"):format(
par, labobj.canonical, category, labobj.module))
end
return this_cats
end
if parent then
if type(parent) ~= "table" then
error(("Internal error: Expected a string, boolean `true` or list for the value of the parent field for label '%s' for category '%s' (defined in module [[%s]]), but saw type '%s': %s"):format(
labobj.canonical, category, labobj.module, type(parent), mw.dumpObject(parent)))
end
local cats
if all_cats then
cats = {}
for _, par in ipairs(parent) do
local this_cats = get_parent_cats(par)
for _, this_cat in ipairs(this_cats) do
insert_if_not(cats, this_cat)
end
end
else
cats = get_parent_cats(parent[1])
end
if #cats > 0 then
return cats, labobj
end
-- FIXME: If the parent doesn't specify any categories, should we try the next parent or fall back
-- to the parent determined through get_default_parent_cat_from_category() (which is what we currently
-- do)?
return {"+"}, labobj
end
end
return {"+"}, nil
end
local likely_lect_parent_cat = {}
-- Register that `cat` is likely to be a lect cat, so we try to handle it as such in the lect handler when
-- we are called on that category. This avoids the need to have manual allow-lists of nonstandardly-named parent
-- lect categories to handle, such as [[:Category:Assyrian]], [[:Category:Ripuarian Franconian]] ("Franconian" is
-- not a language) and [[:Category:Limburgan-Ripuarian transitional dialects]].
function export.register_likely_lect_parent_cat(cat)
if type(cat) == "string" and not cat:find("^Category:") then
likely_lect_parent_cat[cat] = true
end
end
-- Handle lect categories such as [[:Category:New Zealand English]], [[:Category:Late Middle English]],
-- [[:Category:Arbëresh Albanian]], [[:Category:Provençal]] or arbitrarily-named categories like
-- [[:Category:Issime Walser]]. We currently require that lect=1 is specified to the call to {{auto cat}} to avoid
-- overfiring. However, if called from inside, we are processing the breadcrumb for the parent (or conceivably the
-- child) of a lect category, and won't have any params set, so we can't rely on lect=1. In that case, only fire
-- if the category is or ends in the name of a full or etymology-only language, and scrape the category's call to
-- {{auto cat}} to get the appropriate params. This means that nonstandardly-named categories like
-- [[:Category:Issime Walser]] can't be parents of other lect categories. To work around this, either we have to
-- relax the code below to operate on all raw categories (not necessarily a good idea), or we rename the
-- nonstandardly-named categories (e.g. in the case above, to [[:Category:Issime Walser German]], since Walser German
-- is a recognized etymology-only language).
--
-- NOTE: We are able to handle categories for etymology-only families (currently only [[:Category:Middle Iranian]] and
-- [[:Category:Old Iranian]]) and for etymology-only substrate languages (e.g. [[:Category:BMAC substrate]]).
-- There is some special "family" code for the former.
local function lect_handler(category, raw_args, called_from_inside)
if called_from_inside then
-- Avoid infinite loops from wrongly processing non-lect categories. We have a check around line 344 below
-- for categories whose {{auto cat}} doesn't say lect=1, but we still need the following in case of
-- non-existent categories we're being asked to process (e.g. [[:Category:User bcc]] ->
-- [[:Category:Southern Balochi]] (nonexistent) -> [[:Category:Regional Baluchi]] (nonexistent), which
-- causes an infinite loop without the check below.
if category:find("^Regional ") or category:find("^Varieties of ") or category:find("^Rhymes:") then
return nil
end
-- If called from inside we won't have any params available. See comment above about this. We scrape the
-- category page's call to {{auto cat}} to get the appropriate params, and if that fails, we currently fall back
-- to defaults based on the label(s) that categorize(s) into the category or the name of the category. Since the
-- call from inside is only to get the parent category and breadcrumb, these defaults actually work in most
-- cases but not all; e.g. in the chain [[:Category:Regional Yoruba]] -> [[:Category:Central Yoruba]] ->
-- [[:Category:Ekiti Yoruba]] -> [[:Category:Akurẹ Yoruba]], if we are forced to use default values, we will
-- produce the right parent for [[:Category:Central Yoruba]] but not for [[:Category:Ekiti Yoruba]], where the
-- default parent would be [[:Category:Regional Yoruba]] instead of the correct [[:Category:Central Yoruba]].
local lang, breadcrumb = split_region_lang(category)
if lang or likely_lect_parent_cat[category] then
raw_args = scrape_category_for_auto_cat_args(category)
if raw_args and not ine(raw_args.lect) then
-- We are scraping something like [[:Category:American Sign Language]] that ends in a valid language but is not
-- a lect.
return nil
end
if not raw_args then
-- If we can't parse the scraped {{auto cat}} spec, return default values. This helps e.g. in converting
-- from the old {{dialectboiler}} template and generally when adding new varieties.
local parents, label_with_parent
local function getprop(prop)
return -- ine(raw_args[prop]) or
label_with_parent and label_with_parent.labdata[prop]
end
local sorted_labels = select(2, get_sorted_labels(category, lang))
if sorted_labels then
parents, label_with_parent = get_parents_from_sorted_labels(sorted_labels, category)
if not lang and label_with_parent then
lang = label_with_parent.lang
end
else
parents = {"+"}
end
if not lang then
-- We were instructed to scrape by virtue of `register_likely_lect_parent_cat`, but couldn't scrape
-- anything.
return nil
end
local default_parent_cat_from_category = get_default_parent_cat_from_category(category, lang,
getprop("noreg"))
for i, parent in ipairs(parents) do
if parent == "+" then
parents[i] = default_parent_cat_from_category
end
end
local first_parent_cat = parents[1]
if type(first_parent_cat) ~= "string" or first_parent_cat:find("^Category:") then
-- Only keep `first_parent_cat` if it refers to a raw poscat label (which is probably a lect
-- handler label).
first_parent_cat = nil
end
track("lect")
export.register_likely_lect_parent_cat(parents[1])
-- NOTE: When called from inside, the description doesn't matter; nor do any parents other than the
-- first. This is because called_from_inside is only set when computing the breadcrumb trail, which
-- only needs the language, first parent and breadcrumb.
return {
-- FIXME, allow etymological codes here
lang = get_returnable_lang_code(lang),
description = "Foo",
parents = parents,
breadcrumb = breadcrumb or lang:getCanonicalName(),
umbrella = false,
can_be_empty = true,
}, determine_lect_type(category, lang, first_parent_cat)
end
else
return nil
end
end
if not called_from_inside and not ine(raw_args.lect) then
return nil
end
-------------------- 1. Process parameters. -------------------
local boolean = {type = "boolean"}
local sublist = {sublist = "comma without whitespace"}
local args = require("Module:parameters").process(raw_args, {
[1] = true,
lect = boolean,
lang = true,
verb = true,
prep = true,
the = boolean,
def = true,
fulldef = true,
addl = true,
nolink = boolean,
noreg = boolean, -- don't make the default parent be "Regional LANG"; instead, "Varieties of LANG"
type = {set = {"extinct", "extant", "reconstructed", "unattested", "constructed"}},
cat = true,
othercat = sublist,
country = sublist,
wp = true,
wikidata = true,
breadcrumb = true,
also = {type = "title", sublist = "comma without whitespace", namespace = 14},
pagename = true, -- for testing or demonstration
})
-------------------- 2. Initialize breadcrumb, regiondesc and language from category. -------------------
-- They may be overridden later.
local lang, breadcrumb, regiondesc, langname
category = args.pagename or category
if not args.lang then
lang, breadcrumb = split_region_lang(category)
if lang then
langname = lang:getCanonicalName()
end
-- The lang and/or breadcrumb may be nil at this point (e.g. we're processing a category like
-- [[:Category:Singlish]] or [[:Category:Polari]] that doesn't have a language in it). We don't throw an error
-- yet because we may be able to fetch the lang, regiondesc and breadcrumb from a label that categorizes into
-- the category.
regiondesc = breadcrumb
else
lang = get_lang(args.lang, "lang", "allow etym")
langname = lang:getCanonicalName()
if category == ucfirst(langname) then
-- breadcrumb and regiondesc should stay nil; breadcrumb will get `category` as a default, and the lack of
-- regiondesc will cause an error to be thrown unless the user gave it explicitly or specified def=.
else
breadcrumb = category:match("^(.*) " .. pattern_escape(langname) .. "$")
if not breadcrumb then
-- Try to infer the region from the parent. See comment at function.
breadcrumb = infer_region_from_lang(category, lang)
end
regiondesc = breadcrumb
end
end
-------------------- 3. Determine labels categorizing into this category. -------------------
local all_labels, sorted_labels = get_sorted_labels(category, lang)
-------------------- 4. Determine parent categories and initialize additional properties. -------------------
-- The first label with a parent is used to fetch additional properties, such as region= and addl=.
local parents
local first_parent_cat = args.cat
local label_with_parent
local function getprop(prop)
return args[prop] or label_with_parent and label_with_parent.labdata[prop]
end
if first_parent_cat then
parents = {first_parent_cat}
if not lang then
error(("lang= not given and unable to parse language from category '%s' (didn't check labels categorizing into the category because cat= explicitly given)"):format(category))
end
else
if sorted_labels then
parents, label_with_parent = get_parents_from_sorted_labels(sorted_labels, category, "all cats")
if not lang and label_with_parent then
lang = label_with_parent.lang
langname = lang:getCanonicalName()
end
else
parents = {"+"}
end
if not lang then
error(("lang= not given, unable to parse language from category '%s' and can't find a label categorizing into the category"):format(category))
end
local default_parent_cat_from_category = get_default_parent_cat_from_category(category, lang, getprop("noreg"))
for i, parent in ipairs(parents) do
if parent == "+" then
parents[i] = default_parent_cat_from_category
end
end
first_parent_cat = parents[1]
end
if type(first_parent_cat) ~= "string" or first_parent_cat:find("^Category:") then
-- Only keep `first_parent_cat` if it refers to a raw poscat label (which is probably a lect handler label).
-- WARNING: Code below using `first_parent_cat` must handle nil.
first_parent_cat = nil
end
local othercat = getprop("othercat")
if type(othercat) == "string" then
othercat = split_on_comma(othercat)
end
if othercat then
for _, cat in ipairs(othercat) do
if not cat:find("^Category:") then
cat = "Category:" .. cat
end
table.insert(parents, cat)
end
end
local countries = getprop("country") or {}
if type(countries) == "string" then
countries = split_on_comma(countries)
end
-- If no breadcrumb, this often happens when the langname and category are the same (happens only with etym-only
-- languages), and the parent category is set below to the full parent, so the breadcrumb should show the
-- language name (or equivalently, the category). If the langname and category are different, we should fall back to
-- the category. E.g. for Singlish, lang=en is specified and we can't infer a breadcrumb because the lect name
-- doesn't end in "English"; in this case we want the breadcrumb to show "Singlish".
breadcrumb = getprop("breadcrumb") or breadcrumb or category
local the_prefix
if args[1] then
regiondesc = args[1]
else
local regionprop = getprop("region")
if regionprop then
regiondesc = regionprop
elseif label_with_parent then
-- It's not clear which of the following two are better. The second one uses the actual label display form,
-- which might be argued to be better, except that it will often be linked to a Wikipedia article about the
-- lect rather than the place. The first one just uses the canonical label directly (which will later be
-- linked to itself if unlinked). A third possibility is to use `label_with_parent.display` if present,
-- otherwise `label_with_parent.canonical`.
regiondesc = label_with_parent.canonical
if label_with_parent.display and regiondesc ~= label_with_parent.display then
track("display-different-from-canonical")
end
-- regiondesc = require(labels_module).get_displayed_label(label_with_parent.canonical, label_with_parent.labdata, lang)
end
end
the_prefix = the_prefix or getprop("the") and "the " or ""
if #countries == 0 then
countries[1] = regiondesc and the_prefix .. regiondesc or nil
end
for _, country in ipairs(countries) do
if not country:find("[<=]") then
country = require("Module:links").remove_links(country)
local cat = "Category:Languages of " .. country
if page_exists(cat) then
table.insert(parents, cat)
end
end
end
-------------------- 5. Refine the language to an etymology-only child if possible. -------------------
-- Now that we've determined the parent, we look up the parent hierarchy until we find a category naming an
-- etymology-only language. If we find one and it's a child of the language we've determined, use it.
local ancestral_cat = first_parent_cat
local refined_lang
while true do
refined_lang = category_to_lang_name(ancestral_cat)
if refined_lang then
break
end
export.register_likely_lect_parent_cat(ancestral_cat)
local settings, _ = memoizing_lect_handler(ancestral_cat, nil, true)
if not settings then
break
end
ancestral_cat = settings.parents[1]
end
if refined_lang and refined_lang:hasParent(lang) then
lang = refined_lang
langname = lang:getCanonicalName()
end
-------------------- 6. Initialize `additional` with user-specified text and info about labels. -------------------
local additional = getprop("addl")
local function append_addl(addl_text)
if not addl_text then
return
end
if additional then
additional = additional .. "\n\n" .. addl_text
else
additional = addl_text
end
end
if all_labels then
local m_labels_utilities = require(labels_utilities_module)
append_addl(m_labels_utilities.format_labels_categorizing(all_labels, nil,
get_returnable_lang(lang)))
end
-------------------- 7. Augment `additional` with information about etymology-only codes. -------------------
local langname_for_desc
local etymcodes = {}
local function make_code(code)
return ("<code>%s</code>"):format(code)
end
if lang:hasType("etymology-only") and ucfirst(langname) == category then
langname_for_desc = lang:getParentName()
local langcode = lang:getCode()
table.insert(etymcodes, make_code(langcode))
-- Find all alias codes for the etymology-only language.
-- FIXME: There should be a better/easier way of doing this.
local ety_code_to_name = mw.loadData("Module:etymology languages/code to canonical name")
for code, canon_name in pairs(ety_code_to_name) do
if canon_name == langname and code ~= langcode then
table.insert(etymcodes, make_code(code))
end
end
local addl_etym_codes = ("[[Module:etymology_languages/data|Etymology-only language]] code: %s."):format(
serial_comma_join(etymcodes, {conj = "or"}))
append_addl(addl_etym_codes)
else
langname_for_desc = langname
end
-------------------- 8. Try to figure out if this variety is extinct or reconstructed. -------------------
local lect_type = getprop("type")
if not lect_type then
lect_type = determine_lect_type(category, lang, first_parent_cat)
end
local function prefix_addl(addl_text)
if additional then
additional = addl_text .. "\n\n" .. additional
else
additional = addl_text
end
end
if lect_type == "extinct" then
prefix_addl("This lect is [[extinct language|extinct]].")
table.insert(parents, "Category:All extinct languages")
elseif lect_type == "reconstructed" then
prefix_addl("This lect is [[reconstructed language|reconstructed]].")
table.insert(parents, "Category:Reconstructed languages")
elseif lect_type == "unattested" then
prefix_addl("This lect is {{w|unattested language|unattested}}.")
table.insert(parents, "Category:Unattested languages")
elseif lect_type == "constructed" then
prefix_addl("This lect is [[constructed language|constructed]].")
table.insert(parents, "Category:Constructed languages")
end
-------------------- 9. Compute `description`. -------------------
local description
local fulldef = getprop("fulldef")
if fulldef then
description = fulldef .. "."
end
if not description then
local def = getprop("def")
if def then
description = ("Terms or senses in %s."):format(def)
end
end
if not description then
if not regiondesc then
-- We need regiondesc for the description unless def= or fulldef= is given, which overrides the part that needs it.
error(("1= (region) not given and unable to infer region from category '%s' given language name '%s'"):
format(category, langname))
end
local lang_en = get_lang("en", true)
local linked_regiondesc = regiondesc
-- Don't try to link if HTML, = sign, template call or embedded link found in text. Embedded links will
-- automatically be converted to English links by JavaScript.
local function linkable(text)
return not text:find("[<={}%[%]|]")
end
if linked_regiondesc:find("<country>") then
if not countries then
error(("Can't specify <country> in region description '%s' when country= not given"):format(linked_regiondesc))
end
-- Link the countries individually before calling serialCommaJoin(), which inserts HTML.
local linked_countries = {}
for _, country in ipairs(countries) do
if linkable(country) then
country = require("Module:links").full_link { lang = lang_en, term = country }
end
table.insert(linked_countries, country)
end
linked_countries = serial_comma_join(linked_countries)
linked_regiondesc = linked_regiondesc:gsub("<country>", replacement_escape(linked_countries))
elseif not getprop("nolink") and linkable(linked_regiondesc) then
-- Even if nolink not given, don't try to link if HTML or = sign found in linked_regiondesc, otherwise
-- we're likely to get an error.
if page_exists(linked_regiondesc) then
-- Only construct a Wiktionary link if the page exists; otherwise construct a Wikipedia link.
linked_regiondesc = require("Module:links").full_link { lang = lang_en, term = linked_regiondesc }
else
linked_regiondesc = ("[[w:%s|%s]]"):format(linked_regiondesc, linked_regiondesc)
end
end
linked_regiondesc = the_prefix .. linked_regiondesc
local no_longer_spoken = lect_type == "extinct" or lect_type == "reconstructed" or lect_type == "unattested"
local verb = getprop("verb") or no_longer_spoken and "formerly spoken" or "spoken"
local prep = getprop("prep")
if not langname_for_desc then
error(category)
end
description = ("Terms or senses in %s as %s%s %s."):format(
langname_for_desc, verb, prep == "-" and "" or " " .. (prep or "in"), linked_regiondesc)
end
-------------------- 10. Compute the Wikipedia articles that go into `topright`. -------------------
local topright_parts = {}
-- Insert Wikipedia article `article` for Wikimedia language `wmcode` into `topright_parts`, avoiding duplication.
local function insert_wikipedia_article(wmcode, article)
if wmcode == "commons" then
insert_if_not(topright_parts, ("{{commons%s}}"):format(
article == category and "" or "|" .. article
))
else
local wparg = ("%s%s"):format(
wmcode == "en" and "" or wmcode .. ":",
article == category and "" or article
)
insert_if_not(topright_parts, ("{{wp%s}}"):format(
wparg == "" and wparg or "|" .. wparg
))
end
end
local function insert_wikipedia_articles_for_wikipedia_specs(specs, default)
for _, article in ipairs(specs) do
local foreign_wiki
if article == true then
article = default
else
if article:find(":[^ ]") then
local actual_article
foreign_wiki, actual_article = article:match("^([a-z][a-z][a-z-]*):([^ ].*)$")
if actual_article then
article = actual_article
end
end
if article == "+" then
article = default
elseif article == "-" then
article = nil
else
article = require("Module:yesno")(article, article)
if article == true then
article = default
end
end
end
if article then
insert_wikipedia_article(foreign_wiki or "en", article)
end
end
end
local function insert_wikipedia_articles_for_wikidata_specs(specs, lang)
if not mw.wikibase then
error(("Unable to retrieve data from Wikidata ID's '%s'; `mw.wikibase` not defined"):format(args.wikidata))
end
local wikipedia_langs = require(labels_module).get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
local ids_without_wmcodes = {}
local ids_with_wmcodes = {}
for _, id in ipairs(specs) do
if id:find(":") then
table.insert(ids_with_wmcodes, id)
else
table.insert(ids_without_wmcodes, id)
end
end
for _, wmcode in ipairs(wikipedia_langs) do
for _, id in ipairs(ids_without_wmcodes) do
local article = mw.wikibase.sitelink(id, wmcode .. "wiki")
if article then
insert_wikipedia_article(wmcode, article)
end
end
end
for _, id in ipairs(ids_with_wmcodes) do
local wmcode, wikidata_id = id:match("^(.-):(.*)$")
local article = mw.wikibase.sitelink(wikidata_id, wmcode .. "wiki")
if article then
insert_wikipedia_article(wmcode, article)
end
end
end
if args.wp or args.wikidata then
if args.wp then
insert_wikipedia_articles_for_wikipedia_specs(split_on_comma(args.wp), category)
end
if args.wikidata then
insert_wikipedia_articles_for_wikidata_specs(split(args.wikidata, "%s*,%s*"), lang)
end
elseif category == ucfirst(langname) then
local wikipedia_langs = require(labels_module).get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
for _, wmcode in ipairs(wikipedia_langs) do
local article = lang:getWikipediaArticle("no category fallback", wmcode .. "wiki")
if article then
insert_wikipedia_article(wmcode, article)
end
end
end
if #topright_parts == 0 and sorted_labels then
for _, labobj in pairs(all_labels) do
local wp_specs = labobj.labdata.Wikipedia
if wp_specs then
if type(wp_specs) ~= "table" then
wp_specs = {wp_specs}
end
insert_wikipedia_articles_for_wikipedia_specs(wp_specs, labobj.canonical)
end
local wikidata_specs = labobj.labdata.Wikidata
if wikidata_specs then
if type(wikidata_specs) ~= "table" then
wikidata_specs = {wikidata_specs}
end
insert_wikipedia_articles_for_wikidata_specs(wikidata_specs, labobj.lang)
end
end
end
local topright
if #topright_parts > 0 then
topright = table.concat(topright_parts)
end
-------------------- 11. Return the combined structure of all information. -------------------
track("lect")
export.register_likely_lect_parent_cat(parents[1])
return {
-- FIXME, allow etymological codes here
lang = get_returnable_lang_code(lang),
topright = topright,
description = description,
additional = additional,
parents = parents,
breadcrumb = {name = breadcrumb, nocap = true},
umbrella = false,
can_be_empty = true,
}, lect_type
end
local memoized_responses = {}
memoizing_lect_handler = function(category, raw_args, called_from_inside)
mw.log(category)
local retval = memoized_responses[category]
if not retval then
retval = {lect_handler(category, raw_args, called_from_inside)}
memoized_responses[category] = retval
end
local obj, lect_type = retval[1], retval[2]
return obj, lect_type
end
-- Actual handler for lect categories. See lect_handler() above.
table.insert(raw_handlers, function(data)
local settings, _ = memoizing_lect_handler(data.category, data.args, data.called_from_inside)
return settings, not not settings
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers, export = export}
9eqve9mdsmiu5rw4z3joqt6q5l5suxl
Mòideal:category tree/lemmas
828
17724
88389
2026-07-13T01:56:17Z
en>Benwing2
0
rename 'Foo genitive prepositions' to clearer 'Foo prepositions governing the genitive' etc.
88389
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local diminutive_augmentative_poses = {
"adjectives",
"adverbs",
"determiners",
"interjections",
"nouns",
"numerals",
"prefixes",
"proper nouns",
"pronouns",
"suffixes",
"verbs"
}
labels["lemmas"] = {
description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true, sort = " "}},
}
labels["action nouns"] = {
description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.",
parents = {"nouns"},
}
labels["act-related adverbs"] = {
description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.",
parents = {"adverbs"},
}
labels["adjective concords"] = {
description = "{{{langname}}} concords that are prefixed to adjective stems.",
parents = {"concords"},
}
labels["adjectives"] = {
description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.",
parents = {"lemmas"},
}
labels["adjectivized participles"] = {
description = "{{{langname}}} participles that are used as adjectives.",
parents = {"participles", "adjectives"},
}
labels["adjectivized past participles"] = {
description = "{{{langname}}} past participles that are used as adjectives.",
parents = {"past participles", "adjectivized participles", "adjectives"},
}
labels["adjectivized present participles"] = {
description = "{{{langname}}} present participles that are used as adjectives.",
parents = {"present participles", "adjectivized participles", "adjectives"},
}
labels["adverbial accusatives"] = {
description = "Accusative case-forms in {{{langname}}} used as adverbs.",
parents = {"adverbs"},
}
labels["adverbs"] = {
description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.",
parents = {"lemmas"},
}
labels["affixes"] = {
description = "Morphemes attached to existing {{{langname}}} words.",
parents = {"morphemes"},
}
labels["agent nouns"] = {
description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.",
parents = {"nouns"},
}
labels["ambipositions"] = {
description = "{{{langname}}} adpositions that can occur either before or after their objects.",
parents = {"lemmas"},
}
labels["ambitransitive verbs"] = {
description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.",
parents = {"verbs", "transitive verbs", "intransitive verbs"},
}
labels["animal commands"] = {
description = "{{{langname}}} words used to communicate with animals.",
parents = {"interjections"},
}
labels["articles"] = {
description = "{{{langname}}} terms that indicate and specify nouns.",
parents = {"determiners"},
}
labels["aspect adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.",
parents = {"adverbs"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["augmentative " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.",
parents = {pos},
}
end
labels["attenuative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.",
parents = {"verbs"},
}
labels["autobenefactive verbs"] = {
description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.",
parents = {"verbs"},
}
labels["automative verbs"] = {
description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.",
parents = {"verbs"},
}
labels["auxiliary verbs"] = {
description = "{{{langname}}} verbs that provide additional conjugations for other verbs.",
parents = {"verbs"},
}
labels["biaspectual verbs"] = {
description = "{{{langname}}} verbs that can be both imperfective and perfective.",
parents = {"verbs"},
}
labels["causative verbs"] = {
description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly.",
parents = {"verbs"},
}
labels["circumfixes"] = {
description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.",
parents = {"morphemes"},
}
labels["circumpositions"] = {
description = "{{{langname}}} adpositions that appear on both sides of their objects.",
parents = {"lemmas"},
}
labels["classifiers"] = {
description = "{{{langname}}} terms that classify nouns according to their meanings.",
parents = {"lemmas"},
}
labels["clitics"] = {
description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.",
parents = {"morphemes"},
}
for _, pos in ipairs { "nouns", "suffixes" } do
labels["collective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.",
parents = {pos},
}
end
labels["combining forms"] = {
description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.",
parents = {"morphemes"},
}
labels["comparable adjectives"] = {
description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["comparable adverbs"] = {
description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["completive verbs"] = {
description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.",
parents = {"verbs"},
}
labels["concords"] = {
description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.",
parents = {"prefixes"},
}
labels["conjunctions"] = {
description = "{{{langname}}} terms that connect words, phrases or clauses together.",
parents = {"lemmas"},
}
labels["conjunctive adverbs"] = {
description = "{{{langname}}} adverbs that connect two independent clauses together.",
parents = {"adverbs"},
}
labels["continuative verbs"] = {
description = "{{{langname}}} verbs that express continuing action.",
parents = {"imperfective verbs", "verbs"},
}
labels["control verbs"] = {
description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.",
parents = {"verbs"},
}
labels["cooperative verbs"] = {
description = "{{{langname}}} verbs that indicate cooperation",
parents = {"verbs"},
}
labels["coordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.",
parents = {"conjunctions"},
}
labels["copulative verbs"] = {
description = "{{{langname}}} verbs that may take adjectives as their complement.",
parents = {"verbs"},
}
for _, pos in ipairs { "nouns", "proper nouns" } do
labels["countable " .. pos] = {
description = "{{{langname}}} " .. pos .. " that can be quantified directly by numerals.",
parents = {pos},
}
end
labels["countable numerals"] = {
description = "{{{langname}}} numerals that can be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["countable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["counters"] = {
description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.",
parents = {"lemmas"},
}
labels["cumulative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.",
parents = {"verbs"},
}
labels["degree adverbs"] = {
description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.",
parents = {"adverbs"},
}
labels["delimitative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.",
parents = {"imperfective verbs", "verbs"},
}
labels["demonstrative adjectives"] = {
description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.",
parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}},
}
labels["demonstrative adverbs"] = {
description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.",
parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}},
}
labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent?
description = "{{{langname}}} verbs that derive from nouns.",
parents = { "verbs" },
}
labels["demonstrative determiners"] = {
description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.",
parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}},
}
labels["demonstrative pronouns"] = {
description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.",
parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}},
}
labels["deponent verbs"] = {
description = "{{{langname}}} verbs that have active meanings but are not conjugated in the {{w|active voice}}.",
parents = {"verbs"},
}
labels["derivational prefixes"] = {
description = "{{{langname}}} prefixes that are used to create new words.",
parents = {"prefixes"},
}
labels["derivational suffixes"] = {
description = "{{{langname}}} suffixes that are used to create new words.",
parents = {"suffixes"},
}
labels["derivative verbs"] = {
description = "{{{langname}}} verbs that are derived from nouns and adjectives.",
parents = {"verbs"},
}
labels["desiderative verbs"] = {
description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.",
parents = {"verbs"},
}
labels["determinatives"] = {
description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.",
parents = {"lemmas"},
}
labels["determiners"] = {
description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the modified noun.",
parents = {"lemmas"},
}
labels["diminutiva tantum"] = {
description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.",
parents = {"nouns"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["diminutive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.",
parents = {pos},
}
end
labels["discourse particles"] = {
description = "{{{langname}}} particles that manage the flow and structure of discourse.",
parents = {"particles"},
}
labels["distributive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.",
parents = {"imperfective verbs", "verbs"},
}
labels["ditransitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.",
parents = {"verbs", "transitive verbs"},
}
labels["dualia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.",
parents = {"nouns"},
}
labels["duration adverbs"] = {
description = "{{{langname}}} adverbs that express duration in time, such as (in English) [[always]], [[all night]] and [[ever since]].",
parents = {"time adverbs"},
}
labels["ergative verbs"] = {
description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.",
parents = {"verbs", "intransitive verbs", "transitive verbs"},
}
labels["excessive verbs"] = {
description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.",
parents = {"verbs"},
}
labels["enclitics"] = {
description = "{{{langname}}} clitics that attach to the preceding word.",
parents = {"clitics"},
}
labels["nouns with other-gender equivalents"] = {
description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.",
parents = {"nouns"},
}
labels["female equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["neuter equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["female equivalent suffixes"] = {
description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.",
parents = {"noun-forming suffixes"},
}
labels["focus adverbs"] = {
description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.",
parents = {"adverbs"},
}
labels["frequency adverbs"] = {
description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval, such as (in English) [[monthly]], [[continually]] and [[once in a while]].",
parents = {"time adverbs"},
}
labels["frequentative verbs"] = {
description = "{{{langname}}} verbs that express repeated action.",
parents = {"imperfective verbs", "verbs"},
}
labels["general pronouns"] = {
description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.",
parents = {"pronouns"},
}
labels["generational moieties"] = {
description = "{{{langname}}} moieties that alternate every generation.",
parents = {"moieties"},
}
labels["ideophones"] = {
description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.",
parents = {"lemmas"},
}
labels["imperfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.",
parents = {"verbs"},
}
labels["impersonal verbs"] = {
description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.",
parents = {"verbs"},
}
labels["inchoative verbs"] = {
description = "{{{langname}}} verbs that indicate the beginning of an action or event.",
parents = {"verbs"},
}
labels["indefinite adjectives"] = {
description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.",
parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}},
}
labels["indefinite adverbs"] = {
description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.",
parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}},
}
labels["indefinite determiners"] = {
description = "{{{langname}}} determiners that designate an unidentified noun.",
parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}},
}
labels["indefinite pronouns"] = {
description = "{{{langname}}} pronouns that refer to unspecified nouns.",
parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}},
}
labels["infixes"] = {
description = "Affixes inserted inside {{{langname}}} words.",
parents = {"morphemes"},
}
labels["inflectional prefixes"] = {
description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.",
parents = {"prefixes"},
}
labels["inflectional suffixes"] = {
description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.",
parents = {"suffixes"},
}
labels["intensive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.",
parents = {"verbs"},
}
labels["interfixes"] = {
description = "Affixes used to join two {{{langname}}} words or morphemes together.",
parents = {"morphemes"},
}
labels["interjections"] = {
description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.",
parents = {"lemmas"},
}
labels["interrogative adjectives"] = {
description = "{{{langname}}} adjectives that indicate questions.",
parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}},
}
labels["interrogative adverbs"] = {
description = "{{{langname}}} adverbs that indicate questions.",
parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}},
}
labels["interrogative determiners"] = {
description = "{{{langname}}} determiners that indicate questions.",
parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}},
}
labels["interrogative particles"] = {
description = "{{{langname}}} particles that indicate questions.",
parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}},
}
labels["interrogative pronouns"] = {
description = "{{{langname}}} pronouns that indicate questions.",
parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}},
}
labels["intransitive verbs"] = {
description = "{{{langname}}} verbs that don't require any grammatical objects.",
parents = {"verbs"},
}
labels["iterative verbs"] = {
description = "{{{langname}}} verbs that express the repetition of an event.",
parents = {"imperfective verbs", "verbs"},
}
labels["location adverbs"] = {
description = "{{{langname}}} adverbs that indicate location.",
parents = {"adverbs"},
}
labels["male equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["manner adverbs"] = {
description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.",
parents = {"adverbs"},
}
labels["modal adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.",
parents = {"sentence adverbs"},
}
labels["modal particles"] = {
description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.",
parents = {"particles"},
}
labels["modal verbs"] = {
description = "{{{langname}}} verbs that indicate [[grammatical mood]].",
parents = {"auxiliary verbs"},
}
labels["moieties"] = {
description = "{{{langname}}} pairs of abstract categories separating people and the environment.",
parents = {"lemmas"},
}
labels["momentane verbs"] = {
description = "{{{langname}}} verbs that express a sudden and brief action.",
parents = {"perfective verbs", "verbs"},
}
labels["morphemes"] = {
description = "{{{langname}}} word-elements used to form full words.",
parents = {"lemmas"},
}
labels["movement adverbs"] = {
description = "{{{langname}}} adverbs that express movement in space, such as (in English) [[hither]], [[that way]], [[down]] and [[eastwards]].",
additional = "Compare [[:Category:{{{langname}}} position adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Position adverbs by language]].",
},
}
labels["multiword terms"] = {
description = "{{{langname}}} lemmas that are a combination of multiple words, including [[WT:CFI#Idiomaticity|idiomatic]] combinations.",
parents = {"lemmas"},
}
labels["negative verbs"] = {
description = "{{{langname}}} verbs that indicate the lack of an action.",
parents = {"verbs"},
}
labels["negative particles"] = {
description = "{{{langname}}} particles that indicate negation.",
parents = {"particles"},
}
labels["negative pronouns"] = {
description = "{{{langname}}} pronouns that refer to negative or non-existent references.",
parents = {"pronouns"},
}
labels["nominalized adjectives"] = {
description = "{{{langname}}} adjectives that are used as nouns.",
parents = {"nouns", "adjectives"},
}
labels["nominalized present participles"] = {
description = "{{{langname}}} present participles that are used as nouns.",
parents = {"nouns", "present participles"},
}
labels["non-constituents"] = {
description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.",
parents = {"phrases"},
}
labels["noun prefixes"] = {
description = "{{{langname}}} prefixes attached to a noun that display its noun class.",
parents = {"prefixes"},
}
labels["nouns"] = {
description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.",
parents = {"lemmas"},
}
labels["nouns by classifier"] = {
description = "{{{langname}}} nouns organized by the classifier they are used with.",
parents = {{name = "nouns", sort = "classifier"}},
}
labels["numerals"] = {
description = "{{{langname}}} terms that quantify nouns.",
parents = {"lemmas"},
}
labels["object concords"] = {
description = "{{{langname}}} concords used to show the grammatical object.",
parents = {"concords"},
}
labels["object pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical objects.",
parents = {"pronouns"},
}
labels["particles"] = {
description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.",
parents = {"lemmas"},
}
labels["perfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.",
parents = {"verbs"},
}
labels["personal pronouns"] = {
description = "{{{langname}}} pronouns that are used as substitutes for known nouns.",
parents = {"pronouns"},
}
labels["phrasal verbs"] = {
description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.",
parents = {"verbs", "phrases"},
}
labels["phrasal prepositions"] = {
description = "{{{langname}}} prepositions formed with combinations of other terms.",
parents = {"prepositions", "phrases"},
}
labels["pluralia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.",
parents = {"nouns"},
}
labels["point-in-time adverbs"] = {
description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.",
parents = {"time adverbs"},
}
labels["position adverbs"] = {
description = "{{{langname}}} adverbs that express position in space, such as (in English) [[here]], [[next door]], [[cater-corner]] and [[on deck]].",
additional = "Compare [[:Category:{{{langname}}} movement adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Movement adverbs by language]].",
},
}
labels["possessable nouns"] = {
description = "{{{langname}}} nouns can have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Possessable nouns by language",
},
}
labels["possessional adjectives"] = {
description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.",
parents = {"adjectives"},
}
labels["possessive adjectives"] = {
description = "{{{langname}}} adjectives that indicate ownership.",
parents = {"adjectives"},
}
labels["possessive concords"] = {
description = "{{{langname}}} concords used to show possession.",
parents = {"concords"},
}
labels["possessive determiners"] = {
description = "{{{langname}}} determiners that indicate ownership.",
parents = {"determiners"},
}
labels["possessive pronouns"] = {
description = "{{{langname}}} pronouns that indicate ownership.",
parents = {"pronouns"},
}
labels["postpositional phrases"] = {
description = "{{{langname}}} phrases headed by a postposition.",
parents = {"phrases", "postpositions"},
}
labels["postpositions"] = {
description = "{{{langname}}} adpositions that are placed after their objects.",
parents = {"lemmas"},
}
labels["predicatives"] = {
description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.",
parents = {"lemmas"},
}
labels["prefixes"] = {
description = "Affixes attached to the beginning of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["prepositional phrases"] = {
description = "{{{langname}}} phrases headed by a preposition.",
parents = {"phrases", "prepositions"},
}
labels["prepositions"] = {
description = "{{{langname}}} adpositions that are placed before their objects.",
parents = {"lemmas"},
}
labels["matrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's mother.",
parents = {"moieties"},
}
labels["patrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's father.",
parents = {"moieties"},
}
labels["pejorative suffixes"] = {
description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).",
parents = {"suffixes"},
}
labels["prenouns"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to nouns.",
parents = {"prefixes"},
}
labels["preverbs"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to verbs.",
parents = {"prefixes"},
}
labels["privative verbs"] = {
description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.",
parents = {"verbs"},
}
labels["pronominal adverbs"] = {
description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.",
parents = {"adverbs", "prepositions", "pronouns"},
}
labels["pronominal concords"] = {
description = "{{{langname}}} concords that are prefixed to pronominal stems.",
parents = {"concords"},
}
labels["pronouns"] = {
description = "{{{langname}}} terms that refer to and substitute nouns.",
parents = {"lemmas"},
}
labels["proper nouns"] = {
description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.",
parents = {"nouns"},
}
labels["raising verbs"] = {
description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.",
parents = {"verbs"},
}
labels["reciprocal pronouns"] = {
description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.",
parents = {"pronouns", "personal pronouns"},
}
labels["reciprocal verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.",
parents = {"verbs"},
}
labels["reflexive pronouns"] = {
description = "{{{langname}}} pronouns that refer back to the subject.",
parents = {"pronouns", "personal pronouns"},
}
labels["reflexive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.",
parents = {"verbs"},
}
labels["relational adjectives"] = {
description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.",
parents = {"adjectives"},
}
labels["relational nouns"] = {
description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.",
parents = {"nouns"},
}
labels["relative adjectives"] = {
description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.",
parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}},
}
labels["relative adverbs"] = {
description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.",
parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}},
}
labels["relative determiners"] = {
description = "{{{langname}}} determiners used to indicate [[relative clause]]s.",
parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}},
}
labels["relative concords"] = {
description = "{{{langname}}} concords that are prefixed to relative stems.",
parents = {"concords"},
}
labels["relative pronouns"] = {
description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.",
parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}},
}
labels["relatives"] = {
description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.",
parents = {"lemmas"},
}
labels["repetitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.",
parents = {"verbs"},
}
labels["resultative verbs"] = {
description = "{{{langname}}} verbs that indicate a result of some action",
parents = {"verbs"},
}
labels["reversative verbs"] = {
description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.",
parents = {"verbs"},
}
labels["saturative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.",
parents = {"verbs"},
}
labels["semelfactive verbs"] = {
description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).",
parents = {"perfective verbs", "verbs"},
}
labels["sentence adverbs"] = {
description = "{{{langname}}} adverbs that modify an entire clause or sentence.",
parents = {"adverbs"},
}
labels["sequence adverbs"] = {
description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.",
parents = {"conjunctive adverbs"},
}
labels["simulfixes"] = {
description = "Affixes replacing positions in {{{langname}}} words.",
parents = {"morphemes"},
}
labels["singulative nouns"] = {
description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.",
parents = {"nouns"},
}
labels["singularia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.",
parents = {"nouns"},
}
labels["solitary pronouns"] = {
description = "{{{langname}}} pronouns that refer to specific people in particular and sets them apart from anyone else.",
parents = {"pronouns", "personal pronouns"},
}
labels["stative verbs"] = {
description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.",
parents = {"verbs"},
}
labels["stems"] = {
description = "Morphemes from which {{{langname}}} words are formed.",
parents = {"morphemes"},
}
labels["subordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.",
parents = {"conjunctions"},
}
labels["subject concords"] = {
description = "{{{langname}}} concords used to show the grammatical subject.",
parents = {"concords"},
}
labels["subject pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical subjects.",
parents = {"pronouns"},
}
labels["suffixes"] = {
description = "Affixes attached to the end of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["splitting verbs"] = {
description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.",
parents = {"verbs"},
}
labels["terminative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event ceases.",
parents = {"verbs"},
}
labels["time adverbs"] = {
description = "{{{langname}}} adverbs that indicate time, expressing either [[duration]], [[frequency]] or a [[point]] in [[time]].",
parents = {"adverbs"},
}
labels["transfixes"] = {
description = "Discontinuous affixes inserted within a word root.",
parents = {"morphemes"},
}
labels["transformative verbs"] = {
description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.",
parents = {"verbs"},
}
labels["transitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.",
parents = {"verbs"},
}
labels["uncomparable adjectives"] = {
description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["uncomparable adverbs"] = {
description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["uncountable nouns"] = {
description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.",
parents = {"nouns"},
}
labels["uncountable numerals"] = {
description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["uncountable proper nouns"] = {
description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.",
parents = {"proper nouns"},
}
labels["uncountable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["unpossessable nouns"] = {
description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Unpossessable nouns by language",
},
}
labels["verbal nouns"] = {
description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.",
parents = {"nouns"},
}
labels["verbal adjectives"] = {
description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.",
parents = {"adjectives"},
}
-----------------------------------------------------------------------------
labels["verbs"] = {
description = "{{{langname}}} terms that indicate actions, occurrences or states.",
parents = {"lemmas"},
}
for _, voice in pairs{
"active",
"middle",
"passive",
} do
labels[voice .. " verbs"] = {
description = "{{{langname}}} verbs that are predominantly used in the {{w|" .. voice .. " voice}}.",
parents = {"verbs"},
}
local voice_only = voice .. "-only"
labels[voice_only .. " verbs"] = {
breadcrumb = voice_only,
description = "{{{langname}}} verbs that can only be used in the {{w|" .. voice .. " voice}}.",
parents = {voice .. " verbs", "verbs"},
}
end
labels["verbs of movement"] = {
description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.",
parents = {"verbs"},
}
-----------------------------------------------------------------------------
for pos, desc in pairs{
["prepositions"] = "following",
["postpositions"] = "preceding"
} do
for _, case in ipairs{
"ablative",
"accusative",
"dative",
"genitive",
"instrumental",
"locative",
"nominative",
"prepositional",
"vocative",
} do
labels[pos .. " governing the " .. case] = {
breadcrumb = ucfirst(case),
description = ("{{{langname}}} %s that cause the %s noun to be in the %s case."):format(pos, desc, case),
parents = {pos},
}
end
end
-- Add "X-only categories for degrees.
for _, pos in pairs{
"adjectives",
"adverbs",
"determiners",
"pronouns",
} do
for _, degree in pairs{
"comparative",
"superlative",
"elative",
"exaggerated",
"excessive",
"equative",
} do
local degree_only = degree .. "-only"
labels[degree_only .. " " .. pos] = {
breadcrumb = degree_only,
description = "{{{langname}}} " .. pos .. " that are only used in the " .. degree .. " degree.",
parents = {pos},
}
end
end
-- Add "POS-forming suffixes".
for _, pos in pairs{
"adjective",
"adverb",
"noun",
"numeral",
"participle",
"pronoun",
"proper noun",
"verb",
} do
labels[pos .. "-forming suffixes"] = {
description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.",
parents = {"derivational suffixes"},
}
end
local labels2 = {}
-- Add "reconstructed" subcategories; add 'umbrella_parents' key if not
-- already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Lemmas subcategories by language"
end
labels2["reconstructed " .. key] = {
description = "{{{langname}}} " .. key .. " that have been linguistically [[Wiktionary:Reconstructed terms|reconstructed]].",
umbrella_parents = "Lemmas subcategories by language",
parents = {key, {name = "reconstructed terms", sort = key}}
}
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Lemmas subcategories by language"] = {
description = "Umbrella categories covering topics related to lemmas.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "lemmas", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for e.g. [[:Category:English phrasal verbs formed with "aback"]].
table.insert(handlers, function(data)
local particle = data.label:match("^phrasal verbs formed with \"(.-)\"$")
if particle then
local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term")
local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term")
return {
description = "{{{langname}}} {{w|phrasal verb}}s formed with the adverb or preposition " .. link .. ".",
displaytitle = '{{{langname}}} phrasal verbs formed with "' .. particle .. '"',
breadcrumb = tagged_text,
parents = {{ name = "phrasal verbs", sort = particle }},
umbrella = false,
}
end
end)
return {LABELS = labels2, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
hsseb0wnu7nbxnl7i3znvhvjk1d9smb
88390
88389
2026-07-27T00:15:28Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/lemmas]]
88389
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local diminutive_augmentative_poses = {
"adjectives",
"adverbs",
"determiners",
"interjections",
"nouns",
"numerals",
"prefixes",
"proper nouns",
"pronouns",
"suffixes",
"verbs"
}
labels["lemmas"] = {
description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true, sort = " "}},
}
labels["action nouns"] = {
description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.",
parents = {"nouns"},
}
labels["act-related adverbs"] = {
description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.",
parents = {"adverbs"},
}
labels["adjective concords"] = {
description = "{{{langname}}} concords that are prefixed to adjective stems.",
parents = {"concords"},
}
labels["adjectives"] = {
description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.",
parents = {"lemmas"},
}
labels["adjectivized participles"] = {
description = "{{{langname}}} participles that are used as adjectives.",
parents = {"participles", "adjectives"},
}
labels["adjectivized past participles"] = {
description = "{{{langname}}} past participles that are used as adjectives.",
parents = {"past participles", "adjectivized participles", "adjectives"},
}
labels["adjectivized present participles"] = {
description = "{{{langname}}} present participles that are used as adjectives.",
parents = {"present participles", "adjectivized participles", "adjectives"},
}
labels["adverbial accusatives"] = {
description = "Accusative case-forms in {{{langname}}} used as adverbs.",
parents = {"adverbs"},
}
labels["adverbs"] = {
description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.",
parents = {"lemmas"},
}
labels["affixes"] = {
description = "Morphemes attached to existing {{{langname}}} words.",
parents = {"morphemes"},
}
labels["agent nouns"] = {
description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.",
parents = {"nouns"},
}
labels["ambipositions"] = {
description = "{{{langname}}} adpositions that can occur either before or after their objects.",
parents = {"lemmas"},
}
labels["ambitransitive verbs"] = {
description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.",
parents = {"verbs", "transitive verbs", "intransitive verbs"},
}
labels["animal commands"] = {
description = "{{{langname}}} words used to communicate with animals.",
parents = {"interjections"},
}
labels["articles"] = {
description = "{{{langname}}} terms that indicate and specify nouns.",
parents = {"determiners"},
}
labels["aspect adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.",
parents = {"adverbs"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["augmentative " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.",
parents = {pos},
}
end
labels["attenuative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.",
parents = {"verbs"},
}
labels["autobenefactive verbs"] = {
description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.",
parents = {"verbs"},
}
labels["automative verbs"] = {
description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.",
parents = {"verbs"},
}
labels["auxiliary verbs"] = {
description = "{{{langname}}} verbs that provide additional conjugations for other verbs.",
parents = {"verbs"},
}
labels["biaspectual verbs"] = {
description = "{{{langname}}} verbs that can be both imperfective and perfective.",
parents = {"verbs"},
}
labels["causative verbs"] = {
description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly.",
parents = {"verbs"},
}
labels["circumfixes"] = {
description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.",
parents = {"morphemes"},
}
labels["circumpositions"] = {
description = "{{{langname}}} adpositions that appear on both sides of their objects.",
parents = {"lemmas"},
}
labels["classifiers"] = {
description = "{{{langname}}} terms that classify nouns according to their meanings.",
parents = {"lemmas"},
}
labels["clitics"] = {
description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.",
parents = {"morphemes"},
}
for _, pos in ipairs { "nouns", "suffixes" } do
labels["collective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.",
parents = {pos},
}
end
labels["combining forms"] = {
description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.",
parents = {"morphemes"},
}
labels["comparable adjectives"] = {
description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["comparable adverbs"] = {
description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["completive verbs"] = {
description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.",
parents = {"verbs"},
}
labels["concords"] = {
description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.",
parents = {"prefixes"},
}
labels["conjunctions"] = {
description = "{{{langname}}} terms that connect words, phrases or clauses together.",
parents = {"lemmas"},
}
labels["conjunctive adverbs"] = {
description = "{{{langname}}} adverbs that connect two independent clauses together.",
parents = {"adverbs"},
}
labels["continuative verbs"] = {
description = "{{{langname}}} verbs that express continuing action.",
parents = {"imperfective verbs", "verbs"},
}
labels["control verbs"] = {
description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.",
parents = {"verbs"},
}
labels["cooperative verbs"] = {
description = "{{{langname}}} verbs that indicate cooperation",
parents = {"verbs"},
}
labels["coordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.",
parents = {"conjunctions"},
}
labels["copulative verbs"] = {
description = "{{{langname}}} verbs that may take adjectives as their complement.",
parents = {"verbs"},
}
for _, pos in ipairs { "nouns", "proper nouns" } do
labels["countable " .. pos] = {
description = "{{{langname}}} " .. pos .. " that can be quantified directly by numerals.",
parents = {pos},
}
end
labels["countable numerals"] = {
description = "{{{langname}}} numerals that can be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["countable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["counters"] = {
description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.",
parents = {"lemmas"},
}
labels["cumulative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.",
parents = {"verbs"},
}
labels["degree adverbs"] = {
description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.",
parents = {"adverbs"},
}
labels["delimitative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.",
parents = {"imperfective verbs", "verbs"},
}
labels["demonstrative adjectives"] = {
description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.",
parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}},
}
labels["demonstrative adverbs"] = {
description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.",
parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}},
}
labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent?
description = "{{{langname}}} verbs that derive from nouns.",
parents = { "verbs" },
}
labels["demonstrative determiners"] = {
description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.",
parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}},
}
labels["demonstrative pronouns"] = {
description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.",
parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}},
}
labels["deponent verbs"] = {
description = "{{{langname}}} verbs that have active meanings but are not conjugated in the {{w|active voice}}.",
parents = {"verbs"},
}
labels["derivational prefixes"] = {
description = "{{{langname}}} prefixes that are used to create new words.",
parents = {"prefixes"},
}
labels["derivational suffixes"] = {
description = "{{{langname}}} suffixes that are used to create new words.",
parents = {"suffixes"},
}
labels["derivative verbs"] = {
description = "{{{langname}}} verbs that are derived from nouns and adjectives.",
parents = {"verbs"},
}
labels["desiderative verbs"] = {
description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.",
parents = {"verbs"},
}
labels["determinatives"] = {
description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.",
parents = {"lemmas"},
}
labels["determiners"] = {
description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the modified noun.",
parents = {"lemmas"},
}
labels["diminutiva tantum"] = {
description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.",
parents = {"nouns"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["diminutive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.",
parents = {pos},
}
end
labels["discourse particles"] = {
description = "{{{langname}}} particles that manage the flow and structure of discourse.",
parents = {"particles"},
}
labels["distributive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.",
parents = {"imperfective verbs", "verbs"},
}
labels["ditransitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.",
parents = {"verbs", "transitive verbs"},
}
labels["dualia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.",
parents = {"nouns"},
}
labels["duration adverbs"] = {
description = "{{{langname}}} adverbs that express duration in time, such as (in English) [[always]], [[all night]] and [[ever since]].",
parents = {"time adverbs"},
}
labels["ergative verbs"] = {
description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.",
parents = {"verbs", "intransitive verbs", "transitive verbs"},
}
labels["excessive verbs"] = {
description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.",
parents = {"verbs"},
}
labels["enclitics"] = {
description = "{{{langname}}} clitics that attach to the preceding word.",
parents = {"clitics"},
}
labels["nouns with other-gender equivalents"] = {
description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.",
parents = {"nouns"},
}
labels["female equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["neuter equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["female equivalent suffixes"] = {
description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.",
parents = {"noun-forming suffixes"},
}
labels["focus adverbs"] = {
description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.",
parents = {"adverbs"},
}
labels["frequency adverbs"] = {
description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval, such as (in English) [[monthly]], [[continually]] and [[once in a while]].",
parents = {"time adverbs"},
}
labels["frequentative verbs"] = {
description = "{{{langname}}} verbs that express repeated action.",
parents = {"imperfective verbs", "verbs"},
}
labels["general pronouns"] = {
description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.",
parents = {"pronouns"},
}
labels["generational moieties"] = {
description = "{{{langname}}} moieties that alternate every generation.",
parents = {"moieties"},
}
labels["ideophones"] = {
description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.",
parents = {"lemmas"},
}
labels["imperfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.",
parents = {"verbs"},
}
labels["impersonal verbs"] = {
description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.",
parents = {"verbs"},
}
labels["inchoative verbs"] = {
description = "{{{langname}}} verbs that indicate the beginning of an action or event.",
parents = {"verbs"},
}
labels["indefinite adjectives"] = {
description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.",
parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}},
}
labels["indefinite adverbs"] = {
description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.",
parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}},
}
labels["indefinite determiners"] = {
description = "{{{langname}}} determiners that designate an unidentified noun.",
parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}},
}
labels["indefinite pronouns"] = {
description = "{{{langname}}} pronouns that refer to unspecified nouns.",
parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}},
}
labels["infixes"] = {
description = "Affixes inserted inside {{{langname}}} words.",
parents = {"morphemes"},
}
labels["inflectional prefixes"] = {
description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.",
parents = {"prefixes"},
}
labels["inflectional suffixes"] = {
description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.",
parents = {"suffixes"},
}
labels["intensive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.",
parents = {"verbs"},
}
labels["interfixes"] = {
description = "Affixes used to join two {{{langname}}} words or morphemes together.",
parents = {"morphemes"},
}
labels["interjections"] = {
description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.",
parents = {"lemmas"},
}
labels["interrogative adjectives"] = {
description = "{{{langname}}} adjectives that indicate questions.",
parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}},
}
labels["interrogative adverbs"] = {
description = "{{{langname}}} adverbs that indicate questions.",
parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}},
}
labels["interrogative determiners"] = {
description = "{{{langname}}} determiners that indicate questions.",
parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}},
}
labels["interrogative particles"] = {
description = "{{{langname}}} particles that indicate questions.",
parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}},
}
labels["interrogative pronouns"] = {
description = "{{{langname}}} pronouns that indicate questions.",
parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}},
}
labels["intransitive verbs"] = {
description = "{{{langname}}} verbs that don't require any grammatical objects.",
parents = {"verbs"},
}
labels["iterative verbs"] = {
description = "{{{langname}}} verbs that express the repetition of an event.",
parents = {"imperfective verbs", "verbs"},
}
labels["location adverbs"] = {
description = "{{{langname}}} adverbs that indicate location.",
parents = {"adverbs"},
}
labels["male equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["manner adverbs"] = {
description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.",
parents = {"adverbs"},
}
labels["modal adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.",
parents = {"sentence adverbs"},
}
labels["modal particles"] = {
description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.",
parents = {"particles"},
}
labels["modal verbs"] = {
description = "{{{langname}}} verbs that indicate [[grammatical mood]].",
parents = {"auxiliary verbs"},
}
labels["moieties"] = {
description = "{{{langname}}} pairs of abstract categories separating people and the environment.",
parents = {"lemmas"},
}
labels["momentane verbs"] = {
description = "{{{langname}}} verbs that express a sudden and brief action.",
parents = {"perfective verbs", "verbs"},
}
labels["morphemes"] = {
description = "{{{langname}}} word-elements used to form full words.",
parents = {"lemmas"},
}
labels["movement adverbs"] = {
description = "{{{langname}}} adverbs that express movement in space, such as (in English) [[hither]], [[that way]], [[down]] and [[eastwards]].",
additional = "Compare [[:Category:{{{langname}}} position adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Position adverbs by language]].",
},
}
labels["multiword terms"] = {
description = "{{{langname}}} lemmas that are a combination of multiple words, including [[WT:CFI#Idiomaticity|idiomatic]] combinations.",
parents = {"lemmas"},
}
labels["negative verbs"] = {
description = "{{{langname}}} verbs that indicate the lack of an action.",
parents = {"verbs"},
}
labels["negative particles"] = {
description = "{{{langname}}} particles that indicate negation.",
parents = {"particles"},
}
labels["negative pronouns"] = {
description = "{{{langname}}} pronouns that refer to negative or non-existent references.",
parents = {"pronouns"},
}
labels["nominalized adjectives"] = {
description = "{{{langname}}} adjectives that are used as nouns.",
parents = {"nouns", "adjectives"},
}
labels["nominalized present participles"] = {
description = "{{{langname}}} present participles that are used as nouns.",
parents = {"nouns", "present participles"},
}
labels["non-constituents"] = {
description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.",
parents = {"phrases"},
}
labels["noun prefixes"] = {
description = "{{{langname}}} prefixes attached to a noun that display its noun class.",
parents = {"prefixes"},
}
labels["nouns"] = {
description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.",
parents = {"lemmas"},
}
labels["nouns by classifier"] = {
description = "{{{langname}}} nouns organized by the classifier they are used with.",
parents = {{name = "nouns", sort = "classifier"}},
}
labels["numerals"] = {
description = "{{{langname}}} terms that quantify nouns.",
parents = {"lemmas"},
}
labels["object concords"] = {
description = "{{{langname}}} concords used to show the grammatical object.",
parents = {"concords"},
}
labels["object pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical objects.",
parents = {"pronouns"},
}
labels["particles"] = {
description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.",
parents = {"lemmas"},
}
labels["perfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.",
parents = {"verbs"},
}
labels["personal pronouns"] = {
description = "{{{langname}}} pronouns that are used as substitutes for known nouns.",
parents = {"pronouns"},
}
labels["phrasal verbs"] = {
description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.",
parents = {"verbs", "phrases"},
}
labels["phrasal prepositions"] = {
description = "{{{langname}}} prepositions formed with combinations of other terms.",
parents = {"prepositions", "phrases"},
}
labels["pluralia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.",
parents = {"nouns"},
}
labels["point-in-time adverbs"] = {
description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.",
parents = {"time adverbs"},
}
labels["position adverbs"] = {
description = "{{{langname}}} adverbs that express position in space, such as (in English) [[here]], [[next door]], [[cater-corner]] and [[on deck]].",
additional = "Compare [[:Category:{{{langname}}} movement adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Movement adverbs by language]].",
},
}
labels["possessable nouns"] = {
description = "{{{langname}}} nouns can have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Possessable nouns by language",
},
}
labels["possessional adjectives"] = {
description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.",
parents = {"adjectives"},
}
labels["possessive adjectives"] = {
description = "{{{langname}}} adjectives that indicate ownership.",
parents = {"adjectives"},
}
labels["possessive concords"] = {
description = "{{{langname}}} concords used to show possession.",
parents = {"concords"},
}
labels["possessive determiners"] = {
description = "{{{langname}}} determiners that indicate ownership.",
parents = {"determiners"},
}
labels["possessive pronouns"] = {
description = "{{{langname}}} pronouns that indicate ownership.",
parents = {"pronouns"},
}
labels["postpositional phrases"] = {
description = "{{{langname}}} phrases headed by a postposition.",
parents = {"phrases", "postpositions"},
}
labels["postpositions"] = {
description = "{{{langname}}} adpositions that are placed after their objects.",
parents = {"lemmas"},
}
labels["predicatives"] = {
description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.",
parents = {"lemmas"},
}
labels["prefixes"] = {
description = "Affixes attached to the beginning of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["prepositional phrases"] = {
description = "{{{langname}}} phrases headed by a preposition.",
parents = {"phrases", "prepositions"},
}
labels["prepositions"] = {
description = "{{{langname}}} adpositions that are placed before their objects.",
parents = {"lemmas"},
}
labels["matrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's mother.",
parents = {"moieties"},
}
labels["patrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's father.",
parents = {"moieties"},
}
labels["pejorative suffixes"] = {
description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).",
parents = {"suffixes"},
}
labels["prenouns"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to nouns.",
parents = {"prefixes"},
}
labels["preverbs"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to verbs.",
parents = {"prefixes"},
}
labels["privative verbs"] = {
description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.",
parents = {"verbs"},
}
labels["pronominal adverbs"] = {
description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.",
parents = {"adverbs", "prepositions", "pronouns"},
}
labels["pronominal concords"] = {
description = "{{{langname}}} concords that are prefixed to pronominal stems.",
parents = {"concords"},
}
labels["pronouns"] = {
description = "{{{langname}}} terms that refer to and substitute nouns.",
parents = {"lemmas"},
}
labels["proper nouns"] = {
description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.",
parents = {"nouns"},
}
labels["raising verbs"] = {
description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.",
parents = {"verbs"},
}
labels["reciprocal pronouns"] = {
description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.",
parents = {"pronouns", "personal pronouns"},
}
labels["reciprocal verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.",
parents = {"verbs"},
}
labels["reflexive pronouns"] = {
description = "{{{langname}}} pronouns that refer back to the subject.",
parents = {"pronouns", "personal pronouns"},
}
labels["reflexive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.",
parents = {"verbs"},
}
labels["relational adjectives"] = {
description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.",
parents = {"adjectives"},
}
labels["relational nouns"] = {
description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.",
parents = {"nouns"},
}
labels["relative adjectives"] = {
description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.",
parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}},
}
labels["relative adverbs"] = {
description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.",
parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}},
}
labels["relative determiners"] = {
description = "{{{langname}}} determiners used to indicate [[relative clause]]s.",
parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}},
}
labels["relative concords"] = {
description = "{{{langname}}} concords that are prefixed to relative stems.",
parents = {"concords"},
}
labels["relative pronouns"] = {
description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.",
parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}},
}
labels["relatives"] = {
description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.",
parents = {"lemmas"},
}
labels["repetitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.",
parents = {"verbs"},
}
labels["resultative verbs"] = {
description = "{{{langname}}} verbs that indicate a result of some action",
parents = {"verbs"},
}
labels["reversative verbs"] = {
description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.",
parents = {"verbs"},
}
labels["saturative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.",
parents = {"verbs"},
}
labels["semelfactive verbs"] = {
description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).",
parents = {"perfective verbs", "verbs"},
}
labels["sentence adverbs"] = {
description = "{{{langname}}} adverbs that modify an entire clause or sentence.",
parents = {"adverbs"},
}
labels["sequence adverbs"] = {
description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.",
parents = {"conjunctive adverbs"},
}
labels["simulfixes"] = {
description = "Affixes replacing positions in {{{langname}}} words.",
parents = {"morphemes"},
}
labels["singulative nouns"] = {
description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.",
parents = {"nouns"},
}
labels["singularia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.",
parents = {"nouns"},
}
labels["solitary pronouns"] = {
description = "{{{langname}}} pronouns that refer to specific people in particular and sets them apart from anyone else.",
parents = {"pronouns", "personal pronouns"},
}
labels["stative verbs"] = {
description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.",
parents = {"verbs"},
}
labels["stems"] = {
description = "Morphemes from which {{{langname}}} words are formed.",
parents = {"morphemes"},
}
labels["subordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.",
parents = {"conjunctions"},
}
labels["subject concords"] = {
description = "{{{langname}}} concords used to show the grammatical subject.",
parents = {"concords"},
}
labels["subject pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical subjects.",
parents = {"pronouns"},
}
labels["suffixes"] = {
description = "Affixes attached to the end of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["splitting verbs"] = {
description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.",
parents = {"verbs"},
}
labels["terminative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event ceases.",
parents = {"verbs"},
}
labels["time adverbs"] = {
description = "{{{langname}}} adverbs that indicate time, expressing either [[duration]], [[frequency]] or a [[point]] in [[time]].",
parents = {"adverbs"},
}
labels["transfixes"] = {
description = "Discontinuous affixes inserted within a word root.",
parents = {"morphemes"},
}
labels["transformative verbs"] = {
description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.",
parents = {"verbs"},
}
labels["transitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.",
parents = {"verbs"},
}
labels["uncomparable adjectives"] = {
description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["uncomparable adverbs"] = {
description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["uncountable nouns"] = {
description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.",
parents = {"nouns"},
}
labels["uncountable numerals"] = {
description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["uncountable proper nouns"] = {
description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.",
parents = {"proper nouns"},
}
labels["uncountable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["unpossessable nouns"] = {
description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Unpossessable nouns by language",
},
}
labels["verbal nouns"] = {
description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.",
parents = {"nouns"},
}
labels["verbal adjectives"] = {
description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.",
parents = {"adjectives"},
}
-----------------------------------------------------------------------------
labels["verbs"] = {
description = "{{{langname}}} terms that indicate actions, occurrences or states.",
parents = {"lemmas"},
}
for _, voice in pairs{
"active",
"middle",
"passive",
} do
labels[voice .. " verbs"] = {
description = "{{{langname}}} verbs that are predominantly used in the {{w|" .. voice .. " voice}}.",
parents = {"verbs"},
}
local voice_only = voice .. "-only"
labels[voice_only .. " verbs"] = {
breadcrumb = voice_only,
description = "{{{langname}}} verbs that can only be used in the {{w|" .. voice .. " voice}}.",
parents = {voice .. " verbs", "verbs"},
}
end
labels["verbs of movement"] = {
description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.",
parents = {"verbs"},
}
-----------------------------------------------------------------------------
for pos, desc in pairs{
["prepositions"] = "following",
["postpositions"] = "preceding"
} do
for _, case in ipairs{
"ablative",
"accusative",
"dative",
"genitive",
"instrumental",
"locative",
"nominative",
"prepositional",
"vocative",
} do
labels[pos .. " governing the " .. case] = {
breadcrumb = ucfirst(case),
description = ("{{{langname}}} %s that cause the %s noun to be in the %s case."):format(pos, desc, case),
parents = {pos},
}
end
end
-- Add "X-only categories for degrees.
for _, pos in pairs{
"adjectives",
"adverbs",
"determiners",
"pronouns",
} do
for _, degree in pairs{
"comparative",
"superlative",
"elative",
"exaggerated",
"excessive",
"equative",
} do
local degree_only = degree .. "-only"
labels[degree_only .. " " .. pos] = {
breadcrumb = degree_only,
description = "{{{langname}}} " .. pos .. " that are only used in the " .. degree .. " degree.",
parents = {pos},
}
end
end
-- Add "POS-forming suffixes".
for _, pos in pairs{
"adjective",
"adverb",
"noun",
"numeral",
"participle",
"pronoun",
"proper noun",
"verb",
} do
labels[pos .. "-forming suffixes"] = {
description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.",
parents = {"derivational suffixes"},
}
end
local labels2 = {}
-- Add "reconstructed" subcategories; add 'umbrella_parents' key if not
-- already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Lemmas subcategories by language"
end
labels2["reconstructed " .. key] = {
description = "{{{langname}}} " .. key .. " that have been linguistically [[Wiktionary:Reconstructed terms|reconstructed]].",
umbrella_parents = "Lemmas subcategories by language",
parents = {key, {name = "reconstructed terms", sort = key}}
}
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Lemmas subcategories by language"] = {
description = "Umbrella categories covering topics related to lemmas.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "lemmas", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for e.g. [[:Category:English phrasal verbs formed with "aback"]].
table.insert(handlers, function(data)
local particle = data.label:match("^phrasal verbs formed with \"(.-)\"$")
if particle then
local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term")
local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term")
return {
description = "{{{langname}}} {{w|phrasal verb}}s formed with the adverb or preposition " .. link .. ".",
displaytitle = '{{{langname}}} phrasal verbs formed with "' .. particle .. '"',
breadcrumb = tagged_text,
parents = {{ name = "phrasal verbs", sort = particle }},
umbrella = false,
}
end
end)
return {LABELS = labels2, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
hsseb0wnu7nbxnl7i3znvhvjk1d9smb
Mòideal:category tree/lexical properties
828
17725
88391
2026-06-05T22:02:57Z
en>Juwan
0
88391
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local insert = table.insert
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by lexical property"] = {
description = "{{{langname}}} terms categorized by properties relating to spelling, pronunciation or meaning.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}}
}
labels["autohyponyms"] = {
description = "{{{langname}}} terms that have at least two meanings, one of which is a hyponym of the other.",
parents = {"terms by lexical property"},
}
labels["contranyms"] = {
description = "{{{langname}}} terms that have two opposite meanings.",
parents = {"terms by lexical property"},
}
labels["double negatives"] = {
description = "{{{langname}}} terms which include a [[double negative]], either etymologically or in a definition.",
parents = {"terms by lexical property"},
}
labels["heteronyms"] = {
description = "{{{langname}}} terms that have different meanings depending on their etymology and/or on how they are pronounced.",
parents = {"terms by lexical property"},
}
labels["nuqtaless forms"] = {
description = "{{{langname}}} terms that are spelled without a [[nuqta]].",
parents = {"terms by orthographic property"},
}
labels["unhamzated forms"] = {
description = "{{{langname}}} terms that are spelled without a [[hamza]].",
parents = {"terms by orthographic property"},
}
labels["palindromes"] = {
description = "{{{langname}}} terms whose characters are read equally both from left to right and vice versa, normally ignoring spaces, [[diacritic]]s and punctuation.",
parents = {"terms by their sequences of characters"},
}
labels["pleonastic compounds"] = {
description = "{{{langname}}} compound terms where the head is a hyponym of its other part and whose other part is its synonym.",
parents = {"terms by lexical property", "compound terms"},
}
labels["pleonastic compound adjectives"] = {
description = "{{{langname}}} compound adjectives where the head is a hyponym of its other part and whose other part is its synonym.",
breadcrumb = "adjectives",
parents = {{name = "pleonastic compounds", sort = "adjectives"}, "compound adjectives"},
}
labels["pleonastic compound nouns"] = {
description = "{{{langname}}} compound nouns where the head is a hyponym of its other part and where the head is the synonym for the whole.",
breadcrumb = "nouns",
parents = {{name = "pleonastic compounds", sort = "nouns"}, "compound nouns"},
}
labels["pronunciation spellings"] = {
description = "{{{langname}}} terms spelled to represent a pronunciation, often a nonstandard one.",
parents = {"terms by orthographic property"},
}
labels["tautophrases"] = {
description = "{{{langname}}} phrases that repeat the same idea or concept using the same words.",
parents = {"terms by lexical property"},
}
labels["terms by orthographic property"] = {
description = "{{{langname}}} terms categorized by properties relating to [[orthography]] or [[spelling]].",
breadcrumb = "by orthographic property",
parents = {{name = "terms by lexical property", sort = "orthographic property"}},
}
labels["calculator words"] = {
description = "{{{langname}}} terms that can be spelled on a [[seven-segment]] display, as found on pocket calculators, by turning numbers upside-down.",
parents = {"terms by orthographic property"},
}
labels["words spelled without vowels"] = {
description = "{{{langname}}} words spelled without vowels.",
additional = "The letters counted as vowels may differ from language to language but typically include the conventional written vowels (''a'' ''e'' ''i'' ''o'' ''u'' ''y''), and may include other less common letters representing vowels (e.g. ''æ'', ''œ'', ''ø''). Terms in this category may contain vowel sounds in their pronunciation.",
parents = {"terms by their sequences of characters"},
}
labels["words by number of letters"] = {
description = "{{{langname}}} words categorized by number of letters.",
parents = {"terms by orthographic property"},
}
labels["abbreviations by number of letters"] = {
description = "{{{langname}}} abbreviations categorized by number of letters.",
parents = {"terms by orthographic property"},
}
labels["roots by number of letters"] = {
description = "{{{langname}}} {{lg|roots}} categorized by number of letters.",
breadcrumb = "by number of letters",
parents = {
{name = "roots", sort = "number of letters"},
"terms by orthographic property"
},
}
labels["roots by shape"] = {
description = "{{{langname}}} {{lg|roots}} categorized by their shape.",
breadcrumb = "by shape",
parents = {
{name = "roots", sort = "shape"},
"terms by lexical property"
},
}
labels["words by number of syllables"] = {
description = "{{{langname}}} words categorized by number of syllables.",
parents = {"terms by phonemic property"},
}
labels["terms by their individual characters"] = {
description = "{{{langname}}} terms categorized by whether they include certain individual characters.",
breadcrumb = "by their individual characters",
parents = {{name = "terms by orthographic property", sort = "individual characters"}},
}
labels["terms by their sequences of characters"] = {
description = "{{{langname}}} terms categorized by whether they include certain sequences of characters.",
breadcrumb = "by their sequences of characters",
parents = {{name = "terms by orthographic property", sort = "sequences of characters"}},
}
labels["terms with consecutive instances of the same letter"] = {
description = "{{{langname}}} words categorized by the number of consecutive instances of the same letter they contain.",
breadcrumb = "consecutive instances of the same letter",
parents = {{name = "terms by orthographic property", sort = "consecutive instances of the same letter"}},
}
labels["terms containing italics"] = {
description = "{{{langname}}} terms containing [[italics]].",
breadcrumb = "containing italics",
parents = {{name = "terms by orthographic property", sort = "containing italics"}},
}
labels["terms containing Roman numerals"] = {
description = "{{{langname}}} terms containing [[Roman numeral]]s.",
breadcrumb = "containing Roman numbers",
parents = {{name = "terms by orthographic property", sort = "containing Roman numbers"},
{name = "terms spelled with numbers", sort = "Roman numerals"}},
}
labels["terms with mixed convergence"] = {
description = "{{{langname}}} terms where the spelling represents a variant pronunciation that differs from (one of) the current standard pronunciation(s).",
breadcrumb = "with mixed convergence",
parents = {{name = "terms by orthographic property", sort = "mixed convergence"}, "terms by phonemic property"},
}
labels["terms with homophones"] = {
description = "{{{langname}}} terms that have one or more [[homophones]]: other terms that are pronounced in the same way but spelled differently.",
breadcrumb = "with homophones",
parents = {{name = "terms by lexical property", sort = "homophones"}},
}
labels["terms with honorific transposition"] = {
description = "{{{langname}}} compound terms where the written order of the elements is reversed due to [[honorific transposition]].",
breadcrumb = "with honorific transposition",
parents = {{name = "terms by orthographic property", sort = "honorific transposition"}},
}
labels["terms where the adjective follows the noun"] = {
description = "{{{langname}}} terms where the adjective follows the noun. These adjectives within these terms are sometimes referred to as postpositive or postnominal adjectives.",
breadcrumb = "adjective follows the noun",
parents = {{name = "terms by lexical property", sort = "adjective follows the noun"}},
}
labels["terms written in foreign scripts"] = {
description = "{{{langname}}} terms that are written in a different, non-native script.",
breadcrumb = "written in foreign scripts",
parents = {{name = "terms by orthographic property", sort = "written in foreign scripts"}},
}
labels["terms written in multiple scripts"] = {
description = "{{{langname}}} terms that are written using more than one script.",
breadcrumb = "written in multiple scripts",
parents = {{name = "terms by orthographic property", sort = "written in multiple scripts"}},
}
labels["terms by phonemic property"] = {
description = "{{{langname}}} terms categorized by properties relating to [[pronunciation]] and [[phonemics]].",
breadcrumb = "by phonemic property",
parents = {{name = "terms by lexical property", sort = "phonemic property"}},
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Terms by lexical property subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by lexical property subcategories by language"] = {
breadcrumb = "subcategories",
description = "Umbrella categories covering topics related to terms categorized by their lexical properties, such as palindromes and number of letters or syllables in a word.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
{name = "terms by lexical property", is_label = true, sort = " "},
"Umbrella metacategories",
},
}
for _, v in ipairs{
{"words", "letters"},
{"abbreviations", "letters"},
{"roots", "letters"},
{"words", "syllables"}
} do
raw_categories[("%s by number of %s subcategories by language"):format(ucfirst(v[1]), v[2])] = {
breadcrumb = "subcategories",
description = (
"Umbrella categories covering topics related to %s categorized by their number of %s.")
:format(v[1], v[2]
),
additional = "{{{umbrella_meta_msg}}}",
parents = {
{name = ("%s by number of %s"):format(v[1], v[2]), is_label = true, sort = " "},
"Umbrella metacategories",
},
}
end
raw_categories["Terms with consecutive instances of the same letter subcategories by language"] = {
breadcrumb = "subcategories",
description = "Umbrella categories covering topics related to terms categorized by the number of consecutive instances of the same letter they contain.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
{name = "terms with consecutive instances of the same letter", is_label = true, sort = " "},
"Umbrella metacategories",
},
}
raw_categories["Long words by language"] = {
description = "Categories with terms that are longer than a given (per-language) threshold.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "terms by lexical property", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
for _, v in ipairs{
{
"words", "letter", "composed of", function(n)
local pl = n == "1" and "" or "s"
return ("They have meaning(s) other than their letter%s or the shape of their letter%s which are not abbreviations, numbers or symbols."):format(pl, pl)
end
},
{"abbreviations", "letter", "composed of"},
{"roots", "letter", "composed of"},
{"words", "syllable", "pronounced with"}
} do
insert(handlers, function(data)
local n = data.label:match(("^([1-9]%%d*)%%-%s %s$"):format(v[2], v[1]))
if not n then return end
local sortkey = require("Module:category tree").numeral_sortkey(n, 2097152)
return {
breadcrumb = n,
description = (
"{{{langname}}} %s that are %s %d %s%s.")
:format(v[1], v[3], n, v[2], n == "1" and "" or "s"
),
additional = v[4] and v[4](n) or nil,
umbrella = {
breadcrumb = ("%d %s"):format(n, v[2]),
parents = {
{
name = ("%s by number of %ss subcategories by language")
:format(ucfirst(v[1]), v[2]),
sort = sortkey
}
},
},
parents = {{name = ("%s by number of %ss"):format(v[1], v[2]), sort = sortkey}}
}
end)
end
insert(handlers, function(data)
local n = data.label:match("^terms with ([1-9]%d*) consecutive instances of the same letter$")
if not (n and tonumber(n) > 2) then return end
local sortkey = require("Module:category tree").numeral_sortkey(n, 2097152)
return {
breadcrumb = n,
description = (
"{{{langname}}} terms containing %d consecutive instances of the same letter.")
:format(n),
umbrella = {
breadcrumb = ("%d consecutive instances"):format(n),
parents = {
{name = "Terms with consecutive instances of the same letter subcategories by language", sort = sortkey}},
},
parents = {{name = "terms with consecutive instances of the same letter", sort = sortkey}}
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
insert(raw_handlers, function(data)
local langname = data.category:match("^Long (.*) words$")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if not lang then return end
local length_threshold = require("Module:headword/data").long_word_thresholds[lang:getCode()]
if length_threshold then
return {
lang = lang:getCode(),
description = (
"{{{langname}}} words that are "
.. length_threshold .. " letters or longer."
),
parents = {
{
name = "terms by orthographic property",
lang = lang:getCode(),
is_label = true
},
{ name = "Long words by language" },
},
}
end
end
end)
return {
LABELS = labels,
RAW_CATEGORIES = raw_categories,
HANDLERS = handlers,
RAW_HANDLERS = raw_handlers
}
gsz9p9sbvfri4mdkyn53l9derax2zo8
88392
88391
2026-07-27T00:15:42Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/lexical_properties]]
88391
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local insert = table.insert
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by lexical property"] = {
description = "{{{langname}}} terms categorized by properties relating to spelling, pronunciation or meaning.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}}
}
labels["autohyponyms"] = {
description = "{{{langname}}} terms that have at least two meanings, one of which is a hyponym of the other.",
parents = {"terms by lexical property"},
}
labels["contranyms"] = {
description = "{{{langname}}} terms that have two opposite meanings.",
parents = {"terms by lexical property"},
}
labels["double negatives"] = {
description = "{{{langname}}} terms which include a [[double negative]], either etymologically or in a definition.",
parents = {"terms by lexical property"},
}
labels["heteronyms"] = {
description = "{{{langname}}} terms that have different meanings depending on their etymology and/or on how they are pronounced.",
parents = {"terms by lexical property"},
}
labels["nuqtaless forms"] = {
description = "{{{langname}}} terms that are spelled without a [[nuqta]].",
parents = {"terms by orthographic property"},
}
labels["unhamzated forms"] = {
description = "{{{langname}}} terms that are spelled without a [[hamza]].",
parents = {"terms by orthographic property"},
}
labels["palindromes"] = {
description = "{{{langname}}} terms whose characters are read equally both from left to right and vice versa, normally ignoring spaces, [[diacritic]]s and punctuation.",
parents = {"terms by their sequences of characters"},
}
labels["pleonastic compounds"] = {
description = "{{{langname}}} compound terms where the head is a hyponym of its other part and whose other part is its synonym.",
parents = {"terms by lexical property", "compound terms"},
}
labels["pleonastic compound adjectives"] = {
description = "{{{langname}}} compound adjectives where the head is a hyponym of its other part and whose other part is its synonym.",
breadcrumb = "adjectives",
parents = {{name = "pleonastic compounds", sort = "adjectives"}, "compound adjectives"},
}
labels["pleonastic compound nouns"] = {
description = "{{{langname}}} compound nouns where the head is a hyponym of its other part and where the head is the synonym for the whole.",
breadcrumb = "nouns",
parents = {{name = "pleonastic compounds", sort = "nouns"}, "compound nouns"},
}
labels["pronunciation spellings"] = {
description = "{{{langname}}} terms spelled to represent a pronunciation, often a nonstandard one.",
parents = {"terms by orthographic property"},
}
labels["tautophrases"] = {
description = "{{{langname}}} phrases that repeat the same idea or concept using the same words.",
parents = {"terms by lexical property"},
}
labels["terms by orthographic property"] = {
description = "{{{langname}}} terms categorized by properties relating to [[orthography]] or [[spelling]].",
breadcrumb = "by orthographic property",
parents = {{name = "terms by lexical property", sort = "orthographic property"}},
}
labels["calculator words"] = {
description = "{{{langname}}} terms that can be spelled on a [[seven-segment]] display, as found on pocket calculators, by turning numbers upside-down.",
parents = {"terms by orthographic property"},
}
labels["words spelled without vowels"] = {
description = "{{{langname}}} words spelled without vowels.",
additional = "The letters counted as vowels may differ from language to language but typically include the conventional written vowels (''a'' ''e'' ''i'' ''o'' ''u'' ''y''), and may include other less common letters representing vowels (e.g. ''æ'', ''œ'', ''ø''). Terms in this category may contain vowel sounds in their pronunciation.",
parents = {"terms by their sequences of characters"},
}
labels["words by number of letters"] = {
description = "{{{langname}}} words categorized by number of letters.",
parents = {"terms by orthographic property"},
}
labels["abbreviations by number of letters"] = {
description = "{{{langname}}} abbreviations categorized by number of letters.",
parents = {"terms by orthographic property"},
}
labels["roots by number of letters"] = {
description = "{{{langname}}} {{lg|roots}} categorized by number of letters.",
breadcrumb = "by number of letters",
parents = {
{name = "roots", sort = "number of letters"},
"terms by orthographic property"
},
}
labels["roots by shape"] = {
description = "{{{langname}}} {{lg|roots}} categorized by their shape.",
breadcrumb = "by shape",
parents = {
{name = "roots", sort = "shape"},
"terms by lexical property"
},
}
labels["words by number of syllables"] = {
description = "{{{langname}}} words categorized by number of syllables.",
parents = {"terms by phonemic property"},
}
labels["terms by their individual characters"] = {
description = "{{{langname}}} terms categorized by whether they include certain individual characters.",
breadcrumb = "by their individual characters",
parents = {{name = "terms by orthographic property", sort = "individual characters"}},
}
labels["terms by their sequences of characters"] = {
description = "{{{langname}}} terms categorized by whether they include certain sequences of characters.",
breadcrumb = "by their sequences of characters",
parents = {{name = "terms by orthographic property", sort = "sequences of characters"}},
}
labels["terms with consecutive instances of the same letter"] = {
description = "{{{langname}}} words categorized by the number of consecutive instances of the same letter they contain.",
breadcrumb = "consecutive instances of the same letter",
parents = {{name = "terms by orthographic property", sort = "consecutive instances of the same letter"}},
}
labels["terms containing italics"] = {
description = "{{{langname}}} terms containing [[italics]].",
breadcrumb = "containing italics",
parents = {{name = "terms by orthographic property", sort = "containing italics"}},
}
labels["terms containing Roman numerals"] = {
description = "{{{langname}}} terms containing [[Roman numeral]]s.",
breadcrumb = "containing Roman numbers",
parents = {{name = "terms by orthographic property", sort = "containing Roman numbers"},
{name = "terms spelled with numbers", sort = "Roman numerals"}},
}
labels["terms with mixed convergence"] = {
description = "{{{langname}}} terms where the spelling represents a variant pronunciation that differs from (one of) the current standard pronunciation(s).",
breadcrumb = "with mixed convergence",
parents = {{name = "terms by orthographic property", sort = "mixed convergence"}, "terms by phonemic property"},
}
labels["terms with homophones"] = {
description = "{{{langname}}} terms that have one or more [[homophones]]: other terms that are pronounced in the same way but spelled differently.",
breadcrumb = "with homophones",
parents = {{name = "terms by lexical property", sort = "homophones"}},
}
labels["terms with honorific transposition"] = {
description = "{{{langname}}} compound terms where the written order of the elements is reversed due to [[honorific transposition]].",
breadcrumb = "with honorific transposition",
parents = {{name = "terms by orthographic property", sort = "honorific transposition"}},
}
labels["terms where the adjective follows the noun"] = {
description = "{{{langname}}} terms where the adjective follows the noun. These adjectives within these terms are sometimes referred to as postpositive or postnominal adjectives.",
breadcrumb = "adjective follows the noun",
parents = {{name = "terms by lexical property", sort = "adjective follows the noun"}},
}
labels["terms written in foreign scripts"] = {
description = "{{{langname}}} terms that are written in a different, non-native script.",
breadcrumb = "written in foreign scripts",
parents = {{name = "terms by orthographic property", sort = "written in foreign scripts"}},
}
labels["terms written in multiple scripts"] = {
description = "{{{langname}}} terms that are written using more than one script.",
breadcrumb = "written in multiple scripts",
parents = {{name = "terms by orthographic property", sort = "written in multiple scripts"}},
}
labels["terms by phonemic property"] = {
description = "{{{langname}}} terms categorized by properties relating to [[pronunciation]] and [[phonemics]].",
breadcrumb = "by phonemic property",
parents = {{name = "terms by lexical property", sort = "phonemic property"}},
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Terms by lexical property subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by lexical property subcategories by language"] = {
breadcrumb = "subcategories",
description = "Umbrella categories covering topics related to terms categorized by their lexical properties, such as palindromes and number of letters or syllables in a word.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
{name = "terms by lexical property", is_label = true, sort = " "},
"Umbrella metacategories",
},
}
for _, v in ipairs{
{"words", "letters"},
{"abbreviations", "letters"},
{"roots", "letters"},
{"words", "syllables"}
} do
raw_categories[("%s by number of %s subcategories by language"):format(ucfirst(v[1]), v[2])] = {
breadcrumb = "subcategories",
description = (
"Umbrella categories covering topics related to %s categorized by their number of %s.")
:format(v[1], v[2]
),
additional = "{{{umbrella_meta_msg}}}",
parents = {
{name = ("%s by number of %s"):format(v[1], v[2]), is_label = true, sort = " "},
"Umbrella metacategories",
},
}
end
raw_categories["Terms with consecutive instances of the same letter subcategories by language"] = {
breadcrumb = "subcategories",
description = "Umbrella categories covering topics related to terms categorized by the number of consecutive instances of the same letter they contain.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
{name = "terms with consecutive instances of the same letter", is_label = true, sort = " "},
"Umbrella metacategories",
},
}
raw_categories["Long words by language"] = {
description = "Categories with terms that are longer than a given (per-language) threshold.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "terms by lexical property", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
for _, v in ipairs{
{
"words", "letter", "composed of", function(n)
local pl = n == "1" and "" or "s"
return ("They have meaning(s) other than their letter%s or the shape of their letter%s which are not abbreviations, numbers or symbols."):format(pl, pl)
end
},
{"abbreviations", "letter", "composed of"},
{"roots", "letter", "composed of"},
{"words", "syllable", "pronounced with"}
} do
insert(handlers, function(data)
local n = data.label:match(("^([1-9]%%d*)%%-%s %s$"):format(v[2], v[1]))
if not n then return end
local sortkey = require("Module:category tree").numeral_sortkey(n, 2097152)
return {
breadcrumb = n,
description = (
"{{{langname}}} %s that are %s %d %s%s.")
:format(v[1], v[3], n, v[2], n == "1" and "" or "s"
),
additional = v[4] and v[4](n) or nil,
umbrella = {
breadcrumb = ("%d %s"):format(n, v[2]),
parents = {
{
name = ("%s by number of %ss subcategories by language")
:format(ucfirst(v[1]), v[2]),
sort = sortkey
}
},
},
parents = {{name = ("%s by number of %ss"):format(v[1], v[2]), sort = sortkey}}
}
end)
end
insert(handlers, function(data)
local n = data.label:match("^terms with ([1-9]%d*) consecutive instances of the same letter$")
if not (n and tonumber(n) > 2) then return end
local sortkey = require("Module:category tree").numeral_sortkey(n, 2097152)
return {
breadcrumb = n,
description = (
"{{{langname}}} terms containing %d consecutive instances of the same letter.")
:format(n),
umbrella = {
breadcrumb = ("%d consecutive instances"):format(n),
parents = {
{name = "Terms with consecutive instances of the same letter subcategories by language", sort = sortkey}},
},
parents = {{name = "terms with consecutive instances of the same letter", sort = sortkey}}
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
insert(raw_handlers, function(data)
local langname = data.category:match("^Long (.*) words$")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if not lang then return end
local length_threshold = require("Module:headword/data").long_word_thresholds[lang:getCode()]
if length_threshold then
return {
lang = lang:getCode(),
description = (
"{{{langname}}} words that are "
.. length_threshold .. " letters or longer."
),
parents = {
{
name = "terms by orthographic property",
lang = lang:getCode(),
is_label = true
},
{ name = "Long words by language" },
},
}
end
end
end)
return {
LABELS = labels,
RAW_CATEGORIES = raw_categories,
HANDLERS = handlers,
RAW_HANDLERS = raw_handlers
}
gsz9p9sbvfri4mdkyn53l9derax2zo8
Mòideal:category tree/miscellaneous
828
17726
88393
2026-04-15T09:16:38Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/miscellaneous]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88393
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
-- Appendices
labels["appendices"] = {
description = "Pages containing additional information about {{{langdisp}}}.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella = {
description = "Categories with pages containing additional information about a given language.",
parents = {"Category:Appendices"},
breadcrumb = "By language",
},
}
-- Citations pages
labels["citations pages"] = {
description = "Pages documenting instances of actual usage of {{{langname}}} terms.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella = {
description = "Categories with pages documenting instances of actual usage of terms in a given language.",
parents = {"Category:Citations pages"},
breadcrumb = "Citations pages by language",
},
}
labels["citations pages for undefined terms"] = {
description = "Pages documenting instances of actual usage of {{{langname}}} terms which are not defined yet.",
additional = "Citation pages in {{{langdisp}}} are automatically added here when any of the corresponding entries either does not exist (is a redlink) or does not have a {{{langname}}} section (is an orange link). You can also add citation pages to this category manually when the entry exists but it has not been defined in that specific meaning. Before removing a page from this category, please verify that all citations relate to senses properly defined in the entry.",
parents = {"citations pages"},
umbrella = {
description = "Categories with pages documenting instances of actual usage of terms in a given language which are not defined yet.",
parents = {"Requests", "Category:Citations pages"},
breadcrumb = "Citations pages for undefined terms by language",
},
can_be_empty = true,
hidden = true,
}
-- Dialectal equivalent maps
labels["dialectal equivalent maps"] = {
description = "Maps showing the distribution of dialectal equivalents for terms in {{{langname}}}.",
parents = {{name = "{{{langcat}}}", sort = "dialectal equivalent maps", raw = true}},
umbrella = {
description = "Categories with maps showing the distribution of dialectal equivalents for terms in a given language.",
parents = {"Umbrella metacategories"},
breadcrumb = "Dialectal equivalent maps",
},
}
-- Thesaurus entries
labels["thesaurus entries"] = {
description = "[[WT:WS|Thesaurus]] entries for listing [[Wiktionary:Semantic relations|semantically related terms]] such as [[synonym]]s, [[antonym]]s, [[hyponym]]s, [[hypernym]]s, [[meronym]]s, and [[holonym]]s of {{{langname}}} words.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella = {
description = "Categories with [[WT:WS|thesaurus]] entries for listing [[Wiktionary:Semantic relations|semantically related terms]].",
breadcrumb = "By language",
parents = {{name = "Category:Thesaurus", sort = " "}},
},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Fundamental"] = {
topright = "{{commonscat|CommonsRoot}}",
description = "This page is the top-level category, under which all categories at Wiktionary should lie.",
additional = "Note that most categories are in [[:Category:All topics]] or under individual [[:Category:All languages|languages]].",
}
raw_categories["Umbrella metacategories"] = {
description = "This page contains '''umbrella metacategories''', which group umbrella categories under high-level topics.",
additional = "Umbrella categories in turn group language-specific categories devoted to particular low-level topics.",
parents = {"Fundamental"},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
fjxm7tupiv9io9qwudlczmpjw7qhtz1
88394
88393
2026-07-27T00:15:58Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/miscellaneous]]
88393
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
-- Appendices
labels["appendices"] = {
description = "Pages containing additional information about {{{langdisp}}}.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella = {
description = "Categories with pages containing additional information about a given language.",
parents = {"Category:Appendices"},
breadcrumb = "By language",
},
}
-- Citations pages
labels["citations pages"] = {
description = "Pages documenting instances of actual usage of {{{langname}}} terms.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella = {
description = "Categories with pages documenting instances of actual usage of terms in a given language.",
parents = {"Category:Citations pages"},
breadcrumb = "Citations pages by language",
},
}
labels["citations pages for undefined terms"] = {
description = "Pages documenting instances of actual usage of {{{langname}}} terms which are not defined yet.",
additional = "Citation pages in {{{langdisp}}} are automatically added here when any of the corresponding entries either does not exist (is a redlink) or does not have a {{{langname}}} section (is an orange link). You can also add citation pages to this category manually when the entry exists but it has not been defined in that specific meaning. Before removing a page from this category, please verify that all citations relate to senses properly defined in the entry.",
parents = {"citations pages"},
umbrella = {
description = "Categories with pages documenting instances of actual usage of terms in a given language which are not defined yet.",
parents = {"Requests", "Category:Citations pages"},
breadcrumb = "Citations pages for undefined terms by language",
},
can_be_empty = true,
hidden = true,
}
-- Dialectal equivalent maps
labels["dialectal equivalent maps"] = {
description = "Maps showing the distribution of dialectal equivalents for terms in {{{langname}}}.",
parents = {{name = "{{{langcat}}}", sort = "dialectal equivalent maps", raw = true}},
umbrella = {
description = "Categories with maps showing the distribution of dialectal equivalents for terms in a given language.",
parents = {"Umbrella metacategories"},
breadcrumb = "Dialectal equivalent maps",
},
}
-- Thesaurus entries
labels["thesaurus entries"] = {
description = "[[WT:WS|Thesaurus]] entries for listing [[Wiktionary:Semantic relations|semantically related terms]] such as [[synonym]]s, [[antonym]]s, [[hyponym]]s, [[hypernym]]s, [[meronym]]s, and [[holonym]]s of {{{langname}}} words.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella = {
description = "Categories with [[WT:WS|thesaurus]] entries for listing [[Wiktionary:Semantic relations|semantically related terms]].",
breadcrumb = "By language",
parents = {{name = "Category:Thesaurus", sort = " "}},
},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Fundamental"] = {
topright = "{{commonscat|CommonsRoot}}",
description = "This page is the top-level category, under which all categories at Wiktionary should lie.",
additional = "Note that most categories are in [[:Category:All topics]] or under individual [[:Category:All languages|languages]].",
}
raw_categories["Umbrella metacategories"] = {
description = "This page contains '''umbrella metacategories''', which group umbrella categories under high-level topics.",
additional = "Umbrella categories in turn group language-specific categories devoted to particular low-level topics.",
parents = {"Fundamental"},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
fjxm7tupiv9io9qwudlczmpjw7qhtz1
Mòideal:category tree/modules
828
17727
88395
2026-04-27T20:22:13Z
en>Fenakhay
0
88395
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local insert = table.insert
local pattern_escape = require("Module:string utilities").pattern_escape
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["modules"] = {
description = "{{{langname}}} [[Wiktionary:Modules|modules]], which contain Lua code to create and manage entries.",
umbrella = {
parents = {{name = "Modules", sort = " "}},
breadcrumb = "by language",
},
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["data modules"] = {
description = "{{{langname}}} [[Wiktionary:Modules|modules]] containing data used by other modules.",
umbrella = {
parents = {{name = "Data modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "data",
parents = {"modules"},
}
labels["dialect synonyms data modules"] = {
description = "{{{langname}}} [[Wiktionary:Modules|modules]] containing data used by {{tl|dialect synonyms}}.",
umbrella = {
parents = {{name = "Dialect synonyms data modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "dialect synonyms",
parents = {"data modules"},
}
labels["inflection modules"] = {
description = "{{{langname}}} [[inflection]] [[Wiktionary:Modules|modules]], which contain Lua code for generating conjugation and declension tables.",
umbrella = {
parents = {{name = "Inflection modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "inflection",
parents = {"modules", {name = "inflection-table templates", sort = " "}},
}
labels["testcase modules"] = {
description = "{{{langname}}} [[testcase]] [[Wiktionary:Modules|modules]], which contain Lua code for testing other modules.",
umbrella = {
parents = {{name = "Testcase modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "testcase",
parents = {"modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
--[=[
Correctly defining a new module type here:
1. The breadcrumb generally does not need to be given because there is code at the bottom of this file
to generate the breadcrumb in a smart fashion by chopping off a suffix derived from the parent or any of
its ancestors.
2. Module types can be nested under other module types, but also list them directly under 'Modules' as a
secondary parent. (This violates a principle of non-duplication of categories but makes it much easier to
locate a given module type.)
]=]
raw_categories["Modules"] = {
description = "This is a general holder category for modules.",
additional = "For more information on what modules are and how they work, see [[Wiktionary:Scribunto]]. For a complete list of all modules, see [[Special:PrefixIndex/Module:|here]].",
parents = {"Category:Wiktionary"},
}
raw_categories["Uncategorized modules"] = {
description = "Uncategorized modules.",
additional = "Modules are placed here by [[Module:documentation]] under certain circumstances. See the documentation of that module for more info.",
parents = { {name = "Modules", sort = " "} },
}
raw_categories["Appendix modules"] = {
preceding = "{{also|:Category:Appendix templates}}",
description = "Modules with functions that generate content for or extract information from pages in the Appendix namespace.",
parents = { "Modules" },
}
raw_categories["Bot support modules"] = {
description = "Modules for supporting individual bot accounts.",
parents = { "Modules" },
}
raw_categories["Category modules"] = {
preceding = "{{also|:Category:Categorization templates|:Category:Category templates}}",
description = "Modules for adding categories to pages or generating the description and subcategories of category pages.",
parents = { "Modules" },
}
raw_categories["Character info modules"] = {
preceding = "{{also|:Category:Character info templates}}",
description = "Modules containing information on individual characters, or containing functions generating such information.",
parents = { "Modules" },
}
raw_categories["Character insertion modules"] = {
preceding = "{{also|:Category:Character insertion templates}}",
description = "Modules that implement templates that provide easier ways to type characters that are not found in most keyboard layouts.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Chemical element data modules"] = {
preceding = "{{also|:Category:Chemistry templates}}",
description = "Modules containing per-language [[chemical element]] name data consumed by {{tl|chemical element box}} and {{tl|chemical element table}}.",
parents = { "Data modules" },
}
raw_categories["Collections modules"] = {
description = "Modules containing functions used to implement collections (arrays, maps, etc.).",
parents = { "Utility modules", "Modules" },
}
raw_categories["Data modules"] = {
description = "Modules that do not contain functions, but only export a table of data that is used by other modules.",
additional = "Modules that are in this category should be imported using <code>mw.loadData</code> rather than <code>require</code>.",
parents = { "Modules" },
}
raw_categories["Category tree data modules"] = {
preceding = "{{also|:Category:Category tree data modules/lang|:Category:Category tree data modules/topic}}",
description = "[[Wiktionary:Modules|Modules]] containing data and code used by the category tree system for constructing the descriptions of categories.",
parents = { "Data modules", "Category modules" },
}
raw_categories["Category tree data modules/lang"] = {
preceding = "{{also|:Category:Category tree data modules|:Category:Category tree data modules/topic}}",
description = "[[Wiktionary:Modules|Modules]] containing data and code used by the category tree system for constructing the descriptions of language-specific categories.",
breadcrumb = "lang",
parents = { {name = "Category tree data modules", sort = "lang"} },
}
raw_categories["Category tree data modules/topic"] = {
preceding = "{{also|:Category:Category tree data modules|:Category:Category tree data modules/lang}}",
description = "[[Wiktionary:Modules|Modules]] containing data and code used by the category tree system for constructing the descriptions of topic categories.",
breadcrumb = "topic",
parents = { {name = "Category tree data modules", sort = "topic"} },
}
raw_categories["Character insertion data modules"] = {
preceding = "{{also|:Category:Character insertion templates}}",
description = "Modules containing data for use by {{temp|chars}}.",
parents = { "Data modules", "Character insertion modules" },
}
raw_categories["Dialect synonyms data modules"] = {
description = "Modules containing data for use by {{tl|dialect synonyms}}.",
parents = { "Data modules" },
}
raw_categories["Date modules"] = {
description = "Modules that implement functionality to convert or otherwise manipulate dates in various calendar systems.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Debugging modules"] = {
description = "Modules used for debugging.",
additional = "Some should only be used in sandbox modules or when using the " ..
"[[mw:Extension:TemplateSandbox|{{MediaWiki:Templatesandbox-editform-legend}}]] button in the edit page of modules and templates.",
parents = { "Modules" },
}
raw_categories["Definition modules"] = {
preceding = "{{also|:Category:Definition templates}}",
description = "Modules that implement templates used in [[Wiktionary:Glossary#definition line|definition lines]] of entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Deprecated modules"] = {
description = "Modules that should not be used, as their functions are performed by newer modules.",
parents = { "Modules", "Category:Wiktionary maintenance" },
}
raw_categories["Discussion modules"] = {
preceding = "{{also|:Category:Discussion templates}}",
description = "Modules concerning discussion pages.",
parents = { "Modules" },
}
raw_categories["Display text-generating modules"] = {
description = "Modules that are used to generate display text.",
additional = "Display text determines what is shown to the reader. In some languages it must be normalized, " ..
"due to common errors caused by confusable characters, or so as to ensure a consistent display format.",
parents = { "Modules" },
}
raw_categories["Documentation modules"] = {
preceding = "{{also|:Category:Documentation templates}}",
description = "Modules for generating documentation pages.",
parents = { "Modules" },
}
raw_categories["Encoding modules"] = {
description = "Modules for converting between different textual encodings.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Entry-generating modules"] = {
preceding = "{{also|:Category:Entry templates}}",
description = "Modules with functions that are used to generate new entries.",
parents = { "Modules" },
}
raw_categories["Diacritic-stripping modules"] = {
description = "Modules that strip diacritics from the displayed text in order to create the logical pagename.",
parents = { "Modules" },
}
raw_categories["External link modules"] = {
preceding = "{{also|:Category:External link templates}}",
description = "Modules that are used in [[:Category:External link templates|external link templates]], i.e. which link to websites outside of the MediaWiki Foundation purview.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Etymology modules"] = {
preceding = "{{also|:Category:Etymology templates}}",
description = "Modules that implement templates that define the etymology of entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Form-of modules"] = {
preceding = "{{also|:Category:Form-of templates}}",
description = "Modules that generate the definition line of non-lemma forms, e.g. verb forms and noun forms.",
parents = { "Definition modules", "Page generation modules", "Modules" },
}
raw_categories["Headword-line modules"] = {
preceding = "{{also|:Category:Headword-line templates}}",
description = "Modules that support [[:Category:Headword-line templates by language|headword-line templates]] for a specific language.",
additional = "See also [[:Category:Headword-line templates]].",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Inflection modules"] = {
description = "Modules used to support [[:Category:Inflection-table templates by language|inflection templates]] for a specific language.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Internal link modules"] = {
preceding = "{{also|:Category:Internal link templates}}",
description = "Modules that are used in [[:Category:Internal link templates|internal link templates]], i.e. which link between Wiktionary entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Interwiki modules"] = {
preceding = "{{also|:Category:Interwiki templates}}",
description = "Modules that are used in [[:Category:Interwiki templates|interwiki templates]], i.e. which link to other MediaWiki projects.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["JSON-generating modules"] = {
description = "Modules with functions that generate data in JSON format.",
parents = { "Modules" },
}
raw_categories["Language and script modules"] = {
description = "Modules that process language and script codes and return data on them.",
parents = { "Modules" },
}
raw_categories["List modules"] = {
preceding = "{{also|:Category:List templates}}",
description = "Modules that generate lists, tables or tree diagrams of entries or other structured data.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Maintenance modules"] = {
preceding = "{{also|:Category:Maintenance templates}}",
description = "Modules that implement templates used for maintaining entries.",
additional = "Examples are cleanup templates (e.g. {{tl|attention}}), deletion templates (e.g. {{tl|rfd}}) and " ..
"verification templates (e.g. {{tl|rfv}}).",
parents = { "Modules" },
}
raw_categories["Morphology modules"] = {
description = "Modules used to support [[:Category:Morphology templates|morphology templates]].",
parents = { "Modules" },
}
raw_categories["Number modules"] = {
preceding = "{{also|:Category:Number templates}}",
description = "Modules that handle conversion and/or formatting of numbers and numerals in various representations.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Page generation modules"] = {
description = "Modules that generate parts of a mainspace page (e.g. headword line, definition, inflection, links, etc.).",
parents = { "Modules" },
}
raw_categories["Parameter parsing modules"] = {
description = "Modules containing functions used to parse template parameters.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Pronunciation modules"] = {
preceding = "{{also|:Category:Pronunciation templates}}",
description = "Modules that implement templates used to create the language-specific pronunciation of entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Pronunciation testcase modules"] = {
description = "Modules used to test other pronunciation modules.",
parents = { "Testcase modules", {name = "Pronunciation modules", sort = "Testcase"} },
}
raw_categories["Quotation and usage example modules"] = {
description = "Modules that implement templates used to format quotations and usage examples.",
parents = { "Definition modules", "Page generation modules", "Modules" },
}
raw_categories["Reference modules"] = {
preceding = "{{also|:Category:Reference templates}}",
description = "Modules that are used for [[:Category:Reference templates|reference templates]].",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Sandbox modules"] = {
description = "Test versions of modules intended for production use.",
parents = { "Modules" },
}
raw_categories["Semantic relation modules"] = {
preceding = "{{also|:Category:Semantic relation templates}}",
description = "Modules that implement templates used to indicate other terms semantically related to a " ..
"particular sense, e.g. [[synonym]]s or [[antonym]]s.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Sign language modules"] = {
description = "Modules used for sign languages.",
parents = { "Modules" },
}
raw_categories["Sortkey-generating modules"] = {
description = "Modules that generate sortkeys, which determine the order of pagenames in categories.",
parents = { "Modules" },
}
raw_categories["String modules"] = {
description = "Modules containing functions used to manipulate strings.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Swadesh modules"] = {
description = "Modules containing [[Swadesh list]]s.",
parents = { "Modules" },
}
raw_categories["Template interface modules"] = {
description = "Modules whose purpose is to provide an interface between templates and the functions of a module.",
additional = "They are usually named <code>.../templates</code>, and the functions present within them usually all " ..
"have only a \"frame\" parameter.",
parents = { "Modules" },
}
raw_categories["Testcase modules"] = {
description = "Modules used to test other modules.",
parents = { "Modules" },
}
raw_categories["Failing testcase modules"] = {
description = "Modules which contain failures in their unit tests.",
additional = "This category is added automatically by [[Module:UnitTests]] when a test case fails.",
parents = { "Testcase modules" },
}
raw_categories["Tracking modules"] = {
description = "Modules that add tracking templates.",
parents = { "Debugging modules", "Modules" },
}
raw_categories["Transliteration modules"] = {
description = "Modules that automatically convert text in one script to another.",
additional = "Most of them convert non-Latin scripts to Latin (romanisation/romanization), and are used by " ..
"templates or modules to generate transliteration of text that is tagged with a particular language. Each " ..
"language's transliteration module is specified in its data table (for which, see the category {{catlink|Language data modules}}).",
parents = { "Modules" },
}
raw_categories["Transliteration testcase modules"] = {
description = "Modules used to test other transliteration modules.",
parents = { "Testcase modules", {name = "Transliteration modules", sort = "Testcase"} },
}
raw_categories["Unused modules"] = {
description = "Unused modules.",
parents = { "Modules" },
}
raw_categories["User sandbox modules"] = {
description = "Modules that are for personal use and testing by individual editors.",
additional = "These should all begin with <code>User:</code> followed by the user's name. If several " ..
"sandbox modules are needed by a single user, subpages can be created. These modules should not be used in real " ..
"Wiktionary content pages, as all content on those pages should be editable by anyone and, if necessary, edit protected.",
parents = { "Sandbox modules", "Modules" },
}
raw_categories["Utility modules"] = {
description = "Modules that serve some sort of utility purpose in various entries.",
additional = "Avoid categorizing directly into this category, but use one of the more specific (and semantically " ..
"well-defined) module categories. Note also that modules used by multiple languages should go directly in this " ..
"category if necessary, while modules only used by one language should be in [[:Category:Language-specific utility modules]].",
parents = { "Modules" },
}
raw_categories["Language-specific utility modules"] = {
description = "Modules that deal with several utilities needed by a certain language.",
additional = "Usually their names end with {{cd|-utilities}} or {{cd|-common}} (preceded by the language code), " ..
"although more specific utility modules that one language uses may reside here as well. If a utility is used by " ..
"many languages, it should be in [[:Category:Utility modules]].",
parents = {{name = "Utility modules", sort = " "}},
}
raw_categories["Vote modules"] = {
description = "Modules used to manage Wiktionary votes.",
parents = { "Modules" },
}
raw_categories["Wikitext parsing modules"] = {
description = "Modules that contain functions that grab the wikitext of a page and get information from it by " ..
"performing string operations on it.",
parents = { "Modules" },
}
-- Don't modify `raw_categories` while processing it, or items may be skipped.
local new_cats = {}
for raw_cat, obj in pairs(raw_categories) do
local by_script = raw_cat .. " by script"
if raw_cat ~= "Modules" and raw_cat ~= "Data modules" and not raw_categories[by_script] then
new_cats[by_script] = {
description = raw_cat .. ", categorized by the script they operate on or with.",
additional = raw_cat .. " are " .. mw.getContentLanguage():lcfirst(obj.description),
breadcrumb = "by script",
parents = {{name = raw_cat, sort = " "}},
}
end
end
for new_cat, obj in pairs(new_cats) do
raw_categories[new_cat] = obj
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
for _, mod_type in ipairs {"Diacritic-stripping", "Sortkey-generating", "Transliteration"} do
insert(raw_handlers, function(data)
local n, suffix = data.category:match(("^%s modules used by (%%d+) language(s?)$"):format(pattern_escape(mod_type)))
-- Only match if there are no leading zeroes and the suffix is correct.
if not (n and not n:match("^0%d") and suffix == (n == "1" and "" or "s")) then
return
end
return {
breadcrumb = ("used by %d language%s"):format(n, suffix),
description = data.category .. ".",
can_be_empty = true,
parents = {
{name = ("%s modules"):format(mod_type), sort = require("Module:category tree").numeral_sortkey(n)},
},
}
end)
end
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
for key, data in pairs(raw_categories) do
if not data.breadcrumb then
local parent = data.parents[1]
while true do
if type(parent) == "string" then
local parent_re = " " .. pattern_escape(mw.getContentLanguage():lcfirst(parent)) .. "$"
if key:find(parent_re) then
data.breadcrumb = key:gsub(parent_re, "")
break
end
if raw_categories[parent] then
parent = raw_categories[parent].parents[1]
else
break
end
else
break
end
end
end
end
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
d3uknkrafwuaw93gummxf73khug7yn6
88396
88395
2026-07-27T00:16:07Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/modules]]
88395
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local insert = table.insert
local pattern_escape = require("Module:string utilities").pattern_escape
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["modules"] = {
description = "{{{langname}}} [[Wiktionary:Modules|modules]], which contain Lua code to create and manage entries.",
umbrella = {
parents = {{name = "Modules", sort = " "}},
breadcrumb = "by language",
},
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["data modules"] = {
description = "{{{langname}}} [[Wiktionary:Modules|modules]] containing data used by other modules.",
umbrella = {
parents = {{name = "Data modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "data",
parents = {"modules"},
}
labels["dialect synonyms data modules"] = {
description = "{{{langname}}} [[Wiktionary:Modules|modules]] containing data used by {{tl|dialect synonyms}}.",
umbrella = {
parents = {{name = "Dialect synonyms data modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "dialect synonyms",
parents = {"data modules"},
}
labels["inflection modules"] = {
description = "{{{langname}}} [[inflection]] [[Wiktionary:Modules|modules]], which contain Lua code for generating conjugation and declension tables.",
umbrella = {
parents = {{name = "Inflection modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "inflection",
parents = {"modules", {name = "inflection-table templates", sort = " "}},
}
labels["testcase modules"] = {
description = "{{{langname}}} [[testcase]] [[Wiktionary:Modules|modules]], which contain Lua code for testing other modules.",
umbrella = {
parents = {{name = "Testcase modules", sort = " "}},
breadcrumb = "by language",
},
breadcrumb = "testcase",
parents = {"modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
--[=[
Correctly defining a new module type here:
1. The breadcrumb generally does not need to be given because there is code at the bottom of this file
to generate the breadcrumb in a smart fashion by chopping off a suffix derived from the parent or any of
its ancestors.
2. Module types can be nested under other module types, but also list them directly under 'Modules' as a
secondary parent. (This violates a principle of non-duplication of categories but makes it much easier to
locate a given module type.)
]=]
raw_categories["Modules"] = {
description = "This is a general holder category for modules.",
additional = "For more information on what modules are and how they work, see [[Wiktionary:Scribunto]]. For a complete list of all modules, see [[Special:PrefixIndex/Module:|here]].",
parents = {"Category:Wiktionary"},
}
raw_categories["Uncategorized modules"] = {
description = "Uncategorized modules.",
additional = "Modules are placed here by [[Module:documentation]] under certain circumstances. See the documentation of that module for more info.",
parents = { {name = "Modules", sort = " "} },
}
raw_categories["Appendix modules"] = {
preceding = "{{also|:Category:Appendix templates}}",
description = "Modules with functions that generate content for or extract information from pages in the Appendix namespace.",
parents = { "Modules" },
}
raw_categories["Bot support modules"] = {
description = "Modules for supporting individual bot accounts.",
parents = { "Modules" },
}
raw_categories["Category modules"] = {
preceding = "{{also|:Category:Categorization templates|:Category:Category templates}}",
description = "Modules for adding categories to pages or generating the description and subcategories of category pages.",
parents = { "Modules" },
}
raw_categories["Character info modules"] = {
preceding = "{{also|:Category:Character info templates}}",
description = "Modules containing information on individual characters, or containing functions generating such information.",
parents = { "Modules" },
}
raw_categories["Character insertion modules"] = {
preceding = "{{also|:Category:Character insertion templates}}",
description = "Modules that implement templates that provide easier ways to type characters that are not found in most keyboard layouts.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Chemical element data modules"] = {
preceding = "{{also|:Category:Chemistry templates}}",
description = "Modules containing per-language [[chemical element]] name data consumed by {{tl|chemical element box}} and {{tl|chemical element table}}.",
parents = { "Data modules" },
}
raw_categories["Collections modules"] = {
description = "Modules containing functions used to implement collections (arrays, maps, etc.).",
parents = { "Utility modules", "Modules" },
}
raw_categories["Data modules"] = {
description = "Modules that do not contain functions, but only export a table of data that is used by other modules.",
additional = "Modules that are in this category should be imported using <code>mw.loadData</code> rather than <code>require</code>.",
parents = { "Modules" },
}
raw_categories["Category tree data modules"] = {
preceding = "{{also|:Category:Category tree data modules/lang|:Category:Category tree data modules/topic}}",
description = "[[Wiktionary:Modules|Modules]] containing data and code used by the category tree system for constructing the descriptions of categories.",
parents = { "Data modules", "Category modules" },
}
raw_categories["Category tree data modules/lang"] = {
preceding = "{{also|:Category:Category tree data modules|:Category:Category tree data modules/topic}}",
description = "[[Wiktionary:Modules|Modules]] containing data and code used by the category tree system for constructing the descriptions of language-specific categories.",
breadcrumb = "lang",
parents = { {name = "Category tree data modules", sort = "lang"} },
}
raw_categories["Category tree data modules/topic"] = {
preceding = "{{also|:Category:Category tree data modules|:Category:Category tree data modules/lang}}",
description = "[[Wiktionary:Modules|Modules]] containing data and code used by the category tree system for constructing the descriptions of topic categories.",
breadcrumb = "topic",
parents = { {name = "Category tree data modules", sort = "topic"} },
}
raw_categories["Character insertion data modules"] = {
preceding = "{{also|:Category:Character insertion templates}}",
description = "Modules containing data for use by {{temp|chars}}.",
parents = { "Data modules", "Character insertion modules" },
}
raw_categories["Dialect synonyms data modules"] = {
description = "Modules containing data for use by {{tl|dialect synonyms}}.",
parents = { "Data modules" },
}
raw_categories["Date modules"] = {
description = "Modules that implement functionality to convert or otherwise manipulate dates in various calendar systems.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Debugging modules"] = {
description = "Modules used for debugging.",
additional = "Some should only be used in sandbox modules or when using the " ..
"[[mw:Extension:TemplateSandbox|{{MediaWiki:Templatesandbox-editform-legend}}]] button in the edit page of modules and templates.",
parents = { "Modules" },
}
raw_categories["Definition modules"] = {
preceding = "{{also|:Category:Definition templates}}",
description = "Modules that implement templates used in [[Wiktionary:Glossary#definition line|definition lines]] of entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Deprecated modules"] = {
description = "Modules that should not be used, as their functions are performed by newer modules.",
parents = { "Modules", "Category:Wiktionary maintenance" },
}
raw_categories["Discussion modules"] = {
preceding = "{{also|:Category:Discussion templates}}",
description = "Modules concerning discussion pages.",
parents = { "Modules" },
}
raw_categories["Display text-generating modules"] = {
description = "Modules that are used to generate display text.",
additional = "Display text determines what is shown to the reader. In some languages it must be normalized, " ..
"due to common errors caused by confusable characters, or so as to ensure a consistent display format.",
parents = { "Modules" },
}
raw_categories["Documentation modules"] = {
preceding = "{{also|:Category:Documentation templates}}",
description = "Modules for generating documentation pages.",
parents = { "Modules" },
}
raw_categories["Encoding modules"] = {
description = "Modules for converting between different textual encodings.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Entry-generating modules"] = {
preceding = "{{also|:Category:Entry templates}}",
description = "Modules with functions that are used to generate new entries.",
parents = { "Modules" },
}
raw_categories["Diacritic-stripping modules"] = {
description = "Modules that strip diacritics from the displayed text in order to create the logical pagename.",
parents = { "Modules" },
}
raw_categories["External link modules"] = {
preceding = "{{also|:Category:External link templates}}",
description = "Modules that are used in [[:Category:External link templates|external link templates]], i.e. which link to websites outside of the MediaWiki Foundation purview.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Etymology modules"] = {
preceding = "{{also|:Category:Etymology templates}}",
description = "Modules that implement templates that define the etymology of entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Form-of modules"] = {
preceding = "{{also|:Category:Form-of templates}}",
description = "Modules that generate the definition line of non-lemma forms, e.g. verb forms and noun forms.",
parents = { "Definition modules", "Page generation modules", "Modules" },
}
raw_categories["Headword-line modules"] = {
preceding = "{{also|:Category:Headword-line templates}}",
description = "Modules that support [[:Category:Headword-line templates by language|headword-line templates]] for a specific language.",
additional = "See also [[:Category:Headword-line templates]].",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Inflection modules"] = {
description = "Modules used to support [[:Category:Inflection-table templates by language|inflection templates]] for a specific language.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Internal link modules"] = {
preceding = "{{also|:Category:Internal link templates}}",
description = "Modules that are used in [[:Category:Internal link templates|internal link templates]], i.e. which link between Wiktionary entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Interwiki modules"] = {
preceding = "{{also|:Category:Interwiki templates}}",
description = "Modules that are used in [[:Category:Interwiki templates|interwiki templates]], i.e. which link to other MediaWiki projects.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["JSON-generating modules"] = {
description = "Modules with functions that generate data in JSON format.",
parents = { "Modules" },
}
raw_categories["Language and script modules"] = {
description = "Modules that process language and script codes and return data on them.",
parents = { "Modules" },
}
raw_categories["List modules"] = {
preceding = "{{also|:Category:List templates}}",
description = "Modules that generate lists, tables or tree diagrams of entries or other structured data.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Maintenance modules"] = {
preceding = "{{also|:Category:Maintenance templates}}",
description = "Modules that implement templates used for maintaining entries.",
additional = "Examples are cleanup templates (e.g. {{tl|attention}}), deletion templates (e.g. {{tl|rfd}}) and " ..
"verification templates (e.g. {{tl|rfv}}).",
parents = { "Modules" },
}
raw_categories["Morphology modules"] = {
description = "Modules used to support [[:Category:Morphology templates|morphology templates]].",
parents = { "Modules" },
}
raw_categories["Number modules"] = {
preceding = "{{also|:Category:Number templates}}",
description = "Modules that handle conversion and/or formatting of numbers and numerals in various representations.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Page generation modules"] = {
description = "Modules that generate parts of a mainspace page (e.g. headword line, definition, inflection, links, etc.).",
parents = { "Modules" },
}
raw_categories["Parameter parsing modules"] = {
description = "Modules containing functions used to parse template parameters.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Pronunciation modules"] = {
preceding = "{{also|:Category:Pronunciation templates}}",
description = "Modules that implement templates used to create the language-specific pronunciation of entries.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Pronunciation testcase modules"] = {
description = "Modules used to test other pronunciation modules.",
parents = { "Testcase modules", {name = "Pronunciation modules", sort = "Testcase"} },
}
raw_categories["Quotation and usage example modules"] = {
description = "Modules that implement templates used to format quotations and usage examples.",
parents = { "Definition modules", "Page generation modules", "Modules" },
}
raw_categories["Reference modules"] = {
preceding = "{{also|:Category:Reference templates}}",
description = "Modules that are used for [[:Category:Reference templates|reference templates]].",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Sandbox modules"] = {
description = "Test versions of modules intended for production use.",
parents = { "Modules" },
}
raw_categories["Semantic relation modules"] = {
preceding = "{{also|:Category:Semantic relation templates}}",
description = "Modules that implement templates used to indicate other terms semantically related to a " ..
"particular sense, e.g. [[synonym]]s or [[antonym]]s.",
parents = { "Page generation modules", "Modules" },
}
raw_categories["Sign language modules"] = {
description = "Modules used for sign languages.",
parents = { "Modules" },
}
raw_categories["Sortkey-generating modules"] = {
description = "Modules that generate sortkeys, which determine the order of pagenames in categories.",
parents = { "Modules" },
}
raw_categories["String modules"] = {
description = "Modules containing functions used to manipulate strings.",
parents = { "Utility modules", "Modules" },
}
raw_categories["Swadesh modules"] = {
description = "Modules containing [[Swadesh list]]s.",
parents = { "Modules" },
}
raw_categories["Template interface modules"] = {
description = "Modules whose purpose is to provide an interface between templates and the functions of a module.",
additional = "They are usually named <code>.../templates</code>, and the functions present within them usually all " ..
"have only a \"frame\" parameter.",
parents = { "Modules" },
}
raw_categories["Testcase modules"] = {
description = "Modules used to test other modules.",
parents = { "Modules" },
}
raw_categories["Failing testcase modules"] = {
description = "Modules which contain failures in their unit tests.",
additional = "This category is added automatically by [[Module:UnitTests]] when a test case fails.",
parents = { "Testcase modules" },
}
raw_categories["Tracking modules"] = {
description = "Modules that add tracking templates.",
parents = { "Debugging modules", "Modules" },
}
raw_categories["Transliteration modules"] = {
description = "Modules that automatically convert text in one script to another.",
additional = "Most of them convert non-Latin scripts to Latin (romanisation/romanization), and are used by " ..
"templates or modules to generate transliteration of text that is tagged with a particular language. Each " ..
"language's transliteration module is specified in its data table (for which, see the category {{catlink|Language data modules}}).",
parents = { "Modules" },
}
raw_categories["Transliteration testcase modules"] = {
description = "Modules used to test other transliteration modules.",
parents = { "Testcase modules", {name = "Transliteration modules", sort = "Testcase"} },
}
raw_categories["Unused modules"] = {
description = "Unused modules.",
parents = { "Modules" },
}
raw_categories["User sandbox modules"] = {
description = "Modules that are for personal use and testing by individual editors.",
additional = "These should all begin with <code>User:</code> followed by the user's name. If several " ..
"sandbox modules are needed by a single user, subpages can be created. These modules should not be used in real " ..
"Wiktionary content pages, as all content on those pages should be editable by anyone and, if necessary, edit protected.",
parents = { "Sandbox modules", "Modules" },
}
raw_categories["Utility modules"] = {
description = "Modules that serve some sort of utility purpose in various entries.",
additional = "Avoid categorizing directly into this category, but use one of the more specific (and semantically " ..
"well-defined) module categories. Note also that modules used by multiple languages should go directly in this " ..
"category if necessary, while modules only used by one language should be in [[:Category:Language-specific utility modules]].",
parents = { "Modules" },
}
raw_categories["Language-specific utility modules"] = {
description = "Modules that deal with several utilities needed by a certain language.",
additional = "Usually their names end with {{cd|-utilities}} or {{cd|-common}} (preceded by the language code), " ..
"although more specific utility modules that one language uses may reside here as well. If a utility is used by " ..
"many languages, it should be in [[:Category:Utility modules]].",
parents = {{name = "Utility modules", sort = " "}},
}
raw_categories["Vote modules"] = {
description = "Modules used to manage Wiktionary votes.",
parents = { "Modules" },
}
raw_categories["Wikitext parsing modules"] = {
description = "Modules that contain functions that grab the wikitext of a page and get information from it by " ..
"performing string operations on it.",
parents = { "Modules" },
}
-- Don't modify `raw_categories` while processing it, or items may be skipped.
local new_cats = {}
for raw_cat, obj in pairs(raw_categories) do
local by_script = raw_cat .. " by script"
if raw_cat ~= "Modules" and raw_cat ~= "Data modules" and not raw_categories[by_script] then
new_cats[by_script] = {
description = raw_cat .. ", categorized by the script they operate on or with.",
additional = raw_cat .. " are " .. mw.getContentLanguage():lcfirst(obj.description),
breadcrumb = "by script",
parents = {{name = raw_cat, sort = " "}},
}
end
end
for new_cat, obj in pairs(new_cats) do
raw_categories[new_cat] = obj
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
for _, mod_type in ipairs {"Diacritic-stripping", "Sortkey-generating", "Transliteration"} do
insert(raw_handlers, function(data)
local n, suffix = data.category:match(("^%s modules used by (%%d+) language(s?)$"):format(pattern_escape(mod_type)))
-- Only match if there are no leading zeroes and the suffix is correct.
if not (n and not n:match("^0%d") and suffix == (n == "1" and "" or "s")) then
return
end
return {
breadcrumb = ("used by %d language%s"):format(n, suffix),
description = data.category .. ".",
can_be_empty = true,
parents = {
{name = ("%s modules"):format(mod_type), sort = require("Module:category tree").numeral_sortkey(n)},
},
}
end)
end
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
for key, data in pairs(raw_categories) do
if not data.breadcrumb then
local parent = data.parents[1]
while true do
if type(parent) == "string" then
local parent_re = " " .. pattern_escape(mw.getContentLanguage():lcfirst(parent)) .. "$"
if key:find(parent_re) then
data.breadcrumb = key:gsub(parent_re, "")
break
end
if raw_categories[parent] then
parent = raw_categories[parent].parents[1]
else
break
end
else
break
end
end
end
end
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
d3uknkrafwuaw93gummxf73khug7yn6
Mòideal:category tree/names
828
17728
88397
2026-04-15T09:16:39Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/names]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88397
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local names_module = "Module:names"
local en_utilities_module = "Module:en-utilities"
local pluralize = require(en_utilities_module).pluralize
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["names"] = {
description = "{{{langname}}} terms that are used to refer to specific individuals or groups.",
additional = "Place names, demonyms and other kinds of names can be found in [[:Category:Names]].",
umbrella_parents = {name = "terms by semantic function", is_label = true, sort = " "},
parents = {"terms by semantic function", "proper nouns"},
}
------------------------------------------- given names -------------------------------------------
local human_genders = {
["male"] = "to male individuals",
["female"] = "to female individuals",
["unisex"] = "either to male or to female individuals",
}
for gender, props in pairs(require(names_module).given_name_genders) do
if gender ~= "unknown-gender" then
local is_animal = props.type == "animal"
local cat = is_animal and gender .. " names" or gender .. " given names"
local desc = is_animal and " given to [[" .. gender .. "|" .. pluralize(gender) .. "]]" or " given " .. human_genders[gender]
local function do_cat(cat, desc, breadcrumb, parents)
labels[cat] = {
description = "{{{langname}}} " .. desc .. ".",
breadcrumb = breadcrumb,
parents = parents,
}
end
for _, dimaug in ipairs { "diminutive", "augmentative" } do
do_cat(dimaug .. "s of " .. cat, dimaug .. " names " .. desc, dimaug,
{gender .. " given names", dimaug .. " nouns"})
end
do_cat(cat, "names " .. desc, gender, is_animal and (gender == "animal" and "names" or is_animal and
"animal names") or "given names")
if not is_animal then
do_cat(gender .. " skin names", "skin names " .. desc, gender, {"skin names"})
end
end
end
labels["given names"] = {
description = "{{{langname}}} names given to individuals.",
parents = {"names"},
}
labels["skin names"] = {
description = "{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.",
parents = {"proper nouns", "names"},
}
------------------------------------------- surnames -------------------------------------------
labels["common-gender surnames"] = {
description = "{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.",
breadcrumb = "common-gender",
parents = {"surnames"},
}
labels["female surnames"] = {
description = "{{{langname}}} names shared by female family members.",
breadcrumb = "female",
parents = {"surnames"},
}
labels["male surnames"] = {
description = "{{{langname}}} names shared by male family members.",
breadcrumb = "male",
parents = {"surnames"},
}
labels["surnames"] = {
description = "{{{langname}}} names shared by family members.",
parents = {"names"},
}
for _, nymics in ipairs { "matronymics", "patronymics" } do
local ancestor = nymics == "matronymics" and "mother, grandmother or earlier female ancestor" or
"father, grandfather or earlier male ancestor"
labels["common-gender " .. nymics] = {
description = ("{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s."):
format(ancestor, nymics),
breadcrumb = "common-gender",
parents = {nymics},
}
labels["female " .. nymics] = {
description = ("{{{langname}}} names used by women to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "female",
parents = {nymics},
}
labels["male " .. nymics] = {
description = ("{{{langname}}} names used by men to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "male",
parents = {nymics},
}
labels[nymics] = {
description = ("{{{langname}}} names indicating a person's %s."):format(ancestor),
parents = {"names"},
}
end
labels["nomina gentilia"] = {
description = "{{{langname}}} \"[[family name]]s\" (singular ''[[nomen gentile]]'') in a [[w:Roman naming convention|convential Roman name]].",
parents = {"names"},
}
------------------------------------------- misc -------------------------------------------
labels["exonyms"] = {
description = "{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.",
parents = {"names"},
}
labels["renderings of foreign personal names"] = {
description = "{{{langname}}} transliterations, respellings or other renderings of foreign personal names.",
parents = {"names"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Names subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Names subcategories by language"] = {
description = "Umbrella categories covering topics related to names.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "names", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function source_name_to_source(nametype, source_name)
local special_sources
if nametype:find("given names") then
special_sources = require("Module:table").listToSet {
"surnames", "place names", "coinages", "the Bible", "month names"
}
elseif nametype:find("surnames") then
special_sources = require("Module:table").listToSet {
"given names", "place names", "occupations", "patronymics", "matronymics",
"common nouns", "nicknames", "ethnonyms"
}
else
special_sources = {}
end
if special_sources[source_name] then
return source_name
else
return require("Module:languages").getByCanonicalName(source_name, nil,
"allow etym langs", "allow families")
end
end
local function get_source_text(source)
if type(source) == "table" then
return source:getDisplayForm()
else
return source
end
end
local function get_description(lang, nametype, source)
local origintext, addltext
if source == "surnames" then
origintext = "transferred from surnames"
elseif source == "given names" then
origintext = "transferred from given names"
elseif source == "nicknames" then
origintext = "transferred from nicknames"
elseif source == "place names" then
origintext = "transferred from place names"
addltext = " For place names that are also surnames, see " .. (
lang and "[[:Category:{{{langname}}} " .. nametype .. " from surnames]]" or
"[[:Category:" .. mw.getContentLanguage():ucfirst(nametype) .. " from surnames by language]]"
) .. "."
elseif source == "common nouns" then
origintext = "transferred from common nouns"
elseif source == "month names" then
origintext = "transferred from month names"
elseif source == "coinages" then
origintext = "originating as coinages"
addltext = " These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages."
elseif source == "occupations" then
origintext = "originating as occupations"
elseif source == "patronymics" then
origintext = "originating as patronymics"
elseif source == "matronymics" then
origintext = "originating as matronymics"
elseif source == "ethnonyms" then
origintext = "originating as ethnonyms"
elseif source == "the Bible" then
-- Hack esp. for Hawaiian names. We should consider changing them to
-- have the source as Biblical Hebrew and mention the derivation from
-- the Bible some other way.
origintext = "originating from the Bible"
elseif type(source) == "string" then
error("Internal error: Unrecognized string source \"" .. source .. "\", should be special-cased")
else
origintext = "of " .. source:makeCategoryLink() .. " origin"
if lang and source:getCode() == lang:getCode() then
addltext = " These are names derived from common nouns, local mythology, etc."
end
end
local introtext
if lang then
introtext = "{{{langname}}} "
else
introtext = "Categories with "
end
return introtext .. nametype .. " " .. origintext ..
". (This includes names derived at an older stage of the language.)" .. (addltext or "")
end
-- If one of the following families occurs in any of the ancestral families
-- of a given language, use it instead of the three-letter parent
-- (or immediate parent if no three-letter parent).
local high_level_families = require("Module:table").listToSet {
-- Indo-European
"gem", -- Germanic (for gme, gmq, gmw)
"inc", -- Indic (for e.g. pra = Prakrit)
"ine-ana", -- Anatolian (don't keep going to ine)
"ine-toc", -- Tocharian (don't keep going to ine)
"ira", -- Iranian (for e.g. xme = Median, xsc = Scythian)
"sla", -- Slavic (for zle, zls, zlw)
-- Other
"ath", -- Athabaskan (for e.g. apa = Apachean)
"poz", -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian)
"cau-nwc", -- Northwest Caucasian
"cau-nec", -- Northeast Caucasian
}
local function find_high_level_family(lang)
local family = lang:getFamily()
-- (1) If no family, return nil (e.g. for Pictish).
if not family then
return nil
end
-- (2) See if any ancestor family is in `high_level_families`.
-- if so, return it.
local high_level_family = family
while high_level_family do
local high_level_code = high_level_family:getCode()
if high_level_code == "qfa-not" then
-- "not a family"; its own parent, causing an infinite loop.
-- Break rather than return so we get categories like
-- [[Category:English female given names from sign languages]] and
-- [[Category:English female given names from constructed languages]].
break
end
if high_level_families[high_level_code] then
return high_level_family
end
high_level_family = high_level_family:getFamily()
end
-- (3) If the family is of the form 'FOO-BAR', see if 'FOO' is a family.
-- If so, return it.
local basic_family = family:getCode():match("^(.-)%-.*$")
if basic_family then
basic_family = require("Module:families").getByCode(basic_family)
if basic_family then
return basic_family
end
end
-- (4) Fall back to just the family itself.
return family
end
local function match_gendered_nametype(nametype)
local gender, label = nametype:match("^(f?e?male) (given names)$")
if not gender then
gender, label = nametype:match("^(unisex) (given names)$")
end
if gender then
return gender, label
end
end
local function get_parents(lang, nametype, source)
local parents = {}
if lang then
table.insert(parents, {name = nametype, sort = get_source_text(source)})
if type(source) == "table" then
table.insert(parents, {name = "terms derived from " .. source:getDisplayForm(), sort = " "})
-- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for
-- "Russian female given names from German", put it in a parent category "Russian female given names from Germanic languages"
-- (skipping over West Germanic languages).
--
-- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for
-- "French male given names from Gascon", put it in a parent category "French male given names from Occitan".
--
-- If the source is a family, put it in a parent category for the parent family.
if source:hasType("family") then
local parent_family = source:getFamily()
if parent_family and parent_family:getCode() ~= "qfa-not" then
table.insert(parents, {
name = nametype .. " from " .. parent_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
elseif source:hasType("etymology-only") then
local source_parent = source:getFull()
if source_parent and source_parent:getCode() ~= "und" then
table.insert(parents, {
name = nametype .. " from " .. source_parent:getDisplayForm(),
sort = source:getCanonicalName()
})
end
else
local high_level_family = find_high_level_family(source)
if high_level_family then -- may not exist, e.g. for Pictish
table.insert(parents,
{name = nametype .. " from " .. high_level_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
end
end
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), sort = gender})
end
else
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), is_label = true, sort = " "})
elseif type(source) == "table" then
-- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories
-- 'Terms derived from SOURCE'.
local first_umbrella_parent =
source:hasType("family") and {name = source:getCategoryName(), raw = true, sort = " "} or
source:hasType("etymology-only") and {name = "Category:" .. source:getCategoryName(), sort = nametype} or
{name = source:getCategoryName(), raw = true, sort = nametype}
table.insert(parents, first_umbrella_parent)
end
table.insert(parents, "Names subcategories by language")
end
return parents
end
table.insert(handlers, function(data)
local nametype, source_name = data.label:match("^(.*names) from (.+)$")
if nametype then
local personal_name_type_set = require(names_module).personal_name_type_set
if not personal_name_type_set[nametype] then
return nil
end
local source = source_name_to_source(nametype, source_name)
if not source then
return nil
end
return {
description = get_description(data.lang, nametype, source),
breadcrumb = "from " .. get_source_text(source),
parents = get_parents(data.lang, nametype, source),
umbrella = {
description = get_description(nil, nametype, source),
parents = get_parents(nil, nametype, source),
},
}
end
end)
-- Handler for e.g. 'English renderings of Russian male given names'.
table.insert(handlers, function(data)
local label = data.label:match("^renderings of (.*)$")
if label then
local personal_name_types = require(names_module).personal_name_types
for _, nametype in ipairs(personal_name_types) do
local sourcename = label:match("^(.+) " .. nametype .. "$")
if sourcename then
local source = require("Module:languages").getByCanonicalName(sourcename, nil, "allow etym")
if source then
return {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into {{{langdisp}}}.",
lang = data.lang,
breadcrumb = sourcename .. " " .. nametype,
parents = {
{ name = "renderings of foreign personal names", sort = sourcename },
{ name = nametype, lang = source:getCode(), sort = "{{{langname}}}" },
},
umbrella = {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into various languages.",
parents = {{name = "renderings of foreign personal names", is_label = true, sort = label}},
},
}
end
end
end
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
nka9xy2he55k31c1lpud70iamgc4u5s
88398
88397
2026-07-27T00:16:15Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/names]]
88397
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local names_module = "Module:names"
local en_utilities_module = "Module:en-utilities"
local pluralize = require(en_utilities_module).pluralize
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["names"] = {
description = "{{{langname}}} terms that are used to refer to specific individuals or groups.",
additional = "Place names, demonyms and other kinds of names can be found in [[:Category:Names]].",
umbrella_parents = {name = "terms by semantic function", is_label = true, sort = " "},
parents = {"terms by semantic function", "proper nouns"},
}
------------------------------------------- given names -------------------------------------------
local human_genders = {
["male"] = "to male individuals",
["female"] = "to female individuals",
["unisex"] = "either to male or to female individuals",
}
for gender, props in pairs(require(names_module).given_name_genders) do
if gender ~= "unknown-gender" then
local is_animal = props.type == "animal"
local cat = is_animal and gender .. " names" or gender .. " given names"
local desc = is_animal and " given to [[" .. gender .. "|" .. pluralize(gender) .. "]]" or " given " .. human_genders[gender]
local function do_cat(cat, desc, breadcrumb, parents)
labels[cat] = {
description = "{{{langname}}} " .. desc .. ".",
breadcrumb = breadcrumb,
parents = parents,
}
end
for _, dimaug in ipairs { "diminutive", "augmentative" } do
do_cat(dimaug .. "s of " .. cat, dimaug .. " names " .. desc, dimaug,
{gender .. " given names", dimaug .. " nouns"})
end
do_cat(cat, "names " .. desc, gender, is_animal and (gender == "animal" and "names" or is_animal and
"animal names") or "given names")
if not is_animal then
do_cat(gender .. " skin names", "skin names " .. desc, gender, {"skin names"})
end
end
end
labels["given names"] = {
description = "{{{langname}}} names given to individuals.",
parents = {"names"},
}
labels["skin names"] = {
description = "{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.",
parents = {"proper nouns", "names"},
}
------------------------------------------- surnames -------------------------------------------
labels["common-gender surnames"] = {
description = "{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.",
breadcrumb = "common-gender",
parents = {"surnames"},
}
labels["female surnames"] = {
description = "{{{langname}}} names shared by female family members.",
breadcrumb = "female",
parents = {"surnames"},
}
labels["male surnames"] = {
description = "{{{langname}}} names shared by male family members.",
breadcrumb = "male",
parents = {"surnames"},
}
labels["surnames"] = {
description = "{{{langname}}} names shared by family members.",
parents = {"names"},
}
for _, nymics in ipairs { "matronymics", "patronymics" } do
local ancestor = nymics == "matronymics" and "mother, grandmother or earlier female ancestor" or
"father, grandfather or earlier male ancestor"
labels["common-gender " .. nymics] = {
description = ("{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s."):
format(ancestor, nymics),
breadcrumb = "common-gender",
parents = {nymics},
}
labels["female " .. nymics] = {
description = ("{{{langname}}} names used by women to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "female",
parents = {nymics},
}
labels["male " .. nymics] = {
description = ("{{{langname}}} names used by men to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "male",
parents = {nymics},
}
labels[nymics] = {
description = ("{{{langname}}} names indicating a person's %s."):format(ancestor),
parents = {"names"},
}
end
labels["nomina gentilia"] = {
description = "{{{langname}}} \"[[family name]]s\" (singular ''[[nomen gentile]]'') in a [[w:Roman naming convention|convential Roman name]].",
parents = {"names"},
}
------------------------------------------- misc -------------------------------------------
labels["exonyms"] = {
description = "{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.",
parents = {"names"},
}
labels["renderings of foreign personal names"] = {
description = "{{{langname}}} transliterations, respellings or other renderings of foreign personal names.",
parents = {"names"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Names subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Names subcategories by language"] = {
description = "Umbrella categories covering topics related to names.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "names", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function source_name_to_source(nametype, source_name)
local special_sources
if nametype:find("given names") then
special_sources = require("Module:table").listToSet {
"surnames", "place names", "coinages", "the Bible", "month names"
}
elseif nametype:find("surnames") then
special_sources = require("Module:table").listToSet {
"given names", "place names", "occupations", "patronymics", "matronymics",
"common nouns", "nicknames", "ethnonyms"
}
else
special_sources = {}
end
if special_sources[source_name] then
return source_name
else
return require("Module:languages").getByCanonicalName(source_name, nil,
"allow etym langs", "allow families")
end
end
local function get_source_text(source)
if type(source) == "table" then
return source:getDisplayForm()
else
return source
end
end
local function get_description(lang, nametype, source)
local origintext, addltext
if source == "surnames" then
origintext = "transferred from surnames"
elseif source == "given names" then
origintext = "transferred from given names"
elseif source == "nicknames" then
origintext = "transferred from nicknames"
elseif source == "place names" then
origintext = "transferred from place names"
addltext = " For place names that are also surnames, see " .. (
lang and "[[:Category:{{{langname}}} " .. nametype .. " from surnames]]" or
"[[:Category:" .. mw.getContentLanguage():ucfirst(nametype) .. " from surnames by language]]"
) .. "."
elseif source == "common nouns" then
origintext = "transferred from common nouns"
elseif source == "month names" then
origintext = "transferred from month names"
elseif source == "coinages" then
origintext = "originating as coinages"
addltext = " These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages."
elseif source == "occupations" then
origintext = "originating as occupations"
elseif source == "patronymics" then
origintext = "originating as patronymics"
elseif source == "matronymics" then
origintext = "originating as matronymics"
elseif source == "ethnonyms" then
origintext = "originating as ethnonyms"
elseif source == "the Bible" then
-- Hack esp. for Hawaiian names. We should consider changing them to
-- have the source as Biblical Hebrew and mention the derivation from
-- the Bible some other way.
origintext = "originating from the Bible"
elseif type(source) == "string" then
error("Internal error: Unrecognized string source \"" .. source .. "\", should be special-cased")
else
origintext = "of " .. source:makeCategoryLink() .. " origin"
if lang and source:getCode() == lang:getCode() then
addltext = " These are names derived from common nouns, local mythology, etc."
end
end
local introtext
if lang then
introtext = "{{{langname}}} "
else
introtext = "Categories with "
end
return introtext .. nametype .. " " .. origintext ..
". (This includes names derived at an older stage of the language.)" .. (addltext or "")
end
-- If one of the following families occurs in any of the ancestral families
-- of a given language, use it instead of the three-letter parent
-- (or immediate parent if no three-letter parent).
local high_level_families = require("Module:table").listToSet {
-- Indo-European
"gem", -- Germanic (for gme, gmq, gmw)
"inc", -- Indic (for e.g. pra = Prakrit)
"ine-ana", -- Anatolian (don't keep going to ine)
"ine-toc", -- Tocharian (don't keep going to ine)
"ira", -- Iranian (for e.g. xme = Median, xsc = Scythian)
"sla", -- Slavic (for zle, zls, zlw)
-- Other
"ath", -- Athabaskan (for e.g. apa = Apachean)
"poz", -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian)
"cau-nwc", -- Northwest Caucasian
"cau-nec", -- Northeast Caucasian
}
local function find_high_level_family(lang)
local family = lang:getFamily()
-- (1) If no family, return nil (e.g. for Pictish).
if not family then
return nil
end
-- (2) See if any ancestor family is in `high_level_families`.
-- if so, return it.
local high_level_family = family
while high_level_family do
local high_level_code = high_level_family:getCode()
if high_level_code == "qfa-not" then
-- "not a family"; its own parent, causing an infinite loop.
-- Break rather than return so we get categories like
-- [[Category:English female given names from sign languages]] and
-- [[Category:English female given names from constructed languages]].
break
end
if high_level_families[high_level_code] then
return high_level_family
end
high_level_family = high_level_family:getFamily()
end
-- (3) If the family is of the form 'FOO-BAR', see if 'FOO' is a family.
-- If so, return it.
local basic_family = family:getCode():match("^(.-)%-.*$")
if basic_family then
basic_family = require("Module:families").getByCode(basic_family)
if basic_family then
return basic_family
end
end
-- (4) Fall back to just the family itself.
return family
end
local function match_gendered_nametype(nametype)
local gender, label = nametype:match("^(f?e?male) (given names)$")
if not gender then
gender, label = nametype:match("^(unisex) (given names)$")
end
if gender then
return gender, label
end
end
local function get_parents(lang, nametype, source)
local parents = {}
if lang then
table.insert(parents, {name = nametype, sort = get_source_text(source)})
if type(source) == "table" then
table.insert(parents, {name = "terms derived from " .. source:getDisplayForm(), sort = " "})
-- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for
-- "Russian female given names from German", put it in a parent category "Russian female given names from Germanic languages"
-- (skipping over West Germanic languages).
--
-- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for
-- "French male given names from Gascon", put it in a parent category "French male given names from Occitan".
--
-- If the source is a family, put it in a parent category for the parent family.
if source:hasType("family") then
local parent_family = source:getFamily()
if parent_family and parent_family:getCode() ~= "qfa-not" then
table.insert(parents, {
name = nametype .. " from " .. parent_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
elseif source:hasType("etymology-only") then
local source_parent = source:getFull()
if source_parent and source_parent:getCode() ~= "und" then
table.insert(parents, {
name = nametype .. " from " .. source_parent:getDisplayForm(),
sort = source:getCanonicalName()
})
end
else
local high_level_family = find_high_level_family(source)
if high_level_family then -- may not exist, e.g. for Pictish
table.insert(parents,
{name = nametype .. " from " .. high_level_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
end
end
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), sort = gender})
end
else
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), is_label = true, sort = " "})
elseif type(source) == "table" then
-- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories
-- 'Terms derived from SOURCE'.
local first_umbrella_parent =
source:hasType("family") and {name = source:getCategoryName(), raw = true, sort = " "} or
source:hasType("etymology-only") and {name = "Category:" .. source:getCategoryName(), sort = nametype} or
{name = source:getCategoryName(), raw = true, sort = nametype}
table.insert(parents, first_umbrella_parent)
end
table.insert(parents, "Names subcategories by language")
end
return parents
end
table.insert(handlers, function(data)
local nametype, source_name = data.label:match("^(.*names) from (.+)$")
if nametype then
local personal_name_type_set = require(names_module).personal_name_type_set
if not personal_name_type_set[nametype] then
return nil
end
local source = source_name_to_source(nametype, source_name)
if not source then
return nil
end
return {
description = get_description(data.lang, nametype, source),
breadcrumb = "from " .. get_source_text(source),
parents = get_parents(data.lang, nametype, source),
umbrella = {
description = get_description(nil, nametype, source),
parents = get_parents(nil, nametype, source),
},
}
end
end)
-- Handler for e.g. 'English renderings of Russian male given names'.
table.insert(handlers, function(data)
local label = data.label:match("^renderings of (.*)$")
if label then
local personal_name_types = require(names_module).personal_name_types
for _, nametype in ipairs(personal_name_types) do
local sourcename = label:match("^(.+) " .. nametype .. "$")
if sourcename then
local source = require("Module:languages").getByCanonicalName(sourcename, nil, "allow etym")
if source then
return {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into {{{langdisp}}}.",
lang = data.lang,
breadcrumb = sourcename .. " " .. nametype,
parents = {
{ name = "renderings of foreign personal names", sort = sourcename },
{ name = nametype, lang = source:getCode(), sort = "{{{langname}}}" },
},
umbrella = {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into various languages.",
parents = {{name = "renderings of foreign personal names", is_label = true, sort = label}},
},
}
end
end
end
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
nka9xy2he55k31c1lpud70iamgc4u5s
Mòideal:names
828
17729
88399
2026-07-20T17:07:28Z
en>Theknightwho
0
Add nocap= and nocat=.
88399
Scribunto
text/plain
local export = {}
local m_languages = require("Module:languages")
local m_links = require("Module:links")
local m_utilities = require("Module:utilities")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local parameter_utilities_module = "Module:parameter utilities"
local parse_interface_module = "Module:parse interface"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local enlang = m_languages.getByCode("en")
local rsubn = m_str_utils.gsub
local rsplit = m_str_utils.split
local u = m_str_utils.char
local function rsub(str, from, to)
return (rsubn(str, from, to))
end
local TEMP_LESS_THAN = u(0xFFF2)
local force_cat = false -- for testing
--[=[
FIXME:
1. from=the Bible (DONE)
2. origin=18th century [DONE]
3. popular= (DONE)
4. varoftype= (DONE)
5. eqtype= [DONE]
6. dimoftype= [DONE]
7. from=de:Elisabeth (same language) (DONE)
8. blendof=, blendof2= [DONE]
9. varform, dimform [DONE]
10. from=English < Latin [DONE]
11. usage=rare -> categorize as rare?
12. dimeq= (also vareq=?) [DONE]
13. fromtype= [DONE]
14. <tr:...> and similar params [DONE]
]=]
-- Used in category code; name types which are full-word end-matching substrings of longer name types (e.g. "surnames"
-- of "male surnames", but not "male surnames" of "female surnames" because "male" only matches a part of the word
-- "female") should follow the longer name.
export.personal_name_types = {
"male surnames", "female surnames", "common-gender surnames", "surnames",
"patronymics", "matronymics",
}
export.personal_name_type_set = m_table.listToSet(export.personal_name_types)
export.given_name_genders = {
male = {type = "human"},
female = {type = "human"},
unisex = {type = "human", cat = {"male given names", "female given names", "unisex given names"}, article = "a"},
["unknown-gender"] = {type = "human", cat = {}, track = true},
animal = {type = "animal", track = true},
cat = {type = "animal"},
cow = {type = "animal"},
dog = {type = "animal"},
horse = {type = "animal"},
pig = {type = "animal"},
}
local function get_given_name_cats(gender, props)
local cats = props.cat
if not cats then
if props.type == "animal" then
cats = {gender .. " names"}
else
cats = {gender .. " given names"}
end
end
return cats
end
do
local function do_cat(cat)
if not export.personal_name_type_set[cat] then
export.personal_name_type_set[cat] = true
table.insert(export.personal_name_types, cat)
end
end
for gender, props in pairs(export.given_name_genders) do
local cats = get_given_name_cats(gender, props)
for _, cat in ipairs(cats) do
do_cat("diminutives of " .. cat)
do_cat("augmentatives of " .. cat)
do_cat(cat)
end
end
do_cat("given names")
end
local translit_name_type_list = {
"surname", "male given name", "female given name", "unisex given name",
"patronymic"
}
local function track(page)
require("Module:debug").track("names/" .. page)
end
-- Get raw text, for use in computing the indefinite article. Use get_plaintext() in [[Module:utilities]] and also
-- remove parens that may surround qualifier or label text preceding a term.
local function get_rawtext(text)
text = m_utilities.get_plaintext(text)
text = text:gsub("[()%[%]]", "")
return text
end
--[=[
Parse a term and associated properties. This works with parameters of the form 'Karlheinz' or
'Kunigunde<q:medieval, now rare>' or 'non:Óláfr' or 'ru:Фру́нзе<tr:Frúnzɛ><q:rare>' where the modifying properties
are contained in <...> specifications after the term. `term` is the full parameter value including any angle brackets
and colons; `paramname` is the name of the parameter that this value comes from, for error purposes; `deflang` is a
language object used in the return value when the language isn't specified (e.g. in the examples 'Karlheinz' and
'Kunigunde<q:medieval, now rare>' above); `allow_explicit_lang` indicates whether the language can be explicitly given
(e.g. in the examples 'non:Óláfr' or 'ru:Фру́нзе<tr:Frúnzɛ><q:rare>' above).
Normally the return value is a terminfo object that can be passed to full_link() in [[Module:links]]), additionally
with optional fields `.q`, `.qq`, `.l`, `.ll`, `.refs` and `.eq` (a list of objects of the same form as the returned
terminfo object. However, if `allow_multiple_terms` is given, multiple comma-separated names can be given in `term`,
and the return value is a list of objects of the form described just above.
]=]
local function parse_term_with_annotations(term, paramname, deflang, allow_explicit_lang, allow_multiple_terms)
local param_mods = require(parameter_utilities_module).construct_param_mods {
{group = {"link", "l", "q", "ref"}},
{param = "eq", convert = function(eqval, parse_err)
return parse_term_with_annotations(eqval, paramname .. ".eq", enlang, false, "allow multiple terms")
end},
}
local function generate_obj(term, parse_err)
local termlang
if allow_explicit_lang then
local actual_term
actual_term, termlang = require(parse_interface_module).parse_term_with_lang {
term = term,
parse_err = parse_err,
paramname = paramname,
}
term = actual_term or term
end
return {
term = term,
lang = termlang or deflang,
}
end
return require(parse_interface_module).parse_inline_modifiers(term, {
param_mods = param_mods,
paramname = paramname,
generate_obj = generate_obj,
splitchar = allow_multiple_terms and "," or nil,
})
end
--[=[
Link a single term. If `do_language_link` is given and a given term's language is English, the link will be constructed
using language_link() in [[Module:links]]; otherwise, with full_link(). `termobj` is an object as returned by
parse_term_with_annotations(), i.e. it is suitable for passing to [[Module:links]] and additionally contains optional
fields `.q`, `.qq`, `.l`, `.ll`, `.refs` and `.eq` (a list of objects of the same form as `termobj`).
]=]
local function link_one_term(termobj, do_language_link)
local link
if do_language_link and termobj.lang:getCode() == "en" then
link = m_links.language_link(termobj)
else
link = m_links.full_link(termobj)
end
if termobj.q and termobj.q[1] or termobj.qq and termobj.qq[1] or
termobj.l and termobj.l[1] or termobj.ll and termobj.ll[1] or termobj.refs and termobj.refs[1] then
link = require(pron_qualifier_module).format_qualifiers {
lang = termobj.lang,
text = link,
q = termobj.q,
qq = termobj.qq,
l = termobj.l,
ll = termobj.ll,
refs = termobj.refs,
}
end
if termobj.eq then
local eqtext = {}
for _, eqobj in ipairs(termobj.eq) do
table.insert(eqtext, link_one_term(eqobj, true))
end
link = link .. " [=" .. m_table.serialCommaJoin(eqtext, {conj = "or"}) .. "]"
end
return link
end
--[=[
Link the terms in `terms`, and join them using the conjunction in `conj` (defaulting to "or"). Joining is done using
serialCommaJoin() in [[Module:table]], so that e.g. two terms are joined as "TERM or TERM" while three terms are joined
as "TERM, TERM or TERM" with special CSS spans before the final "or" to allow an "Oxford comma" to appear if configured
appropriately. (However, if `conj` is the special value ", ", joining is done directly using that value.)
If `include_langname` is given, the language of the first term will be prepended to the joined terms. If
`do_language_link` is given and a given term's language is English, the link will be constructed using language_link()
in [[Module:links]]; otherwise, with full_link(). Each term in `terms` is an object as returned by
parse_term_with_annotations().
]=]
local function join_terms(terms, include_langname, do_language_link, conj)
local links = {}
local langnametext
for _, termobj in ipairs(terms) do
if include_langname and not langnametext then
langnametext = termobj.lang:getCanonicalName() .. " "
end
table.insert(links, link_one_term(termobj, do_language_link))
end
local joined_terms
if conj == ", " then
joined_terms = table.concat(links, conj)
else
joined_terms = m_table.serialCommaJoin(links, {conj = conj or "or"})
end
return (langnametext or "") .. joined_terms
end
--[=[
Gather the parameters for multiple names and link each name using full_link() (for foreign names) or language_link()
(for English names), joining the names using serialCommaJoin() in [[Module:table]] with the conjunction `conj`
(defaulting to "or"). (However, if `conj` is the special value ", ", joining is done directly using that value.)
This can be used, for example, to fetch and join all the masculine equivalent names for a feminine given name. Each
name is specified using parameters beginning with `pname` in `args`, e.g. "m", "m2", "m3", etc. `lang` is a language
object specifying the language of the names (defaulting to English), for use in linking them. If `allow_explicit_lang`
is given, the language of the terms can be specified explicitly by prefixing a term with a language code, e.g.
'sv:Björn' or 'la:[[Nicolaus|Nīcolāī]]'. This function assumes that the parameters have already been parsed by
[[Module:parameters]] and gathered into lists, so that e.g. all "mN" parameters are in a list in args["m"].
]=]
local function join_names(lang, args, pname, conj, allow_explicit_lang)
local termobjs = {}
local do_language_link = false
if not lang then
lang = enlang
do_language_link = true
end
local function process_one_term(term, i)
for _, termobj in ipairs(parse_term_with_annotations(term, pname .. (i == 1 and "" or i), lang,
allow_explicit_lang, "allow multiple terms")) do
table.insert(termobjs, termobj)
end
end
if not args[pname] then
return "", 0
elseif type(args[pname]) == "table" then
for i, term in ipairs(args[pname]) do
process_one_term(term, i)
end
else
process_one_term(args[pname], 1)
end
return join_terms(termobjs, nil, do_language_link, conj), #termobjs
end
local function get_eqtext(args)
local eqsegs = {}
local lastlang = nil
local last_eqseg = {}
local function process_one_term(term, i)
for _, termobj in ipairs(parse_term_with_annotations(term, "eq" .. (i == 1 and "" or i), enlang,
"allow explicit lang", "allow multiple terms")) do
local termlang = termobj.lang:getCode()
if lastlang and lastlang ~= termlang then
if #last_eqseg > 0 then
table.insert(eqsegs, last_eqseg)
end
last_eqseg = {}
end
lastlang = termlang
table.insert(last_eqseg, termobj)
end
end
if type(args.eq) == "table" then
for i, term in ipairs(args.eq) do
process_one_term(term, i)
end
elseif type(args.eq) == "string" then
process_one_term(args.eq, 1)
end
if #last_eqseg > 0 then
table.insert(eqsegs, last_eqseg)
end
local eqtextsegs = {}
for _, eqseg in ipairs(eqsegs) do
table.insert(eqtextsegs, join_terms(eqseg, "include langname"))
end
return m_table.serialCommaJoin(eqtextsegs, {conj = "or"})
end
local function get_fromtext(lang, args)
local catparts = {}
local fromsegs = {}
local i = 1
local function parse_from(from)
local unrecognized = false
local prefix, suffix
if from == "surnames" or from == "given names" or from == "nicknames" or from == "place names" or from == "common nouns" or from == "month names" then
prefix = "transferred from the "
suffix = from:gsub("s$", "")
table.insert(catparts, from)
elseif from == "patronymics" or from == "matronymics" or from == "coinages" then
prefix = "originating "
suffix = "as a " .. from:gsub("s$", "")
table.insert(catparts, from)
elseif from == "occupations" or from == "ethnonyms" then
prefix = "originating "
suffix = "as an " .. from:gsub("s$", "")
table.insert(catparts, from)
elseif from == "the Bible" then
prefix = "originating "
suffix = "from the Bible"
table.insert(catparts, from)
else
prefix = "from "
if from:find(":") then
local termobj = parse_term_with_annotations(from, "from" .. (i == 1 and "" or i), lang,
"allow explicit lang")
local fromlangname = ""
if termobj.lang:getCode() ~= lang:getCode() then
-- If name is derived from another name in the same language, don't include lang name after text
-- "from " or create a category like "German male given names derived from German".
local canonical_name = termobj.lang:getCanonicalName()
fromlangname = canonical_name .. " "
table.insert(catparts, canonical_name)
end
suffix = fromlangname .. link_one_term(termobj)
else
local family = from:match("^(.+) languages$") or
from:match("^.+ Languages$") or
from:match("^.+ [Ll]ects$")
if family then
if require("Module:families").getByCanonicalName(family) then
table.insert(catparts, from)
else
unrecognized = true
end
suffix = "the " .. from
else
if m_languages.getByCanonicalName(from, nil, "allow etym") then
table.insert(catparts, from)
else
unrecognized = true
end
suffix = from
end
end
end
if unrecognized then
track("unrecognized from")
track("unrecognized from/" .. from)
end
return prefix, suffix
end
local last_fromseg = nil
local put = require(parse_utilities_module)
local from_args = args.from or {}
if type(from_args) == "string" then
from_args = {from_args}
end
while from_args[i] do
-- We may have multiple comma-separated items, each of which may have multiple items separated by a
-- space-delimited < sign, each of which may have inline modifiers with embedded commas in them. To handle
-- this correctly, first replace space-delimited < signs with a special character, then split on balanced
-- <...> and [...] signs, then split on comma, then rejoin the stuff between commas. We will then split on
-- TEMP_LESS_THAN (the replacement for space-delimited < signs) and reparse.
local rawfroms = rsub(from_args[i], "%s+<%s+", TEMP_LESS_THAN)
local segments = put.parse_multi_delimiter_balanced_segment_run(rawfroms, {{"<", ">"}, {"[", "]"}})
local comma_separated_groups = put.split_alternating_runs_on_comma(segments)
for j, comma_separated_group in ipairs(comma_separated_groups) do
comma_separated_groups[j] = table.concat(comma_separated_group)
end
for _, rawfrom in ipairs(comma_separated_groups) do
local froms = rsplit(rawfrom, TEMP_LESS_THAN)
if #froms == 1 then
local prefix, suffix = parse_from(froms[1])
if last_fromseg and (last_fromseg.has_multiple_froms or last_fromseg.prefix ~= prefix) then
table.insert(fromsegs, last_fromseg)
last_fromseg = nil
end
if not last_fromseg then
last_fromseg = {prefix = prefix, suffixes = {}}
end
table.insert(last_fromseg.suffixes, suffix)
else
if last_fromseg then
table.insert(fromsegs, last_fromseg)
last_fromseg = nil
end
local first_suffixpart = ""
local rest_suffixparts = {}
for j, from in ipairs(froms) do
local prefix, suffix = parse_from(from)
if j == 1 then
first_suffixpart = prefix .. suffix
else
table.insert(rest_suffixparts, prefix .. suffix)
end
end
local full_suffix = first_suffixpart .. " [in turn " .. table.concat(rest_suffixparts, ", in turn ") .. "]"
last_fromseg = {prefix = "", has_multiple_froms = true, suffixes = {full_suffix}}
end
end
i = i + 1
end
table.insert(fromsegs, last_fromseg)
local fromtextsegs = {}
for _, fromseg in ipairs(fromsegs) do
table.insert(fromtextsegs, fromseg.prefix .. m_table.serialCommaJoin(fromseg.suffixes, {conj = "or"}))
end
return m_table.serialCommaJoin(fromtextsegs, {conj = "or"}), catparts
end
local function parse_given_name_genders(genderspec)
if export.given_name_genders[genderspec] then -- optimization
return {{
type = genderspec,
props = export.given_name_genders[genderspec],
}}, export.given_name_genders[genderspec].type == "animal"
end
local is_animal = nil
local param_mods = require(parameter_utilities_module).construct_param_mods {
{group = {"l", "q", "ref"}},
{param = {"text", "article"}},
}
local function generate_obj(term, parse_err)
if not export.given_name_genders[term] then
local valid_genders = {}
for k, _ in pairs(export.given_name_genders) do
table.insert(valid_genders, k)
end
table.sort(valid_genders)
parse_err(("Unrecognized gender '%s': valid genders are %s"):format(
term, table.concat(valid_genders, ", ")))
end
return {
type = term,
props = export.given_name_genders[term],
}
end
local retval = require(parse_interface_module).parse_inline_modifiers(genderspec, {
param_mods = param_mods,
paramname = "2",
generate_obj = generate_obj,
splitchar = ",",
})
for _, spec in ipairs(retval) do
local this_is_animal = spec.props.type == "animal"
if is_animal == nil then
is_animal = this_is_animal
elseif is_animal ~= this_is_animal then
error("Can't mix animal and human genders")
end
end
return retval, is_animal
end
local function generate_given_name_genders(lang, genders)
local parts = {}
for _, spec in ipairs(genders) do
local text
if spec.text then
-- NOTE: This assumes no % sign in the gender type, which seems safe.
text = spec.text:gsub("%+", spec.type)
else
if spec.props.type == "animal" then
text = "[[" .. spec.type .. "]]"
else
text = spec.type
end
end
if spec.q and spec.q[1] or spec.qq and spec.qq[1] or spec.l and spec.l[1] or spec.ll and spec.ll[1] or
spec.refs and spec.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = text,
q = spec.q,
qq = spec.qq,
l = spec.l,
ll = spec.ll,
refs = spec.refs,
raw = true,
}
end
table.insert(parts, text)
end
local retval = m_table.serialCommaJoin(parts, {conj = "or"})
local article = genders[1].article
if not article and not genders[1].text and not genders[1].q and not genders[1].l then
article = genders[1].props.article
end
if not article then
article = require(en_utilities_module).get_indefinite_article(get_rawtext(retval))
end
return retval, article
end
-- The entry point for {{given name}}.
function export.given_name(frame)
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
local lang_index = compat and "lang" or 1
local boolean = {type = "boolean"}
local list = {list = true}
local args = require("Module:parameters").process(parent_args, {
[lang_index] = {required = true, type = "language", default = "und"},
["gender"] = {default = "unknown-gender"},
[1 + offset] = {alias_of = "gender"},
["usage"] = true,
["origin"] = true,
["popular"] = true,
["populartype"] = true,
["meaning"] = list,
["meaningtype"] = true,
["addl"] = true,
["nocap"] = boolean,
-- initial article: A or An
["A"] = true,
["sort"] = true,
["from"] = true,
[2 + offset] = {alias_of = "from"},
["fromtype"] = true,
["xlit"] = true,
["eq"] = true,
["eqtype"] = true,
["varof"] = true,
["varoftype"] = true,
["var"] = {alias_of = "varof"},
["vartype"] = {alias_of = "varoftype"},
["varform"] = true,
["varformtype"] = true,
["dimof"] = true,
["dimoftype"] = true,
["dim"] = {alias_of = "dimof"},
["dimtype"] = {alias_of = "dimoftype"},
["dimform"] = true,
["dimformtype"] = true,
["augof"] = true,
["augoftype"] = true,
["aug"] = {alias_of = "augof"},
["augtype"] = {alias_of = "augoftype"},
["augform"] = true,
["augformtype"] = true,
["clipof"] = true,
["clipoftype"] = true,
["blend"] = true,
["blendtype"] = true,
["m"] = true,
["mtype"] = true,
["f"] = true,
["ftype"] = true,
["nocat"] = boolean,
})
local textsegs = {}
local lang = args[lang_index]
local langcode = lang:getCode()
local function fetch_typetext(param)
return args[param] and args[param] .. " " or ""
end
local genders, is_animal = parse_given_name_genders(args.gender)
local dimoftext, numdimofs = join_names(lang, args, "dimof")
local augoftext, numaugofs = join_names(lang, args, "augof")
local xlittext = join_names(nil, args, "xlit")
local blendtext = join_names(lang, args, "blend", "and")
local varoftext = join_names(lang, args, "varof")
local clipoftext = join_names(lang, args, "clipof")
local mtext = join_names(lang, args, "m")
local ftext = join_names(lang, args, "f")
local varformtext, numvarforms = join_names(lang, args, "varform", ", ")
local dimformtext, numdimforms = join_names(lang, args, "dimform", ", ")
local augformtext, numaugforms = join_names(lang, args, "augform", ", ")
local meaningsegs = {}
for _, meaning in ipairs(args.meaning) do
table.insert(meaningsegs, '“' .. meaning .. '”')
end
local meaningtext = m_table.serialCommaJoin(meaningsegs, {conj = "or"})
local eqtext = get_eqtext(args)
local function ins(txt)
table.insert(textsegs, txt)
end
local dimoftype = args.dimoftype
local augoftype = args.augoftype
local added_text = nil
if numdimofs > 0 then
added_text = (dimoftype and dimoftype .. " " or "") .. "[[diminutive]]" ..
(xlittext ~= "" and ", " .. xlittext .. "," or "") .. " of "
elseif numaugofs > 0 then
added_text = (augoftype and augoftype .. " " or "") .. "[[augmentative]]" ..
(xlittext ~= "" and ", " .. xlittext .. "," or "") .. " of "
end
local force_plural = false
if added_text ~= nil then
if args.dimof == "-" then
dimoftext = ""
force_plural = true
else
added_text = added_text .. "the "
end
ins(added_text)
end
local article = args.A
if not article and textsegs[1] then
article = require(en_utilities_module).get_indefinite_article(textsegs[1])
end
if not is_animal then
local gendertext, gender_article = generate_given_name_genders(lang, genders)
article = article or gender_article
ins(gendertext)
ins(" ")
end
ins((numdimofs > 1 or numaugofs > 1 or force_plural) and "[[given name|given names]]" or "[[given name]]")
article = article or "a" -- if no article set yet, it's "a" based on "given name"
if langcode == "en" and not args.nocap then
article = mw.getContentLanguage():ucfirst(article)
end
local need_comma = false
if numdimofs > 0 then
ins(" " .. dimoftext)
need_comma = not is_animal
elseif numaugofs > 0 then
ins(" " .. augoftext)
need_comma = not is_animal
elseif xlittext ~= "" then
ins(", " .. xlittext)
need_comma = true
end
if is_animal then
if need_comma then
ins(",")
end
need_comma = true
ins(" for ")
local gendertext, gender_article = generate_given_name_genders(lang, genders)
ins(gender_article)
ins(" ")
ins(gendertext)
end
local from_catparts = {}
if args.from then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("fromtype"))
local textseg, this_catparts = get_fromtext(lang, args)
for _, catpart in ipairs(this_catparts) do
m_table.insertIfNot(from_catparts, catpart)
end
ins(textseg)
end
if meaningtext ~= "" then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("meaningtype") .. "meaning " .. meaningtext)
end
if args.origin then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.origin .. " origin")
end
if args.usage then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.usage .. " usage")
end
if varoftext ~= "" then
ins(", " ..fetch_typetext("varoftype") .. "variant of " .. varoftext)
end
if clipoftext ~= "" then
ins(", " .. fetch_typetext("clipoftype") .. "clipping of " .. clipoftext)
end
if blendtext ~= "" then
ins(", " .. fetch_typetext("blendtype") .. "blend of " .. blendtext)
end
if args.popular then
ins(", " .. fetch_typetext("populartype") .. "popular " .. args.popular)
end
if mtext ~= "" then
ins(", " .. fetch_typetext("mtype") .. "masculine equivalent " .. mtext)
end
if ftext ~= "" then
ins(", " .. fetch_typetext("ftype") .. "feminine equivalent " .. ftext)
end
if eqtext ~= "" then
ins(", " .. fetch_typetext("eqtype") .. "equivalent to " .. eqtext)
end
if args.addl then
if args.addl:find("^;") then
ins(args.addl)
elseif args.addl:find("^_") then
ins(" " .. args.addl:sub(2))
else
ins(", " .. args.addl)
end
end
if varformtext ~= "" then
ins("; " .. fetch_typetext("varformtype") .. "variant form" .. (numvarforms > 1 and "s" or "") .. " " ..
varformtext)
end
if dimformtext ~= "" then
ins("; " .. fetch_typetext("dimformtype") .. "diminutive form" .. (numdimforms > 1 and "s" or "") .. " " ..
dimformtext)
end
if augformtext ~= "" then
ins("; " .. fetch_typetext("augformtype") .. "augmentative form" .. (numaugforms > 1 and "s" or "") .. " " ..
augformtext)
end
local text = "<span class='use-with-mention'>" .. article .. " " .. table.concat(textsegs) .. "</span>"
if args.nocat then
return text
end
local categories = {}
local langname = lang:getCanonicalName() .. " "
local function insert_cats(dimaugof)
if dimaugof == "" and genders[1].props.type == "human" then
-- No category such as "English diminutives of given names"
table.insert(categories, langname .. "given names")
end
local function insert_cat(cat)
table.insert(categories, langname .. dimaugof .. cat)
for _, catpart in ipairs(from_catparts) do
table.insert(categories, langname .. dimaugof .. cat .. " from " .. catpart)
end
end
for _, spec in ipairs(genders) do
local typ = spec.type
if spec.props.track then
track(typ)
end
local cats = get_given_name_cats(spec.type, spec.props)
for _, cat in ipairs(cats) do
insert_cat(cat)
end
end
end
insert_cats("")
if numdimofs > 0 then
insert_cats("diminutives of ")
elseif numaugofs > 0 then
insert_cats("augmentatives of ")
end
return text .. m_utilities.format_categories(categories, lang, args.sort, nil, force_cat)
end
-- The entry point for {{surname}}, {{patronymic}} and {{matronymic}}.
function export.surname(frame)
local iargs = require("Module:parameters").process(frame.args, {
["type"] = {required = true, set = {"surname", "patronymic", "matronymic"}},
})
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
if parent_args.dot or parent_args.nodot then
error("dot= and nodot= are no longer supported in [[Template:" .. iargs.type .. "]] because a trailing " ..
"period is no longer added by default; if you want it, add it explicitly after the template")
end
local lang_index = compat and "lang" or 1
local boolean = {type = "boolean"}
local list = {list = true}
local gender_arg = iargs.type == "surname" and "g" or 1 + offset
local adj_arg = iargs.type == "surname" and 1 + offset or 2 + offset
local args = require("Module:parameters").process(parent_args, {
[lang_index] = {required = true, type = "language", template_default = "und"},
[gender_arg] = iargs.type == "surname" and true or {required = true, template_default = "unknown"}, -- gender(s)
[adj_arg] = true, -- adjective/qualifier
["usage"] = true,
["origin"] = true,
["popular"] = true,
["populartype"] = true,
["meaning"] = list,
["meaningtype"] = true,
["parent"] = true,
["addl"] = true,
["nocap"] = boolean,
-- initial article: by default A or An (English), a or an (otherwise)
["A"] = true,
["sort"] = true,
["from"] = true,
["fromtype"] = true,
["xlit"] = true,
["eq"] = true,
["eqtype"] = true,
["varof"] = true,
["varoftype"] = true,
["var"] = {alias_of = "varof"},
["vartype"] = {alias_of = "varoftype"},
["varform"] = true,
["varformtype"] = true,
["clipof"] = true,
["clipoftype"] = true,
["blend"] = true,
["blendtype"] = true,
["m"] = true,
["mtype"] = true,
["f"] = true,
["ftype"] = true,
["nocat"] = boolean,
})
local textsegs = {}
local lang = args[lang_index]
local langcode = lang:getCode()
local function fetch_typetext(param)
return args[param] and args[param] .. " " or ""
end
local saw_male = false
local saw_female = false
local genders = {}
if args[gender_arg] then
for _, g in ipairs(require(parse_interface_module).split_on_comma(args[gender_arg])) do
if g == "unknown" or g == "unknown gender" or g == "unknown-gender" or g == "?" then
g = "unknown-gender"
track("unknown gender")
elseif g == "unisex" or g == "common gender" or g == "common-gender" or g == "c" then
g = "common-gender"
saw_male = true
saw_female = true
elseif g == "m" or g == "male" then
g = "male"
saw_male = true
elseif g == "f" or g == "female" then
g = "female"
saw_female = true
else
error("Unrecognized gender: " .. g)
end
table.insert(genders, g)
end
end
local adj = args[adj_arg]
local xlittext = join_names(nil, args, "xlit")
local blendtext = join_names(lang, args, "blend", "and")
local varoftext = join_names(lang, args, "varof")
local clipoftext = join_names(lang, args, "clipof")
local mtext = join_names(lang, args, "m")
local ftext = join_names(lang, args, "f")
local parenttext = join_names(lang, args, "parent", nil, "allow explicit lang")
local varformtext, numvarforms = join_names(lang, args, "varform", ", ")
local meaningsegs = {}
for _, meaning in ipairs(args.meaning) do
table.insert(meaningsegs, '“' .. meaning .. '”')
end
if parenttext ~= "" then
local child = saw_male and not saw_female and "son" or saw_female and not saw_male and "daughter" or
"son/daughter"
table.insert(meaningsegs, ("“%s of %s”"):format(child, parenttext))
end
local meaningtext = m_table.serialCommaJoin(meaningsegs, {conj = "or"})
local eqtext = get_eqtext(args)
local function ins(txt)
table.insert(textsegs, txt)
end
ins("<span class='use-with-mention'>")
-- If gender is supplied, it goes before the specified adjective in adj=. The only value of gender that uses "an" is
-- "unknown-gender" (note that "unisex" wouldn't use it but in any case we map "unisex" to "common-gender"). If gender
-- isn't supplied, look at the first letter of the value of adj= if supplied; otherwise, the article is always "a"
-- because the word "surname", "patronymic" or "matronymic" follows. Capitalize "A"/"An" if English.
local article
if args.A then
article = args.A
else
article = #genders > 0 and genders[1] == "unknown-gender" and "an" or
#genders == 0 and adj and require(en_utilities_module).get_indefinite_article(adj) or
"a"
if langcode == "en" and not args.nocap then
article = mw.getContentLanguage():ucfirst(article)
end
end
ins(article .. " ")
if #genders > 0 then
ins(table.concat(genders, " or ") .. " ")
end
if adj then
ins(adj .. " ")
end
ins("[[" .. iargs.type .. "]]")
local need_comma = false
if xlittext ~= "" then
ins(", " .. xlittext)
need_comma = true
end
local from_catparts = {}
if args.from then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("fromtype"))
local textseg, this_catparts = get_fromtext(lang, args)
for _, catpart in ipairs(this_catparts) do
m_table.insertIfNot(from_catparts, catpart)
end
ins(textseg)
end
if meaningtext ~= "" then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("meaningtype") .. "meaning " .. meaningtext)
end
if args.origin then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.origin .. " origin")
end
if args.usage then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.usage .. " usage")
end
if varoftext ~= "" then
ins(", " ..fetch_typetext("varoftype") .. "variant of " .. varoftext)
end
if clipoftext ~= "" then
ins(", " .. fetch_typetext("clipoftype") .. "clipping of " .. clipoftext)
end
if blendtext ~= "" then
ins(", " .. fetch_typetext("blendtype") .. "blend of " .. blendtext)
end
if args.popular then
ins(", " .. fetch_typetext("populartype") .. "popular " .. args.popular)
end
if mtext ~= "" then
ins(", " .. fetch_typetext("mtype") .. "masculine equivalent " .. mtext)
end
if ftext ~= "" then
ins(", " .. fetch_typetext("ftype") .. "feminine equivalent " .. ftext)
end
if eqtext ~= "" then
ins(", " .. fetch_typetext("eqtype") .. "equivalent to " .. eqtext)
end
if args.addl then
if args.addl:find("^;") then
ins(args.addl)
elseif args.addl:find("^_") then
ins(" " .. args.addl:sub(2))
else
ins(", " .. args.addl)
end
end
if varformtext ~= "" then
ins("; " .. fetch_typetext("varformtype") .. "variant form" ..
(numvarforms > 1 and "s" or "") .. " " .. varformtext)
end
ins("</span>")
local text = table.concat(textsegs)
if args.nocat then
return text
end
local categories = {}
local langname = lang:getCanonicalName() .. " "
local function insert_cats(g)
g = g and g .. " " or ""
table.insert(categories, langname .. g .. iargs.type .. "s")
for _, catpart in ipairs(from_catparts) do
table.insert(categories, langname .. g .. iargs.type .. "s from " .. catpart)
end
end
insert_cats(nil)
local function insert_cats_gender(g)
if g == "unknown-gender" then
return
end
if g == "common-gender" then
insert_cats_gender("male")
insert_cats_gender("female")
end
insert_cats(g)
end
for _, g in ipairs(genders) do
insert_cats_gender(g)
end
return text .. m_utilities.format_categories(categories, lang, args.sort, nil, force_cat)
end
-- The entry point for {{name translit}}, {{name respelling}}, {{name obor}} and {{foreign name}}.
function export.name_translit(frame)
local boolean = {type = "boolean"}
local iargs = require("Module:parameters").process(frame.args, {
["desctext"] = {required = true},
["obor"] = boolean,
["foreign_name"] = boolean,
})
local parent_args = frame:getParent().args
local params = {
[1] = {required = true, type = "language", template_default = "en"},
[2] = {required = true, type = "language", sublist = true, template_default = "ru"},
[3] = {list = true, allow_holes = true},
["type"] = {required = true, set = translit_name_type_list, sublist = true, default = "patronymic"},
["dim"] = boolean,
["aug"] = boolean,
["nocap"] = boolean,
["addl"] = true,
["sort"] = true,
["pagename"] = true,
["nocat"] = boolean,
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "q", "l", "ref"}},
{param = {"xlit", "eq"}},
}
local names, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 3,
track_module = "names/name translit",
disallow_custom_separators = true,
-- Use the first source language as the language of the specified names.
lang = function(args) return args[2][1] end,
sc = "sc.default",
}
local lang = args[1]
local langcode = lang:getCode()
local sources = args[2]
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local textsegs = {}
local function ins(txt)
table.insert(textsegs, txt)
end
ins("<span class='use-with-mention'>")
local desctext = iargs.desctext
if langcode == "en" and not args.nocap then
desctext = mw.getContentLanguage():ucfirst(desctext)
end
ins(desctext .. " ")
if not iargs.foreign_name then
ins("of ")
end
local langsegs = {}
for i, source in ipairs(sources) do
local sourcename = source:getCanonicalName()
local function get_source_link()
local term_to_link = names[1] and names[1].term or pagename
-- We link the language name to either the first specified name or the pagename, in the following
-- circumstances:
-- (1) More than one language was given along with at least one name; or
-- (2) We're handling {{foreign name}} or {{name obor}}, and no name was given.
-- The reason for (1) is that if more than one language was given, we want a link to the name
-- in each language, as the name that's displayed is linked only to the first specified language.
-- However, if only one language was given, linking the language to the name is redundant.
-- The reason for (2) is that {{foreign name}} is often used when the name in the destination language
-- is spelled the same as the name in the source language (e.g. [[Clinton]] or [[Obama]] in Italian),
-- and in that case no name will be explicitly specified but we still want a link to the name in the
-- source language. The reason we restrict this to {{foreign name}} or {{name obor}}, not to
-- {{name translit}} or {{name respelling}}, is that {{name translit}} and {{name respelling}} ought to be
-- used for names spelled differently in the destination language (either transliterated or respelled), so
-- assuming the pagename is the name in the source language is wrong.
if names[1] and #sources > 1 or (iargs.foreign_name or iargs.obor) and not names[1] then
return m_links.language_link{
lang = sources[i], term = term_to_link, alt = sourcename, tr = "-"
}
else
return sourcename
end
end
if i == 1 and not iargs.foreign_name then
-- If at least one name is given, we say "A transliteration of the LANG surname FOO", linking LANG to FOO.
-- Otherwise we say "A transliteration of a LANG surname".
if names[1] then
table.insert(langsegs, "the " .. get_source_link())
else
table.insert(langsegs, require(en_utilities_module).add_indefinite_article(sourcename))
end
else
table.insert(langsegs, get_source_link())
end
end
local langseg_text = m_table.serialCommaJoin(langsegs, {conj = "or"})
local augdim_text
if args.dim then
augdim_text = " [[diminutive]]"
elseif args.aug then
augdim_text = " [[augmentative]]"
else
augdim_text = ""
end
local nametype_linked = {}
for _, nametype in ipairs(args["type"]) do
if nametype == "surname" or nametype == "patronymic" then
table.insert(nametype_linked, "[[" .. nametype .. "]]")
elseif nametype == "male given name" then
table.insert(nametype_linked, "male [[given name]]")
elseif nametype == "female given name" then
table.insert(nametype_linked, "female [[given name]]")
elseif nametype == "unisex given name" then
table.insert(nametype_linked, "unisex [[given name]]")
else
table.insert(nametype_linked, nametype)
end
end
local nametype_text = m_table.serialCommaJoin(nametype_linked) .. augdim_text
if not iargs.foreign_name then
ins(langseg_text .. " ")
ins(nametype_text)
if names[1] then
ins(" ")
end
else
ins(nametype_text)
ins(" in " .. langseg_text)
if names[1] then
ins(", ")
end
end
local linked_names = {}
local embedded_comma = false
for _, name in ipairs(names) do
local linked_name = m_links.full_link(name, "term")
if name.q and name.q[1] or name.qq and name.qq[1] or name.l and name.l[1] or name.ll and name.ll[1] or
name.refs and name.refs[1] then
linked_name = require(pron_qualifier_module).format_qualifiers {
lang = name.lang,
text = linked_name,
q = name.q,
qq = name.qq,
l = name.l,
ll = name.ll,
refs = name.refs,
raw = true,
}
end
if name.xlit then
embedded_comma = true
linked_name = linked_name .. ", " .. m_links.language_link { lang = enlang, term = name.xlit }
end
if name.eq then
embedded_comma = true
linked_name = linked_name .. ", equivalent to " .. m_links.language_link { lang = enlang, term = name.eq }
end
table.insert(linked_names, linked_name)
end
if embedded_comma then
ins(table.concat(linked_names, "; or of "))
else
ins(m_table.serialCommaJoin(linked_names, {conj = "or"}))
end
if args.addl then
if args.addl:find("^;") then
ins(args.addl)
elseif args.addl:find("^_") then
ins(" " .. args.addl:sub(2))
else
ins(", " .. args.addl)
end
end
ins("</span>")
local text = table.concat(textsegs)
if args.nocat then
return text
end
local categories = {}
local function inscat(cat)
table.insert(categories, lang:getFullName() .. " " .. cat)
end
for _, nametype in ipairs(args.type) do
local function insert_cats(dimaugof)
local function insert_cats_type(ty)
if ty == "unisex given name" then
insert_cats_type("male given name")
insert_cats_type("female given name")
end
for _, source in ipairs(sources) do
inscat("renderings of " .. source:getCanonicalName() .. " " .. dimaugof .. ty .. "s")
inscat("terms derived from " .. source:getCanonicalName())
inscat("terms borrowed from " .. source:getCanonicalName())
if iargs.obor then
inscat("orthographic borrowings from " .. source:getCanonicalName())
end
if source:getCode() ~= source:getFullCode() then
-- etymology language
inscat("renderings of " .. source:getFullName() .. " " .. dimaugof .. ty .. "s")
end
end
end
insert_cats_type(nametype)
end
insert_cats("")
if args.dim then
insert_cats("diminutives of ")
end
if args.aug then
insert_cats("augmentatives of ")
end
end
return text .. m_utilities.format_categories(categories, lang, args.sort, nil, force_cat)
end
return export
b9jbhtx95ntspbgglugla9oyxockhi0
88400
88399
2026-07-27T00:16:24Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:names]]
88399
Scribunto
text/plain
local export = {}
local m_languages = require("Module:languages")
local m_links = require("Module:links")
local m_utilities = require("Module:utilities")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local parameter_utilities_module = "Module:parameter utilities"
local parse_interface_module = "Module:parse interface"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local enlang = m_languages.getByCode("en")
local rsubn = m_str_utils.gsub
local rsplit = m_str_utils.split
local u = m_str_utils.char
local function rsub(str, from, to)
return (rsubn(str, from, to))
end
local TEMP_LESS_THAN = u(0xFFF2)
local force_cat = false -- for testing
--[=[
FIXME:
1. from=the Bible (DONE)
2. origin=18th century [DONE]
3. popular= (DONE)
4. varoftype= (DONE)
5. eqtype= [DONE]
6. dimoftype= [DONE]
7. from=de:Elisabeth (same language) (DONE)
8. blendof=, blendof2= [DONE]
9. varform, dimform [DONE]
10. from=English < Latin [DONE]
11. usage=rare -> categorize as rare?
12. dimeq= (also vareq=?) [DONE]
13. fromtype= [DONE]
14. <tr:...> and similar params [DONE]
]=]
-- Used in category code; name types which are full-word end-matching substrings of longer name types (e.g. "surnames"
-- of "male surnames", but not "male surnames" of "female surnames" because "male" only matches a part of the word
-- "female") should follow the longer name.
export.personal_name_types = {
"male surnames", "female surnames", "common-gender surnames", "surnames",
"patronymics", "matronymics",
}
export.personal_name_type_set = m_table.listToSet(export.personal_name_types)
export.given_name_genders = {
male = {type = "human"},
female = {type = "human"},
unisex = {type = "human", cat = {"male given names", "female given names", "unisex given names"}, article = "a"},
["unknown-gender"] = {type = "human", cat = {}, track = true},
animal = {type = "animal", track = true},
cat = {type = "animal"},
cow = {type = "animal"},
dog = {type = "animal"},
horse = {type = "animal"},
pig = {type = "animal"},
}
local function get_given_name_cats(gender, props)
local cats = props.cat
if not cats then
if props.type == "animal" then
cats = {gender .. " names"}
else
cats = {gender .. " given names"}
end
end
return cats
end
do
local function do_cat(cat)
if not export.personal_name_type_set[cat] then
export.personal_name_type_set[cat] = true
table.insert(export.personal_name_types, cat)
end
end
for gender, props in pairs(export.given_name_genders) do
local cats = get_given_name_cats(gender, props)
for _, cat in ipairs(cats) do
do_cat("diminutives of " .. cat)
do_cat("augmentatives of " .. cat)
do_cat(cat)
end
end
do_cat("given names")
end
local translit_name_type_list = {
"surname", "male given name", "female given name", "unisex given name",
"patronymic"
}
local function track(page)
require("Module:debug").track("names/" .. page)
end
-- Get raw text, for use in computing the indefinite article. Use get_plaintext() in [[Module:utilities]] and also
-- remove parens that may surround qualifier or label text preceding a term.
local function get_rawtext(text)
text = m_utilities.get_plaintext(text)
text = text:gsub("[()%[%]]", "")
return text
end
--[=[
Parse a term and associated properties. This works with parameters of the form 'Karlheinz' or
'Kunigunde<q:medieval, now rare>' or 'non:Óláfr' or 'ru:Фру́нзе<tr:Frúnzɛ><q:rare>' where the modifying properties
are contained in <...> specifications after the term. `term` is the full parameter value including any angle brackets
and colons; `paramname` is the name of the parameter that this value comes from, for error purposes; `deflang` is a
language object used in the return value when the language isn't specified (e.g. in the examples 'Karlheinz' and
'Kunigunde<q:medieval, now rare>' above); `allow_explicit_lang` indicates whether the language can be explicitly given
(e.g. in the examples 'non:Óláfr' or 'ru:Фру́нзе<tr:Frúnzɛ><q:rare>' above).
Normally the return value is a terminfo object that can be passed to full_link() in [[Module:links]]), additionally
with optional fields `.q`, `.qq`, `.l`, `.ll`, `.refs` and `.eq` (a list of objects of the same form as the returned
terminfo object. However, if `allow_multiple_terms` is given, multiple comma-separated names can be given in `term`,
and the return value is a list of objects of the form described just above.
]=]
local function parse_term_with_annotations(term, paramname, deflang, allow_explicit_lang, allow_multiple_terms)
local param_mods = require(parameter_utilities_module).construct_param_mods {
{group = {"link", "l", "q", "ref"}},
{param = "eq", convert = function(eqval, parse_err)
return parse_term_with_annotations(eqval, paramname .. ".eq", enlang, false, "allow multiple terms")
end},
}
local function generate_obj(term, parse_err)
local termlang
if allow_explicit_lang then
local actual_term
actual_term, termlang = require(parse_interface_module).parse_term_with_lang {
term = term,
parse_err = parse_err,
paramname = paramname,
}
term = actual_term or term
end
return {
term = term,
lang = termlang or deflang,
}
end
return require(parse_interface_module).parse_inline_modifiers(term, {
param_mods = param_mods,
paramname = paramname,
generate_obj = generate_obj,
splitchar = allow_multiple_terms and "," or nil,
})
end
--[=[
Link a single term. If `do_language_link` is given and a given term's language is English, the link will be constructed
using language_link() in [[Module:links]]; otherwise, with full_link(). `termobj` is an object as returned by
parse_term_with_annotations(), i.e. it is suitable for passing to [[Module:links]] and additionally contains optional
fields `.q`, `.qq`, `.l`, `.ll`, `.refs` and `.eq` (a list of objects of the same form as `termobj`).
]=]
local function link_one_term(termobj, do_language_link)
local link
if do_language_link and termobj.lang:getCode() == "en" then
link = m_links.language_link(termobj)
else
link = m_links.full_link(termobj)
end
if termobj.q and termobj.q[1] or termobj.qq and termobj.qq[1] or
termobj.l and termobj.l[1] or termobj.ll and termobj.ll[1] or termobj.refs and termobj.refs[1] then
link = require(pron_qualifier_module).format_qualifiers {
lang = termobj.lang,
text = link,
q = termobj.q,
qq = termobj.qq,
l = termobj.l,
ll = termobj.ll,
refs = termobj.refs,
}
end
if termobj.eq then
local eqtext = {}
for _, eqobj in ipairs(termobj.eq) do
table.insert(eqtext, link_one_term(eqobj, true))
end
link = link .. " [=" .. m_table.serialCommaJoin(eqtext, {conj = "or"}) .. "]"
end
return link
end
--[=[
Link the terms in `terms`, and join them using the conjunction in `conj` (defaulting to "or"). Joining is done using
serialCommaJoin() in [[Module:table]], so that e.g. two terms are joined as "TERM or TERM" while three terms are joined
as "TERM, TERM or TERM" with special CSS spans before the final "or" to allow an "Oxford comma" to appear if configured
appropriately. (However, if `conj` is the special value ", ", joining is done directly using that value.)
If `include_langname` is given, the language of the first term will be prepended to the joined terms. If
`do_language_link` is given and a given term's language is English, the link will be constructed using language_link()
in [[Module:links]]; otherwise, with full_link(). Each term in `terms` is an object as returned by
parse_term_with_annotations().
]=]
local function join_terms(terms, include_langname, do_language_link, conj)
local links = {}
local langnametext
for _, termobj in ipairs(terms) do
if include_langname and not langnametext then
langnametext = termobj.lang:getCanonicalName() .. " "
end
table.insert(links, link_one_term(termobj, do_language_link))
end
local joined_terms
if conj == ", " then
joined_terms = table.concat(links, conj)
else
joined_terms = m_table.serialCommaJoin(links, {conj = conj or "or"})
end
return (langnametext or "") .. joined_terms
end
--[=[
Gather the parameters for multiple names and link each name using full_link() (for foreign names) or language_link()
(for English names), joining the names using serialCommaJoin() in [[Module:table]] with the conjunction `conj`
(defaulting to "or"). (However, if `conj` is the special value ", ", joining is done directly using that value.)
This can be used, for example, to fetch and join all the masculine equivalent names for a feminine given name. Each
name is specified using parameters beginning with `pname` in `args`, e.g. "m", "m2", "m3", etc. `lang` is a language
object specifying the language of the names (defaulting to English), for use in linking them. If `allow_explicit_lang`
is given, the language of the terms can be specified explicitly by prefixing a term with a language code, e.g.
'sv:Björn' or 'la:[[Nicolaus|Nīcolāī]]'. This function assumes that the parameters have already been parsed by
[[Module:parameters]] and gathered into lists, so that e.g. all "mN" parameters are in a list in args["m"].
]=]
local function join_names(lang, args, pname, conj, allow_explicit_lang)
local termobjs = {}
local do_language_link = false
if not lang then
lang = enlang
do_language_link = true
end
local function process_one_term(term, i)
for _, termobj in ipairs(parse_term_with_annotations(term, pname .. (i == 1 and "" or i), lang,
allow_explicit_lang, "allow multiple terms")) do
table.insert(termobjs, termobj)
end
end
if not args[pname] then
return "", 0
elseif type(args[pname]) == "table" then
for i, term in ipairs(args[pname]) do
process_one_term(term, i)
end
else
process_one_term(args[pname], 1)
end
return join_terms(termobjs, nil, do_language_link, conj), #termobjs
end
local function get_eqtext(args)
local eqsegs = {}
local lastlang = nil
local last_eqseg = {}
local function process_one_term(term, i)
for _, termobj in ipairs(parse_term_with_annotations(term, "eq" .. (i == 1 and "" or i), enlang,
"allow explicit lang", "allow multiple terms")) do
local termlang = termobj.lang:getCode()
if lastlang and lastlang ~= termlang then
if #last_eqseg > 0 then
table.insert(eqsegs, last_eqseg)
end
last_eqseg = {}
end
lastlang = termlang
table.insert(last_eqseg, termobj)
end
end
if type(args.eq) == "table" then
for i, term in ipairs(args.eq) do
process_one_term(term, i)
end
elseif type(args.eq) == "string" then
process_one_term(args.eq, 1)
end
if #last_eqseg > 0 then
table.insert(eqsegs, last_eqseg)
end
local eqtextsegs = {}
for _, eqseg in ipairs(eqsegs) do
table.insert(eqtextsegs, join_terms(eqseg, "include langname"))
end
return m_table.serialCommaJoin(eqtextsegs, {conj = "or"})
end
local function get_fromtext(lang, args)
local catparts = {}
local fromsegs = {}
local i = 1
local function parse_from(from)
local unrecognized = false
local prefix, suffix
if from == "surnames" or from == "given names" or from == "nicknames" or from == "place names" or from == "common nouns" or from == "month names" then
prefix = "transferred from the "
suffix = from:gsub("s$", "")
table.insert(catparts, from)
elseif from == "patronymics" or from == "matronymics" or from == "coinages" then
prefix = "originating "
suffix = "as a " .. from:gsub("s$", "")
table.insert(catparts, from)
elseif from == "occupations" or from == "ethnonyms" then
prefix = "originating "
suffix = "as an " .. from:gsub("s$", "")
table.insert(catparts, from)
elseif from == "the Bible" then
prefix = "originating "
suffix = "from the Bible"
table.insert(catparts, from)
else
prefix = "from "
if from:find(":") then
local termobj = parse_term_with_annotations(from, "from" .. (i == 1 and "" or i), lang,
"allow explicit lang")
local fromlangname = ""
if termobj.lang:getCode() ~= lang:getCode() then
-- If name is derived from another name in the same language, don't include lang name after text
-- "from " or create a category like "German male given names derived from German".
local canonical_name = termobj.lang:getCanonicalName()
fromlangname = canonical_name .. " "
table.insert(catparts, canonical_name)
end
suffix = fromlangname .. link_one_term(termobj)
else
local family = from:match("^(.+) languages$") or
from:match("^.+ Languages$") or
from:match("^.+ [Ll]ects$")
if family then
if require("Module:families").getByCanonicalName(family) then
table.insert(catparts, from)
else
unrecognized = true
end
suffix = "the " .. from
else
if m_languages.getByCanonicalName(from, nil, "allow etym") then
table.insert(catparts, from)
else
unrecognized = true
end
suffix = from
end
end
end
if unrecognized then
track("unrecognized from")
track("unrecognized from/" .. from)
end
return prefix, suffix
end
local last_fromseg = nil
local put = require(parse_utilities_module)
local from_args = args.from or {}
if type(from_args) == "string" then
from_args = {from_args}
end
while from_args[i] do
-- We may have multiple comma-separated items, each of which may have multiple items separated by a
-- space-delimited < sign, each of which may have inline modifiers with embedded commas in them. To handle
-- this correctly, first replace space-delimited < signs with a special character, then split on balanced
-- <...> and [...] signs, then split on comma, then rejoin the stuff between commas. We will then split on
-- TEMP_LESS_THAN (the replacement for space-delimited < signs) and reparse.
local rawfroms = rsub(from_args[i], "%s+<%s+", TEMP_LESS_THAN)
local segments = put.parse_multi_delimiter_balanced_segment_run(rawfroms, {{"<", ">"}, {"[", "]"}})
local comma_separated_groups = put.split_alternating_runs_on_comma(segments)
for j, comma_separated_group in ipairs(comma_separated_groups) do
comma_separated_groups[j] = table.concat(comma_separated_group)
end
for _, rawfrom in ipairs(comma_separated_groups) do
local froms = rsplit(rawfrom, TEMP_LESS_THAN)
if #froms == 1 then
local prefix, suffix = parse_from(froms[1])
if last_fromseg and (last_fromseg.has_multiple_froms or last_fromseg.prefix ~= prefix) then
table.insert(fromsegs, last_fromseg)
last_fromseg = nil
end
if not last_fromseg then
last_fromseg = {prefix = prefix, suffixes = {}}
end
table.insert(last_fromseg.suffixes, suffix)
else
if last_fromseg then
table.insert(fromsegs, last_fromseg)
last_fromseg = nil
end
local first_suffixpart = ""
local rest_suffixparts = {}
for j, from in ipairs(froms) do
local prefix, suffix = parse_from(from)
if j == 1 then
first_suffixpart = prefix .. suffix
else
table.insert(rest_suffixparts, prefix .. suffix)
end
end
local full_suffix = first_suffixpart .. " [in turn " .. table.concat(rest_suffixparts, ", in turn ") .. "]"
last_fromseg = {prefix = "", has_multiple_froms = true, suffixes = {full_suffix}}
end
end
i = i + 1
end
table.insert(fromsegs, last_fromseg)
local fromtextsegs = {}
for _, fromseg in ipairs(fromsegs) do
table.insert(fromtextsegs, fromseg.prefix .. m_table.serialCommaJoin(fromseg.suffixes, {conj = "or"}))
end
return m_table.serialCommaJoin(fromtextsegs, {conj = "or"}), catparts
end
local function parse_given_name_genders(genderspec)
if export.given_name_genders[genderspec] then -- optimization
return {{
type = genderspec,
props = export.given_name_genders[genderspec],
}}, export.given_name_genders[genderspec].type == "animal"
end
local is_animal = nil
local param_mods = require(parameter_utilities_module).construct_param_mods {
{group = {"l", "q", "ref"}},
{param = {"text", "article"}},
}
local function generate_obj(term, parse_err)
if not export.given_name_genders[term] then
local valid_genders = {}
for k, _ in pairs(export.given_name_genders) do
table.insert(valid_genders, k)
end
table.sort(valid_genders)
parse_err(("Unrecognized gender '%s': valid genders are %s"):format(
term, table.concat(valid_genders, ", ")))
end
return {
type = term,
props = export.given_name_genders[term],
}
end
local retval = require(parse_interface_module).parse_inline_modifiers(genderspec, {
param_mods = param_mods,
paramname = "2",
generate_obj = generate_obj,
splitchar = ",",
})
for _, spec in ipairs(retval) do
local this_is_animal = spec.props.type == "animal"
if is_animal == nil then
is_animal = this_is_animal
elseif is_animal ~= this_is_animal then
error("Can't mix animal and human genders")
end
end
return retval, is_animal
end
local function generate_given_name_genders(lang, genders)
local parts = {}
for _, spec in ipairs(genders) do
local text
if spec.text then
-- NOTE: This assumes no % sign in the gender type, which seems safe.
text = spec.text:gsub("%+", spec.type)
else
if spec.props.type == "animal" then
text = "[[" .. spec.type .. "]]"
else
text = spec.type
end
end
if spec.q and spec.q[1] or spec.qq and spec.qq[1] or spec.l and spec.l[1] or spec.ll and spec.ll[1] or
spec.refs and spec.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = text,
q = spec.q,
qq = spec.qq,
l = spec.l,
ll = spec.ll,
refs = spec.refs,
raw = true,
}
end
table.insert(parts, text)
end
local retval = m_table.serialCommaJoin(parts, {conj = "or"})
local article = genders[1].article
if not article and not genders[1].text and not genders[1].q and not genders[1].l then
article = genders[1].props.article
end
if not article then
article = require(en_utilities_module).get_indefinite_article(get_rawtext(retval))
end
return retval, article
end
-- The entry point for {{given name}}.
function export.given_name(frame)
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
local lang_index = compat and "lang" or 1
local boolean = {type = "boolean"}
local list = {list = true}
local args = require("Module:parameters").process(parent_args, {
[lang_index] = {required = true, type = "language", default = "und"},
["gender"] = {default = "unknown-gender"},
[1 + offset] = {alias_of = "gender"},
["usage"] = true,
["origin"] = true,
["popular"] = true,
["populartype"] = true,
["meaning"] = list,
["meaningtype"] = true,
["addl"] = true,
["nocap"] = boolean,
-- initial article: A or An
["A"] = true,
["sort"] = true,
["from"] = true,
[2 + offset] = {alias_of = "from"},
["fromtype"] = true,
["xlit"] = true,
["eq"] = true,
["eqtype"] = true,
["varof"] = true,
["varoftype"] = true,
["var"] = {alias_of = "varof"},
["vartype"] = {alias_of = "varoftype"},
["varform"] = true,
["varformtype"] = true,
["dimof"] = true,
["dimoftype"] = true,
["dim"] = {alias_of = "dimof"},
["dimtype"] = {alias_of = "dimoftype"},
["dimform"] = true,
["dimformtype"] = true,
["augof"] = true,
["augoftype"] = true,
["aug"] = {alias_of = "augof"},
["augtype"] = {alias_of = "augoftype"},
["augform"] = true,
["augformtype"] = true,
["clipof"] = true,
["clipoftype"] = true,
["blend"] = true,
["blendtype"] = true,
["m"] = true,
["mtype"] = true,
["f"] = true,
["ftype"] = true,
["nocat"] = boolean,
})
local textsegs = {}
local lang = args[lang_index]
local langcode = lang:getCode()
local function fetch_typetext(param)
return args[param] and args[param] .. " " or ""
end
local genders, is_animal = parse_given_name_genders(args.gender)
local dimoftext, numdimofs = join_names(lang, args, "dimof")
local augoftext, numaugofs = join_names(lang, args, "augof")
local xlittext = join_names(nil, args, "xlit")
local blendtext = join_names(lang, args, "blend", "and")
local varoftext = join_names(lang, args, "varof")
local clipoftext = join_names(lang, args, "clipof")
local mtext = join_names(lang, args, "m")
local ftext = join_names(lang, args, "f")
local varformtext, numvarforms = join_names(lang, args, "varform", ", ")
local dimformtext, numdimforms = join_names(lang, args, "dimform", ", ")
local augformtext, numaugforms = join_names(lang, args, "augform", ", ")
local meaningsegs = {}
for _, meaning in ipairs(args.meaning) do
table.insert(meaningsegs, '“' .. meaning .. '”')
end
local meaningtext = m_table.serialCommaJoin(meaningsegs, {conj = "or"})
local eqtext = get_eqtext(args)
local function ins(txt)
table.insert(textsegs, txt)
end
local dimoftype = args.dimoftype
local augoftype = args.augoftype
local added_text = nil
if numdimofs > 0 then
added_text = (dimoftype and dimoftype .. " " or "") .. "[[diminutive]]" ..
(xlittext ~= "" and ", " .. xlittext .. "," or "") .. " of "
elseif numaugofs > 0 then
added_text = (augoftype and augoftype .. " " or "") .. "[[augmentative]]" ..
(xlittext ~= "" and ", " .. xlittext .. "," or "") .. " of "
end
local force_plural = false
if added_text ~= nil then
if args.dimof == "-" then
dimoftext = ""
force_plural = true
else
added_text = added_text .. "the "
end
ins(added_text)
end
local article = args.A
if not article and textsegs[1] then
article = require(en_utilities_module).get_indefinite_article(textsegs[1])
end
if not is_animal then
local gendertext, gender_article = generate_given_name_genders(lang, genders)
article = article or gender_article
ins(gendertext)
ins(" ")
end
ins((numdimofs > 1 or numaugofs > 1 or force_plural) and "[[given name|given names]]" or "[[given name]]")
article = article or "a" -- if no article set yet, it's "a" based on "given name"
if langcode == "en" and not args.nocap then
article = mw.getContentLanguage():ucfirst(article)
end
local need_comma = false
if numdimofs > 0 then
ins(" " .. dimoftext)
need_comma = not is_animal
elseif numaugofs > 0 then
ins(" " .. augoftext)
need_comma = not is_animal
elseif xlittext ~= "" then
ins(", " .. xlittext)
need_comma = true
end
if is_animal then
if need_comma then
ins(",")
end
need_comma = true
ins(" for ")
local gendertext, gender_article = generate_given_name_genders(lang, genders)
ins(gender_article)
ins(" ")
ins(gendertext)
end
local from_catparts = {}
if args.from then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("fromtype"))
local textseg, this_catparts = get_fromtext(lang, args)
for _, catpart in ipairs(this_catparts) do
m_table.insertIfNot(from_catparts, catpart)
end
ins(textseg)
end
if meaningtext ~= "" then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("meaningtype") .. "meaning " .. meaningtext)
end
if args.origin then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.origin .. " origin")
end
if args.usage then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.usage .. " usage")
end
if varoftext ~= "" then
ins(", " ..fetch_typetext("varoftype") .. "variant of " .. varoftext)
end
if clipoftext ~= "" then
ins(", " .. fetch_typetext("clipoftype") .. "clipping of " .. clipoftext)
end
if blendtext ~= "" then
ins(", " .. fetch_typetext("blendtype") .. "blend of " .. blendtext)
end
if args.popular then
ins(", " .. fetch_typetext("populartype") .. "popular " .. args.popular)
end
if mtext ~= "" then
ins(", " .. fetch_typetext("mtype") .. "masculine equivalent " .. mtext)
end
if ftext ~= "" then
ins(", " .. fetch_typetext("ftype") .. "feminine equivalent " .. ftext)
end
if eqtext ~= "" then
ins(", " .. fetch_typetext("eqtype") .. "equivalent to " .. eqtext)
end
if args.addl then
if args.addl:find("^;") then
ins(args.addl)
elseif args.addl:find("^_") then
ins(" " .. args.addl:sub(2))
else
ins(", " .. args.addl)
end
end
if varformtext ~= "" then
ins("; " .. fetch_typetext("varformtype") .. "variant form" .. (numvarforms > 1 and "s" or "") .. " " ..
varformtext)
end
if dimformtext ~= "" then
ins("; " .. fetch_typetext("dimformtype") .. "diminutive form" .. (numdimforms > 1 and "s" or "") .. " " ..
dimformtext)
end
if augformtext ~= "" then
ins("; " .. fetch_typetext("augformtype") .. "augmentative form" .. (numaugforms > 1 and "s" or "") .. " " ..
augformtext)
end
local text = "<span class='use-with-mention'>" .. article .. " " .. table.concat(textsegs) .. "</span>"
if args.nocat then
return text
end
local categories = {}
local langname = lang:getCanonicalName() .. " "
local function insert_cats(dimaugof)
if dimaugof == "" and genders[1].props.type == "human" then
-- No category such as "English diminutives of given names"
table.insert(categories, langname .. "given names")
end
local function insert_cat(cat)
table.insert(categories, langname .. dimaugof .. cat)
for _, catpart in ipairs(from_catparts) do
table.insert(categories, langname .. dimaugof .. cat .. " from " .. catpart)
end
end
for _, spec in ipairs(genders) do
local typ = spec.type
if spec.props.track then
track(typ)
end
local cats = get_given_name_cats(spec.type, spec.props)
for _, cat in ipairs(cats) do
insert_cat(cat)
end
end
end
insert_cats("")
if numdimofs > 0 then
insert_cats("diminutives of ")
elseif numaugofs > 0 then
insert_cats("augmentatives of ")
end
return text .. m_utilities.format_categories(categories, lang, args.sort, nil, force_cat)
end
-- The entry point for {{surname}}, {{patronymic}} and {{matronymic}}.
function export.surname(frame)
local iargs = require("Module:parameters").process(frame.args, {
["type"] = {required = true, set = {"surname", "patronymic", "matronymic"}},
})
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
if parent_args.dot or parent_args.nodot then
error("dot= and nodot= are no longer supported in [[Template:" .. iargs.type .. "]] because a trailing " ..
"period is no longer added by default; if you want it, add it explicitly after the template")
end
local lang_index = compat and "lang" or 1
local boolean = {type = "boolean"}
local list = {list = true}
local gender_arg = iargs.type == "surname" and "g" or 1 + offset
local adj_arg = iargs.type == "surname" and 1 + offset or 2 + offset
local args = require("Module:parameters").process(parent_args, {
[lang_index] = {required = true, type = "language", template_default = "und"},
[gender_arg] = iargs.type == "surname" and true or {required = true, template_default = "unknown"}, -- gender(s)
[adj_arg] = true, -- adjective/qualifier
["usage"] = true,
["origin"] = true,
["popular"] = true,
["populartype"] = true,
["meaning"] = list,
["meaningtype"] = true,
["parent"] = true,
["addl"] = true,
["nocap"] = boolean,
-- initial article: by default A or An (English), a or an (otherwise)
["A"] = true,
["sort"] = true,
["from"] = true,
["fromtype"] = true,
["xlit"] = true,
["eq"] = true,
["eqtype"] = true,
["varof"] = true,
["varoftype"] = true,
["var"] = {alias_of = "varof"},
["vartype"] = {alias_of = "varoftype"},
["varform"] = true,
["varformtype"] = true,
["clipof"] = true,
["clipoftype"] = true,
["blend"] = true,
["blendtype"] = true,
["m"] = true,
["mtype"] = true,
["f"] = true,
["ftype"] = true,
["nocat"] = boolean,
})
local textsegs = {}
local lang = args[lang_index]
local langcode = lang:getCode()
local function fetch_typetext(param)
return args[param] and args[param] .. " " or ""
end
local saw_male = false
local saw_female = false
local genders = {}
if args[gender_arg] then
for _, g in ipairs(require(parse_interface_module).split_on_comma(args[gender_arg])) do
if g == "unknown" or g == "unknown gender" or g == "unknown-gender" or g == "?" then
g = "unknown-gender"
track("unknown gender")
elseif g == "unisex" or g == "common gender" or g == "common-gender" or g == "c" then
g = "common-gender"
saw_male = true
saw_female = true
elseif g == "m" or g == "male" then
g = "male"
saw_male = true
elseif g == "f" or g == "female" then
g = "female"
saw_female = true
else
error("Unrecognized gender: " .. g)
end
table.insert(genders, g)
end
end
local adj = args[adj_arg]
local xlittext = join_names(nil, args, "xlit")
local blendtext = join_names(lang, args, "blend", "and")
local varoftext = join_names(lang, args, "varof")
local clipoftext = join_names(lang, args, "clipof")
local mtext = join_names(lang, args, "m")
local ftext = join_names(lang, args, "f")
local parenttext = join_names(lang, args, "parent", nil, "allow explicit lang")
local varformtext, numvarforms = join_names(lang, args, "varform", ", ")
local meaningsegs = {}
for _, meaning in ipairs(args.meaning) do
table.insert(meaningsegs, '“' .. meaning .. '”')
end
if parenttext ~= "" then
local child = saw_male and not saw_female and "son" or saw_female and not saw_male and "daughter" or
"son/daughter"
table.insert(meaningsegs, ("“%s of %s”"):format(child, parenttext))
end
local meaningtext = m_table.serialCommaJoin(meaningsegs, {conj = "or"})
local eqtext = get_eqtext(args)
local function ins(txt)
table.insert(textsegs, txt)
end
ins("<span class='use-with-mention'>")
-- If gender is supplied, it goes before the specified adjective in adj=. The only value of gender that uses "an" is
-- "unknown-gender" (note that "unisex" wouldn't use it but in any case we map "unisex" to "common-gender"). If gender
-- isn't supplied, look at the first letter of the value of adj= if supplied; otherwise, the article is always "a"
-- because the word "surname", "patronymic" or "matronymic" follows. Capitalize "A"/"An" if English.
local article
if args.A then
article = args.A
else
article = #genders > 0 and genders[1] == "unknown-gender" and "an" or
#genders == 0 and adj and require(en_utilities_module).get_indefinite_article(adj) or
"a"
if langcode == "en" and not args.nocap then
article = mw.getContentLanguage():ucfirst(article)
end
end
ins(article .. " ")
if #genders > 0 then
ins(table.concat(genders, " or ") .. " ")
end
if adj then
ins(adj .. " ")
end
ins("[[" .. iargs.type .. "]]")
local need_comma = false
if xlittext ~= "" then
ins(", " .. xlittext)
need_comma = true
end
local from_catparts = {}
if args.from then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("fromtype"))
local textseg, this_catparts = get_fromtext(lang, args)
for _, catpart in ipairs(this_catparts) do
m_table.insertIfNot(from_catparts, catpart)
end
ins(textseg)
end
if meaningtext ~= "" then
if need_comma then
ins(",")
end
need_comma = true
ins(" " .. fetch_typetext("meaningtype") .. "meaning " .. meaningtext)
end
if args.origin then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.origin .. " origin")
end
if args.usage then
if need_comma then
ins(",")
end
need_comma = true
ins(" of " .. args.usage .. " usage")
end
if varoftext ~= "" then
ins(", " ..fetch_typetext("varoftype") .. "variant of " .. varoftext)
end
if clipoftext ~= "" then
ins(", " .. fetch_typetext("clipoftype") .. "clipping of " .. clipoftext)
end
if blendtext ~= "" then
ins(", " .. fetch_typetext("blendtype") .. "blend of " .. blendtext)
end
if args.popular then
ins(", " .. fetch_typetext("populartype") .. "popular " .. args.popular)
end
if mtext ~= "" then
ins(", " .. fetch_typetext("mtype") .. "masculine equivalent " .. mtext)
end
if ftext ~= "" then
ins(", " .. fetch_typetext("ftype") .. "feminine equivalent " .. ftext)
end
if eqtext ~= "" then
ins(", " .. fetch_typetext("eqtype") .. "equivalent to " .. eqtext)
end
if args.addl then
if args.addl:find("^;") then
ins(args.addl)
elseif args.addl:find("^_") then
ins(" " .. args.addl:sub(2))
else
ins(", " .. args.addl)
end
end
if varformtext ~= "" then
ins("; " .. fetch_typetext("varformtype") .. "variant form" ..
(numvarforms > 1 and "s" or "") .. " " .. varformtext)
end
ins("</span>")
local text = table.concat(textsegs)
if args.nocat then
return text
end
local categories = {}
local langname = lang:getCanonicalName() .. " "
local function insert_cats(g)
g = g and g .. " " or ""
table.insert(categories, langname .. g .. iargs.type .. "s")
for _, catpart in ipairs(from_catparts) do
table.insert(categories, langname .. g .. iargs.type .. "s from " .. catpart)
end
end
insert_cats(nil)
local function insert_cats_gender(g)
if g == "unknown-gender" then
return
end
if g == "common-gender" then
insert_cats_gender("male")
insert_cats_gender("female")
end
insert_cats(g)
end
for _, g in ipairs(genders) do
insert_cats_gender(g)
end
return text .. m_utilities.format_categories(categories, lang, args.sort, nil, force_cat)
end
-- The entry point for {{name translit}}, {{name respelling}}, {{name obor}} and {{foreign name}}.
function export.name_translit(frame)
local boolean = {type = "boolean"}
local iargs = require("Module:parameters").process(frame.args, {
["desctext"] = {required = true},
["obor"] = boolean,
["foreign_name"] = boolean,
})
local parent_args = frame:getParent().args
local params = {
[1] = {required = true, type = "language", template_default = "en"},
[2] = {required = true, type = "language", sublist = true, template_default = "ru"},
[3] = {list = true, allow_holes = true},
["type"] = {required = true, set = translit_name_type_list, sublist = true, default = "patronymic"},
["dim"] = boolean,
["aug"] = boolean,
["nocap"] = boolean,
["addl"] = true,
["sort"] = true,
["pagename"] = true,
["nocat"] = boolean,
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "q", "l", "ref"}},
{param = {"xlit", "eq"}},
}
local names, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 3,
track_module = "names/name translit",
disallow_custom_separators = true,
-- Use the first source language as the language of the specified names.
lang = function(args) return args[2][1] end,
sc = "sc.default",
}
local lang = args[1]
local langcode = lang:getCode()
local sources = args[2]
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local textsegs = {}
local function ins(txt)
table.insert(textsegs, txt)
end
ins("<span class='use-with-mention'>")
local desctext = iargs.desctext
if langcode == "en" and not args.nocap then
desctext = mw.getContentLanguage():ucfirst(desctext)
end
ins(desctext .. " ")
if not iargs.foreign_name then
ins("of ")
end
local langsegs = {}
for i, source in ipairs(sources) do
local sourcename = source:getCanonicalName()
local function get_source_link()
local term_to_link = names[1] and names[1].term or pagename
-- We link the language name to either the first specified name or the pagename, in the following
-- circumstances:
-- (1) More than one language was given along with at least one name; or
-- (2) We're handling {{foreign name}} or {{name obor}}, and no name was given.
-- The reason for (1) is that if more than one language was given, we want a link to the name
-- in each language, as the name that's displayed is linked only to the first specified language.
-- However, if only one language was given, linking the language to the name is redundant.
-- The reason for (2) is that {{foreign name}} is often used when the name in the destination language
-- is spelled the same as the name in the source language (e.g. [[Clinton]] or [[Obama]] in Italian),
-- and in that case no name will be explicitly specified but we still want a link to the name in the
-- source language. The reason we restrict this to {{foreign name}} or {{name obor}}, not to
-- {{name translit}} or {{name respelling}}, is that {{name translit}} and {{name respelling}} ought to be
-- used for names spelled differently in the destination language (either transliterated or respelled), so
-- assuming the pagename is the name in the source language is wrong.
if names[1] and #sources > 1 or (iargs.foreign_name or iargs.obor) and not names[1] then
return m_links.language_link{
lang = sources[i], term = term_to_link, alt = sourcename, tr = "-"
}
else
return sourcename
end
end
if i == 1 and not iargs.foreign_name then
-- If at least one name is given, we say "A transliteration of the LANG surname FOO", linking LANG to FOO.
-- Otherwise we say "A transliteration of a LANG surname".
if names[1] then
table.insert(langsegs, "the " .. get_source_link())
else
table.insert(langsegs, require(en_utilities_module).add_indefinite_article(sourcename))
end
else
table.insert(langsegs, get_source_link())
end
end
local langseg_text = m_table.serialCommaJoin(langsegs, {conj = "or"})
local augdim_text
if args.dim then
augdim_text = " [[diminutive]]"
elseif args.aug then
augdim_text = " [[augmentative]]"
else
augdim_text = ""
end
local nametype_linked = {}
for _, nametype in ipairs(args["type"]) do
if nametype == "surname" or nametype == "patronymic" then
table.insert(nametype_linked, "[[" .. nametype .. "]]")
elseif nametype == "male given name" then
table.insert(nametype_linked, "male [[given name]]")
elseif nametype == "female given name" then
table.insert(nametype_linked, "female [[given name]]")
elseif nametype == "unisex given name" then
table.insert(nametype_linked, "unisex [[given name]]")
else
table.insert(nametype_linked, nametype)
end
end
local nametype_text = m_table.serialCommaJoin(nametype_linked) .. augdim_text
if not iargs.foreign_name then
ins(langseg_text .. " ")
ins(nametype_text)
if names[1] then
ins(" ")
end
else
ins(nametype_text)
ins(" in " .. langseg_text)
if names[1] then
ins(", ")
end
end
local linked_names = {}
local embedded_comma = false
for _, name in ipairs(names) do
local linked_name = m_links.full_link(name, "term")
if name.q and name.q[1] or name.qq and name.qq[1] or name.l and name.l[1] or name.ll and name.ll[1] or
name.refs and name.refs[1] then
linked_name = require(pron_qualifier_module).format_qualifiers {
lang = name.lang,
text = linked_name,
q = name.q,
qq = name.qq,
l = name.l,
ll = name.ll,
refs = name.refs,
raw = true,
}
end
if name.xlit then
embedded_comma = true
linked_name = linked_name .. ", " .. m_links.language_link { lang = enlang, term = name.xlit }
end
if name.eq then
embedded_comma = true
linked_name = linked_name .. ", equivalent to " .. m_links.language_link { lang = enlang, term = name.eq }
end
table.insert(linked_names, linked_name)
end
if embedded_comma then
ins(table.concat(linked_names, "; or of "))
else
ins(m_table.serialCommaJoin(linked_names, {conj = "or"}))
end
if args.addl then
if args.addl:find("^;") then
ins(args.addl)
elseif args.addl:find("^_") then
ins(" " .. args.addl:sub(2))
else
ins(", " .. args.addl)
end
end
ins("</span>")
local text = table.concat(textsegs)
if args.nocat then
return text
end
local categories = {}
local function inscat(cat)
table.insert(categories, lang:getFullName() .. " " .. cat)
end
for _, nametype in ipairs(args.type) do
local function insert_cats(dimaugof)
local function insert_cats_type(ty)
if ty == "unisex given name" then
insert_cats_type("male given name")
insert_cats_type("female given name")
end
for _, source in ipairs(sources) do
inscat("renderings of " .. source:getCanonicalName() .. " " .. dimaugof .. ty .. "s")
inscat("terms derived from " .. source:getCanonicalName())
inscat("terms borrowed from " .. source:getCanonicalName())
if iargs.obor then
inscat("orthographic borrowings from " .. source:getCanonicalName())
end
if source:getCode() ~= source:getFullCode() then
-- etymology language
inscat("renderings of " .. source:getFullName() .. " " .. dimaugof .. ty .. "s")
end
end
end
insert_cats_type(nametype)
end
insert_cats("")
if args.dim then
insert_cats("diminutives of ")
end
if args.aug then
insert_cats("augmentatives of ")
end
end
return text .. m_utilities.format_categories(categories, lang, args.sort, nil, force_cat)
end
return export
b9jbhtx95ntspbgglugla9oyxockhi0
Mòideal:category tree/non-lemma forms
828
17730
88401
2026-03-12T02:59:44Z
en>Theknightwho
0
88401
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local en_utilities_module = "Module:en-utilities"
local insert = table.insert
local pluralize = require(en_utilities_module).pluralize
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local degrees = {
comparative = "that express a higher degree of an attribute when comparing one thing to another, or serve to set that thing apart from another",
superlative = "that express the highest possible degree of an attribute",
elative = "that, depending on the context, express either the comparative degree (a higher degree of an attribute when comparing one thing to another) or the superlative degree (the highest possible degree of an attribute)",
exaggerated = "that express the highest possible degree of an attribute (like the superlative degree), but with an additional level of emphasis",
excessive = "that express an excessive degree of some attribute",
equative = "that express the same or a similar degree of an attribute when comparing one thing to another",
}
local degree_pos = { "adjective", "adverb", "determiner", "pronoun" }
for _, pos in ipairs(degree_pos) do
local plpos = pluralize(pos)
for degree, desc in pairs(degrees) do
labels[degree .. " " .. plpos] = {
breadcrumb = degree,
description = "{{{langname}}} " .. plpos .. " " .. desc .. ".",
parents = {pos .. " forms"},
}
end
end
labels["non-lemma forms"] = {
description = "{{{langname}}} inflected forms of other [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
-- Handle specific types of non-lemma forms. Each spec is of the form {POS, PARENT_POS} where POS is the singular form
-- of a part of speech for which non-lemma forms exist (e.g. 'determiner' is listed because 'determiner forms' exist),
-- and PARENT_POS is the singular form of the parent category to add the category to. For example, the spec
-- {"circumfix", "morpheme"} means that 'circumfix forms' categories have the corresponding 'morpheme forms' categories
-- as their first parent. The second parent is the POS itself; e.g. 'morpheme forms' has 'morphemes' as its second
-- parent, with a sort key that places 'morpheme forms' at the beginning of the child categories. If PARENT_POS is
-- 'false', only the second parent appears as the parent. If a spec is a single string POS, the PARENT_POS defaults to
-- "non-lemma"; e.g. if the spec is "adjective", then 'adjective forms' categories have the corresponding
-- 'non-lemma forms' category as their first parent.
local specs = {
"adjective",
"adverb",
{"article", "determiner"},
{"circumfix", "morpheme"},
"classifier",
"clitic",
"conjunction",
"determiner",
{"infinitive", false},
"interjection",
"morpheme",
"noun",
"numeral",
"participle",
"particle",
{"past participle", "participle"},
"predicative",
{"prefix", "morpheme"},
"proper noun",
"postposition",
"preposition",
"pronoun",
{"suffix", "morpheme"},
"verb",
}
for degree in pairs(degrees) do
for _, pos in ipairs(degree_pos) do
insert(specs, {degree .. " " .. pos, false})
end
end
for _, spec in ipairs(specs) do
local pos, parent_pos
if type(spec) == "table" then
pos, parent_pos = unpack(spec)
else
pos = spec
end
if parent_pos == nil then
parent_pos = "non-lemma"
end
local plpos, parents, breadcrumb = pluralize(pos), {}
if parent_pos == false then -- parent is the POS ([POS] » Forms)
breadcrumb = "Forms"
else
insert(parents, parent_pos .. " forms")
end
insert(parents, {name = plpos, sort = "**"})
labels[pos .. " forms"] = {
breadcrumb = breadcrumb,
description = ("{{{langname}}} %s that are inflected to display grammatical relations other than the main form."):format(plpos),
parents = parents,
}
end
labels["active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action.",
parents = {"participles"},
}
labels["active adjectival participles"] = {
description = "{{{langname}}} participles that function as adjectives and express an agent actively performing an action.",
parents = {"participles", "adjectives"},
}
labels["adjectival participles"] = {
description = "{{{langname}}} participles that function as adjectives.",
parents = {"participles", "adjectives"},
}
labels["adjective construct forms"] = {
description = "{{{langname}}} adjectives that are inflected to modify a noun in a genitive construction.",
parents = {{name = "adjective forms", sort = "construct"}},
}
labels["adjective definite forms"] = {
description = "{{{langname}}} adjectives that are inflected to give attributes to specific and identifiable nouns.",
parents = {{name = "adjective forms", sort = "definite forms"}},
}
labels["adjective dual forms"] = {
description = "{{{langname}}} adjectives that are inflected to be quantified as two.",
parents = {{name = "adjective forms", sort = "dual forms"}},
}
labels["adjective feminine forms"] = {
description = "{{{langname}}} adjectives that are inflected to give attributes to nouns associated to female beings.",
parents = {{name = "adjective forms", sort = "feminine forms"}},
}
labels["adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs.",
parents = {"participles", "adverbs"},
}
labels["agent participles"] = {
description = "{{{langname}}} participles that express an agent by who something is done.",
parents = {"participles"},
}
labels["anterior adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action completed before the one expressed by the primary verb.",
parents = {"participles", "adverbs"},
}
labels["classifier singular forms"] = {
description = "{{{langname}}} classifiers that are inflected for singular number.",
parents = {"classifier forms"},
}
labels["collective plurals"] = {
description = "{{{langname}}} nominal plural forms with specifically collective semantics.",
parents = {"noun forms"},
}
labels["contemporary adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action occuring simultaneously with the one expressed by the primary verb.",
parents = {"participles", "adverbs"},
}
labels["converbs"] = {
description = "{{{langname}}} verb forms that build clauses which function as adverbials.",
parents = {"verb forms"},
}
labels["diminutive gerunds"] = {
description = "{{{langname}}} diminutives of gerunds.",
parents = {"verb forms"},
}
labels["extended adjective forms"] = {
parents = {"adjective forms"},
}
labels["future active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in future time.",
parents = {"participles"},
}
labels["future participles"] = {
description = "{{{langname}}} participles that indicate future events.",
parents = {"participles"},
}
labels["future passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in future time.",
parents = {"participles"},
}
local function gerund_description(data)
local default_text = "{{{langname}}} verbs that are conjugated to indicate ongoing events at unspecified moments."
if not data.lang then
-- This happens e.g. in [[:Category:Gerunds by language]].
return default_text
else
local langcode = data.lang:getCode()
if langcode == "sq" or langcode == "kmr" or langcode == "liv" or data.lang:inFamily("gem", "itc") then
return "{{{langname}}} forms that generally act as an action noun for the verb that they are formed from."
elseif langcode == "sa" or langcode == "pi" then
return "{{{langname}}} verb forms used in a clause to indicate a prior action by the subject of the sentence."
else
return default_text
end
end
end
labels["gerunds"] = {
description = gerund_description,
additional = "{{small|[Edit function gerund_description() in [[Module:category tree/non-lemma forms]] to change this description.]}}",
parents = {"verb forms"},
}
labels["imperfect participles"] = {
description = "{{{langname}}} participles that express an ongoing or continuous action.",
parents = {"participles"},
}
labels["infinitives"] = {
description = "{{{langname}}} non-finite verb forms of various kinds.",
parents = {"verb forms"},
}
labels["intensive adjectives"] = {
description = "{{{langname}}} adjectives that are derived from a base word to express a stronger concept than the base word.",
parents = {"adjective forms"},
}
labels["manuscript forms"] = {
description = "{{{langname}}} words as they appear in original manuscripts.",
parents = {"non-lemma forms"},
}
labels["mutated forms"] = {
description = "{{{langname}}} terms whose initial consonant is mutated due to the effect of the preceding word.",
parents = {"non-lemma forms"},
}
local inflected_pos_for_mutation = {
"adjective",
"adverb",
"determiner",
"interjection",
"noun",
"numeral",
"participle",
"particle",
"prefix",
"preposition",
"pronoun",
"proper noun",
"verb",
}
for _, pos in ipairs(inflected_pos_for_mutation) do
local plpos = pluralize(pos)
labels["mutated " .. plpos] = {
description = "{{{langname}}} " .. plpos .. " whose initial consonant is mutated due to the effect of the preceding word.",
parents = {pos .. " forms", {name = "mutated forms", sort = pos}},
}
end
local mutation_types = {
-- FIXME, we should add these terms to [[Appendix:Glossary]] and link to them.
["eclipsed"] = "[[Appendix:Irish mutations#Eclipsis|eclipsis]]",
["lenited"] = "[[Appendix:Irish mutations#Lenition|lenition]]",
["h-prothesized"] = "[[h-prothesis]]",
["t-prothesized"] = "[[t-prothesis]]",
["aspirate-mutation"] = "[[aspirate mutation]]",
["hard-mutation"] = "[[hard mutation]]",
["mixed-mutation"] = "[[mixed mutation]]",
["nasal-mutation"] = "[[nasal mutation]]",
["soft-mutation"] = "[[soft mutation]]",
}
for muttype, desc in pairs(mutation_types) do
labels[muttype .. " forms"] = {
description = "{{{langname}}} terms whose initial consonant is mutated through " .. desc .. ", due to the effect of the preceding word.",
parents = {"mutated forms"},
}
end
labels["negative participles"] = {
description = "{{{langname}}} participles that express lack of an action being performed.",
parents = {"participles"},
}
labels["nominal participles"] = {
description = "{{{langname}}} participles that function as nouns.",
parents = {"participles", "nouns"},
}
labels["noun construct forms"] = {
description = "{{{langname}}} nouns that are inflected to modify a noun in a genitive construction.",
parents = {{name = "noun forms", sort = "construct"}},
}
labels["noun definite forms"] = {
description = "{{{langname}}} nouns that are inflected to designate an identified object.",
parents = {{name = "noun forms", sort = "definite"}},
}
labels["noun feminine forms"] = {
description = "{{{langname}}} nouns that are inflected to be associated to female beings.",
parents = {{name = "noun forms", sort = "feminine"}},
}
labels["noun indefinite forms"] = {
description = "{{{langname}}} nouns that are inflected to designate an unidentified object.",
parents = {{name = "noun forms", sort = "indefinite"}},
}
labels["noun masculine forms"] = {
description = "{{{langname}}} nouns that are inflected to be associated to male beings.",
parents = {{name = "noun forms", sort = "masculine"}},
}
labels["noun paucal forms"] = {
description = "{{{langname}}} nouns that are inflected to be quantified as between two (or three in some languages with dual number) and ten.",
parents = {{name = "noun forms", sort = "paucal"}},
}
labels["noun possessive forms"] = {
description = "{{{langname}}} nouns that are inflected to indicate possession.",
parents = {{name = "noun forms", sort = "possessive"}},
}
labels["participles"] = {
description = "{{{langname}}} verbal forms that behave syntactically like adjectives (or sometimes adverbs), and in some languages are often used in compound conjugations and/or reduced relative clauses.",
parents = {"verb forms"},
}
labels["passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it.",
parents = {"participles"},
}
labels["passive adjectival participles"] = {
description = "{{{langname}}} participles that function as adjectives and express a patient having an action performed on it.",
parents = {"participles", "adjectives"},
}
labels["past active aorist participles"] = {
description = "{{{langname}}} participles that express completed events in past time.",
parents = {"participles"},
}
labels["past active imperfect participles"] = {
description = "{{{langname}}} participles that express ongoing events in past time.",
parents = {"participles"},
}
labels["past active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in past time.",
parents = {"participles"},
}
labels["past adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in past time.",
parents = {"adverbial participles", "adverbs"},
}
labels["past participles"] = {
description = "{{{langname}}} participles that express actions in past time.",
parents = {"participles"},
}
labels["past passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in past time.",
parents = {"participles"},
}
labels["perfect participles"] = {
description = "{{{langname}}} participles that express having completed or undergone an action.",
parents = {"participles"},
}
labels["perfect active participles"] = {
description = "{{{langname}}} participles that express an agent having completed an action.",
parents = {"participles"},
}
labels["prepositional pronouns"] = {
description = "{{{langname}}} pronouns that are combined with a preposition.",
umbrella_parents = "Lemmas subcategories by language",
parents = {"pronoun forms", {name = "prepositions", sort = "pronouns"}},
}
labels["present active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in present time.",
parents = {"participles"},
}
labels["present adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in present time.",
parents = {"adverbial participles", "adverbs"},
}
labels["present middle participles"] = {
description = "{{{langname}}} participles that express an agent performing an action in present time in middle voice.",
parents = {"participles"},
}
labels["present participles"] = {
description = "{{{langname}}} participles that express actions occurring in the present time.",
parents = {"participles"},
}
labels["present passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in present time.",
parents = {"participles"},
}
labels["pronoun possessive forms"] = {
description = "{{{langname}}} pronouns that are inflected to indicate possession.",
parents = {{name = "pronoun forms", sort = "possessive"}},
}
labels["pronunciation variants"] = {
description = "{{{langname}}} words that have alternative pronunciation-based spellings.",
parents = {"non-lemma forms"},
}
labels["singulatives"] = {
description = "{{{langname}}} plural nouns that are inflected for singular number.",
parents = {"noun forms"},
}
labels["verb causative forms"] = {
description = "{{{langname}}} verbs that are conjugated to express actions caused by external conditions.",
parents = {{name = "verb forms", sort = "causative"}},
}
labels["verb irregular forms"] = {
description = "{{{langname}}} verb forms that don't follow standard patterns of conjugation.",
parents = {{name = "verb forms", sort = "irregular"}},
}
labels["verb negative forms"] = {
description = "{{{langname}}} verbs that are conjugated to express negation.",
parents = {{name = "verb forms", sort = "negative"}},
}
labels["verb passive forms"] = {
description = "{{{langname}}} verbs that are conjugated to direct the action to the grammatical subject, by means of passive voice.",
parents = {{name = "verb forms", sort = "passive"}},
}
labels["verb simple past forms"] = {
description = "{{{langname}}} verbs that are conjugated to indicate events before the current moment.",
parents = {{name = "verb forms", sort = "simple past"}},
}
local labels2 = {}
-- Add "reconstructed" subcategories; add 'umbrella_parents' key if not
-- already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Non-lemma forms subcategories by language"
end
labels2["reconstructed " .. key] = {
description = "{{{langname}}} " .. key .. " that have been linguistically [[Wiktionary:Reconstructed terms|reconstructed]].",
umbrella_parents = "Non-lemma forms subcategories by language",
parents = {key, {name = "reconstructed terms", sort = key}}
}
end
-- These are top-level; don't (for the moment at least) add 'reconstructed alternative forms'.
-- These are created by setting the altform= parameter to {{head}} or full_headword() in [[Module:headword]]. See
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] for discussion.
labels2["alternative forms"] = {
description = "{{{langname}}} alternative forms of [[Wiktionary:Lemmas|lemmas]], i.e. variant forms or spellings that are attested but secondary, and typically not in common use.",
additional = "Such terms may be uncommon spelling variants; dialectal forms; historical, archaic or obsolete spellings; spellings in less-used scripts; or the like. " ..
"They are kept out of the lemma category to avoid cluttering it. Commonly used variants should not be placed in this category, but should be treated as lemmas.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Non-lemma forms subcategories by language"] = {
description = "Umbrella categories covering topics related to non-lemma forms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "non-lemma forms", is_label = true, sort = " "},
},
}
return {LABELS = labels2, RAW_CATEGORIES = raw_categories}
e2oj9449rg9ounmoitbpk6wkobq6bm0
88402
88401
2026-07-27T00:16:55Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/non-lemma_forms]]
88401
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local en_utilities_module = "Module:en-utilities"
local insert = table.insert
local pluralize = require(en_utilities_module).pluralize
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local degrees = {
comparative = "that express a higher degree of an attribute when comparing one thing to another, or serve to set that thing apart from another",
superlative = "that express the highest possible degree of an attribute",
elative = "that, depending on the context, express either the comparative degree (a higher degree of an attribute when comparing one thing to another) or the superlative degree (the highest possible degree of an attribute)",
exaggerated = "that express the highest possible degree of an attribute (like the superlative degree), but with an additional level of emphasis",
excessive = "that express an excessive degree of some attribute",
equative = "that express the same or a similar degree of an attribute when comparing one thing to another",
}
local degree_pos = { "adjective", "adverb", "determiner", "pronoun" }
for _, pos in ipairs(degree_pos) do
local plpos = pluralize(pos)
for degree, desc in pairs(degrees) do
labels[degree .. " " .. plpos] = {
breadcrumb = degree,
description = "{{{langname}}} " .. plpos .. " " .. desc .. ".",
parents = {pos .. " forms"},
}
end
end
labels["non-lemma forms"] = {
description = "{{{langname}}} inflected forms of other [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
-- Handle specific types of non-lemma forms. Each spec is of the form {POS, PARENT_POS} where POS is the singular form
-- of a part of speech for which non-lemma forms exist (e.g. 'determiner' is listed because 'determiner forms' exist),
-- and PARENT_POS is the singular form of the parent category to add the category to. For example, the spec
-- {"circumfix", "morpheme"} means that 'circumfix forms' categories have the corresponding 'morpheme forms' categories
-- as their first parent. The second parent is the POS itself; e.g. 'morpheme forms' has 'morphemes' as its second
-- parent, with a sort key that places 'morpheme forms' at the beginning of the child categories. If PARENT_POS is
-- 'false', only the second parent appears as the parent. If a spec is a single string POS, the PARENT_POS defaults to
-- "non-lemma"; e.g. if the spec is "adjective", then 'adjective forms' categories have the corresponding
-- 'non-lemma forms' category as their first parent.
local specs = {
"adjective",
"adverb",
{"article", "determiner"},
{"circumfix", "morpheme"},
"classifier",
"clitic",
"conjunction",
"determiner",
{"infinitive", false},
"interjection",
"morpheme",
"noun",
"numeral",
"participle",
"particle",
{"past participle", "participle"},
"predicative",
{"prefix", "morpheme"},
"proper noun",
"postposition",
"preposition",
"pronoun",
{"suffix", "morpheme"},
"verb",
}
for degree in pairs(degrees) do
for _, pos in ipairs(degree_pos) do
insert(specs, {degree .. " " .. pos, false})
end
end
for _, spec in ipairs(specs) do
local pos, parent_pos
if type(spec) == "table" then
pos, parent_pos = unpack(spec)
else
pos = spec
end
if parent_pos == nil then
parent_pos = "non-lemma"
end
local plpos, parents, breadcrumb = pluralize(pos), {}
if parent_pos == false then -- parent is the POS ([POS] » Forms)
breadcrumb = "Forms"
else
insert(parents, parent_pos .. " forms")
end
insert(parents, {name = plpos, sort = "**"})
labels[pos .. " forms"] = {
breadcrumb = breadcrumb,
description = ("{{{langname}}} %s that are inflected to display grammatical relations other than the main form."):format(plpos),
parents = parents,
}
end
labels["active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action.",
parents = {"participles"},
}
labels["active adjectival participles"] = {
description = "{{{langname}}} participles that function as adjectives and express an agent actively performing an action.",
parents = {"participles", "adjectives"},
}
labels["adjectival participles"] = {
description = "{{{langname}}} participles that function as adjectives.",
parents = {"participles", "adjectives"},
}
labels["adjective construct forms"] = {
description = "{{{langname}}} adjectives that are inflected to modify a noun in a genitive construction.",
parents = {{name = "adjective forms", sort = "construct"}},
}
labels["adjective definite forms"] = {
description = "{{{langname}}} adjectives that are inflected to give attributes to specific and identifiable nouns.",
parents = {{name = "adjective forms", sort = "definite forms"}},
}
labels["adjective dual forms"] = {
description = "{{{langname}}} adjectives that are inflected to be quantified as two.",
parents = {{name = "adjective forms", sort = "dual forms"}},
}
labels["adjective feminine forms"] = {
description = "{{{langname}}} adjectives that are inflected to give attributes to nouns associated to female beings.",
parents = {{name = "adjective forms", sort = "feminine forms"}},
}
labels["adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs.",
parents = {"participles", "adverbs"},
}
labels["agent participles"] = {
description = "{{{langname}}} participles that express an agent by who something is done.",
parents = {"participles"},
}
labels["anterior adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action completed before the one expressed by the primary verb.",
parents = {"participles", "adverbs"},
}
labels["classifier singular forms"] = {
description = "{{{langname}}} classifiers that are inflected for singular number.",
parents = {"classifier forms"},
}
labels["collective plurals"] = {
description = "{{{langname}}} nominal plural forms with specifically collective semantics.",
parents = {"noun forms"},
}
labels["contemporary adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express an action occuring simultaneously with the one expressed by the primary verb.",
parents = {"participles", "adverbs"},
}
labels["converbs"] = {
description = "{{{langname}}} verb forms that build clauses which function as adverbials.",
parents = {"verb forms"},
}
labels["diminutive gerunds"] = {
description = "{{{langname}}} diminutives of gerunds.",
parents = {"verb forms"},
}
labels["extended adjective forms"] = {
parents = {"adjective forms"},
}
labels["future active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in future time.",
parents = {"participles"},
}
labels["future participles"] = {
description = "{{{langname}}} participles that indicate future events.",
parents = {"participles"},
}
labels["future passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in future time.",
parents = {"participles"},
}
local function gerund_description(data)
local default_text = "{{{langname}}} verbs that are conjugated to indicate ongoing events at unspecified moments."
if not data.lang then
-- This happens e.g. in [[:Category:Gerunds by language]].
return default_text
else
local langcode = data.lang:getCode()
if langcode == "sq" or langcode == "kmr" or langcode == "liv" or data.lang:inFamily("gem", "itc") then
return "{{{langname}}} forms that generally act as an action noun for the verb that they are formed from."
elseif langcode == "sa" or langcode == "pi" then
return "{{{langname}}} verb forms used in a clause to indicate a prior action by the subject of the sentence."
else
return default_text
end
end
end
labels["gerunds"] = {
description = gerund_description,
additional = "{{small|[Edit function gerund_description() in [[Module:category tree/non-lemma forms]] to change this description.]}}",
parents = {"verb forms"},
}
labels["imperfect participles"] = {
description = "{{{langname}}} participles that express an ongoing or continuous action.",
parents = {"participles"},
}
labels["infinitives"] = {
description = "{{{langname}}} non-finite verb forms of various kinds.",
parents = {"verb forms"},
}
labels["intensive adjectives"] = {
description = "{{{langname}}} adjectives that are derived from a base word to express a stronger concept than the base word.",
parents = {"adjective forms"},
}
labels["manuscript forms"] = {
description = "{{{langname}}} words as they appear in original manuscripts.",
parents = {"non-lemma forms"},
}
labels["mutated forms"] = {
description = "{{{langname}}} terms whose initial consonant is mutated due to the effect of the preceding word.",
parents = {"non-lemma forms"},
}
local inflected_pos_for_mutation = {
"adjective",
"adverb",
"determiner",
"interjection",
"noun",
"numeral",
"participle",
"particle",
"prefix",
"preposition",
"pronoun",
"proper noun",
"verb",
}
for _, pos in ipairs(inflected_pos_for_mutation) do
local plpos = pluralize(pos)
labels["mutated " .. plpos] = {
description = "{{{langname}}} " .. plpos .. " whose initial consonant is mutated due to the effect of the preceding word.",
parents = {pos .. " forms", {name = "mutated forms", sort = pos}},
}
end
local mutation_types = {
-- FIXME, we should add these terms to [[Appendix:Glossary]] and link to them.
["eclipsed"] = "[[Appendix:Irish mutations#Eclipsis|eclipsis]]",
["lenited"] = "[[Appendix:Irish mutations#Lenition|lenition]]",
["h-prothesized"] = "[[h-prothesis]]",
["t-prothesized"] = "[[t-prothesis]]",
["aspirate-mutation"] = "[[aspirate mutation]]",
["hard-mutation"] = "[[hard mutation]]",
["mixed-mutation"] = "[[mixed mutation]]",
["nasal-mutation"] = "[[nasal mutation]]",
["soft-mutation"] = "[[soft mutation]]",
}
for muttype, desc in pairs(mutation_types) do
labels[muttype .. " forms"] = {
description = "{{{langname}}} terms whose initial consonant is mutated through " .. desc .. ", due to the effect of the preceding word.",
parents = {"mutated forms"},
}
end
labels["negative participles"] = {
description = "{{{langname}}} participles that express lack of an action being performed.",
parents = {"participles"},
}
labels["nominal participles"] = {
description = "{{{langname}}} participles that function as nouns.",
parents = {"participles", "nouns"},
}
labels["noun construct forms"] = {
description = "{{{langname}}} nouns that are inflected to modify a noun in a genitive construction.",
parents = {{name = "noun forms", sort = "construct"}},
}
labels["noun definite forms"] = {
description = "{{{langname}}} nouns that are inflected to designate an identified object.",
parents = {{name = "noun forms", sort = "definite"}},
}
labels["noun feminine forms"] = {
description = "{{{langname}}} nouns that are inflected to be associated to female beings.",
parents = {{name = "noun forms", sort = "feminine"}},
}
labels["noun indefinite forms"] = {
description = "{{{langname}}} nouns that are inflected to designate an unidentified object.",
parents = {{name = "noun forms", sort = "indefinite"}},
}
labels["noun masculine forms"] = {
description = "{{{langname}}} nouns that are inflected to be associated to male beings.",
parents = {{name = "noun forms", sort = "masculine"}},
}
labels["noun paucal forms"] = {
description = "{{{langname}}} nouns that are inflected to be quantified as between two (or three in some languages with dual number) and ten.",
parents = {{name = "noun forms", sort = "paucal"}},
}
labels["noun possessive forms"] = {
description = "{{{langname}}} nouns that are inflected to indicate possession.",
parents = {{name = "noun forms", sort = "possessive"}},
}
labels["participles"] = {
description = "{{{langname}}} verbal forms that behave syntactically like adjectives (or sometimes adverbs), and in some languages are often used in compound conjugations and/or reduced relative clauses.",
parents = {"verb forms"},
}
labels["passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it.",
parents = {"participles"},
}
labels["passive adjectival participles"] = {
description = "{{{langname}}} participles that function as adjectives and express a patient having an action performed on it.",
parents = {"participles", "adjectives"},
}
labels["past active aorist participles"] = {
description = "{{{langname}}} participles that express completed events in past time.",
parents = {"participles"},
}
labels["past active imperfect participles"] = {
description = "{{{langname}}} participles that express ongoing events in past time.",
parents = {"participles"},
}
labels["past active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in past time.",
parents = {"participles"},
}
labels["past adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in past time.",
parents = {"adverbial participles", "adverbs"},
}
labels["past participles"] = {
description = "{{{langname}}} participles that express actions in past time.",
parents = {"participles"},
}
labels["past passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in past time.",
parents = {"participles"},
}
labels["perfect participles"] = {
description = "{{{langname}}} participles that express having completed or undergone an action.",
parents = {"participles"},
}
labels["perfect active participles"] = {
description = "{{{langname}}} participles that express an agent having completed an action.",
parents = {"participles"},
}
labels["prepositional pronouns"] = {
description = "{{{langname}}} pronouns that are combined with a preposition.",
umbrella_parents = "Lemmas subcategories by language",
parents = {"pronoun forms", {name = "prepositions", sort = "pronouns"}},
}
labels["present active participles"] = {
description = "{{{langname}}} participles that express an agent actively performing an action in present time.",
parents = {"participles"},
}
labels["present adverbial participles"] = {
description = "{{{langname}}} participles that function as adverbs and express actions in present time.",
parents = {"adverbial participles", "adverbs"},
}
labels["present middle participles"] = {
description = "{{{langname}}} participles that express an agent performing an action in present time in middle voice.",
parents = {"participles"},
}
labels["present participles"] = {
description = "{{{langname}}} participles that express actions occurring in the present time.",
parents = {"participles"},
}
labels["present passive participles"] = {
description = "{{{langname}}} participles that express a patient having an action performed on it in present time.",
parents = {"participles"},
}
labels["pronoun possessive forms"] = {
description = "{{{langname}}} pronouns that are inflected to indicate possession.",
parents = {{name = "pronoun forms", sort = "possessive"}},
}
labels["pronunciation variants"] = {
description = "{{{langname}}} words that have alternative pronunciation-based spellings.",
parents = {"non-lemma forms"},
}
labels["singulatives"] = {
description = "{{{langname}}} plural nouns that are inflected for singular number.",
parents = {"noun forms"},
}
labels["verb causative forms"] = {
description = "{{{langname}}} verbs that are conjugated to express actions caused by external conditions.",
parents = {{name = "verb forms", sort = "causative"}},
}
labels["verb irregular forms"] = {
description = "{{{langname}}} verb forms that don't follow standard patterns of conjugation.",
parents = {{name = "verb forms", sort = "irregular"}},
}
labels["verb negative forms"] = {
description = "{{{langname}}} verbs that are conjugated to express negation.",
parents = {{name = "verb forms", sort = "negative"}},
}
labels["verb passive forms"] = {
description = "{{{langname}}} verbs that are conjugated to direct the action to the grammatical subject, by means of passive voice.",
parents = {{name = "verb forms", sort = "passive"}},
}
labels["verb simple past forms"] = {
description = "{{{langname}}} verbs that are conjugated to indicate events before the current moment.",
parents = {{name = "verb forms", sort = "simple past"}},
}
local labels2 = {}
-- Add "reconstructed" subcategories; add 'umbrella_parents' key if not
-- already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Non-lemma forms subcategories by language"
end
labels2["reconstructed " .. key] = {
description = "{{{langname}}} " .. key .. " that have been linguistically [[Wiktionary:Reconstructed terms|reconstructed]].",
umbrella_parents = "Non-lemma forms subcategories by language",
parents = {key, {name = "reconstructed terms", sort = key}}
}
end
-- These are top-level; don't (for the moment at least) add 'reconstructed alternative forms'.
-- These are created by setting the altform= parameter to {{head}} or full_headword() in [[Module:headword]]. See
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] for discussion.
labels2["alternative forms"] = {
description = "{{{langname}}} alternative forms of [[Wiktionary:Lemmas|lemmas]], i.e. variant forms or spellings that are attested but secondary, and typically not in common use.",
additional = "Such terms may be uncommon spelling variants; dialectal forms; historical, archaic or obsolete spellings; spellings in less-used scripts; or the like. " ..
"They are kept out of the lemma category to avoid cluttering it. Commonly used variants should not be placed in this category, but should be treated as lemmas.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Non-lemma forms subcategories by language"] = {
description = "Umbrella categories covering topics related to non-lemma forms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "non-lemma forms", is_label = true, sort = " "},
},
}
return {LABELS = labels2, RAW_CATEGORIES = raw_categories}
e2oj9449rg9ounmoitbpk6wkobq6bm0
Mòideal:category tree/phrases
828
17731
88403
2026-04-15T09:16:39Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/phrases]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88403
Scribunto
text/plain
local labels = {}
local raw_categories = {}
labels["phrases"] = {
description = "{{{langname}}} groups of words elaborated to express ideas, not necessarily [[phrase]]s in the grammatical sense.",
umbrella_parents = "Lemmas subcategories by language",
parents = {"lemmas", "multiword terms"},
}
labels["adverb-adjective phrases"] = {
description = "{{{langname}}} phrases in which an adverb modifies the adjective that heads the phrase.",
umbrella_parents = {name = "phrases", is_label = true, sort = " "},
parents = {"phrases"},
}
labels["alliterative phrases"] = {
description = "{{{langname}}} phrases composed of two or more words that alliterate.",
umbrella_parents = {name = "phrases", is_label = true, sort = " "},
parents = {"phrases"},
}
labels["rhyming phrases"] = {
description = "{{{langname}}} phrases composed of two or more words that rhyme.",
umbrella_parents = {name = "phrases", is_label = true, sort = " "},
parents = {"phrases"},
}
labels["sentences"] = {
description = "{{{langname}}} [[sentence]]s.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["phrasebook"] = {
description = "{{{langname}}} non-idiomatic phrases that are used in common situations, and may be useful to language learners or travellers.",
parents = {
"phrases",
{name = "Phrasebooks by language", raw = true, sort = "{{{langname}}}"}
},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
raw_categories["Phrasebooks by language"] = {
description = "Categories with phrasebooks in various specific languages.",
additional = "Phrasebook categories contain non-idiomatic phrases that are used in common situations, and may be useful to language learners or travellers.\n\n" ..
"See [[Wiktionary:Phrasebook]] for more information.\n\n{{{umbrella_msg}}}",
parents = "Fundamental",
}
for _, category in ipairs({
{name = "Basic", topics = {}},
{name = "Communication", topics = {"Communication"}},
{name = "Emergencies", topics = {"Emergency medicine"}},
{name = "Ethnicity", topics = {"Ethnicity"}},
{name = "Family", topics = {"Family"}},
{name = "Farewells", topics = {}},
{name = "Festivities", topics = {}},
{name = "Food and drink", topics = {"Food and drink"}},
{name = "Greetings", topics = {}},
{name = "Health", topics = {"Health"}},
{name = "Love", topics = {"Love"}},
{name = "Money", topics = {"Money"}},
{name = "Needs", topics = {}},
{name = "Religion", topics = {"Religion"}},
{name = "Sex", topics = {"Sex"}},
{name = "Time", topics = {"Time"}},
{name = "Travel", topics = {"Travel"}},
{name = "Weather", topics = {"Weather"}},
}) do
local parents = {
{name = "phrasebook", sort = category.name},
{name = "Phrasebooks by language/" .. category.name, raw = true, sort = "{{{langname}}}"},
}
for _, topic in ipairs(category.topics) do
table.insert(parents, {name = "{{{langcode}}}:" .. topic, sort = " ", raw = true})
end
labels["phrasebook/" .. category.name] = {
description = "{{{langname}}} common non-idiomatic phrases in the category '" .. category.name .. "'.",
breadcrumb = category.name,
parents = parents,
umbrella = false,
}
raw_categories["Phrasebooks by language/" .. category.name] = {
description = "Categories with common non-idiomatic phrases in the category '" .. category.name .. "', in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {{name = "Phrasebooks by language", sort = " "}},
breadcrumb = category.name,
}
end
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
51yk9wz0qio0nz6p1vy1ju7edgv4joe
88404
88403
2026-07-27T00:17:05Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/phrases]]
88403
Scribunto
text/plain
local labels = {}
local raw_categories = {}
labels["phrases"] = {
description = "{{{langname}}} groups of words elaborated to express ideas, not necessarily [[phrase]]s in the grammatical sense.",
umbrella_parents = "Lemmas subcategories by language",
parents = {"lemmas", "multiword terms"},
}
labels["adverb-adjective phrases"] = {
description = "{{{langname}}} phrases in which an adverb modifies the adjective that heads the phrase.",
umbrella_parents = {name = "phrases", is_label = true, sort = " "},
parents = {"phrases"},
}
labels["alliterative phrases"] = {
description = "{{{langname}}} phrases composed of two or more words that alliterate.",
umbrella_parents = {name = "phrases", is_label = true, sort = " "},
parents = {"phrases"},
}
labels["rhyming phrases"] = {
description = "{{{langname}}} phrases composed of two or more words that rhyme.",
umbrella_parents = {name = "phrases", is_label = true, sort = " "},
parents = {"phrases"},
}
labels["sentences"] = {
description = "{{{langname}}} [[sentence]]s.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["phrasebook"] = {
description = "{{{langname}}} non-idiomatic phrases that are used in common situations, and may be useful to language learners or travellers.",
parents = {
"phrases",
{name = "Phrasebooks by language", raw = true, sort = "{{{langname}}}"}
},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
raw_categories["Phrasebooks by language"] = {
description = "Categories with phrasebooks in various specific languages.",
additional = "Phrasebook categories contain non-idiomatic phrases that are used in common situations, and may be useful to language learners or travellers.\n\n" ..
"See [[Wiktionary:Phrasebook]] for more information.\n\n{{{umbrella_msg}}}",
parents = "Fundamental",
}
for _, category in ipairs({
{name = "Basic", topics = {}},
{name = "Communication", topics = {"Communication"}},
{name = "Emergencies", topics = {"Emergency medicine"}},
{name = "Ethnicity", topics = {"Ethnicity"}},
{name = "Family", topics = {"Family"}},
{name = "Farewells", topics = {}},
{name = "Festivities", topics = {}},
{name = "Food and drink", topics = {"Food and drink"}},
{name = "Greetings", topics = {}},
{name = "Health", topics = {"Health"}},
{name = "Love", topics = {"Love"}},
{name = "Money", topics = {"Money"}},
{name = "Needs", topics = {}},
{name = "Religion", topics = {"Religion"}},
{name = "Sex", topics = {"Sex"}},
{name = "Time", topics = {"Time"}},
{name = "Travel", topics = {"Travel"}},
{name = "Weather", topics = {"Weather"}},
}) do
local parents = {
{name = "phrasebook", sort = category.name},
{name = "Phrasebooks by language/" .. category.name, raw = true, sort = "{{{langname}}}"},
}
for _, topic in ipairs(category.topics) do
table.insert(parents, {name = "{{{langcode}}}:" .. topic, sort = " ", raw = true})
end
labels["phrasebook/" .. category.name] = {
description = "{{{langname}}} common non-idiomatic phrases in the category '" .. category.name .. "'.",
breadcrumb = category.name,
parents = parents,
umbrella = false,
}
raw_categories["Phrasebooks by language/" .. category.name] = {
description = "Categories with common non-idiomatic phrases in the category '" .. category.name .. "', in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {{name = "Phrasebooks by language", sort = " "}},
breadcrumb = category.name,
}
end
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
51yk9wz0qio0nz6p1vy1ju7edgv4joe
Mòideal:category tree/pragmatic properties
828
17732
88405
2026-07-08T12:16:44Z
en>Smurrayinchester
0
misspelled "misspellings"!
88405
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local string_utilities_module = "Module:string utilities"
local ucfirst = require(string_utilities_module).ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by usage"] = {
description = "{{{langname}}} terms categorized by the manner and context in which they are used by speakers.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
local function generate_category_with_senses(typ, desc, distinguish, other_types_in_group)
if distinguish then
distinguish = "\n\n" .. distinguish
else
distinguish = ""
end
local function make_preceding(pos)
if not other_types_in_group then
return nil
end
local cats = {}
for _, other_type in ipairs(other_types_in_group) do
table.insert(cats, ("Category:{{{langname}}} " .. pos):format(other_type))
end
return ("{{also|%s}}"):format(table.concat(cats, "|"))
end
local function make_umbrella_preceding(pos)
if not other_types_in_group then
return nil
end
local cats = {}
for _, other_type in ipairs(other_types_in_group) do
table.insert(cats, "Category:" .. ucfirst((pos .. " by language"):format(other_type)))
end
return ("{{also|%s}}"):format(table.concat(cats, "|"))
end
labels[("%s terms"):format(typ)] = {
description = ("{{{langname}}} terms that %s."):format(desc),
additional = ("To categorize into this category, use {{tl|tlb|{{{langcode}}}|%s}} (template '''tlb''', not '''lb'''), " ..
"which should typically be placed next to the headword.\n\nIf the term is merely a variant (alternative form) of a term " ..
"in general use, it should be categorized instead in {{cl|{{{langname}}} %s forms}} (using " ..
"{{tl|%s form of|{{{langcode}}}|...}} or {{tl|%s spelling of|{{{langcode}}}|...}}). If only some senses of the term are %s, " ..
"it should be categorized instead in {{cl|{{{langname}}} terms with %s senses}}, using {{tl|lb|{{{langcode}}}|%s}} " ..
"(template '''lb''' instead of '''tlb'''), which should typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "terms")),
parents = {"terms by usage"},
preceding = make_preceding("%s terms"),
umbrella = {
preceding = make_umbrella_preceding("%s terms"),
additional = ("To categorize into this category, use <code><nowiki>{{</nowiki>tlb|<var>langcode</var>|%s}}</code> " ..
"(template '''tlb''', not '''lb'''), which should typically be placed next to the headword. " ..
"(<code><var>langcode</var></code> is the appropriate language code for the language in question; see [[Wiktionary:List of languages]].)\n\n" ..
"If the term is merely a variant (alternative form) of a term in general use, it should be categorized instead in " ..
"{{cl|<var>langname</var> %s forms}} (using <code><nowiki>{{</nowiki>%s form of|<var>langcode</var>|...}}</code> " ..
"or <code><nowiki>{{</nowiki>%s spelling of|<var>langcode</var>|...}}</code>). " ..
"If only some senses of the term are %s, it should be categorized instead in {{cl|<var>langname</var> terms with %s senses}}, " ..
"using <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> (template '''lb''' instead of '''tlb'''), which should " ..
"typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "terms")),
}
}
labels[("terms with %s senses"):format(typ)] = {
description = ("{{{langname}}} terms with individual senses that %s."):format(desc),
additional = ("To categorize into this category, use {{tl|lb|{{{langcode}}}|%s}} (template '''lb''', not '''tlb'''), " ..
"which should typically be placed next to the individual sense.\n\nIf the term itself, in all its senses, is %s, " ..
"it should be placed in {{cl|{{{langname}}} %s terms}} instead, using {{tl|tlb|{{{langcode}}}|%s}} " ..
"(template '''tlb''' instead of '''lb'''), which should typically be placed next to the headword. " ..
"If the term is merely a variant (alternative form) of a term in general use, it should be categorized in " ..
"{{cl|{{{langname}}} %s forms}} (using {{tl|%s form of|{{{langcode}}}|...}} or {{tl|%s spelling of|{{{langcode}}}|...}}).%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "senses")),
parents = {{name = "terms by usage", sort = ("%s senses"):format(typ)}},
breadcrumb = ("with %s senses"):format(typ),
preceding = make_preceding("terms with %s senses"),
umbrella = {
preceding = make_umbrella_preceding("terms with %s senses"),
additional = ("To categorize into this category, use <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> " ..
"(template '''lb''', not '''tlb'''), which should typically be placed next to the individual sense. " ..
"(<code><var>langcode</var></code> is the appropriate language code for the language in question; see [[Wiktionary:List of languages]].)\n\n" ..
"If the term itself, in all its senses, is %s, it should be placed in {{cl|<var>langname</var> %s terms}} instead, using " ..
"<code><nowiki>{{</nowiki>tlb|<var>langcode</var>|%s}}</code> (template '''tlb''' instead of '''lb'''), which should " ..
"typically be placed next to the headword. If the term is merely a variant (alternative form) of a term in general use, " ..
"it should be categorized in {{cl|<var>langname</var> %s forms}} (using <code><nowiki>{{</nowiki>%s form of|<var>langcode</var>|...}}</code> " ..
"or <code><nowiki>{{</nowiki>%s spelling of|<var>langcode</var>|...}}</code>.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "senses")),
}
}
labels[("%s forms"):format(typ)] = {
description = ("{{{langname}}} forms that %s; and serve as alternative forms of the same terms in general use."):format(desc),
additional = ("To categorize into this category, use {{tl|%s form of|{{{langcode}}}|...}} or {{tl|%s spelling of|{{{langcode}}}|...}}.\n\n" ..
"If the term is not merely a variant (alternative form) of a term in general use, it should be placed in {{cl|{{{langname}}} %s terms}} " ..
"instead; to do this, use {{tl|tlb|{{{langcode}}}|%s}} (template '''tlb''', not '''lb'''), which should typically be placed next to the " ..
"headword. If only some senses of the term are %s, it should be categorized instead in {{cl|{{{langname}}} terms with %s senses}}, " ..
"using {{tl|lb|{{{langcode}}}|%s}} (template '''lb''' instead of '''tlb'''), which should typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "forms")),
parents = {{name = ("%s terms"):format(typ), sort = "forms"}},
breadcrumb = "forms",
preceding = make_preceding("%s forms"),
umbrella = {
preceding = make_umbrella_preceding("%s forms"),
additional = ("To categorize into this category, use <code><nowiki>{{</nowiki>%s form of|<var>langcode</var>|...}}</code> " ..
"or <code><nowiki>{{</nowiki>%s spelling of|<var>langcode</var>|...}}</code>. (<code><var>langcode</var></code> is the " ..
"appropriate language code for the language in question; see [[Wiktionary:List of languages]].)\n\n" ..
"If the term is not merely a variant (alternative form) of a term in general use, it should be placed in {{cl|<var>langname</var> %s terms}} " ..
"instead; to do this, use <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> (template '''tlb''', not '''lb'''), " ..
"which should typically be placed next to the headword. If only some senses of the term are %s, it should be categorized instead " ..
"in {{cl|<var>langname</var> terms with %s senses}}, using <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> " ..
"(template '''lb''' instead of '''tlb'''), which should typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "forms")),
}
}
end
local function generate_related_categories_with_senses(info)
for typ, spec in pairs(info) do
local other_types = {}
for other_type, _ in pairs(info) do
if other_type ~= typ then
table.insert(other_types, other_type)
end
end
table.sort(other_types)
generate_category_with_senses(typ, spec.desc, spec.distinguish, other_types)
end
end
generate_related_categories_with_senses {
archaic = {
desc = "are no longer in general use but still encountered in older literature, sometimes still used for special effect, and typically recognized by native speakers",
distinguish = "Archaic POS should be distinguished from dated POS, which are merely [[unfashionable]] and [[anachronistic]] but still sometimes used, especially by older speakers; and on the other hand from obsolete POS, which are no longer in use at all and are not usually recognized by native speakers.",
},
dated = {
desc = "are no longer fashionable and thus are [[anachronistic]], but still sometimes in use, especially by older speakers",
distinguish = "Dated POS should be distinguished from archaic POS, which are no longer in use (except occasionally for special effect) but are still sometimes encountered in older literature and are typically recognized by native speakers; and obsolete POS, which are no longer in use at all and are not usually recognized by native speakers.",
},
obsolete = {
desc = "are no longer in use and not usually recognized by native speakers, but still sometimes found in older literature",
distinguish = "Obsolete POS should be distinguished from archaic POS, which, although no longer in general use, are still occasionally used for special effect and are typically recognized by native speakers; and dated POS, which are merely [[unfashionable]] and [[anachronistic]] but still sometimes used, especially by older speakers.",
},
}
generate_related_categories_with_senses {
rare = {
desc = "are rarely found in general use and may not be recognized by some native speakers",
distinguish = "Rare POS should be distinguished from uncommon POS, which are not common but used enough to be generally recognized.",
},
uncommon = {
desc = "are in general use but not common",
distinguish = "Uncommon POS should be distinguished from rare POS, which are infrequent enough that they are sometimes not recognized by native speakers.",
},
}
labels["2channel slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|2channel}}.",
parents = {"internet slang"},
}
labels["4chan slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|4chan}}.",
parents = {"internet slang"},
}
labels["4chan /lgbt/ slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the /lgbt/ board of the website {{w|4chan}}.",
parents = {"4chan slang", "LGBTQ slang"},
}
labels["angry register terms"] = {
description = "{{{langname}}} terms belonging to an angry linguistic register, used only when the speaker is angry.",
parents = {"terms by usage"},
}
labels["anti-LGBTQ slurs"] = {
description = "{{{langname}}} terms that are intended to offend [[LGBTQ]] people.",
parents = {"offensive terms"},
}
labels["autological terms"] = {
description = "{{{langname}}} terms that possess the property they themselves describe.",
parents = {"terms by usage"},
}
labels["back slang"] = {
description = "{{{langname}}} terms in which the written word is spoken phonemically backwards to form a coded language.",
parents = {"cant"},
}
labels["cant"] = {
description = "{{{langname}}} terms used to form secret languages that are typically restricted to members of a specific group.",
parents = {"slang"},
}
labels["censored spellings"] = {
description = "{{{langname}}} spellings where some characters have been changed in an effort to reduce the shock value of the original term.",
parents = {"terms by usage"},
}
labels["childish terms"] = {
description = "{{{langname}}} terms that are typically only used by, or to, children.",
parents = {"terms by usage", "informal terms"},
}
labels["colloquialisms"] = {
description = "{{{langname}}} terms that are likely to be used primarily in casual conversation rather than in more formal written works, speeches, and discourse.",
parents = {"terms by usage"},
}
labels["corporate jargon"] = {
description = "{{{langname}}} terms (typically for non-business-specific concepts) that are used especially in a [[business]] or [[corporate]] [[context]].",
additional = "See also [[:Category:Businesses]], [[:Category:Business]] and language-specific categories thereof for terms related to business-specific concepts.",
parents = {"terms by usage"},
}
labels["criminal slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to criminals.",
parents = {"slang"},
}
labels["derogatory terms"] = {
description = "{{{langname}}} terms that are intended to [[disparage]], [[demean]], [[insult]] or [[offend]].",
parents = {"terms by usage"},
}
labels["dialectal terms"] = {
description = "{{{langname}}} terms that are not used in standard language but only in dialects.",
parents = {"terms by usage"},
}
labels["dis legomena"] = {
description = "{{{langname}}} terms that are attested only twice in the entire corpus.",
parents = {"terms by usage"},
}
labels["drag slang"] = {
description = "{{{langname}}} [[slang]] terms used in the [[drag]] community.",
parents = {"LGBTQ slang"},
}
labels["ecclesiastical terms"] = {
description = "{{{langname}}} terms used only by religious figures.",
parents = {"terms by usage"},
}
labels["eggcorns"] = {
description = "{{{langname}}} [[eggcorn]]s, terms which are misconstructed.",
parents = {"misconstructions"},
}
labels["emoticons"] = {
description = "{{{langname}}} characters, or sequences of characters, that imitate expressions and other objects by means of [[pareidolia]].",
parents = {"internet slang", "text messaging slang"},
}
labels["endearing terms"] = {
description = "{{{langname}}} terms that are used to show affection or endearment to another person.",
parents = {"terms by usage"},
}
labels["ethnic slurs"] = {
description = "{{{langname}}} terms that are intended to offend certain ethnic groups.",
parents = {"offensive terms"},
}
labels["expressive terms"] = {
description = "{{{langname}}} terms with additional expressive content compared with the basic meaning of the term.",
additional = "This term is common in Slavic lexicography and is found in most Czech, Slovak and Polish dictionaries, but there is no exact equivalent in English lexicography. The closest equivalents might be a combination of ''colloquial'' and either ''endearing'' or ''pejorative'', as the case may be.",
parents = {"terms by usage"},
}
labels["eye dialect"] = {
description = "{{{langname}}} nonstandard spellings, which however do not change pronunciation, deliberately used by an author to indicate that the speaker uses a nonstandard or dialectal speech.",
parents = {"nonstandard forms", "terms by orthographic property"},
}
labels["familiar terms"] = {
description = "{{{langname}}} terms whose use is typically to contexts of friendly intimacy.",
parents = {"terms by usage"},
}
labels["fandom slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to fans of one or more works of fiction.",
parents = {"slang"},
}
labels["feminist forms"] = {
description = "Forms of {{{langname}}} terms primarily used in [[feminist]] writing, typically altered from standard forms to [[avoid]] an element perceived as [[male]].",
parents = {"nonstandard forms", "deliberate misspellings", "terms by usage", "Category:{{{langcode}}}:Feminism"},
}
labels["filter-avoidance spellings"] = {
description = "Deliberate misspellings of {{{langname}}} terms that are used to avoid [[w:Wordfilter|wordfilters]].",
parents = {"deliberate misspellings"},
}
labels["folk poetic terms"] = {
description = "{{{langname}}} terms whose usage is typically restricted to works of oral or folk poetry.",
parents = {"terms by usage", "poetic terms"},
}
labels["formal terms"] = {
description = "{{{langname}}} terms whose use is typically restricted to polite, ceremonious, non-casual contexts.",
parents = {"terms by usage"},
}
labels["gay slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to homosexual people.",
parents = {"LGBTQ slang"},
}
labels["gender-critical slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to gender-critical feminists.",
parents = {"slang", "Category:{{{langcode}}}:Gender-critical feminism"},
}
labels["gender-neutral terms"] = {
description = "{{{langname}}} terms that are applicable to all people, independent of gender.",
parents = {"terms by usage"},
}
labels["graffiti slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to creators of [[graffiti#Noun|graffiti]].",
parents = {"slang", "Category:{{{langcode}}}:Art"},
}
labels["higher register terms"] = {
description = "{{{langname}}} terms belonging to a higher linguistic register, such as literary terms; such terms are somewhat less common or known.",
parents = {"terms by usage"},
}
labels["historical terms"] = {
description = "{{{langname}}} terms that refer to obsolete things or concepts.",
parents = {"terms by usage"},
}
labels["honorific terms"] = {
description = "{{{langname}}} [[honorific]] terms, which are used to show deference and respect.",
parents = {"terms by usage"},
}
labels["polite terms"] = {
description = "{{{langname}}} [[polite]] terms, which are used to show deference and respect.",
parents = {"terms by usage"},
}
labels["hapax legomena"] = {
description = "{{{langname}}} terms that are attested only once in the entire corpus.",
parents = {"terms by usage"},
}
labels["humble terms"] = {
description = "{{{langname}}} [[humble]] terms, which are used to show humility towards the addressee, indicating that the speaker has a lower social standing.",
parents = {"honorific terms"},
}
labels["hypercorrections"] = {
description = "{{{langname}}} forms of other terms by misapplications of grammatical or orthographical rules.",
parents = {"nonstandard terms", "nonstandard forms"},
}
labels["hyperforeign terms"] = {
description = "{{{langname}}} terms created by misapplying the perceived grammatical, orthographical or phonetical rules of another language.",
parents = {"hypercorrections"},
}
labels["incel slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to incels.",
parents = {"slang", "Category:{{{langcode}}}:Incel community"},
}
labels["imperfective forms"] = {
description = "{{{langname}}} verbs that serve as imperfective variants of perfective verbs, sharing the same base set of meanings.",
parents = {"terms by usage"},
}
labels["informal forms"] = {
description = "{{{langname}}} terms that can be used in casual, non-ceremonious conversations as alternative forms of other terms.",
additional = "Informal non-lemma form variants also belong here.",
parents = {"informal terms"},
}
labels["informal terms"] = {
description = "{{{langname}}} terms whose use is typically restricted to casual, non‐ceremonious conversations.",
parents = {"terms by usage"},
}
labels["deliberate misspellings"] = {
description = "Deliberate misspellings of {{{langname}}} terms.",
parents = {"misspellings"},
}
labels["internet laughter slang"] = {
description = "{{{langname}}} [[slang]] terms that are used as substitutes for laughter in internet-related contexts.",
additional = "::''Note: The majority of items that <u>could</u> be here do not meet Wiktionary's [[WT:CFI|criteria for inclusion]].''",
parents = {"internet slang"},
}
labels["internet slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to internet users.",
parents = {"slang"},
}
labels["humorous terms"] = {
description = "{{{langname}}} terms that are humorous, amusing or joking.",
parents = {"terms by usage"},
}
labels["journalistic terms"] = {
description = "{{{langname}}} terms that are used especially in [[journalistic]] language, i.e. in newspapers and magazines.",
parents = {"terms by usage"},
}
labels["kennings"] = {
description = "{{{langname}}} metaphorical compounds or phrases describing basic objects in an allusive fashion, used especially in Germanic poetry.",
parents = {"poetic terms"},
}
labels["leetspeak"] = {
description = "{{{langname}}} which are used in [[leetspeak]], a variety of internet slang that focuses on substitution of letters by other characters which are similar in appearance.",
parents = {"internet slang"},
}
labels["LGBTQ slang"] = {
description = "{{{langname}}} [[slang]] terms which are used predominantly among [[LGBTQ]] people.",
parents = {"slang", "Category:{{{langcode}}}:LGBTQ"},
}
labels["literary terms"] = {
description = "{{{langname}}} terms whose usage is typically restricted to works of literature.",
parents = {"higher register terms"},
}
labels["medical slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to medical doctors, such as physicians and surgeons.",
parents = {"slang"},
}
labels["military slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to military personnel.",
parents = {"slang"},
}
labels["misconstructions"] = {
description = "Terms wrongly built due to a misunderstanding of their parts.",
parents = {"nonstandard forms"},
}
labels["misromanizations"] = {
description = "Common misromanizations of {{{langname}}} terms.",
parents = {"nonstandard forms"},
}
labels["misspellings"] = {
description = "Common accidental misspellings of {{{langname}}} terms and some terms which are deliberate misspellings.",
parents = {"nonstandard forms"},
}
labels["multiplicity slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to the {{l|en|multiplicity|id=multiple personalities}} [[community]].",
parents = {"slang", "Category:{{{langcode}}}:Multiplicity (psychology)"},
}
labels["naval slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to naval personnel.",
parents = {"military slang"},
}
labels["nonstandard forms"] = {
description = "{{{langname}}} forms of standard terms that are considered improper, incorrect or commonly misused.",
parents = {"nonstandard terms"},
}
labels["nonstandard terms"] = {
description = "{{{langname}}} terms that are considered improper, incorrect or commonly misused.",
parents = {"terms by usage"},
}
labels["numismatic slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to numismatists.",
parents = {"slang", "Category:{{{langcode}}}:Currency"},
}
labels["offensive terms"] = {
description = "{{{langname}}} terms that are typically considered to offend people.",
parents = {"terms by usage"},
}
labels["officialese terms"] = {
description = "{{{langname}}} terms that are chiefly used by official sources, and are often bureaucratic-sounding.",
parents = {"terms by usage"},
}
labels["oxymorons"] = {
description = "{{{langname}}} terms that are juxtapositions of opposing ideas.",
parents = {"terms by usage"},
}
labels["perfective forms"] = {
description = "{{{langname}}} verbs that serve as perfective variants of imperfective verbs, sharing the same base set of meanings.",
parents = {"terms by usage"},
}
labels["placeholder terms"] = {
description = "{{{langname}}} terms used to refer to items for which one does not know or cannot recall the name, or is unable to or does not care to specify precisely.",
parents = {"terms by usage"},
}
labels["poetic forms"] = {
description = "{{{langname}}} terms that can be used in works of poetry as poetic alternative forms of other terms.",
additional = "Poetic non-lemma form variants also belong here.",
parents = {"poetic terms"},
}
labels["poetic terms"] = {
description = "{{{langname}}} terms whose usage is typically restricted to works of poetry.",
parents = {"terms by usage", "literary terms"},
}
labels["post-nominal letters"] = {
description = "{{{langname}}} Post-nominal letters - also called post-nominal initials, post-nominal titles or designatory letters are letters placed after the name of a person to indicate that the individual holds a position, educational degree, accreditation, office, military decoration, or honour, or is a member of a religious institute or fraternity.",
parents = {"terms by usage"},
}
labels["prison slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to detainees in correctional institutions.",
parents = {"slang"},
}
labels["proscribed terms"] = {
description = "{{{langname}}} terms whose usage is proscribed; thus, they are considered wrong according to prescriptive sources.",
parents = {"terms by usage", "nonstandard terms"},
}
labels["puristic terms"] = {
description = "{{{langname}}} terms adopted for [[w:Linguistic purism|linguistic purism]].",
parents = {"terms by usage"},
}
labels["radio slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to radio communication.",
parents = {"slang"},
}
labels["Reddit slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|Reddit}}.",
parents = {"internet slang"},
}
labels["religious slurs"] = {
description = "{{{langname}}} terms that are intended to offend members of certain religions.",
parents = {"offensive terms"},
}
labels["reverential terms"] = {
description = "{{{langname}}} [[reverential]] terms, which are used to exalt the addressee, indicating that they have a higher social standing than the speaker.",
parents = {"honorific terms"},
}
labels["royal terms"] = {
description = "{{{langname}}} terms used only by royalty.",
parents = {"terms by usage"},
}
labels["rustic terms"] = {
description = "{{{langname}}} terms whose use is typically restricted rural speech.",
parents = {"terms by usage"},
}
labels["school slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to schools and school pupils.",
parents = {"slang"},
}
labels["self-deprecatory terms"] = {
description = "{{{langname}}} [[self-deprecatory]] terms.",
parents = {"terms by usage"},
}
labels["short forms"] = {
description = "{{{langname}}} terms that are [[short form]]s of other terms, often used informally.",
parents = {"terms by usage", "shortenings"},
}
labels["slang"] = {
description = "{{{langname}}} [[colloquial]] terms that are typically used to mark membership in a cultural subgroup.",
parents = {"terms by usage"},
}
labels["solemn terms"] = {
description = "{{{langname}}} terms that are used to instill a sense of somberness.",
parents = {"terms by usage"},
}
labels["student slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to colleges, universities, and their students.",
parents = {"slang"},
}
labels["superseded forms"] = {
description = "{{{langname}}} forms that have been superseded by other forms due to changes in spelling conventions.",
parents = {"terms by usage", "terms by orthographic property"},
}
labels["swear words"] = {
description = "{{{langname}}} terms that are used to swear, such as to express strong anger or frustration.",
parents = {"vulgarities"},
}
labels["technical terms"] = {
description = "{{{langname}}} terms that are usually or exclusively used in technical/scientific writing.",
parents = {"terms by usage"},
}
labels["terms of address"] = {
description = "{{{langname}}} terms used to refer to another person.",
parents = {"terms by usage"},
}
labels["terms used in hendiadys"] = {
description = "{{{langname}}} words or senses which are used only in {{w|hendiadys}}.",
parents = {"terms by usage"},
}
labels["terms with historical senses"] = {
description = "{{{langname}}} terms with senses that refer to things or concepts mainly known for their historical value.",
parents = {"terms by usage"},
}
labels["terms with transferred senses"] = {
description = "{{{langname}}} terms with [[Appendix:Glossary#transferred senses|transferred senses]].",
parents = {"terms by usage"},
}
labels["terms with uncertain meaning"] = {
description = "{{{langname}}} terms whose meaning is unknown or disputed.",
parents = {"terms by usage"},
}
labels["text messaging slang"] = {
description = "{{{langname}}} terms used for [[text messaging]] on mobile phones or similar devices, usually consisting of heavily abbreviated forms.",
parents = {"slang"},
}
labels["tone indicators"] = {
description = "{{{langname}}} symbols used to denote or clarify the intent of a preceeding or occasionally following message.",
parents = {"internet slang"},
}
labels["trademarks"] = {
description = "{{{langname}}} terms that identify legal entities, their products and services, by means of legal protection — to some extent, in a number of jurisdictions — against unauthorized use of the terms.",
parents = {"terms by usage"},
}
labels["transgender slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to transgender people.",
parents = {"LGBTQ slang", "Category:{{{langcode}}}:Transgender"},
}
labels["TV Tropes slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|TV Tropes}}.",
parents = {"internet slang"},
}
labels["umlautless spellings"] = {
description = "{{{langname}}} terms that are the result of the original terms' [[umlaut]]s being substituted.",
parents = {"nonstandard forms", "terms by orthographic property"},
}
labels["Usenet slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of {{w|Usenet}}.",
parents = {"internet slang"},
}
labels["men's speech terms"] = {
description = "{{{langname}}} terms and forms used in [[Appendix:Glossary#men's speech|men's speech]].",
parents = {"terms by usage"},
}
labels["women's speech terms"] = {
description = "{{{langname}}} terms and forms used in [[Appendix:Glossary#women's speech|women's speech]].",
parents = {"terms by usage"},
}
labels["vulgarities"] = {
description = "{{{langname}}} terms whose tone (rather than the meaning) is offensive to polite company.",
parents = {"terms by usage"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Terms by usage subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by usage subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their usage, such as slang, obsolete or archaic forms and vulgarities.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by usage", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
i6ngi1fgpp5ywoerwdmcv0rt197lhri
88406
88405
2026-07-27T00:17:18Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/pragmatic_properties]]
88405
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local string_utilities_module = "Module:string utilities"
local ucfirst = require(string_utilities_module).ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by usage"] = {
description = "{{{langname}}} terms categorized by the manner and context in which they are used by speakers.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
local function generate_category_with_senses(typ, desc, distinguish, other_types_in_group)
if distinguish then
distinguish = "\n\n" .. distinguish
else
distinguish = ""
end
local function make_preceding(pos)
if not other_types_in_group then
return nil
end
local cats = {}
for _, other_type in ipairs(other_types_in_group) do
table.insert(cats, ("Category:{{{langname}}} " .. pos):format(other_type))
end
return ("{{also|%s}}"):format(table.concat(cats, "|"))
end
local function make_umbrella_preceding(pos)
if not other_types_in_group then
return nil
end
local cats = {}
for _, other_type in ipairs(other_types_in_group) do
table.insert(cats, "Category:" .. ucfirst((pos .. " by language"):format(other_type)))
end
return ("{{also|%s}}"):format(table.concat(cats, "|"))
end
labels[("%s terms"):format(typ)] = {
description = ("{{{langname}}} terms that %s."):format(desc),
additional = ("To categorize into this category, use {{tl|tlb|{{{langcode}}}|%s}} (template '''tlb''', not '''lb'''), " ..
"which should typically be placed next to the headword.\n\nIf the term is merely a variant (alternative form) of a term " ..
"in general use, it should be categorized instead in {{cl|{{{langname}}} %s forms}} (using " ..
"{{tl|%s form of|{{{langcode}}}|...}} or {{tl|%s spelling of|{{{langcode}}}|...}}). If only some senses of the term are %s, " ..
"it should be categorized instead in {{cl|{{{langname}}} terms with %s senses}}, using {{tl|lb|{{{langcode}}}|%s}} " ..
"(template '''lb''' instead of '''tlb'''), which should typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "terms")),
parents = {"terms by usage"},
preceding = make_preceding("%s terms"),
umbrella = {
preceding = make_umbrella_preceding("%s terms"),
additional = ("To categorize into this category, use <code><nowiki>{{</nowiki>tlb|<var>langcode</var>|%s}}</code> " ..
"(template '''tlb''', not '''lb'''), which should typically be placed next to the headword. " ..
"(<code><var>langcode</var></code> is the appropriate language code for the language in question; see [[Wiktionary:List of languages]].)\n\n" ..
"If the term is merely a variant (alternative form) of a term in general use, it should be categorized instead in " ..
"{{cl|<var>langname</var> %s forms}} (using <code><nowiki>{{</nowiki>%s form of|<var>langcode</var>|...}}</code> " ..
"or <code><nowiki>{{</nowiki>%s spelling of|<var>langcode</var>|...}}</code>). " ..
"If only some senses of the term are %s, it should be categorized instead in {{cl|<var>langname</var> terms with %s senses}}, " ..
"using <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> (template '''lb''' instead of '''tlb'''), which should " ..
"typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "terms")),
}
}
labels[("terms with %s senses"):format(typ)] = {
description = ("{{{langname}}} terms with individual senses that %s."):format(desc),
additional = ("To categorize into this category, use {{tl|lb|{{{langcode}}}|%s}} (template '''lb''', not '''tlb'''), " ..
"which should typically be placed next to the individual sense.\n\nIf the term itself, in all its senses, is %s, " ..
"it should be placed in {{cl|{{{langname}}} %s terms}} instead, using {{tl|tlb|{{{langcode}}}|%s}} " ..
"(template '''tlb''' instead of '''lb'''), which should typically be placed next to the headword. " ..
"If the term is merely a variant (alternative form) of a term in general use, it should be categorized in " ..
"{{cl|{{{langname}}} %s forms}} (using {{tl|%s form of|{{{langcode}}}|...}} or {{tl|%s spelling of|{{{langcode}}}|...}}).%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "senses")),
parents = {{name = "terms by usage", sort = ("%s senses"):format(typ)}},
breadcrumb = ("with %s senses"):format(typ),
preceding = make_preceding("terms with %s senses"),
umbrella = {
preceding = make_umbrella_preceding("terms with %s senses"),
additional = ("To categorize into this category, use <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> " ..
"(template '''lb''', not '''tlb'''), which should typically be placed next to the individual sense. " ..
"(<code><var>langcode</var></code> is the appropriate language code for the language in question; see [[Wiktionary:List of languages]].)\n\n" ..
"If the term itself, in all its senses, is %s, it should be placed in {{cl|<var>langname</var> %s terms}} instead, using " ..
"<code><nowiki>{{</nowiki>tlb|<var>langcode</var>|%s}}</code> (template '''tlb''' instead of '''lb'''), which should " ..
"typically be placed next to the headword. If the term is merely a variant (alternative form) of a term in general use, " ..
"it should be categorized in {{cl|<var>langname</var> %s forms}} (using <code><nowiki>{{</nowiki>%s form of|<var>langcode</var>|...}}</code> " ..
"or <code><nowiki>{{</nowiki>%s spelling of|<var>langcode</var>|...}}</code>.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "senses")),
}
}
labels[("%s forms"):format(typ)] = {
description = ("{{{langname}}} forms that %s; and serve as alternative forms of the same terms in general use."):format(desc),
additional = ("To categorize into this category, use {{tl|%s form of|{{{langcode}}}|...}} or {{tl|%s spelling of|{{{langcode}}}|...}}.\n\n" ..
"If the term is not merely a variant (alternative form) of a term in general use, it should be placed in {{cl|{{{langname}}} %s terms}} " ..
"instead; to do this, use {{tl|tlb|{{{langcode}}}|%s}} (template '''tlb''', not '''lb'''), which should typically be placed next to the " ..
"headword. If only some senses of the term are %s, it should be categorized instead in {{cl|{{{langname}}} terms with %s senses}}, " ..
"using {{tl|lb|{{{langcode}}}|%s}} (template '''lb''' instead of '''tlb'''), which should typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "forms")),
parents = {{name = ("%s terms"):format(typ), sort = "forms"}},
breadcrumb = "forms",
preceding = make_preceding("%s forms"),
umbrella = {
preceding = make_umbrella_preceding("%s forms"),
additional = ("To categorize into this category, use <code><nowiki>{{</nowiki>%s form of|<var>langcode</var>|...}}</code> " ..
"or <code><nowiki>{{</nowiki>%s spelling of|<var>langcode</var>|...}}</code>. (<code><var>langcode</var></code> is the " ..
"appropriate language code for the language in question; see [[Wiktionary:List of languages]].)\n\n" ..
"If the term is not merely a variant (alternative form) of a term in general use, it should be placed in {{cl|<var>langname</var> %s terms}} " ..
"instead; to do this, use <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> (template '''tlb''', not '''lb'''), " ..
"which should typically be placed next to the headword. If only some senses of the term are %s, it should be categorized instead " ..
"in {{cl|<var>langname</var> terms with %s senses}}, using <code><nowiki>{{</nowiki>lb|<var>langcode</var>|%s}}</code> " ..
"(template '''lb''' instead of '''tlb'''), which should typically be placed next to the individual sense.%s"):format(
typ, typ, typ, typ, typ, typ, typ, distinguish:gsub("POS", "forms")),
}
}
end
local function generate_related_categories_with_senses(info)
for typ, spec in pairs(info) do
local other_types = {}
for other_type, _ in pairs(info) do
if other_type ~= typ then
table.insert(other_types, other_type)
end
end
table.sort(other_types)
generate_category_with_senses(typ, spec.desc, spec.distinguish, other_types)
end
end
generate_related_categories_with_senses {
archaic = {
desc = "are no longer in general use but still encountered in older literature, sometimes still used for special effect, and typically recognized by native speakers",
distinguish = "Archaic POS should be distinguished from dated POS, which are merely [[unfashionable]] and [[anachronistic]] but still sometimes used, especially by older speakers; and on the other hand from obsolete POS, which are no longer in use at all and are not usually recognized by native speakers.",
},
dated = {
desc = "are no longer fashionable and thus are [[anachronistic]], but still sometimes in use, especially by older speakers",
distinguish = "Dated POS should be distinguished from archaic POS, which are no longer in use (except occasionally for special effect) but are still sometimes encountered in older literature and are typically recognized by native speakers; and obsolete POS, which are no longer in use at all and are not usually recognized by native speakers.",
},
obsolete = {
desc = "are no longer in use and not usually recognized by native speakers, but still sometimes found in older literature",
distinguish = "Obsolete POS should be distinguished from archaic POS, which, although no longer in general use, are still occasionally used for special effect and are typically recognized by native speakers; and dated POS, which are merely [[unfashionable]] and [[anachronistic]] but still sometimes used, especially by older speakers.",
},
}
generate_related_categories_with_senses {
rare = {
desc = "are rarely found in general use and may not be recognized by some native speakers",
distinguish = "Rare POS should be distinguished from uncommon POS, which are not common but used enough to be generally recognized.",
},
uncommon = {
desc = "are in general use but not common",
distinguish = "Uncommon POS should be distinguished from rare POS, which are infrequent enough that they are sometimes not recognized by native speakers.",
},
}
labels["2channel slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|2channel}}.",
parents = {"internet slang"},
}
labels["4chan slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|4chan}}.",
parents = {"internet slang"},
}
labels["4chan /lgbt/ slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the /lgbt/ board of the website {{w|4chan}}.",
parents = {"4chan slang", "LGBTQ slang"},
}
labels["angry register terms"] = {
description = "{{{langname}}} terms belonging to an angry linguistic register, used only when the speaker is angry.",
parents = {"terms by usage"},
}
labels["anti-LGBTQ slurs"] = {
description = "{{{langname}}} terms that are intended to offend [[LGBTQ]] people.",
parents = {"offensive terms"},
}
labels["autological terms"] = {
description = "{{{langname}}} terms that possess the property they themselves describe.",
parents = {"terms by usage"},
}
labels["back slang"] = {
description = "{{{langname}}} terms in which the written word is spoken phonemically backwards to form a coded language.",
parents = {"cant"},
}
labels["cant"] = {
description = "{{{langname}}} terms used to form secret languages that are typically restricted to members of a specific group.",
parents = {"slang"},
}
labels["censored spellings"] = {
description = "{{{langname}}} spellings where some characters have been changed in an effort to reduce the shock value of the original term.",
parents = {"terms by usage"},
}
labels["childish terms"] = {
description = "{{{langname}}} terms that are typically only used by, or to, children.",
parents = {"terms by usage", "informal terms"},
}
labels["colloquialisms"] = {
description = "{{{langname}}} terms that are likely to be used primarily in casual conversation rather than in more formal written works, speeches, and discourse.",
parents = {"terms by usage"},
}
labels["corporate jargon"] = {
description = "{{{langname}}} terms (typically for non-business-specific concepts) that are used especially in a [[business]] or [[corporate]] [[context]].",
additional = "See also [[:Category:Businesses]], [[:Category:Business]] and language-specific categories thereof for terms related to business-specific concepts.",
parents = {"terms by usage"},
}
labels["criminal slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to criminals.",
parents = {"slang"},
}
labels["derogatory terms"] = {
description = "{{{langname}}} terms that are intended to [[disparage]], [[demean]], [[insult]] or [[offend]].",
parents = {"terms by usage"},
}
labels["dialectal terms"] = {
description = "{{{langname}}} terms that are not used in standard language but only in dialects.",
parents = {"terms by usage"},
}
labels["dis legomena"] = {
description = "{{{langname}}} terms that are attested only twice in the entire corpus.",
parents = {"terms by usage"},
}
labels["drag slang"] = {
description = "{{{langname}}} [[slang]] terms used in the [[drag]] community.",
parents = {"LGBTQ slang"},
}
labels["ecclesiastical terms"] = {
description = "{{{langname}}} terms used only by religious figures.",
parents = {"terms by usage"},
}
labels["eggcorns"] = {
description = "{{{langname}}} [[eggcorn]]s, terms which are misconstructed.",
parents = {"misconstructions"},
}
labels["emoticons"] = {
description = "{{{langname}}} characters, or sequences of characters, that imitate expressions and other objects by means of [[pareidolia]].",
parents = {"internet slang", "text messaging slang"},
}
labels["endearing terms"] = {
description = "{{{langname}}} terms that are used to show affection or endearment to another person.",
parents = {"terms by usage"},
}
labels["ethnic slurs"] = {
description = "{{{langname}}} terms that are intended to offend certain ethnic groups.",
parents = {"offensive terms"},
}
labels["expressive terms"] = {
description = "{{{langname}}} terms with additional expressive content compared with the basic meaning of the term.",
additional = "This term is common in Slavic lexicography and is found in most Czech, Slovak and Polish dictionaries, but there is no exact equivalent in English lexicography. The closest equivalents might be a combination of ''colloquial'' and either ''endearing'' or ''pejorative'', as the case may be.",
parents = {"terms by usage"},
}
labels["eye dialect"] = {
description = "{{{langname}}} nonstandard spellings, which however do not change pronunciation, deliberately used by an author to indicate that the speaker uses a nonstandard or dialectal speech.",
parents = {"nonstandard forms", "terms by orthographic property"},
}
labels["familiar terms"] = {
description = "{{{langname}}} terms whose use is typically to contexts of friendly intimacy.",
parents = {"terms by usage"},
}
labels["fandom slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to fans of one or more works of fiction.",
parents = {"slang"},
}
labels["feminist forms"] = {
description = "Forms of {{{langname}}} terms primarily used in [[feminist]] writing, typically altered from standard forms to [[avoid]] an element perceived as [[male]].",
parents = {"nonstandard forms", "deliberate misspellings", "terms by usage", "Category:{{{langcode}}}:Feminism"},
}
labels["filter-avoidance spellings"] = {
description = "Deliberate misspellings of {{{langname}}} terms that are used to avoid [[w:Wordfilter|wordfilters]].",
parents = {"deliberate misspellings"},
}
labels["folk poetic terms"] = {
description = "{{{langname}}} terms whose usage is typically restricted to works of oral or folk poetry.",
parents = {"terms by usage", "poetic terms"},
}
labels["formal terms"] = {
description = "{{{langname}}} terms whose use is typically restricted to polite, ceremonious, non-casual contexts.",
parents = {"terms by usage"},
}
labels["gay slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to homosexual people.",
parents = {"LGBTQ slang"},
}
labels["gender-critical slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to gender-critical feminists.",
parents = {"slang", "Category:{{{langcode}}}:Gender-critical feminism"},
}
labels["gender-neutral terms"] = {
description = "{{{langname}}} terms that are applicable to all people, independent of gender.",
parents = {"terms by usage"},
}
labels["graffiti slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to creators of [[graffiti#Noun|graffiti]].",
parents = {"slang", "Category:{{{langcode}}}:Art"},
}
labels["higher register terms"] = {
description = "{{{langname}}} terms belonging to a higher linguistic register, such as literary terms; such terms are somewhat less common or known.",
parents = {"terms by usage"},
}
labels["historical terms"] = {
description = "{{{langname}}} terms that refer to obsolete things or concepts.",
parents = {"terms by usage"},
}
labels["honorific terms"] = {
description = "{{{langname}}} [[honorific]] terms, which are used to show deference and respect.",
parents = {"terms by usage"},
}
labels["polite terms"] = {
description = "{{{langname}}} [[polite]] terms, which are used to show deference and respect.",
parents = {"terms by usage"},
}
labels["hapax legomena"] = {
description = "{{{langname}}} terms that are attested only once in the entire corpus.",
parents = {"terms by usage"},
}
labels["humble terms"] = {
description = "{{{langname}}} [[humble]] terms, which are used to show humility towards the addressee, indicating that the speaker has a lower social standing.",
parents = {"honorific terms"},
}
labels["hypercorrections"] = {
description = "{{{langname}}} forms of other terms by misapplications of grammatical or orthographical rules.",
parents = {"nonstandard terms", "nonstandard forms"},
}
labels["hyperforeign terms"] = {
description = "{{{langname}}} terms created by misapplying the perceived grammatical, orthographical or phonetical rules of another language.",
parents = {"hypercorrections"},
}
labels["incel slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to incels.",
parents = {"slang", "Category:{{{langcode}}}:Incel community"},
}
labels["imperfective forms"] = {
description = "{{{langname}}} verbs that serve as imperfective variants of perfective verbs, sharing the same base set of meanings.",
parents = {"terms by usage"},
}
labels["informal forms"] = {
description = "{{{langname}}} terms that can be used in casual, non-ceremonious conversations as alternative forms of other terms.",
additional = "Informal non-lemma form variants also belong here.",
parents = {"informal terms"},
}
labels["informal terms"] = {
description = "{{{langname}}} terms whose use is typically restricted to casual, non‐ceremonious conversations.",
parents = {"terms by usage"},
}
labels["deliberate misspellings"] = {
description = "Deliberate misspellings of {{{langname}}} terms.",
parents = {"misspellings"},
}
labels["internet laughter slang"] = {
description = "{{{langname}}} [[slang]] terms that are used as substitutes for laughter in internet-related contexts.",
additional = "::''Note: The majority of items that <u>could</u> be here do not meet Wiktionary's [[WT:CFI|criteria for inclusion]].''",
parents = {"internet slang"},
}
labels["internet slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to internet users.",
parents = {"slang"},
}
labels["humorous terms"] = {
description = "{{{langname}}} terms that are humorous, amusing or joking.",
parents = {"terms by usage"},
}
labels["journalistic terms"] = {
description = "{{{langname}}} terms that are used especially in [[journalistic]] language, i.e. in newspapers and magazines.",
parents = {"terms by usage"},
}
labels["kennings"] = {
description = "{{{langname}}} metaphorical compounds or phrases describing basic objects in an allusive fashion, used especially in Germanic poetry.",
parents = {"poetic terms"},
}
labels["leetspeak"] = {
description = "{{{langname}}} which are used in [[leetspeak]], a variety of internet slang that focuses on substitution of letters by other characters which are similar in appearance.",
parents = {"internet slang"},
}
labels["LGBTQ slang"] = {
description = "{{{langname}}} [[slang]] terms which are used predominantly among [[LGBTQ]] people.",
parents = {"slang", "Category:{{{langcode}}}:LGBTQ"},
}
labels["literary terms"] = {
description = "{{{langname}}} terms whose usage is typically restricted to works of literature.",
parents = {"higher register terms"},
}
labels["medical slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to medical doctors, such as physicians and surgeons.",
parents = {"slang"},
}
labels["military slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to military personnel.",
parents = {"slang"},
}
labels["misconstructions"] = {
description = "Terms wrongly built due to a misunderstanding of their parts.",
parents = {"nonstandard forms"},
}
labels["misromanizations"] = {
description = "Common misromanizations of {{{langname}}} terms.",
parents = {"nonstandard forms"},
}
labels["misspellings"] = {
description = "Common accidental misspellings of {{{langname}}} terms and some terms which are deliberate misspellings.",
parents = {"nonstandard forms"},
}
labels["multiplicity slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to the {{l|en|multiplicity|id=multiple personalities}} [[community]].",
parents = {"slang", "Category:{{{langcode}}}:Multiplicity (psychology)"},
}
labels["naval slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to naval personnel.",
parents = {"military slang"},
}
labels["nonstandard forms"] = {
description = "{{{langname}}} forms of standard terms that are considered improper, incorrect or commonly misused.",
parents = {"nonstandard terms"},
}
labels["nonstandard terms"] = {
description = "{{{langname}}} terms that are considered improper, incorrect or commonly misused.",
parents = {"terms by usage"},
}
labels["numismatic slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to numismatists.",
parents = {"slang", "Category:{{{langcode}}}:Currency"},
}
labels["offensive terms"] = {
description = "{{{langname}}} terms that are typically considered to offend people.",
parents = {"terms by usage"},
}
labels["officialese terms"] = {
description = "{{{langname}}} terms that are chiefly used by official sources, and are often bureaucratic-sounding.",
parents = {"terms by usage"},
}
labels["oxymorons"] = {
description = "{{{langname}}} terms that are juxtapositions of opposing ideas.",
parents = {"terms by usage"},
}
labels["perfective forms"] = {
description = "{{{langname}}} verbs that serve as perfective variants of imperfective verbs, sharing the same base set of meanings.",
parents = {"terms by usage"},
}
labels["placeholder terms"] = {
description = "{{{langname}}} terms used to refer to items for which one does not know or cannot recall the name, or is unable to or does not care to specify precisely.",
parents = {"terms by usage"},
}
labels["poetic forms"] = {
description = "{{{langname}}} terms that can be used in works of poetry as poetic alternative forms of other terms.",
additional = "Poetic non-lemma form variants also belong here.",
parents = {"poetic terms"},
}
labels["poetic terms"] = {
description = "{{{langname}}} terms whose usage is typically restricted to works of poetry.",
parents = {"terms by usage", "literary terms"},
}
labels["post-nominal letters"] = {
description = "{{{langname}}} Post-nominal letters - also called post-nominal initials, post-nominal titles or designatory letters are letters placed after the name of a person to indicate that the individual holds a position, educational degree, accreditation, office, military decoration, or honour, or is a member of a religious institute or fraternity.",
parents = {"terms by usage"},
}
labels["prison slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to detainees in correctional institutions.",
parents = {"slang"},
}
labels["proscribed terms"] = {
description = "{{{langname}}} terms whose usage is proscribed; thus, they are considered wrong according to prescriptive sources.",
parents = {"terms by usage", "nonstandard terms"},
}
labels["puristic terms"] = {
description = "{{{langname}}} terms adopted for [[w:Linguistic purism|linguistic purism]].",
parents = {"terms by usage"},
}
labels["radio slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to radio communication.",
parents = {"slang"},
}
labels["Reddit slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|Reddit}}.",
parents = {"internet slang"},
}
labels["religious slurs"] = {
description = "{{{langname}}} terms that are intended to offend members of certain religions.",
parents = {"offensive terms"},
}
labels["reverential terms"] = {
description = "{{{langname}}} [[reverential]] terms, which are used to exalt the addressee, indicating that they have a higher social standing than the speaker.",
parents = {"honorific terms"},
}
labels["royal terms"] = {
description = "{{{langname}}} terms used only by royalty.",
parents = {"terms by usage"},
}
labels["rustic terms"] = {
description = "{{{langname}}} terms whose use is typically restricted rural speech.",
parents = {"terms by usage"},
}
labels["school slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to schools and school pupils.",
parents = {"slang"},
}
labels["self-deprecatory terms"] = {
description = "{{{langname}}} [[self-deprecatory]] terms.",
parents = {"terms by usage"},
}
labels["short forms"] = {
description = "{{{langname}}} terms that are [[short form]]s of other terms, often used informally.",
parents = {"terms by usage", "shortenings"},
}
labels["slang"] = {
description = "{{{langname}}} [[colloquial]] terms that are typically used to mark membership in a cultural subgroup.",
parents = {"terms by usage"},
}
labels["solemn terms"] = {
description = "{{{langname}}} terms that are used to instill a sense of somberness.",
parents = {"terms by usage"},
}
labels["student slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to colleges, universities, and their students.",
parents = {"slang"},
}
labels["superseded forms"] = {
description = "{{{langname}}} forms that have been superseded by other forms due to changes in spelling conventions.",
parents = {"terms by usage", "terms by orthographic property"},
}
labels["swear words"] = {
description = "{{{langname}}} terms that are used to swear, such as to express strong anger or frustration.",
parents = {"vulgarities"},
}
labels["technical terms"] = {
description = "{{{langname}}} terms that are usually or exclusively used in technical/scientific writing.",
parents = {"terms by usage"},
}
labels["terms of address"] = {
description = "{{{langname}}} terms used to refer to another person.",
parents = {"terms by usage"},
}
labels["terms used in hendiadys"] = {
description = "{{{langname}}} words or senses which are used only in {{w|hendiadys}}.",
parents = {"terms by usage"},
}
labels["terms with historical senses"] = {
description = "{{{langname}}} terms with senses that refer to things or concepts mainly known for their historical value.",
parents = {"terms by usage"},
}
labels["terms with transferred senses"] = {
description = "{{{langname}}} terms with [[Appendix:Glossary#transferred senses|transferred senses]].",
parents = {"terms by usage"},
}
labels["terms with uncertain meaning"] = {
description = "{{{langname}}} terms whose meaning is unknown or disputed.",
parents = {"terms by usage"},
}
labels["text messaging slang"] = {
description = "{{{langname}}} terms used for [[text messaging]] on mobile phones or similar devices, usually consisting of heavily abbreviated forms.",
parents = {"slang"},
}
labels["tone indicators"] = {
description = "{{{langname}}} symbols used to denote or clarify the intent of a preceeding or occasionally following message.",
parents = {"internet slang"},
}
labels["trademarks"] = {
description = "{{{langname}}} terms that identify legal entities, their products and services, by means of legal protection — to some extent, in a number of jurisdictions — against unauthorized use of the terms.",
parents = {"terms by usage"},
}
labels["transgender slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to transgender people.",
parents = {"LGBTQ slang", "Category:{{{langcode}}}:Transgender"},
}
labels["TV Tropes slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of the website {{w|TV Tropes}}.",
parents = {"internet slang"},
}
labels["umlautless spellings"] = {
description = "{{{langname}}} terms that are the result of the original terms' [[umlaut]]s being substituted.",
parents = {"nonstandard forms", "terms by orthographic property"},
}
labels["Usenet slang"] = {
description = "{{{langname}}} [[slang]] terms whose usage is typically restricted to users of {{w|Usenet}}.",
parents = {"internet slang"},
}
labels["men's speech terms"] = {
description = "{{{langname}}} terms and forms used in [[Appendix:Glossary#men's speech|men's speech]].",
parents = {"terms by usage"},
}
labels["women's speech terms"] = {
description = "{{{langname}}} terms and forms used in [[Appendix:Glossary#women's speech|women's speech]].",
parents = {"terms by usage"},
}
labels["vulgarities"] = {
description = "{{{langname}}} terms whose tone (rather than the meaning) is offensive to polite company.",
parents = {"terms by usage"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Terms by usage subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by usage subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their usage, such as slang, obsolete or archaic forms and vulgarities.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by usage", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
i6ngi1fgpp5ywoerwdmcv0rt197lhri
Mòideal:category tree/rhymes
828
17733
88407
2026-04-15T09:16:40Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/rhymes]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88407
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["rhymes"] = {
description = "List of indexes of {{{langname}}} words by their rhymes.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["refractory rhymes"] = {
description = "Lists of {{{langname}}} words that don't rhyme with other words.",
umbrella_parents = "Rhymes subcategories by language",
parents = {"rhymes"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Rhymes subcategories by language"] = {
description = "Umbrella categories covering topics related to rhymes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "rhymes", is_label = true, sort = " "},
},
}
raw_categories["Rhymes"] = {
description = "Umbrella categories covering rhymes by language.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "rhymes", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local rhyme_beginning = data.label:match("^rhymes/(.-)%-$")
if rhyme_beginning then
return {
description = ("{{{langname}}} rhyme indexes beginning with {{IPAchar|/%s/}}."):format(rhyme_beginning),
additional = "The entries in this category are not dictionary entries, but rather indexes of {{{langname}}} terms that rhyme in specific ways.",
parents = {
{name = "rhymes", sort = rhyme_beginning},
},
breadcrumb = {name = ("{{IPAchar|/%s-/}}"):format(rhyme_beginning), nocap = true},
umbrella = false,
}
end
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(raw_handlers, function(data)
local function rhymeTopCategory(lang)
return {
lang = lang:getCode(),
description = "Lists of " .. lang:makeCategoryLink() .. " words by their rhymes.",
additional = "This is an umbrella category. It contains no dictionary entries, but rather possible rhymes as subcategories.",
parents = {
"{{{langcat}}}",
{name = "Rhymes", sort = langname},
},
breadcrumb = "Rhymes",
toctemplateprefix = "rhymetop"
}
end
local function linkRhymeIfExists(lang, rhyme) -- {{change new|Though this could be ported to Wiktionary}}
if mw.title.new('Rhymes:' .. lang:getCanonicalName() .. "/" .. rhyme).exists then
return "'''[[Rhymes:" .. lang:getCanonicalName() .. "/" .. rhyme ..'|<span class="IPA">-' .. rhyme .. "</span>]]'''"
end
return '<span class="IPA">-' .. rhyme .. '</span>'
end
local function rhymeCategory(lang, rhyme)
return {
lang = lang:getCode(),
description = "List of " .. lang:makeCategoryLink() .. ' words with the rhyme ' .. linkRhymeIfExists(lang, rhyme) .. '.',
parents = {
{name = "Rhymes:" .. lang:getCanonicalName(), sort = rhyme},
},
breadcrumb = '<span class="IPA">-' .. rhyme .. '</span>',
displaytitle = 'Rhymes:' .. lang:getCanonicalName() .. '/<span class="IPA">' .. rhyme .. '</span>'
}
end
local function rhymeSyllableCountCategory(lang, rhyme, syllableCount)
return {
lang = lang:getCode(),
description = "List of " .. syllableCount .. "-syllable " .. lang:makeCategoryLink() .. ' words with the rhyme ' .. linkRhymeIfExists(lang, rhyme) .. '.',
parents = {
{name = "Rhymes:" .. lang:getCanonicalName() .. "/" .. rhyme, sort = syllableCount},
},
breadcrumb = tostring(syllableCount) .. " syllables",
displaytitle = 'Rhymes:' .. lang:getCanonicalName() .. '/<span class="IPA">' .. rhyme .. '</span>/' .. tostring(syllableCount) .. " syllable" .. (syllableCount > 1 and "s" or "")
}
end
local langname = data.category:match("^Rhymes:([^/]+)")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if lang then
local tokens = mw.text.split(data.category, "/")
if #tokens > 1 then
local rhyme = tokens[2]
if #tokens == 3 then
-- rhyme + syllable count category
local syllables = nil
if tokens[3] == "1 syllable" then
syllables = 1
else
local syllablesregex = tokens[3]:match("(%d+) syllables")
if syllablesregex then
syllables = tonumber(syllablesregex)
if syllables < 2 then
syllables = nil
end
end
end
if syllables then
return rhymeSyllableCountCategory(lang, rhyme, syllables)
end
elseif #tokens == 2 then
-- rhyme category
return rhymeCategory(lang, rhyme)
end
else
-- rhyme language top category
return rhymeTopCategory(lang)
end
end
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
etn5h5sat00dnyqrhgq7tayggz1hkrb
88408
88407
2026-07-27T00:17:28Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/rhymes]]
88407
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["rhymes"] = {
description = "List of indexes of {{{langname}}} words by their rhymes.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["refractory rhymes"] = {
description = "Lists of {{{langname}}} words that don't rhyme with other words.",
umbrella_parents = "Rhymes subcategories by language",
parents = {"rhymes"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Rhymes subcategories by language"] = {
description = "Umbrella categories covering topics related to rhymes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "rhymes", is_label = true, sort = " "},
},
}
raw_categories["Rhymes"] = {
description = "Umbrella categories covering rhymes by language.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "rhymes", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local rhyme_beginning = data.label:match("^rhymes/(.-)%-$")
if rhyme_beginning then
return {
description = ("{{{langname}}} rhyme indexes beginning with {{IPAchar|/%s/}}."):format(rhyme_beginning),
additional = "The entries in this category are not dictionary entries, but rather indexes of {{{langname}}} terms that rhyme in specific ways.",
parents = {
{name = "rhymes", sort = rhyme_beginning},
},
breadcrumb = {name = ("{{IPAchar|/%s-/}}"):format(rhyme_beginning), nocap = true},
umbrella = false,
}
end
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(raw_handlers, function(data)
local function rhymeTopCategory(lang)
return {
lang = lang:getCode(),
description = "Lists of " .. lang:makeCategoryLink() .. " words by their rhymes.",
additional = "This is an umbrella category. It contains no dictionary entries, but rather possible rhymes as subcategories.",
parents = {
"{{{langcat}}}",
{name = "Rhymes", sort = langname},
},
breadcrumb = "Rhymes",
toctemplateprefix = "rhymetop"
}
end
local function linkRhymeIfExists(lang, rhyme) -- {{change new|Though this could be ported to Wiktionary}}
if mw.title.new('Rhymes:' .. lang:getCanonicalName() .. "/" .. rhyme).exists then
return "'''[[Rhymes:" .. lang:getCanonicalName() .. "/" .. rhyme ..'|<span class="IPA">-' .. rhyme .. "</span>]]'''"
end
return '<span class="IPA">-' .. rhyme .. '</span>'
end
local function rhymeCategory(lang, rhyme)
return {
lang = lang:getCode(),
description = "List of " .. lang:makeCategoryLink() .. ' words with the rhyme ' .. linkRhymeIfExists(lang, rhyme) .. '.',
parents = {
{name = "Rhymes:" .. lang:getCanonicalName(), sort = rhyme},
},
breadcrumb = '<span class="IPA">-' .. rhyme .. '</span>',
displaytitle = 'Rhymes:' .. lang:getCanonicalName() .. '/<span class="IPA">' .. rhyme .. '</span>'
}
end
local function rhymeSyllableCountCategory(lang, rhyme, syllableCount)
return {
lang = lang:getCode(),
description = "List of " .. syllableCount .. "-syllable " .. lang:makeCategoryLink() .. ' words with the rhyme ' .. linkRhymeIfExists(lang, rhyme) .. '.',
parents = {
{name = "Rhymes:" .. lang:getCanonicalName() .. "/" .. rhyme, sort = syllableCount},
},
breadcrumb = tostring(syllableCount) .. " syllables",
displaytitle = 'Rhymes:' .. lang:getCanonicalName() .. '/<span class="IPA">' .. rhyme .. '</span>/' .. tostring(syllableCount) .. " syllable" .. (syllableCount > 1 and "s" or "")
}
end
local langname = data.category:match("^Rhymes:([^/]+)")
if langname then
local lang = require("Module:languages").getByCanonicalName(langname)
if lang then
local tokens = mw.text.split(data.category, "/")
if #tokens > 1 then
local rhyme = tokens[2]
if #tokens == 3 then
-- rhyme + syllable count category
local syllables = nil
if tokens[3] == "1 syllable" then
syllables = 1
else
local syllablesregex = tokens[3]:match("(%d+) syllables")
if syllablesregex then
syllables = tonumber(syllablesregex)
if syllables < 2 then
syllables = nil
end
end
end
if syllables then
return rhymeSyllableCountCategory(lang, rhyme, syllables)
end
elseif #tokens == 2 then
-- rhyme category
return rhymeCategory(lang, rhyme)
end
else
-- rhyme language top category
return rhymeTopCategory(lang)
end
end
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
etn5h5sat00dnyqrhgq7tayggz1hkrb
Mòideal:category tree/scripts
828
17734
88409
2025-09-08T14:46:54Z
en>Surjection
0
88409
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module
-- and displayed in script category pages.
local blocks_submodule = "Module:category tree/scripts/blocks"
local en_utilities_module = "Module:en-utilities"
local scripts_module = "Module:scripts"
local string_utilities_module = "Module:string utilities"
local m_str_utils = require(string_utilities_module)
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local get_script_by_category_name = require(scripts_module).getByCategoryName
local pattern_escape = m_str_utils.pattern_escape
-----------------------------------------------------------------------------
-- --
-- SCRIPT LABELS --
-- --
-----------------------------------------------------------------------------
--[=[
The following values are recognized for each script label:
'description'
A plain English description for the label. Special template substitutions are recognized; see below.
'umbrella_parents'
A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label.
The format is as for regular raw categories (see [[Module:category tree/data/documentation]]).
'umbrella_breadcrumb'
The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script".
'catfix'
Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]).
This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked
appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question.
Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and
'root_additional' variable values initialized below). These are replaced by the equivalent text.
{{{code}}}: Script code.
{{{codes}}}: A comma-separated list of all the alias codes for this script. This applies especially to Arabic, which has
multiple aliases (e.g. 'tt-Arab', 'ur-Arab', 'ku-Arab', etc.).
{{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string.
{{{scname}}}: The name of the script that the category belongs to.
{{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name.
{{{scdisp}}}: The display form of the script, which adds "script" to the regular name.
{{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}.
{{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}.
]=]
local script_labels = {}
script_labels["characters"] = {
description = "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language.",
umbrella_parents = {"Fundamental"},
umbrella_breadcrumb = "Characters by script",
catfix = "mul",
}
script_labels["appendices"] = {
description = "Appendices about {{{scprosename}}}.",
umbrella_parents = {"Category:Appendices"},
}
script_labels["languages"] = {
description = "Languages that use {{{scprosename}}}.",
umbrella_parents = {"All languages"},
}
script_labels["templates"] = {
description = "Templates with predefined contents for {{{scprosename}}}.",
umbrella_parents = {"Templates"},
}
script_labels["modules"] = {
description = "Modules that implement functionality for {{{scprosename}}}.",
umbrella_parents = {"Modules"},
}
script_labels["data modules"] = {
description = "Modules that contain data related to {{{scprosename}}}.",
umbrella_parents = {"Data modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["All scripts"] = {
description = "This category contains the categories for every script (writing system) on Wiktionary.",
additional = "See [[Wiktionary:List of scripts]] for a full list.",
parents = {"Fundamental"},
}
-- Types of writing systems listed in [[Module:writing systems/data]].
raw_categories["Scripts by type"] = {
description = "Scripts classified by how they represent words.",
parents = {{ name = "All scripts", sort = " " }},
breadcrumb = "by type",
}
raw_categories["Abjads"] = {
description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.",
parents = {"Scripts by type"},
}
raw_categories["Abugidas"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.",
parents = {"Scripts by type"},
}
raw_categories["Alphabetic writing systems"] = {
description = "Scripts whose symbols represent individual speech sounds.",
parents = {"Scripts by type"},
}
raw_categories["Logographic writing systems"] = {
description = "Scripts whose symbols represent individual words.",
parents = {"Scripts by type"},
}
raw_categories["Pictographic writing systems"] = {
description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.",
parents = {"Scripts by type"},
}
raw_categories["Semisyllabaries"] = {
description = "Scripts which are a combination of an alphabet and a syllbary.",
parents = {"Scripts by type"},
}
raw_categories["Syllabaries"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.",
parents = {"Scripts by type"},
}
for script_label, obj in pairs(script_labels) do
raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = {
description = "Categories with " .. script_label .. " of various specific scripts.",
breadcrumb = obj.umbrella_breadcrumb or "by script",
parents = obj.umbrella_parents,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div>
{| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)"
| style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}''
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]'''
|-
| style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}'''
|}
</div>]=]
-- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_description = "This is the main category of '''{{{scprosename}}}'''."
-- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]].
In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=]
-- Replace template notation {{{}}} with variables.
local function substitute_template_refs(text, sc)
local displayForm = sc:getDisplayForm()
local scname = sc:getCanonicalName()
local codes = {}
for code, data in pairs(mw.loadData("Module:scripts/data")) do
if data[1] == scname then
table.insert(codes, "'''" .. code .. "'''")
end
end
if codes[2] then
table.sort(
codes,
-- Four-letter codes have length 10, because they are bolded: '''Latn'''.
function(code1, code2)
if #code1 == 10 then
if #code2 == 10 then
return code1 < code2
else
return true
end
else
if #code2 == 10 then
return false -- four-letter codes before other codes
else
return code1 < code2
end
end
end)
end
local content = {
code = sc:getCode(),
codesplural = codes[2] and "s" or "",
codes = table.concat(codes, ", "),
scname = scname,
sccat = sc:getCategoryName(),
scdisp = displayForm,
scprosename = (displayForm:find("code") or displayForm:find("semaphore")) and displayForm or "the " .. displayForm,
Wikipedia = sc:getWikipediaArticle(),
}
text = string.gsub(
text,
"{{{([^}]+)}}}",
function (parameter)
return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.")
end)
return text
end
local function get_root_additional(additional, sc)
local ret = { additional }
local systems = sc:getSystems()
for _, system in ipairs(systems) do
table.insert(ret, "\n\nThe {{{scname}}} script is ")
table.insert(ret, add_indefinite_article(system:getDisplayForm("singular")))
table.insert(ret, ".")
end
local blocks = require(blocks_submodule).print_blocks_by_canonical_name(sc:getCanonicalName())
if blocks then
table.insert(ret, "\n")
table.insert(ret, blocks)
end
return substitute_template_refs(table.concat(ret), sc)
end
-- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and
-- [[Category:Flag semaphore]].
table.insert(raw_handlers, function(data)
local sc = get_script_by_category_name(data.category)
if not sc then
return nil
end
-- Compute parents.
local parents = {}
local systems = sc:getSystems()
for _, system in ipairs(systems) do
table.insert(parents, system:getCategoryName())
end
table.insert(parents, "All scripts")
-- Compute (extra) children.
local children = {}
for script_label in pairs(script_labels) do
table.insert(children, data.category .. " " .. script_label)
end
return {
canonical_name = sc:getCategoryName(),
topright = substitute_template_refs(root_topright, sc),
description = substitute_template_refs(root_description, sc),
additional = get_root_additional(root_additional, sc),
parents = parents,
breadcrumb = sc:getCanonicalName(),
extra_children = children,
can_be_empty = true,
}
end)
-- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and
-- [[Category:Flag semaphore LABELS]].
table.insert(raw_handlers, function(data)
local sc, scname, label
for lab in pairs(script_labels) do
scname, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$")
sc = get_script_by_category_name(scname)
if sc then
break
end
end
if not sc then
return nil
end
local label_obj = script_labels[label]
-- Compute parents.
local parents = {
{name = scname, sort = label},
-- umbrella category
mw.getContentLanguage():ucfirst(label) .. " by script",
}
return {
canonical_name = sc:getCategoryName() .. " " .. label,
description = substitute_template_refs(label_obj.description, sc),
parents = parents,
breadcrumb = label,
catfix = label_obj.catfix,
catfix_sc = label_obj.catfix and sc:getCode(),
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
gkkg5412pu1tu58lld0rtbr4yfxgz5l
88410
88409
2026-07-27T00:17:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/scripts]]
88409
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module
-- and displayed in script category pages.
local blocks_submodule = "Module:category tree/scripts/blocks"
local en_utilities_module = "Module:en-utilities"
local scripts_module = "Module:scripts"
local string_utilities_module = "Module:string utilities"
local m_str_utils = require(string_utilities_module)
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local get_script_by_category_name = require(scripts_module).getByCategoryName
local pattern_escape = m_str_utils.pattern_escape
-----------------------------------------------------------------------------
-- --
-- SCRIPT LABELS --
-- --
-----------------------------------------------------------------------------
--[=[
The following values are recognized for each script label:
'description'
A plain English description for the label. Special template substitutions are recognized; see below.
'umbrella_parents'
A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label.
The format is as for regular raw categories (see [[Module:category tree/data/documentation]]).
'umbrella_breadcrumb'
The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script".
'catfix'
Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]).
This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked
appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question.
Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and
'root_additional' variable values initialized below). These are replaced by the equivalent text.
{{{code}}}: Script code.
{{{codes}}}: A comma-separated list of all the alias codes for this script. This applies especially to Arabic, which has
multiple aliases (e.g. 'tt-Arab', 'ur-Arab', 'ku-Arab', etc.).
{{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string.
{{{scname}}}: The name of the script that the category belongs to.
{{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name.
{{{scdisp}}}: The display form of the script, which adds "script" to the regular name.
{{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}.
{{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}.
]=]
local script_labels = {}
script_labels["characters"] = {
description = "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language.",
umbrella_parents = {"Fundamental"},
umbrella_breadcrumb = "Characters by script",
catfix = "mul",
}
script_labels["appendices"] = {
description = "Appendices about {{{scprosename}}}.",
umbrella_parents = {"Category:Appendices"},
}
script_labels["languages"] = {
description = "Languages that use {{{scprosename}}}.",
umbrella_parents = {"All languages"},
}
script_labels["templates"] = {
description = "Templates with predefined contents for {{{scprosename}}}.",
umbrella_parents = {"Templates"},
}
script_labels["modules"] = {
description = "Modules that implement functionality for {{{scprosename}}}.",
umbrella_parents = {"Modules"},
}
script_labels["data modules"] = {
description = "Modules that contain data related to {{{scprosename}}}.",
umbrella_parents = {"Data modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["All scripts"] = {
description = "This category contains the categories for every script (writing system) on Wiktionary.",
additional = "See [[Wiktionary:List of scripts]] for a full list.",
parents = {"Fundamental"},
}
-- Types of writing systems listed in [[Module:writing systems/data]].
raw_categories["Scripts by type"] = {
description = "Scripts classified by how they represent words.",
parents = {{ name = "All scripts", sort = " " }},
breadcrumb = "by type",
}
raw_categories["Abjads"] = {
description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.",
parents = {"Scripts by type"},
}
raw_categories["Abugidas"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.",
parents = {"Scripts by type"},
}
raw_categories["Alphabetic writing systems"] = {
description = "Scripts whose symbols represent individual speech sounds.",
parents = {"Scripts by type"},
}
raw_categories["Logographic writing systems"] = {
description = "Scripts whose symbols represent individual words.",
parents = {"Scripts by type"},
}
raw_categories["Pictographic writing systems"] = {
description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.",
parents = {"Scripts by type"},
}
raw_categories["Semisyllabaries"] = {
description = "Scripts which are a combination of an alphabet and a syllbary.",
parents = {"Scripts by type"},
}
raw_categories["Syllabaries"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.",
parents = {"Scripts by type"},
}
for script_label, obj in pairs(script_labels) do
raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = {
description = "Categories with " .. script_label .. " of various specific scripts.",
breadcrumb = obj.umbrella_breadcrumb or "by script",
parents = obj.umbrella_parents,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div>
{| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)"
| style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}''
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]'''
|-
| style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}'''
|}
</div>]=]
-- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_description = "This is the main category of '''{{{scprosename}}}'''."
-- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]].
In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=]
-- Replace template notation {{{}}} with variables.
local function substitute_template_refs(text, sc)
local displayForm = sc:getDisplayForm()
local scname = sc:getCanonicalName()
local codes = {}
for code, data in pairs(mw.loadData("Module:scripts/data")) do
if data[1] == scname then
table.insert(codes, "'''" .. code .. "'''")
end
end
if codes[2] then
table.sort(
codes,
-- Four-letter codes have length 10, because they are bolded: '''Latn'''.
function(code1, code2)
if #code1 == 10 then
if #code2 == 10 then
return code1 < code2
else
return true
end
else
if #code2 == 10 then
return false -- four-letter codes before other codes
else
return code1 < code2
end
end
end)
end
local content = {
code = sc:getCode(),
codesplural = codes[2] and "s" or "",
codes = table.concat(codes, ", "),
scname = scname,
sccat = sc:getCategoryName(),
scdisp = displayForm,
scprosename = (displayForm:find("code") or displayForm:find("semaphore")) and displayForm or "the " .. displayForm,
Wikipedia = sc:getWikipediaArticle(),
}
text = string.gsub(
text,
"{{{([^}]+)}}}",
function (parameter)
return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.")
end)
return text
end
local function get_root_additional(additional, sc)
local ret = { additional }
local systems = sc:getSystems()
for _, system in ipairs(systems) do
table.insert(ret, "\n\nThe {{{scname}}} script is ")
table.insert(ret, add_indefinite_article(system:getDisplayForm("singular")))
table.insert(ret, ".")
end
local blocks = require(blocks_submodule).print_blocks_by_canonical_name(sc:getCanonicalName())
if blocks then
table.insert(ret, "\n")
table.insert(ret, blocks)
end
return substitute_template_refs(table.concat(ret), sc)
end
-- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and
-- [[Category:Flag semaphore]].
table.insert(raw_handlers, function(data)
local sc = get_script_by_category_name(data.category)
if not sc then
return nil
end
-- Compute parents.
local parents = {}
local systems = sc:getSystems()
for _, system in ipairs(systems) do
table.insert(parents, system:getCategoryName())
end
table.insert(parents, "All scripts")
-- Compute (extra) children.
local children = {}
for script_label in pairs(script_labels) do
table.insert(children, data.category .. " " .. script_label)
end
return {
canonical_name = sc:getCategoryName(),
topright = substitute_template_refs(root_topright, sc),
description = substitute_template_refs(root_description, sc),
additional = get_root_additional(root_additional, sc),
parents = parents,
breadcrumb = sc:getCanonicalName(),
extra_children = children,
can_be_empty = true,
}
end)
-- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and
-- [[Category:Flag semaphore LABELS]].
table.insert(raw_handlers, function(data)
local sc, scname, label
for lab in pairs(script_labels) do
scname, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$")
sc = get_script_by_category_name(scname)
if sc then
break
end
end
if not sc then
return nil
end
local label_obj = script_labels[label]
-- Compute parents.
local parents = {
{name = scname, sort = label},
-- umbrella category
mw.getContentLanguage():ucfirst(label) .. " by script",
}
return {
canonical_name = sc:getCategoryName() .. " " .. label,
description = substitute_template_refs(label_obj.description, sc),
parents = parents,
breadcrumb = label,
catfix = label_obj.catfix,
catfix_sc = label_obj.catfix and sc:getCode(),
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
gkkg5412pu1tu58lld0rtbr4yfxgz5l
Mòideal:category tree/semantic classes
828
17735
88411
2026-04-15T09:16:40Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/semantic classes]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88411
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by semantic function"] = {
description = "{{{langname}}} terms by their semantic function, regardless of part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["cardinal numbers"] = {
description = "{{{langname}}} terms that are used to count objects.",
parents = {"numbers"},
}
labels["collective numbers"] = {
description = "{{{langname}}} terms used to indicate a set of items of a particular size.",
parents = {"numbers"},
}
labels["demonstrative pro-forms"] = {
description = "{{{langname}}} terms that refer to specified entities or qualities.",
parents = {"pro-forms"},
}
labels["distributive numbers"] = {
description = "{{{langname}}} terms that expresses the amount or quantity of something as it pertains to each member of a set, such as the number of times something happens at once, or the number of members affected each time.",
parents = {"numbers"},
}
labels["fractional numbers"] = {
description = "{{{langname}}} terms that indicate proportioned parts of a whole.",
parents = {"numbers"},
}
labels["hedges"] = {
description = "{{{langname}}} expressions that are used to qualify statements so as to lessen impact, e.g. to appear polite or modest or to soften a blow.",
parents = {"terms by semantic function"},
}
labels["indefinite pro-forms"] = {
description = "{{{langname}}} terms that refer to unspecified entities or qualities.",
parents = {"pro-forms"},
}
labels["intensifiers"] = {
description = "{{{langname}}} terms that serve to intensify.",
parents = {"terms by semantic function"},
}
labels["interrogative pro-forms"] = {
description = "{{{langname}}} terms that request the listener to specify.",
parents = {"pro-forms"},
}
labels["imperative sentences"] = {
description = "{{{langname}}} free-standing expressions that are in the grammatical form of commands, though often with a [[precative]] or [[hortatory]] force.",
parents = {"sentences"},
}
labels["negative polarity items"] = {
description = "{{{langname}}} terms that are chiefly or always used with a negation.",
additional = "These are the opposite of positive polarity items; see [[:Category:{{{langname}}} positive polarity items]]. See also {{pedia|Polarity items}} for a general discussion and also {{w|Irrealis mood}} for grammatical constructions in which these can be used without an explicit negative.",
umbrella = {
additional = "These are the opposite of positive polarity items; see [[:Category:Positive polarity items by language]]. See also {{pedia|Polarity items}}",
},
parents = {"terms by semantic function"},
}
labels["multiplicative numbers"] = {
description = "{{{langname}}} terms that are used to multiply the amount or quantity of something.",
parents = {"numbers"},
}
labels["nominal numbers"] = {
description = "{{{langname}}} terms that represent numbers as entities in themselves.",
parents = {"numbers"},
}
labels["numbers"] = {
description = "{{{langname}}} terms that represent or relate to numbers of various kinds.",
parents = {"terms by semantic function"},
}
labels["ordinal numbers"] = {
description = "{{{langname}}} terms that specify the ordering of objects within a sequence.",
parents = {"numbers"},
}
labels["positive polarity items"] = {
description = "{{{langname}}} terms that are chiefly or always used in an affirmative sentence, and not with a negation.",
additional = "These are the opposite of negative polarity items; see [[:Category:{{{langname}}} negative polarity items]]. See also {{pedia|Polarity items}}",
umbrella = {
additional = "These are the opposite of negative polarity items; see [[:Category:Negative polarity items by language]]. See also {{pedia|Polarity items}}",
},
parents = {"terms by semantic function"},
}
labels["pro-forms"] = {
description = "{{{langname}}} terms that refer to other parts of speech.",
parents = {"terms by semantic function"},
}
labels["pro-sentences"] = {
description = "{{{langname}}} terms that substitute for full [[sentences]].",
parents = {"pro-forms"},
}
labels["questions"] = {
description = "{{{langname}}} terms that are usually or notably used as questions.",
parents = {"sentences"},
}
labels["relative pro-forms"] = {
description = "{{{langname}}} terms that indicate [[relative clause]]s.",
parents = {"pro-forms"},
}
labels["rhetorical questions"] = {
description = "{{{langname}}} questions posed only for dramatic or persuasive effect.",
parents = {"idioms", "sentences", "questions"},
}
labels["subjunctive expressions"] = {
description = "{{{langname}}} expressions containing grammatically [[subjunctive]] verbs.",
parents = {"terms by semantic function"},
}
for label, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Terms by semantic function subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by semantic function subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their semantic function, such as types of numbers or questions.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by semantic function", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
ip3q6oba014cfheyt1lpfwesi3p1clv
88412
88411
2026-07-27T00:17:52Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/semantic_classes]]
88411
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by semantic function"] = {
description = "{{{langname}}} terms by their semantic function, regardless of part of speech.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["cardinal numbers"] = {
description = "{{{langname}}} terms that are used to count objects.",
parents = {"numbers"},
}
labels["collective numbers"] = {
description = "{{{langname}}} terms used to indicate a set of items of a particular size.",
parents = {"numbers"},
}
labels["demonstrative pro-forms"] = {
description = "{{{langname}}} terms that refer to specified entities or qualities.",
parents = {"pro-forms"},
}
labels["distributive numbers"] = {
description = "{{{langname}}} terms that expresses the amount or quantity of something as it pertains to each member of a set, such as the number of times something happens at once, or the number of members affected each time.",
parents = {"numbers"},
}
labels["fractional numbers"] = {
description = "{{{langname}}} terms that indicate proportioned parts of a whole.",
parents = {"numbers"},
}
labels["hedges"] = {
description = "{{{langname}}} expressions that are used to qualify statements so as to lessen impact, e.g. to appear polite or modest or to soften a blow.",
parents = {"terms by semantic function"},
}
labels["indefinite pro-forms"] = {
description = "{{{langname}}} terms that refer to unspecified entities or qualities.",
parents = {"pro-forms"},
}
labels["intensifiers"] = {
description = "{{{langname}}} terms that serve to intensify.",
parents = {"terms by semantic function"},
}
labels["interrogative pro-forms"] = {
description = "{{{langname}}} terms that request the listener to specify.",
parents = {"pro-forms"},
}
labels["imperative sentences"] = {
description = "{{{langname}}} free-standing expressions that are in the grammatical form of commands, though often with a [[precative]] or [[hortatory]] force.",
parents = {"sentences"},
}
labels["negative polarity items"] = {
description = "{{{langname}}} terms that are chiefly or always used with a negation.",
additional = "These are the opposite of positive polarity items; see [[:Category:{{{langname}}} positive polarity items]]. See also {{pedia|Polarity items}} for a general discussion and also {{w|Irrealis mood}} for grammatical constructions in which these can be used without an explicit negative.",
umbrella = {
additional = "These are the opposite of positive polarity items; see [[:Category:Positive polarity items by language]]. See also {{pedia|Polarity items}}",
},
parents = {"terms by semantic function"},
}
labels["multiplicative numbers"] = {
description = "{{{langname}}} terms that are used to multiply the amount or quantity of something.",
parents = {"numbers"},
}
labels["nominal numbers"] = {
description = "{{{langname}}} terms that represent numbers as entities in themselves.",
parents = {"numbers"},
}
labels["numbers"] = {
description = "{{{langname}}} terms that represent or relate to numbers of various kinds.",
parents = {"terms by semantic function"},
}
labels["ordinal numbers"] = {
description = "{{{langname}}} terms that specify the ordering of objects within a sequence.",
parents = {"numbers"},
}
labels["positive polarity items"] = {
description = "{{{langname}}} terms that are chiefly or always used in an affirmative sentence, and not with a negation.",
additional = "These are the opposite of negative polarity items; see [[:Category:{{{langname}}} negative polarity items]]. See also {{pedia|Polarity items}}",
umbrella = {
additional = "These are the opposite of negative polarity items; see [[:Category:Negative polarity items by language]]. See also {{pedia|Polarity items}}",
},
parents = {"terms by semantic function"},
}
labels["pro-forms"] = {
description = "{{{langname}}} terms that refer to other parts of speech.",
parents = {"terms by semantic function"},
}
labels["pro-sentences"] = {
description = "{{{langname}}} terms that substitute for full [[sentences]].",
parents = {"pro-forms"},
}
labels["questions"] = {
description = "{{{langname}}} terms that are usually or notably used as questions.",
parents = {"sentences"},
}
labels["relative pro-forms"] = {
description = "{{{langname}}} terms that indicate [[relative clause]]s.",
parents = {"pro-forms"},
}
labels["rhetorical questions"] = {
description = "{{{langname}}} questions posed only for dramatic or persuasive effect.",
parents = {"idioms", "sentences", "questions"},
}
labels["subjunctive expressions"] = {
description = "{{{langname}}} expressions containing grammatically [[subjunctive]] verbs.",
parents = {"terms by semantic function"},
}
for label, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Terms by semantic function subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by semantic function subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their semantic function, such as types of numbers or questions.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by semantic function", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
ip3q6oba014cfheyt1lpfwesi3p1clv
Mòideal:category tree/shortenings
828
17736
88413
2026-04-15T09:16:41Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/shortenings]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88413
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["shortenings"] = {
description = "{{{langname}}} terms that are shortened forms of other words or word combinations.",
umbrella_parents = "Terms by etymology subcategories by language",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["abbreviations"] = {
description = "{{{langname}}} abbreviated words or groups of words.",
parents = {"shortenings"},
}
labels["acronyms"] = {
description = "{{{langname}}} groups of words represented by parts pronounced together as single words.",
parents = {"shortenings"},
}
labels["apheretic forms"] = {
description = "{{{langname}}} words that underwent [[apheresis]], meaning their origin involved a loss or omission of a sound or syllable from their beginning.",
parents = {"clippings", "terms by etymology"},
}
labels["apocopic forms"] = {
description = "{{{langname}}} words that underwent [[apocope]], thus their origin involved a loss or omission of a sound or syllable(s) from their end.",
parents = {"clippings", "terms by etymology"},
}
labels["clipped compounds"] = {
description = "{{{langname}}} compounds formed by clipping some of the words of the original term while leaving others as is.",
parents = {"clippings"},
}
labels["clippings"] = {
description = "{{{langname}}} words that were formed from another word by removing part of it, but without changing the part of speech.",
parents = {"shortenings"},
}
labels["contractions"] = {
description = "{{{langname}}} shortened words or phrases, deriving from multiple words.",
parents = {"shortenings"},
}
labels["ellipses"] = {
description = "{{{langname}}} terms that are shortened versions of longer expressions.",
parents = {"shortenings", "terms by etymology"},
}
labels["initialisms"] = {
description = "{{{langname}}} groups of words represented by their beginning parts pronounced separately.",
parents = {"shortenings"},
}
labels["nomina sacra"] = {
description = "{{{langname}}} [[nomen sacrum|nomina sacra]].",
parents = {"abbreviations"},
}
labels["pseudo-acronyms"] = {
description = "{{{langname}}} groups of words that used to represent an acronym but no longer do, or which appear to be acronyms but are not.",
parents = {"shortenings"},
}
labels["scribal abbreviations"] = {
description = "{{{langname}}} abbreviations used by scribes.",
parents = {"abbreviations"},
}
labels["sigla"] = {
description = "{{{langname}}} letters or symbols standing for words, word parts or common sequences of letters.",
parents = {"abbreviations", "symbols"},
}
labels["Stenoscript abbreviations"] = {
description = "{{{langname}}} abbreviations used in [[Stenoscript]].",
parents = {"abbreviations"},
}
labels["syllabic abbreviations"] = {
description = "{{{langname}}} abbreviations formed from syllables of the words being abbreviated rather than individual letters.",
parents = {"acronyms"},
}
labels["syncopic forms"] = {
description = "{{{langname}}} words that underwent [[syncope]], thus their origin involved a loss or omission of a sound or syllable from their interior.",
parents = {"clippings", "terms by etymology"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Shortenings subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Shortenings subcategories by language"] = {
description = "Umbrella categories covering topics related to shortenings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "shortenings", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
ecbk0l33ookt03anes8qb88uot8hkr6
88414
88413
2026-07-27T00:18:09Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/shortenings]]
88413
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["shortenings"] = {
description = "{{{langname}}} terms that are shortened forms of other words or word combinations.",
umbrella_parents = "Terms by etymology subcategories by language",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["abbreviations"] = {
description = "{{{langname}}} abbreviated words or groups of words.",
parents = {"shortenings"},
}
labels["acronyms"] = {
description = "{{{langname}}} groups of words represented by parts pronounced together as single words.",
parents = {"shortenings"},
}
labels["apheretic forms"] = {
description = "{{{langname}}} words that underwent [[apheresis]], meaning their origin involved a loss or omission of a sound or syllable from their beginning.",
parents = {"clippings", "terms by etymology"},
}
labels["apocopic forms"] = {
description = "{{{langname}}} words that underwent [[apocope]], thus their origin involved a loss or omission of a sound or syllable(s) from their end.",
parents = {"clippings", "terms by etymology"},
}
labels["clipped compounds"] = {
description = "{{{langname}}} compounds formed by clipping some of the words of the original term while leaving others as is.",
parents = {"clippings"},
}
labels["clippings"] = {
description = "{{{langname}}} words that were formed from another word by removing part of it, but without changing the part of speech.",
parents = {"shortenings"},
}
labels["contractions"] = {
description = "{{{langname}}} shortened words or phrases, deriving from multiple words.",
parents = {"shortenings"},
}
labels["ellipses"] = {
description = "{{{langname}}} terms that are shortened versions of longer expressions.",
parents = {"shortenings", "terms by etymology"},
}
labels["initialisms"] = {
description = "{{{langname}}} groups of words represented by their beginning parts pronounced separately.",
parents = {"shortenings"},
}
labels["nomina sacra"] = {
description = "{{{langname}}} [[nomen sacrum|nomina sacra]].",
parents = {"abbreviations"},
}
labels["pseudo-acronyms"] = {
description = "{{{langname}}} groups of words that used to represent an acronym but no longer do, or which appear to be acronyms but are not.",
parents = {"shortenings"},
}
labels["scribal abbreviations"] = {
description = "{{{langname}}} abbreviations used by scribes.",
parents = {"abbreviations"},
}
labels["sigla"] = {
description = "{{{langname}}} letters or symbols standing for words, word parts or common sequences of letters.",
parents = {"abbreviations", "symbols"},
}
labels["Stenoscript abbreviations"] = {
description = "{{{langname}}} abbreviations used in [[Stenoscript]].",
parents = {"abbreviations"},
}
labels["syllabic abbreviations"] = {
description = "{{{langname}}} abbreviations formed from syllables of the words being abbreviated rather than individual letters.",
parents = {"acronyms"},
}
labels["syncopic forms"] = {
description = "{{{langname}}} words that underwent [[syncope]], thus their origin involved a loss or omission of a sound or syllable from their interior.",
parents = {"clippings", "terms by etymology"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Shortenings subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Shortenings subcategories by language"] = {
description = "Umbrella categories covering topics related to shortenings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "shortenings", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
ecbk0l33ookt03anes8qb88uot8hkr6
Mòideal:category tree/speech acts
828
17737
88415
2026-04-15T09:16:41Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/speech acts]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88415
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["speech acts"] = {
description = "{{{langname}}} terms that serves a performative function, in addition to conveying information.",
umbrella_parents = "Terms by semantic function subcategories by language",
parents = {"terms by semantic function"},
}
labels["dismissals"] = {
description = "{{{langname}}} expressions intended to [[dismiss]] the listener.",
parents = {"farewells", "imperative sentences"},
}
labels["expressions of gratitude"] = {
description = "{{{langname}}} expressions intended to express the [[gratitude]] or [[thank]]s of the speaker to the listener.",
parents = {"speech acts"},
}
labels["farewells"] = {
description = "{{{langname}}} expressions intended to mark the end of the speaker's interaction with the listener.",
parents = {"speech acts"},
}
labels["greetings"] = {
description = "{{{langname}}} expressions intended to mark the start of the speaker's interaction with the listener.",
parents = {"speech acts"},
}
labels["mnemonics"] = {
description = "{{{langname}}} terms used for remembering something more easily.",
parents = {"speech acts"},
}
labels["oaths"] = {
description = "{{{langname}}} expressions which appeal to a deity or entity as a form of intensifier.",
parents = {"speech acts", "intensifiers"},
}
labels["responses to sneezing"] = {
description = "{{{langname}}} expressions said in response to a [[sneeze]].",
parents = {"speech acts"},
}
labels["toasts"] = {
description = "{{{langname}}} expressions said as part of a [[toast]].",
parents = {"speech acts"},
}
for label, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Speech acts subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Speech acts subcategories by language"] = {
description = "Umbrella categories covering topics related to speech acts, such as greetings or farewells.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "speech acts", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
cmv9beiak1prmzgc5jf7btdah9dakx7
88416
88415
2026-07-27T00:18:20Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/speech_acts]]
88415
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["speech acts"] = {
description = "{{{langname}}} terms that serves a performative function, in addition to conveying information.",
umbrella_parents = "Terms by semantic function subcategories by language",
parents = {"terms by semantic function"},
}
labels["dismissals"] = {
description = "{{{langname}}} expressions intended to [[dismiss]] the listener.",
parents = {"farewells", "imperative sentences"},
}
labels["expressions of gratitude"] = {
description = "{{{langname}}} expressions intended to express the [[gratitude]] or [[thank]]s of the speaker to the listener.",
parents = {"speech acts"},
}
labels["farewells"] = {
description = "{{{langname}}} expressions intended to mark the end of the speaker's interaction with the listener.",
parents = {"speech acts"},
}
labels["greetings"] = {
description = "{{{langname}}} expressions intended to mark the start of the speaker's interaction with the listener.",
parents = {"speech acts"},
}
labels["mnemonics"] = {
description = "{{{langname}}} terms used for remembering something more easily.",
parents = {"speech acts"},
}
labels["oaths"] = {
description = "{{{langname}}} expressions which appeal to a deity or entity as a form of intensifier.",
parents = {"speech acts", "intensifiers"},
}
labels["responses to sneezing"] = {
description = "{{{langname}}} expressions said in response to a [[sneeze]].",
parents = {"speech acts"},
}
labels["toasts"] = {
description = "{{{langname}}} expressions said as part of a [[toast]].",
parents = {"speech acts"},
}
for label, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Speech acts subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Speech acts subcategories by language"] = {
description = "Umbrella categories covering topics related to speech acts, such as greetings or farewells.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "speech acts", is_label = true, sort = " "},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
cmv9beiak1prmzgc5jf7btdah9dakx7
Mòideal:category tree/symbols
828
17738
88417
2026-04-15T09:16:41Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/symbols]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88417
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["symbols"] = {
description = "{{{langname}}} written signs.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["diacritical marks"] = {
description = "{{{langname}}} glyphs that are added to characters to modify their sounds or meanings.",
parents = {"symbols"},
}
labels["Han characters"] = {
description = "{{{langname}}} symbols of the Han logographic script, which can represent sounds or convey meanings directly.",
topright = "{{wp|Chinese characters}}",
parents = {"logograms"},
}
labels["ideograms"] = {
description = "{{{langname}}} symbols that represent objects, ideas or concepts directly.",
umbrella_parents = "Fundamental",
parents = {"symbols"},
}
labels["iteration marks"] = {
description = "{{{langname}}} glyphs that act as a shorthand for repeated text.",
parents = {"abbreviations", "symbols"},
}
labels["letters"] = {
description = "{{{langname}}} symbols that represent single sounds. Variations of letters, such as letters with diacritics, should also be categorized here.",
parents = {"symbols"},
}
labels["ligatures"] = {
description = "{{{langname}}} letters that have been combined into a single graphical unit.",
parents = {"symbols"},
}
labels["logograms"] = {
description = "{{{langname}}} symbols that represent single words or morphemes.",
parents = {"symbols"},
}
labels["matched pairs"] = {
description = "{{{langname}}} pairs of separate characters that are used together. Example: [[( )]].",
parents = {"symbols"},
}
labels["numeral symbols"] = {
description = "{{{langname}}} symbols that represent numerals.",
parents = {"symbols"},
}
labels["punctuation marks"] = {
description = "{{{langname}}} symbols that indicate structure and organization of writing.",
parents = {"symbols"},
}
labels["syllables"] = {
description = "{{{langname}}} symbols that represent groups of sounds. Variations of syllables, such as syllables with diacritics, should also be categorized here.",
parents = {"symbols"},
}
labels["multigraphs"] = {
description = "{{{langname}}} symbols consisting of multiple letters.",
parents = {"symbols"},
}
local function multigraph(name, n)
labels[name] = {
description = "{{{langname}}} symbols consisting of " .. n .. " letters.",
parents = {"multigraphs"},
}
end
multigraph("digraphs", "two")
multigraph("trigraphs", "three")
multigraph("tetragraphs", "four")
multigraph("pentagraphs", "five")
multigraph("hexagraphs", "six")
multigraph("heptagraphs", "seven")
multigraph("octagraphs", "eight")
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Symbols subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Symbols subcategories by language"] = {
description = "Umbrella categories covering topics related to symbols.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "symbols", is_label = true, sort = " "},
},
}
raw_categories["IPA symbols"] = {
description = "Symbols which are part of the {{w|International Phonetic Alphabet}}.",
additional = "For more information, see [[Wiktionary:About International Phonetic Alphabet]].",
catfix = "mul",
parents = {
{name = "symbols", is_label = true, lang = "mul"},
},
}
raw_categories["NAPA symbols"] = {
description = "Symbols which are part of the {{w|Americanist phonetic notation|North American Phonetic Alphabet}}.",
catfix = "mul",
parents = {
{name = "symbols", is_label = true, lang = "mul"},
},
}
raw_categories["UPA symbols"] = {
description = "Symbols which are part of the {{w|Uralic Phonetic Alphabet}}.",
catfix = "mul",
parents = {
{name = "symbols", is_label = true, lang = "mul"},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
p8d779jzef4mqghgteg9aespcnxu5wk
88418
88417
2026-07-27T00:18:29Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/symbols]]
88417
Scribunto
text/plain
local labels = {}
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["symbols"] = {
description = "{{{langname}}} written signs.",
umbrella_parents = "Fundamental",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["diacritical marks"] = {
description = "{{{langname}}} glyphs that are added to characters to modify their sounds or meanings.",
parents = {"symbols"},
}
labels["Han characters"] = {
description = "{{{langname}}} symbols of the Han logographic script, which can represent sounds or convey meanings directly.",
topright = "{{wp|Chinese characters}}",
parents = {"logograms"},
}
labels["ideograms"] = {
description = "{{{langname}}} symbols that represent objects, ideas or concepts directly.",
umbrella_parents = "Fundamental",
parents = {"symbols"},
}
labels["iteration marks"] = {
description = "{{{langname}}} glyphs that act as a shorthand for repeated text.",
parents = {"abbreviations", "symbols"},
}
labels["letters"] = {
description = "{{{langname}}} symbols that represent single sounds. Variations of letters, such as letters with diacritics, should also be categorized here.",
parents = {"symbols"},
}
labels["ligatures"] = {
description = "{{{langname}}} letters that have been combined into a single graphical unit.",
parents = {"symbols"},
}
labels["logograms"] = {
description = "{{{langname}}} symbols that represent single words or morphemes.",
parents = {"symbols"},
}
labels["matched pairs"] = {
description = "{{{langname}}} pairs of separate characters that are used together. Example: [[( )]].",
parents = {"symbols"},
}
labels["numeral symbols"] = {
description = "{{{langname}}} symbols that represent numerals.",
parents = {"symbols"},
}
labels["punctuation marks"] = {
description = "{{{langname}}} symbols that indicate structure and organization of writing.",
parents = {"symbols"},
}
labels["syllables"] = {
description = "{{{langname}}} symbols that represent groups of sounds. Variations of syllables, such as syllables with diacritics, should also be categorized here.",
parents = {"symbols"},
}
labels["multigraphs"] = {
description = "{{{langname}}} symbols consisting of multiple letters.",
parents = {"symbols"},
}
local function multigraph(name, n)
labels[name] = {
description = "{{{langname}}} symbols consisting of " .. n .. " letters.",
parents = {"multigraphs"},
}
end
multigraph("digraphs", "two")
multigraph("trigraphs", "three")
multigraph("tetragraphs", "four")
multigraph("pentagraphs", "five")
multigraph("hexagraphs", "six")
multigraph("heptagraphs", "seven")
multigraph("octagraphs", "eight")
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Symbols subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Symbols subcategories by language"] = {
description = "Umbrella categories covering topics related to symbols.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "symbols", is_label = true, sort = " "},
},
}
raw_categories["IPA symbols"] = {
description = "Symbols which are part of the {{w|International Phonetic Alphabet}}.",
additional = "For more information, see [[Wiktionary:About International Phonetic Alphabet]].",
catfix = "mul",
parents = {
{name = "symbols", is_label = true, lang = "mul"},
},
}
raw_categories["NAPA symbols"] = {
description = "Symbols which are part of the {{w|Americanist phonetic notation|North American Phonetic Alphabet}}.",
catfix = "mul",
parents = {
{name = "symbols", is_label = true, lang = "mul"},
},
}
raw_categories["UPA symbols"] = {
description = "Symbols which are part of the {{w|Uralic Phonetic Alphabet}}.",
catfix = "mul",
parents = {
{name = "symbols", is_label = true, lang = "mul"},
},
}
return {LABELS = labels, RAW_CATEGORIES = raw_categories}
p8d779jzef4mqghgteg9aespcnxu5wk
Mòideal:category tree/templates
828
17739
88419
2026-06-12T08:51:06Z
en>Juwan
0
88419
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local languages_module = "Module:languages"
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["templates"] = {
description = "{{{langname}}} [[Wiktionary:Templates|templates]], which contain reusable wiki code that helps with creating and managing entries.",
umbrella = {
parents = {{name = "Templates", sort = " "}},
breadcrumb = "by language",
},
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["auto-table templates"] = {
description = "Templates that contain {{{langname}}} tables generated automatically.",
additional = "They use the <code>table:</code> prefix. For example, see [[Template:table:chess pieces/en]].",
parents = {"link templates"},
}
labels["category boilerplate templates"] = {
description = "Templates used to generate descriptions and categorization for category pages.",
parents = {"templates"},
}
labels["conversion templates"] = {
description = "Templates used in {{{langname}}} entries to convert between different orthographic or numeral representations.",
parents = {"templates"},
}
labels["definition templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] of {{{langname}}} entries to help in creating definitions.",
parents = {"templates"},
}
labels["entry templates"] = {
description = "Templates used to help in the creation of {{{langname}}} entries.",
umbrella_parents = {"Templates subcategories by language", "Entry templates"},
parents = {"templates"},
}
labels["etymology templates"] = {
description = "Templates used in the etymology section of {{{langname}}} entries.",
parents = {"templates"},
}
labels["experimental templates"] = {
description = "Templates used to test possible content for {{{langname}}} entries.",
parents = {"templates"},
}
labels["form-of templates"] = {
description = "Templates used on the definition line of entries for inflected forms of words in {{{langdisp}}}, to link back to the main form.",
parents = {"definition templates", "link templates"},
}
labels["headword-line templates"] = {
description = "Templates used in {{{langname}}} entries to display lines containing headwords.",
parents = {"templates"},
}
labels["index templates"] = {
description = "Templates used to organize {{{langname}}} indexes.",
parents = {"link templates"},
}
labels["inflection-table templates"] = {
description = "Templates used to show inflection tables for {{{langname}}} terms.",
parents = {"templates"},
}
-- Do particular types of inflection-table templates.
for _, pos in ipairs({
"adjective",
"adverb",
"determiner",
"nominal",
"noun",
"numeral",
"participle",
"postposition",
"particle",
"preposition",
"pronoun",
"verb",
}) do
labels[pos .. " inflection-table templates"] = {
description = "Templates used to show declension tables for {{{langname}}} " .. pos .. "s.",
parents = {"inflection-table templates"},
}
end
labels["link templates"] = {
description = "{{{langname}}} templates used to create links to other entries.",
parents = {"templates"},
}
labels["list templates"] = {
description = "Templates that contain {{{langname}}} lists.",
additional = "They use the <code>list:</code> prefix. For example, see [[Template:list:Latin script letters/en]].<br />" ..
"See also [[:Category:List templates]].",
parents = {"link templates"},
}
labels["mutation templates"] = {
description = "Templates used to show mutation of {{{langname}}} words.",
parents = {"templates"},
}
labels["navigation templates"] = {
description = "{{{langname}}} templates used to create navigation boxes for easily linking to other similar pages.",
additional = "Examples are all the members of a given class (e.g. personal pronouns, interrogatives, demonstratives), cardinal numbers up to 100, category TOC (table-of-contents) templates, etc.",
parents = {"link templates"},
}
labels["pronunciation templates"] = {
description = "Templates used to generate IPA pronunciation, rhymes, hyphenation, etc. for {{{langname}}} entries.",
umbrella_parents = {"Templates subcategories by language", "Category:Pronunciation templates"},
parents = {"templates"},
}
labels["sign production templates"] = {
description = "Templates used in describing and showing the production of {{{langname}}} signs.",
parents = {"pronunciation templates"},
}
labels["quotation templates"] = {
description = "Templates used to generate quotations for {{{langname}}} entries.",
umbrella_parents = {"Templates subcategories by language", "Category:Citation templates"},
parents = {"templates"},
}
labels["quotation navigation templates"] = {
description = "Templates used in the documentation of {{{langname}}} [[Wiktionary:Quotations/Templates|quotation templates]] in order to link to quotation templates for other works by the same author.",
umbrella_parents = {"Templates subcategories by language", "Category:Navigation templates", "Category:Quotation templates by language"},
parents = {"quotation templates", "link templates"},
}
labels["reference templates"] = {
topright = function(data)
if data.lang and data.lang:getCode() == "ine-pro" then
return "{{shortcut|WT:RTINE}}"
end
end,
umbrella = {
preceding = "{{also|Wiktionary:Reference templates}}\n{{also|Template:refcat}}",
parents = {"Templates subcategories by language", "Category:Reference templates"},
breadcrumb = "by language",
},
description = "Templates used to generate reference footnotes for {{{langname}}} entries.",
parents = {"link templates"},
}
labels["reference navigation templates"] = {
description = "Templates used in the documentation of reference templates in order to link to related reference templates.",
umbrella_parents = {"Templates subcategories by language", "Category:Navigation templates", "Category:Reference templates by language"},
parents = {"reference templates", "link templates"},
}
labels["supplementary templates"] = {
description = "Templates used to keep contents for other {{{langname}}} templates.",
parents = {"templates"},
}
labels["inflection-table subtemplates"] = {
description = "Templates used to assist in constructing parts of {{{langname}}} inflection-table templates.",
parents = {"supplementary templates"},
}
labels["usage templates"] = {
description = "Templates used to show usage notes in {{{langname}}} entries.",
parents = {"templates"},
}
for key, data in pairs(labels) do
-- Add 'umbrella_parents' key if not already present.
if not data.umbrella and not data.umbrella_parents then
data.umbrella_parents = "Templates subcategories by language"
end
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
if not data.breadcrumb then
local parent = data.parents[1]
while true do
if type(parent) == "string" then
local parent_re = " " .. require("Module:string utilities").pattern_escape(parent) .. "$"
if key:find(parent_re) then
data.breadcrumb = key:gsub(parent_re, "")
break
end
if labels[parent] then
parent = labels[parent].parents[1]
else
break
end
else
break
end
end
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Templates"] = {
topright = "{{shortcut|WT:T}}",
description = "An organizing category intended for all templates in use on Wiktionary.",
additional = "''See also: [[Wiktionary:Templates]], [[meta:Help:Template]]''",
parents = {"Wiktionary"},
}
raw_categories["Administration templates"] = {
description = "Templates used in the administration of Wiktionary.",
additional = "They are only used outside of mainspace and are distinct from [[:Category:Maintenance templates|maintenance templates]], which are used in maintaining entries.",
parents = {"Templates"},
}
raw_categories["Archive templates"] = {
description = "Templates used on archived or otherwise inactive pages.",
parents = {"Administration templates"},
}
raw_categories["CheckUser templates"] = {
description = "Templates related to [[Wiktionary:Requests for checkuser|checkuser requests]].",
parents = {"Administration templates"},
}
raw_categories["Editnotices"] = {
description = "Templates used to display notices in edit mode.",
parents = {"Administration templates"},
}
raw_categories["Appendix templates"] = {
description = "Templates used in appendices or to link to appendices.",
parents = {"Templates", "Category:Appendices"},
}
raw_categories["Swadesh list templates"] = {
description = "Templates used on pages that contain [[w:Swadesh list]]s.<br />" ..
"See also [[Wiktionary:Swadesh template]] and [[Wiktionary:Swadesh template categorized]].",
parents = {"Appendix templates"},
}
raw_categories["Astrology templates"] = {
description = "Templates that display astrology-related diagrams or boxes.",
parents = {"Templates"},
}
raw_categories["Audio templates"] = {
description = "Templates used to play or request audio files.",
parents = {"Templates"},
}
raw_categories["Auto-table templates"] = {
description = "Templates used to generate word tables (like [[Template:table:seasons]]).",
additional = "See also [[:Category:Auto-table templates by language]].",
parents = {"Templates"},
}
raw_categories["Box templates"] = {
description = "General purpose box templates.",
additional = "If you're considering making a template that looks like a box, look here first!",
parents = {"Templates"},
}
raw_categories["Categorization templates"] = {
preceding = "{{also|:Category:Category modules}}",
description = "Templates used to categorize terms or entries.",
additional = "([[:Category:Category templates]], on the other hand, contains templates used in the category namespace.)",
parents = {"Templates"},
}
raw_categories["Category templates"] = {
description = "Templates used in the category namespace.",
additional = "([[:Category:Categorization templates]], on the other hand, contains templates used to categorize pages.)",
parents = {"Templates"},
}
raw_categories["Category boilerplate templates"] = {
description = "Templates used to generate the text of category pages.",
parents = {"Category templates"},
}
raw_categories["TOC templates"] = {
description = "Templates used to generate a list of linked letters to navigate the pages listed in categories.",
parents = {"Category templates", "Navigation templates"},
}
raw_categories["Character info templates"] = {
description = "Templates that utilize {{temp|character info}}.",
parents = {"Templates"},
}
raw_categories["Character insertion templates"] = {
description = "Templates that provide easier ways to type characters that are not found in most keyboard layouts.",
parents = {"Templates"},
}
raw_categories["Templates for generating characters used in wiki code"] = {
description = "Templates used to generate characters that are reserved for specific wiki code functions and cannot be directly entered.",
additional = "An alternative to using these templates is to use an HTML entity such as <code>&#91</code> " ..
"for a left bracket.<br />" ..
"Note that the templates below are sorted by the first character of the wikicode that each template generates.",
parents = {"Character insertion templates"},
}
raw_categories["Chemistry templates"] = {
description = "Templates that display chemistry-related diagrams or boxes.",
parents = {"Templates"},
}
raw_categories["Chess templates"] = {
description = "Templates that display chess diagrams.",
parents = {"Templates"},
}
raw_categories["Citation templates"] = {
preceding = "{{ombox|type=speedy|text=Some templates may be marked '''FOR TESTING ONLY'''. Do not use these in entries, if requested on the template page itself. Take a look at the template page before using it.}}",
description = "Templates used to generate citations and quotations.",
additional = [=[
{{citation templates}}
==See also==
* [[Wiktionary:Quotations]]
* [[:Category:Reference templates]] for specific templates to well-known and widely used sources.]=],
parents = {"Templates"},
}
-- Skipped: Concordance templates
raw_categories["Control flow templates"] = {
description = "Templates to aid in control-flow constructs, which the template language is normally limited in.",
parents = {"Templates"},
}
raw_categories["Cross reference templates"] = {
description = "Templates used to create cross-references between sections.",
parents = {"Templates"},
}
raw_categories["Dating templates"] = {
description = "Templates for displaying dates.",
parents = {"Templates"},
}
raw_categories["Definition templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] to help in creating definitions.",
parents = {"Templates"},
}
raw_categories["Form-of templates"] = {
description = "Templates used in defining inflections or variants of a given lemma.",
parents = {"Definition templates"},
}
raw_categories["Grammar form-of templates"] = {
description = "Templates used in defining terms that stand in a particular grammatical relation to a given lemma.",
parents = {"Form-of templates"},
}
raw_categories["Conjugation form-of templates"] = {
description = "Templates used in defining terms that represent particular verb forms (e.g. past participle) of given lemma.",
parents = {"Grammar form-of templates"},
}
raw_categories["Declension form-of templates"] = {
description = "Templates used in defining terms that represent particular noun or adjective forms (e.g. masculine plural) of given lemma.",
parents = {"Grammar form-of templates"},
}
raw_categories["Name templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] to help in creating definitions for names.",
parents = {"Definition templates"},
}
raw_categories["Object usage templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] to show case and adposition usage for verb objects and similar constructs.",
parents = {"Definition templates"},
}
raw_categories["Place name templates"] = {
description = "Templates used in defining place names or demonyms that refer to place names.",
parents = {"Definition templates"},
}
raw_categories["Entry templates"] = {
description = "Templates used to help create new entries.",
parents = {"Templates"},
}
raw_categories["Etymology templates"] = {
description = "Templates used in etymology sections to define the etymology of a term.",
parents = {"Templates"},
}
raw_categories["Foreign derivation templates"] = {
description = "Templates used in etymology sections to indicate derivation from a different language than the language of the current entry.",
parents = {"Etymology templates"},
}
raw_categories["Morphology templates"] = {
description = "Templates used in etymology sections to specify the morphology of a term.",
parents = {"Etymology templates"},
}
raw_categories["Language-specific morphology templates"] = {
description = "Specialized morphology templates used in the etymology sections of terms in particular languages.",
parents = {"Morphology templates"},
}
raw_categories["Headword-line templates"] = {
preceding = "{{also|Wiktionary:Headword-line templates}}",
description = "Templates used to define the [[Wiktionary:Glossary#headword line|headword line]] of a term.",
parents = {"Templates"},
}
raw_categories["Discussion templates"] = {
description = "Templates intended for use only in discussions and documentation of templates and modules.",
parents = {"Templates"},
}
raw_categories["Monthly-subpages discussion room infrastructure"] = {
description = "Templates used in generating and maintaining monthly discussion forums such as the [[Wiktionary:Grease pit|Grease pit]] and [[Wiktionary:Beer parlour|Beer parlour]].",
parents = {"Discussion templates"},
}
raw_categories["Documentation templates"] = {
description = "Templates used on template and module documentation pages.",
parents = {"Templates"},
}
raw_categories["File templates"] = {
description = "Templates used in the File namespace.",
parents = {"Templates"},
}
raw_categories["Language attestation warning templates"] = {
description = "Templates that warn users about the attestation status of entries or senses from a language.",
parents = {"Templates"},
}
raw_categories["Layout templates"] = {
description = "Templates used in creating specific layouts within entries.",
parents = {"Templates"},
}
raw_categories["Collapsible box templates"] = {
description = "Templates used in creating collapsible boxes.",
parents = {"Layout templates"},
}
raw_categories["Column templates"] = {
preceding = "{{also|Wiktionary:Templates#Columns}}",
description = "Templates used in laying out lists in columns.",
parents = {"Layout templates"},
}
raw_categories["Table templates"] = {
description = "Templates used in formatting tables.",
parents = {"Layout templates"},
}
raw_categories["Link templates"] = {
description = "Templates used to link to other terms, to other MediaWiki projects or to external websites.",
parents = {"Templates"},
}
raw_categories["Disambiguation templates"] = {
description = "Templates used to disambiguate multiple similar terms.",
parents = {"Link templates"},
}
raw_categories["External link templates"] = {
description = "Templates that link to websites outside of the MediaWiki Foundation purview.",
additional = "See also [[:Category:Citation templates]] for others.",
parents = {"Link templates"},
}
raw_categories["Internal link templates"] = {
description = "Templates that link between Wiktionary entries.",
parents = {"Link templates"},
}
raw_categories["Language-specific internal link templates"] = {
description = "Language-specific templates that link between Wiktionary entries in particular languages.",
parents = {"Internal link templates"},
}
raw_categories["Interwiki link templates"] = {
description = "Templates that link to other Wikimedia projects.",
parents = {"Link templates"},
}
raw_categories["Inline interwiki link templates"] = {
description = "Inline templates that link to other Wikimedia projects.",
parents = {"Interwiki link templates"},
}
raw_categories["Sidebar interwiki link templates"] = {
description = "Sidebar templates that link to other Wikimedia projects.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikipedia link templates"] = {
description = "Templates that link to Wikipedia.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikidata link templates"] = {
-- TODO: Following the category names in other wikis,
-- Possibly rename to just "Wikidata templates"?
description = "Templates that link to or query Wikidata.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikisource link templates"] = {
description = "Templates that link to Wikisource.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikispecies link templates"] = {
description = "Templates that link to Wikispecies.",
parents = {"Interwiki link templates", "Taxonomic reference templates"},
}
raw_categories["List templates"] = {
description = "Templates used to generate lists.",
additional = "See also [[:Category:List templates by language]].",
parents = {"Templates"},
}
raw_categories["Character list templates"] = {
description = "Templates used to generate lists of characters.",
parents = {"List templates"},
}
raw_categories["Lua-free templates"] = {
description = 'Lua-free (i.e. "lite") versions of templates that use Lua.',
additional = "Lua-free templates are used on long pages to avoid [[Wiktionary:Lua memory errors|Lua memory errors]].",
parents = {"Templates"},
}
raw_categories["Maintenance templates"] = {
preceding = "{{also|Wiktionary:Maintenance templates}}",
description = "Templates used in the maintenance of Wiktionary entries and other pages.",
additional = "They are distinct from [[:Category:Administration templates|administration templates]], which are only used outside of mainspace.",
parents = {"Templates", "Category:Wiktionary maintenance"},
}
raw_categories["Cleanup templates"] = {
description = "Templates used to request cleanup of entries.",
additional = "Some of these templates are used when entries are batch-imported from another source.",
parents = {"Maintenance templates", "Request templates"},
}
raw_categories["Deletion templates"] = {
description = "Templates used to request deletion of entries.",
parents = {"Maintenance templates", "Request templates"},
}
raw_categories["Verification templates"] = {
description = "Templates used to request verification of entries that may be incorrect.",
parents = {"Maintenance templates", "Request templates"},
}
raw_categories["Wiktionary templates"] = {
description = "Templates used in the internal operation of Wiktionary.",
parents = {"Templates", "Wiktionary"},
}
raw_categories["Metatemplates"] = {
description = "Templates used in other templates or to create other templates.",
parents = {"Templates"},
}
raw_categories["String manipulation templates"] = {
description = "Templates used to manipulate strings.",
additional = "See also [[Module:string/templates]], which can be invoked from templates to do string manipulation.",
parents = {"Metatemplates"},
}
------------ NAVIGATION TEMPLATES ------------
raw_categories["Navigation templates"] = {
description = "Templates used to create navigation boxes for easily linking to other similar pages.",
parents = {"Templates"},
}
raw_categories["Language-specific number templates"] = {
description = "Language-specific templates that generate number boxes or lists for a given language.",
additional = "Contrast {{catlink|Number templates}}, which contains general (language-agnostic) templates for converting numbers or generating number boxes or lists in a given language.",
parents = {"Navigation templates"},
}
raw_categories["Pro-form box templates"] = {
description = "Language-specific templates that generate navigation boxes for displaying pro-forms (pronouns, determiners, pronominal adverbs, etc.) for a given language.",
parents = {"Navigation templates"},
}
raw_categories["Demonstrative box templates"] = {
description = "Language-specific templates that generate demonstrative pronoun, determiner and adverb boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Grammatical article box templates"] = {
description = "Language-specific templates that generate grammatical article boxes (definite, indefinite, partitive, etc.) for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Interrogative box templates"] = {
description = "Language-specific templates that generate interrogative pronoun, determiner and adverb boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Personal pronoun box templates"] = {
description = "Language-specific templates that generate personal pronoun boxes for a given language.",
additional = [=[
The standard format for these templates is:
* Where the language is uninflected (e.g. Samoan {{tl|sm-personal pronouns}}) or the language is inflected but the box shows only the lemma forms of the pronoun (e.g. Basque {{tl|eu-personal pronouns}}), the '''numbers''' (singular/plural) run across the top and the '''persons''' (1st/2nd/3rd) run down the left side.
* Where the language is inflected, the '''cases''' run across the top. Down the left side, the headers (from left to right) are '''number''', '''person''', then any subform if applicable. Example: Middle High German {{tl|gmh-personal pronouns}}
** Exceptions:
*** If there are too many cases to fit on the screen as columns, the template can be transposed so that cases run vertically. Example: Northern Yukaghir {{tl|ykg-personal pronouns}}
*** If the singular and plural forms are very similar, consider placing the person headers outside number instead. Example: Punjabi {{tl|pa-personal pronouns}}
]=],
parents = {"Pro-form box templates"},
}
raw_categories["Possessive pronoun and determiner box templates"] = {
description = "Language-specific templates that generate possessive pronoun and determiner boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Reflexive pronoun and determiner box templates"] = {
description = "Language-specific templates that generate reflexive pronoun and determiner boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Relative pronoun and determiner box templates"] = {
description = "Language-specific templates that generate relative pronoun and determiner boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Number templates"] = {
description = "General (language-agnostic) templates used to convert numbers or generate boxes or lists of the numbers in a given language.",
additional = "Contrast {{catlink|Language-specific number templates}}, which contains language-specific templates for generating number boxes or lists in a given language.",
parents = {"Templates"},
}
raw_categories["Orthographic and regional variant templates"] = {
description = "Templates used to generate lists of links to alternative forms of a term, either across orthographic systems, scripts, or regional or dialectal variation.",
parents = {"Script templates", "Internal link templates"},
}
raw_categories["Pagename templates"] = {
description = "Templates used to retrieve pagenames or pagename properties or manipulate pagenames.",
parents = {"Templates"},
}
raw_categories["Preloaded templates"] = {
description = "Templates not meant to be transcluded, but instead, whether through URL parameters or modules, have their contents preloaded into edit fields.",
parents = {"Templates"},
}
raw_categories["Pronunciation templates"] = {
description = "Templates used to format pronunciation sections and the characters they use.",
additional = "See also [[:Category:Script templates]] and [[Wiktionary:Pronunciation]].",
parents = {"Templates"},
}
raw_categories["Rhyme templates"] = {
description = "Templates used to format [[Wiktionary:Rhymes|rhyme pages]], links to them from pronunciation sections, etc.",
parents = {"Pronunciation templates"},
}
raw_categories["Sign language templates"] = {
description = "Templates used to format sign-language pronunciation charts.",
parents = {"Pronunciation templates"},
}
raw_categories["Qualifier and gloss templates"] = {
description = "Templates for displaying qualifiers, glosses and the like.",
parents = {"Templates"},
}
raw_categories["Redirect templates"] = {
description = "Templates used to format redirect pages.",
parents = {"Templates"},
}
raw_categories["Reference templates"] = {
preceding = "{{also|Wiktionary:Reference templates|:Category:Reference templates by language}}",
description = "Templates used to format references.",
parents = {"Templates"},
}
raw_categories["Religion templates"] = {
description = "Templates that display religion-related diagrams or boxes.",
parents = {"Templates"},
}
raw_categories["Request templates"] = {
topright = "{{shortcut|WT:RT}}",
description = "Request templates for dictionary entries in the main namespace.",
parents = {"Templates", "Requests"},
}
raw_categories["Sandbox templates"] = {
description = "Sandbox versions of templates used for testing purposes.",
additional = "'''NOTE:''' The use of sandbox templates in mainspace is strongly dispreferred. Please place all sandbox templates in your userspace.",
parents = {"Templates"},
}
raw_categories["Script templates"] = {
preceding = "{{mainwikt|Scripts}}",
description = "Templates used for converting between scripts or displaying text in a specific script.",
parents = {"Templates"},
}
raw_categories["Semantic relation templates"] = {
description = "Templates that are placed below the [[Wiktionary:Glossary#definition line|definition line]], to indicate other terms semantically related to a particular sense.",
parents = {"Templates"},
}
raw_categories["Single-page-use templates"] = {
description = "Templates used only on a single page and unlikely to find re-use elsewhere.",
parents = {"Templates"},
}
raw_categories["Supplementary templates"] = {
description = "A grab bag of templates used to assist other templates.",
additional = "These should be recategorized according to function.",
parents = {"Templates"},
}
raw_categories["Taxonomy templates"] = {
description = "Templates used in Translingual taxonomy entries and in reference to those entries.",
parents = {"Templates"},
}
raw_categories["Taxonomic hypernym templates"] = {
description = "Templates and subcategories containing such templates. The templates contain text to appear under the Hypernyms header for taxonomic name entries.",
additional = "Each template has the name of the taxon from which it begins. The templates in this category at present are the many templates that begin with the names of taxonomic families. Others are in subcategories",
breadcrumb = "Hypernym",
parents = {"Taxonomy templates"},
}
raw_categories["Taxonomic name templates"] = {
description = "Templates used for the presentation of taxonomic names on a definition line.",
breadcrumb = "Name",
parents = {"Taxonomy templates", "Definition templates"},
}
raw_categories["Taxonomic reference templates"] = {
description = "Templates used to format references for taxonomic names.",
breadcrumb = "Reference",
parents = {"Taxonomy templates", "Reference templates"},
}
raw_categories["Templates that must be substituted"] = {
description = "Templates that are not intended for transclusion with <code><nowiki>{{ }}</nowiki></code>, " ..
"and must be substituted with <code><nowiki>{{subst: }}</nowiki></code>wherever they exist.",
additional = "Some of the members of this category are permanent, as the template was written in such a way that " ..
"it must be substituted to function properly. There may also be templates in this category that are deprecated, " ..
"in which case their content has been replaced with the preferred code.",
parents = {"Templates", "Requests"},
}
raw_categories["Templates with acceleration"] = {
description = "Templates can be added to this category by adding {{tl|isAccelerated}} to their documentation pages.",
additional = "Presence in this category indicates that at least some of the \"form-of\" entries for the word can be generated semi-automatically by users with [[Wiktionary:ACCEL|accelerated]] editing enabled.",
parents = {"Templates"},
}
raw_categories["Text format templates"] = {
description = "Templates that provide shortcuts for formatting ordinary text.",
parents = {"Templates"},
}
raw_categories["Thesaurus templates"] = {
description = "Templates for linking to or formatting thesaurus entries.",
parents = {"Templates"},
}
raw_categories["Translation templates"] = {
description = "Templates used to format entries in and parts of translation tables.",
parents = {"Templates"},
}
raw_categories["User templates"] = {
description = "Templates meant to be used in userspace.",
parents = {"Templates"},
}
raw_categories["User sandbox templates"] = {
description = "Templates that are for personal use and testing by individual editors.",
additional = "These should all begin with <code>User:</code> followed by the user's name. If several " ..
"sandbox templates are needed by a single user, subpages can be created. These templates should not be used in real " ..
"Wiktionary content pages, as all content on those pages should be editable by anyone and, if necessary, edit protected.",
parents = { "Sandbox templates", "Templates" },
}
raw_categories["Authority control subtemplates"] = {
description = "Subtemplates used in conjunction with {{tl|authority control}}.",
parents = {"User templates"},
}
raw_categories["User competency templates"] = {
description = "Templates used for to indicate a user's competency in a given natural language, script or programming language.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User templates"},
}
raw_categories["Coder user templates"] = {
description = "Templates used for to indicate a user's competency in a given programming language.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User competency templates"},
}
raw_categories["Language user templates"] = {
description = "Templates used for to indicate a user's competency in speaking a given language.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User competency templates"},
}
raw_categories["Script user templates"] = {
description = "Templates used for to indicate a user's competency in reading a given script.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User competency templates"},
}
raw_categories["WOTD templates"] = {
description = "Templates used to support the Word of the Day.",
parents = {"Wiktionary templates"},
}
raw_categories["FWOTD templates"] = {
description = "Templates used to support the Foreign Word of the Day.",
parents = {"WOTD templates"},
}
raw_categories["Non-production templates and modules"] = {
description = "Templates and modules not currently used in production.",
additional = "{{also|Special:UnusedTemplates|Category:Unused templates}}",
parents = {"Templates", "Modules", "Category:Wiktionary maintenance"},
}
raw_categories["Templates subcategories by language"] = {
description = "Umbrella categories covering topics related to templates.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "templates", is_label = true, sort = " "},
},
}
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
for key, data in pairs(raw_categories) do
if not data.breadcrumb then
local parent = data.parents[1]
while true do
if type(parent) == "string" then
local parent_re = " " .. require("Module:string utilities").pattern_escape(mw.getContentLanguage():lcfirst(parent)) .. "$"
if key:find(parent_re) then
data.breadcrumb = key:gsub(parent_re, "")
break
end
if raw_categories[parent] then
parent = raw_categories[parent].parents[1]
else
break
end
else
break
end
end
end
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
insert(raw_handlers, function(data)
-- Allow 'Foo reference templates' for etym-only varieties.
local langname = data.category:match("^(.+) reference templates$")
if not langname then
return nil
end
local lang = require(languages_module).getByCanonicalName(langname, nil, true)
if lang and lang:hasType("etymology-only") then
local first_parent
local lang_parent = lang:getParent()
if lang_parent:hasType("etymology-only") then
-- In case there are nested etymology templates, return the parent's reference template cat, not the
-- full lang's reference template cat.
first_parent = lang_parent:getCanonicalName() .. " reference templates"
else
first_parent = {name = "reference templates", lang = lang_parent:getCode(), is_label = true}
end
return {
lang = lang:getCode(),
description = "Templates used to generate reference footnotes for {{{langname}}} entries.",
parents = {
first_parent,
lang:getCategoryName(),
},
breadcrumb_and_first_sort_key = langname,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
hqkhrd0nngaomt6m0kf84zac4qyilu1
88420
88419
2026-07-27T00:18:44Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/templates]]
88419
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local languages_module = "Module:languages"
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["templates"] = {
description = "{{{langname}}} [[Wiktionary:Templates|templates]], which contain reusable wiki code that helps with creating and managing entries.",
umbrella = {
parents = {{name = "Templates", sort = " "}},
breadcrumb = "by language",
},
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["auto-table templates"] = {
description = "Templates that contain {{{langname}}} tables generated automatically.",
additional = "They use the <code>table:</code> prefix. For example, see [[Template:table:chess pieces/en]].",
parents = {"link templates"},
}
labels["category boilerplate templates"] = {
description = "Templates used to generate descriptions and categorization for category pages.",
parents = {"templates"},
}
labels["conversion templates"] = {
description = "Templates used in {{{langname}}} entries to convert between different orthographic or numeral representations.",
parents = {"templates"},
}
labels["definition templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] of {{{langname}}} entries to help in creating definitions.",
parents = {"templates"},
}
labels["entry templates"] = {
description = "Templates used to help in the creation of {{{langname}}} entries.",
umbrella_parents = {"Templates subcategories by language", "Entry templates"},
parents = {"templates"},
}
labels["etymology templates"] = {
description = "Templates used in the etymology section of {{{langname}}} entries.",
parents = {"templates"},
}
labels["experimental templates"] = {
description = "Templates used to test possible content for {{{langname}}} entries.",
parents = {"templates"},
}
labels["form-of templates"] = {
description = "Templates used on the definition line of entries for inflected forms of words in {{{langdisp}}}, to link back to the main form.",
parents = {"definition templates", "link templates"},
}
labels["headword-line templates"] = {
description = "Templates used in {{{langname}}} entries to display lines containing headwords.",
parents = {"templates"},
}
labels["index templates"] = {
description = "Templates used to organize {{{langname}}} indexes.",
parents = {"link templates"},
}
labels["inflection-table templates"] = {
description = "Templates used to show inflection tables for {{{langname}}} terms.",
parents = {"templates"},
}
-- Do particular types of inflection-table templates.
for _, pos in ipairs({
"adjective",
"adverb",
"determiner",
"nominal",
"noun",
"numeral",
"participle",
"postposition",
"particle",
"preposition",
"pronoun",
"verb",
}) do
labels[pos .. " inflection-table templates"] = {
description = "Templates used to show declension tables for {{{langname}}} " .. pos .. "s.",
parents = {"inflection-table templates"},
}
end
labels["link templates"] = {
description = "{{{langname}}} templates used to create links to other entries.",
parents = {"templates"},
}
labels["list templates"] = {
description = "Templates that contain {{{langname}}} lists.",
additional = "They use the <code>list:</code> prefix. For example, see [[Template:list:Latin script letters/en]].<br />" ..
"See also [[:Category:List templates]].",
parents = {"link templates"},
}
labels["mutation templates"] = {
description = "Templates used to show mutation of {{{langname}}} words.",
parents = {"templates"},
}
labels["navigation templates"] = {
description = "{{{langname}}} templates used to create navigation boxes for easily linking to other similar pages.",
additional = "Examples are all the members of a given class (e.g. personal pronouns, interrogatives, demonstratives), cardinal numbers up to 100, category TOC (table-of-contents) templates, etc.",
parents = {"link templates"},
}
labels["pronunciation templates"] = {
description = "Templates used to generate IPA pronunciation, rhymes, hyphenation, etc. for {{{langname}}} entries.",
umbrella_parents = {"Templates subcategories by language", "Category:Pronunciation templates"},
parents = {"templates"},
}
labels["sign production templates"] = {
description = "Templates used in describing and showing the production of {{{langname}}} signs.",
parents = {"pronunciation templates"},
}
labels["quotation templates"] = {
description = "Templates used to generate quotations for {{{langname}}} entries.",
umbrella_parents = {"Templates subcategories by language", "Category:Citation templates"},
parents = {"templates"},
}
labels["quotation navigation templates"] = {
description = "Templates used in the documentation of {{{langname}}} [[Wiktionary:Quotations/Templates|quotation templates]] in order to link to quotation templates for other works by the same author.",
umbrella_parents = {"Templates subcategories by language", "Category:Navigation templates", "Category:Quotation templates by language"},
parents = {"quotation templates", "link templates"},
}
labels["reference templates"] = {
topright = function(data)
if data.lang and data.lang:getCode() == "ine-pro" then
return "{{shortcut|WT:RTINE}}"
end
end,
umbrella = {
preceding = "{{also|Wiktionary:Reference templates}}\n{{also|Template:refcat}}",
parents = {"Templates subcategories by language", "Category:Reference templates"},
breadcrumb = "by language",
},
description = "Templates used to generate reference footnotes for {{{langname}}} entries.",
parents = {"link templates"},
}
labels["reference navigation templates"] = {
description = "Templates used in the documentation of reference templates in order to link to related reference templates.",
umbrella_parents = {"Templates subcategories by language", "Category:Navigation templates", "Category:Reference templates by language"},
parents = {"reference templates", "link templates"},
}
labels["supplementary templates"] = {
description = "Templates used to keep contents for other {{{langname}}} templates.",
parents = {"templates"},
}
labels["inflection-table subtemplates"] = {
description = "Templates used to assist in constructing parts of {{{langname}}} inflection-table templates.",
parents = {"supplementary templates"},
}
labels["usage templates"] = {
description = "Templates used to show usage notes in {{{langname}}} entries.",
parents = {"templates"},
}
for key, data in pairs(labels) do
-- Add 'umbrella_parents' key if not already present.
if not data.umbrella and not data.umbrella_parents then
data.umbrella_parents = "Templates subcategories by language"
end
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
if not data.breadcrumb then
local parent = data.parents[1]
while true do
if type(parent) == "string" then
local parent_re = " " .. require("Module:string utilities").pattern_escape(parent) .. "$"
if key:find(parent_re) then
data.breadcrumb = key:gsub(parent_re, "")
break
end
if labels[parent] then
parent = labels[parent].parents[1]
else
break
end
else
break
end
end
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Templates"] = {
topright = "{{shortcut|WT:T}}",
description = "An organizing category intended for all templates in use on Wiktionary.",
additional = "''See also: [[Wiktionary:Templates]], [[meta:Help:Template]]''",
parents = {"Wiktionary"},
}
raw_categories["Administration templates"] = {
description = "Templates used in the administration of Wiktionary.",
additional = "They are only used outside of mainspace and are distinct from [[:Category:Maintenance templates|maintenance templates]], which are used in maintaining entries.",
parents = {"Templates"},
}
raw_categories["Archive templates"] = {
description = "Templates used on archived or otherwise inactive pages.",
parents = {"Administration templates"},
}
raw_categories["CheckUser templates"] = {
description = "Templates related to [[Wiktionary:Requests for checkuser|checkuser requests]].",
parents = {"Administration templates"},
}
raw_categories["Editnotices"] = {
description = "Templates used to display notices in edit mode.",
parents = {"Administration templates"},
}
raw_categories["Appendix templates"] = {
description = "Templates used in appendices or to link to appendices.",
parents = {"Templates", "Category:Appendices"},
}
raw_categories["Swadesh list templates"] = {
description = "Templates used on pages that contain [[w:Swadesh list]]s.<br />" ..
"See also [[Wiktionary:Swadesh template]] and [[Wiktionary:Swadesh template categorized]].",
parents = {"Appendix templates"},
}
raw_categories["Astrology templates"] = {
description = "Templates that display astrology-related diagrams or boxes.",
parents = {"Templates"},
}
raw_categories["Audio templates"] = {
description = "Templates used to play or request audio files.",
parents = {"Templates"},
}
raw_categories["Auto-table templates"] = {
description = "Templates used to generate word tables (like [[Template:table:seasons]]).",
additional = "See also [[:Category:Auto-table templates by language]].",
parents = {"Templates"},
}
raw_categories["Box templates"] = {
description = "General purpose box templates.",
additional = "If you're considering making a template that looks like a box, look here first!",
parents = {"Templates"},
}
raw_categories["Categorization templates"] = {
preceding = "{{also|:Category:Category modules}}",
description = "Templates used to categorize terms or entries.",
additional = "([[:Category:Category templates]], on the other hand, contains templates used in the category namespace.)",
parents = {"Templates"},
}
raw_categories["Category templates"] = {
description = "Templates used in the category namespace.",
additional = "([[:Category:Categorization templates]], on the other hand, contains templates used to categorize pages.)",
parents = {"Templates"},
}
raw_categories["Category boilerplate templates"] = {
description = "Templates used to generate the text of category pages.",
parents = {"Category templates"},
}
raw_categories["TOC templates"] = {
description = "Templates used to generate a list of linked letters to navigate the pages listed in categories.",
parents = {"Category templates", "Navigation templates"},
}
raw_categories["Character info templates"] = {
description = "Templates that utilize {{temp|character info}}.",
parents = {"Templates"},
}
raw_categories["Character insertion templates"] = {
description = "Templates that provide easier ways to type characters that are not found in most keyboard layouts.",
parents = {"Templates"},
}
raw_categories["Templates for generating characters used in wiki code"] = {
description = "Templates used to generate characters that are reserved for specific wiki code functions and cannot be directly entered.",
additional = "An alternative to using these templates is to use an HTML entity such as <code>&#91</code> " ..
"for a left bracket.<br />" ..
"Note that the templates below are sorted by the first character of the wikicode that each template generates.",
parents = {"Character insertion templates"},
}
raw_categories["Chemistry templates"] = {
description = "Templates that display chemistry-related diagrams or boxes.",
parents = {"Templates"},
}
raw_categories["Chess templates"] = {
description = "Templates that display chess diagrams.",
parents = {"Templates"},
}
raw_categories["Citation templates"] = {
preceding = "{{ombox|type=speedy|text=Some templates may be marked '''FOR TESTING ONLY'''. Do not use these in entries, if requested on the template page itself. Take a look at the template page before using it.}}",
description = "Templates used to generate citations and quotations.",
additional = [=[
{{citation templates}}
==See also==
* [[Wiktionary:Quotations]]
* [[:Category:Reference templates]] for specific templates to well-known and widely used sources.]=],
parents = {"Templates"},
}
-- Skipped: Concordance templates
raw_categories["Control flow templates"] = {
description = "Templates to aid in control-flow constructs, which the template language is normally limited in.",
parents = {"Templates"},
}
raw_categories["Cross reference templates"] = {
description = "Templates used to create cross-references between sections.",
parents = {"Templates"},
}
raw_categories["Dating templates"] = {
description = "Templates for displaying dates.",
parents = {"Templates"},
}
raw_categories["Definition templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] to help in creating definitions.",
parents = {"Templates"},
}
raw_categories["Form-of templates"] = {
description = "Templates used in defining inflections or variants of a given lemma.",
parents = {"Definition templates"},
}
raw_categories["Grammar form-of templates"] = {
description = "Templates used in defining terms that stand in a particular grammatical relation to a given lemma.",
parents = {"Form-of templates"},
}
raw_categories["Conjugation form-of templates"] = {
description = "Templates used in defining terms that represent particular verb forms (e.g. past participle) of given lemma.",
parents = {"Grammar form-of templates"},
}
raw_categories["Declension form-of templates"] = {
description = "Templates used in defining terms that represent particular noun or adjective forms (e.g. masculine plural) of given lemma.",
parents = {"Grammar form-of templates"},
}
raw_categories["Name templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] to help in creating definitions for names.",
parents = {"Definition templates"},
}
raw_categories["Object usage templates"] = {
description = "Templates used in the [[Wiktionary:Glossary#definition line|definition line]] to show case and adposition usage for verb objects and similar constructs.",
parents = {"Definition templates"},
}
raw_categories["Place name templates"] = {
description = "Templates used in defining place names or demonyms that refer to place names.",
parents = {"Definition templates"},
}
raw_categories["Entry templates"] = {
description = "Templates used to help create new entries.",
parents = {"Templates"},
}
raw_categories["Etymology templates"] = {
description = "Templates used in etymology sections to define the etymology of a term.",
parents = {"Templates"},
}
raw_categories["Foreign derivation templates"] = {
description = "Templates used in etymology sections to indicate derivation from a different language than the language of the current entry.",
parents = {"Etymology templates"},
}
raw_categories["Morphology templates"] = {
description = "Templates used in etymology sections to specify the morphology of a term.",
parents = {"Etymology templates"},
}
raw_categories["Language-specific morphology templates"] = {
description = "Specialized morphology templates used in the etymology sections of terms in particular languages.",
parents = {"Morphology templates"},
}
raw_categories["Headword-line templates"] = {
preceding = "{{also|Wiktionary:Headword-line templates}}",
description = "Templates used to define the [[Wiktionary:Glossary#headword line|headword line]] of a term.",
parents = {"Templates"},
}
raw_categories["Discussion templates"] = {
description = "Templates intended for use only in discussions and documentation of templates and modules.",
parents = {"Templates"},
}
raw_categories["Monthly-subpages discussion room infrastructure"] = {
description = "Templates used in generating and maintaining monthly discussion forums such as the [[Wiktionary:Grease pit|Grease pit]] and [[Wiktionary:Beer parlour|Beer parlour]].",
parents = {"Discussion templates"},
}
raw_categories["Documentation templates"] = {
description = "Templates used on template and module documentation pages.",
parents = {"Templates"},
}
raw_categories["File templates"] = {
description = "Templates used in the File namespace.",
parents = {"Templates"},
}
raw_categories["Language attestation warning templates"] = {
description = "Templates that warn users about the attestation status of entries or senses from a language.",
parents = {"Templates"},
}
raw_categories["Layout templates"] = {
description = "Templates used in creating specific layouts within entries.",
parents = {"Templates"},
}
raw_categories["Collapsible box templates"] = {
description = "Templates used in creating collapsible boxes.",
parents = {"Layout templates"},
}
raw_categories["Column templates"] = {
preceding = "{{also|Wiktionary:Templates#Columns}}",
description = "Templates used in laying out lists in columns.",
parents = {"Layout templates"},
}
raw_categories["Table templates"] = {
description = "Templates used in formatting tables.",
parents = {"Layout templates"},
}
raw_categories["Link templates"] = {
description = "Templates used to link to other terms, to other MediaWiki projects or to external websites.",
parents = {"Templates"},
}
raw_categories["Disambiguation templates"] = {
description = "Templates used to disambiguate multiple similar terms.",
parents = {"Link templates"},
}
raw_categories["External link templates"] = {
description = "Templates that link to websites outside of the MediaWiki Foundation purview.",
additional = "See also [[:Category:Citation templates]] for others.",
parents = {"Link templates"},
}
raw_categories["Internal link templates"] = {
description = "Templates that link between Wiktionary entries.",
parents = {"Link templates"},
}
raw_categories["Language-specific internal link templates"] = {
description = "Language-specific templates that link between Wiktionary entries in particular languages.",
parents = {"Internal link templates"},
}
raw_categories["Interwiki link templates"] = {
description = "Templates that link to other Wikimedia projects.",
parents = {"Link templates"},
}
raw_categories["Inline interwiki link templates"] = {
description = "Inline templates that link to other Wikimedia projects.",
parents = {"Interwiki link templates"},
}
raw_categories["Sidebar interwiki link templates"] = {
description = "Sidebar templates that link to other Wikimedia projects.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikipedia link templates"] = {
description = "Templates that link to Wikipedia.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikidata link templates"] = {
-- TODO: Following the category names in other wikis,
-- Possibly rename to just "Wikidata templates"?
description = "Templates that link to or query Wikidata.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikisource link templates"] = {
description = "Templates that link to Wikisource.",
parents = {"Interwiki link templates"},
}
raw_categories["Wikispecies link templates"] = {
description = "Templates that link to Wikispecies.",
parents = {"Interwiki link templates", "Taxonomic reference templates"},
}
raw_categories["List templates"] = {
description = "Templates used to generate lists.",
additional = "See also [[:Category:List templates by language]].",
parents = {"Templates"},
}
raw_categories["Character list templates"] = {
description = "Templates used to generate lists of characters.",
parents = {"List templates"},
}
raw_categories["Lua-free templates"] = {
description = 'Lua-free (i.e. "lite") versions of templates that use Lua.',
additional = "Lua-free templates are used on long pages to avoid [[Wiktionary:Lua memory errors|Lua memory errors]].",
parents = {"Templates"},
}
raw_categories["Maintenance templates"] = {
preceding = "{{also|Wiktionary:Maintenance templates}}",
description = "Templates used in the maintenance of Wiktionary entries and other pages.",
additional = "They are distinct from [[:Category:Administration templates|administration templates]], which are only used outside of mainspace.",
parents = {"Templates", "Category:Wiktionary maintenance"},
}
raw_categories["Cleanup templates"] = {
description = "Templates used to request cleanup of entries.",
additional = "Some of these templates are used when entries are batch-imported from another source.",
parents = {"Maintenance templates", "Request templates"},
}
raw_categories["Deletion templates"] = {
description = "Templates used to request deletion of entries.",
parents = {"Maintenance templates", "Request templates"},
}
raw_categories["Verification templates"] = {
description = "Templates used to request verification of entries that may be incorrect.",
parents = {"Maintenance templates", "Request templates"},
}
raw_categories["Wiktionary templates"] = {
description = "Templates used in the internal operation of Wiktionary.",
parents = {"Templates", "Wiktionary"},
}
raw_categories["Metatemplates"] = {
description = "Templates used in other templates or to create other templates.",
parents = {"Templates"},
}
raw_categories["String manipulation templates"] = {
description = "Templates used to manipulate strings.",
additional = "See also [[Module:string/templates]], which can be invoked from templates to do string manipulation.",
parents = {"Metatemplates"},
}
------------ NAVIGATION TEMPLATES ------------
raw_categories["Navigation templates"] = {
description = "Templates used to create navigation boxes for easily linking to other similar pages.",
parents = {"Templates"},
}
raw_categories["Language-specific number templates"] = {
description = "Language-specific templates that generate number boxes or lists for a given language.",
additional = "Contrast {{catlink|Number templates}}, which contains general (language-agnostic) templates for converting numbers or generating number boxes or lists in a given language.",
parents = {"Navigation templates"},
}
raw_categories["Pro-form box templates"] = {
description = "Language-specific templates that generate navigation boxes for displaying pro-forms (pronouns, determiners, pronominal adverbs, etc.) for a given language.",
parents = {"Navigation templates"},
}
raw_categories["Demonstrative box templates"] = {
description = "Language-specific templates that generate demonstrative pronoun, determiner and adverb boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Grammatical article box templates"] = {
description = "Language-specific templates that generate grammatical article boxes (definite, indefinite, partitive, etc.) for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Interrogative box templates"] = {
description = "Language-specific templates that generate interrogative pronoun, determiner and adverb boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Personal pronoun box templates"] = {
description = "Language-specific templates that generate personal pronoun boxes for a given language.",
additional = [=[
The standard format for these templates is:
* Where the language is uninflected (e.g. Samoan {{tl|sm-personal pronouns}}) or the language is inflected but the box shows only the lemma forms of the pronoun (e.g. Basque {{tl|eu-personal pronouns}}), the '''numbers''' (singular/plural) run across the top and the '''persons''' (1st/2nd/3rd) run down the left side.
* Where the language is inflected, the '''cases''' run across the top. Down the left side, the headers (from left to right) are '''number''', '''person''', then any subform if applicable. Example: Middle High German {{tl|gmh-personal pronouns}}
** Exceptions:
*** If there are too many cases to fit on the screen as columns, the template can be transposed so that cases run vertically. Example: Northern Yukaghir {{tl|ykg-personal pronouns}}
*** If the singular and plural forms are very similar, consider placing the person headers outside number instead. Example: Punjabi {{tl|pa-personal pronouns}}
]=],
parents = {"Pro-form box templates"},
}
raw_categories["Possessive pronoun and determiner box templates"] = {
description = "Language-specific templates that generate possessive pronoun and determiner boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Reflexive pronoun and determiner box templates"] = {
description = "Language-specific templates that generate reflexive pronoun and determiner boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Relative pronoun and determiner box templates"] = {
description = "Language-specific templates that generate relative pronoun and determiner boxes for a given language.",
parents = {"Pro-form box templates"},
}
raw_categories["Number templates"] = {
description = "General (language-agnostic) templates used to convert numbers or generate boxes or lists of the numbers in a given language.",
additional = "Contrast {{catlink|Language-specific number templates}}, which contains language-specific templates for generating number boxes or lists in a given language.",
parents = {"Templates"},
}
raw_categories["Orthographic and regional variant templates"] = {
description = "Templates used to generate lists of links to alternative forms of a term, either across orthographic systems, scripts, or regional or dialectal variation.",
parents = {"Script templates", "Internal link templates"},
}
raw_categories["Pagename templates"] = {
description = "Templates used to retrieve pagenames or pagename properties or manipulate pagenames.",
parents = {"Templates"},
}
raw_categories["Preloaded templates"] = {
description = "Templates not meant to be transcluded, but instead, whether through URL parameters or modules, have their contents preloaded into edit fields.",
parents = {"Templates"},
}
raw_categories["Pronunciation templates"] = {
description = "Templates used to format pronunciation sections and the characters they use.",
additional = "See also [[:Category:Script templates]] and [[Wiktionary:Pronunciation]].",
parents = {"Templates"},
}
raw_categories["Rhyme templates"] = {
description = "Templates used to format [[Wiktionary:Rhymes|rhyme pages]], links to them from pronunciation sections, etc.",
parents = {"Pronunciation templates"},
}
raw_categories["Sign language templates"] = {
description = "Templates used to format sign-language pronunciation charts.",
parents = {"Pronunciation templates"},
}
raw_categories["Qualifier and gloss templates"] = {
description = "Templates for displaying qualifiers, glosses and the like.",
parents = {"Templates"},
}
raw_categories["Redirect templates"] = {
description = "Templates used to format redirect pages.",
parents = {"Templates"},
}
raw_categories["Reference templates"] = {
preceding = "{{also|Wiktionary:Reference templates|:Category:Reference templates by language}}",
description = "Templates used to format references.",
parents = {"Templates"},
}
raw_categories["Religion templates"] = {
description = "Templates that display religion-related diagrams or boxes.",
parents = {"Templates"},
}
raw_categories["Request templates"] = {
topright = "{{shortcut|WT:RT}}",
description = "Request templates for dictionary entries in the main namespace.",
parents = {"Templates", "Requests"},
}
raw_categories["Sandbox templates"] = {
description = "Sandbox versions of templates used for testing purposes.",
additional = "'''NOTE:''' The use of sandbox templates in mainspace is strongly dispreferred. Please place all sandbox templates in your userspace.",
parents = {"Templates"},
}
raw_categories["Script templates"] = {
preceding = "{{mainwikt|Scripts}}",
description = "Templates used for converting between scripts or displaying text in a specific script.",
parents = {"Templates"},
}
raw_categories["Semantic relation templates"] = {
description = "Templates that are placed below the [[Wiktionary:Glossary#definition line|definition line]], to indicate other terms semantically related to a particular sense.",
parents = {"Templates"},
}
raw_categories["Single-page-use templates"] = {
description = "Templates used only on a single page and unlikely to find re-use elsewhere.",
parents = {"Templates"},
}
raw_categories["Supplementary templates"] = {
description = "A grab bag of templates used to assist other templates.",
additional = "These should be recategorized according to function.",
parents = {"Templates"},
}
raw_categories["Taxonomy templates"] = {
description = "Templates used in Translingual taxonomy entries and in reference to those entries.",
parents = {"Templates"},
}
raw_categories["Taxonomic hypernym templates"] = {
description = "Templates and subcategories containing such templates. The templates contain text to appear under the Hypernyms header for taxonomic name entries.",
additional = "Each template has the name of the taxon from which it begins. The templates in this category at present are the many templates that begin with the names of taxonomic families. Others are in subcategories",
breadcrumb = "Hypernym",
parents = {"Taxonomy templates"},
}
raw_categories["Taxonomic name templates"] = {
description = "Templates used for the presentation of taxonomic names on a definition line.",
breadcrumb = "Name",
parents = {"Taxonomy templates", "Definition templates"},
}
raw_categories["Taxonomic reference templates"] = {
description = "Templates used to format references for taxonomic names.",
breadcrumb = "Reference",
parents = {"Taxonomy templates", "Reference templates"},
}
raw_categories["Templates that must be substituted"] = {
description = "Templates that are not intended for transclusion with <code><nowiki>{{ }}</nowiki></code>, " ..
"and must be substituted with <code><nowiki>{{subst: }}</nowiki></code>wherever they exist.",
additional = "Some of the members of this category are permanent, as the template was written in such a way that " ..
"it must be substituted to function properly. There may also be templates in this category that are deprecated, " ..
"in which case their content has been replaced with the preferred code.",
parents = {"Templates", "Requests"},
}
raw_categories["Templates with acceleration"] = {
description = "Templates can be added to this category by adding {{tl|isAccelerated}} to their documentation pages.",
additional = "Presence in this category indicates that at least some of the \"form-of\" entries for the word can be generated semi-automatically by users with [[Wiktionary:ACCEL|accelerated]] editing enabled.",
parents = {"Templates"},
}
raw_categories["Text format templates"] = {
description = "Templates that provide shortcuts for formatting ordinary text.",
parents = {"Templates"},
}
raw_categories["Thesaurus templates"] = {
description = "Templates for linking to or formatting thesaurus entries.",
parents = {"Templates"},
}
raw_categories["Translation templates"] = {
description = "Templates used to format entries in and parts of translation tables.",
parents = {"Templates"},
}
raw_categories["User templates"] = {
description = "Templates meant to be used in userspace.",
parents = {"Templates"},
}
raw_categories["User sandbox templates"] = {
description = "Templates that are for personal use and testing by individual editors.",
additional = "These should all begin with <code>User:</code> followed by the user's name. If several " ..
"sandbox templates are needed by a single user, subpages can be created. These templates should not be used in real " ..
"Wiktionary content pages, as all content on those pages should be editable by anyone and, if necessary, edit protected.",
parents = { "Sandbox templates", "Templates" },
}
raw_categories["Authority control subtemplates"] = {
description = "Subtemplates used in conjunction with {{tl|authority control}}.",
parents = {"User templates"},
}
raw_categories["User competency templates"] = {
description = "Templates used for to indicate a user's competency in a given natural language, script or programming language.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User templates"},
}
raw_categories["Coder user templates"] = {
description = "Templates used for to indicate a user's competency in a given programming language.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User competency templates"},
}
raw_categories["Language user templates"] = {
description = "Templates used for to indicate a user's competency in speaking a given language.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User competency templates"},
}
raw_categories["Script user templates"] = {
description = "Templates used for to indicate a user's competency in reading a given script.",
additional = "These are used in conjunction with {{tl|Babel}}, which invokes these templates as necessary.",
parents = {"User competency templates"},
}
raw_categories["WOTD templates"] = {
description = "Templates used to support the Word of the Day.",
parents = {"Wiktionary templates"},
}
raw_categories["FWOTD templates"] = {
description = "Templates used to support the Foreign Word of the Day.",
parents = {"WOTD templates"},
}
raw_categories["Non-production templates and modules"] = {
description = "Templates and modules not currently used in production.",
additional = "{{also|Special:UnusedTemplates|Category:Unused templates}}",
parents = {"Templates", "Modules", "Category:Wiktionary maintenance"},
}
raw_categories["Templates subcategories by language"] = {
description = "Umbrella categories covering topics related to templates.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "templates", is_label = true, sort = " "},
},
}
-- Add breadcrumb by chopping off the parent (or the parent's parent, etc.) from the end of the label, if possible.
for key, data in pairs(raw_categories) do
if not data.breadcrumb then
local parent = data.parents[1]
while true do
if type(parent) == "string" then
local parent_re = " " .. require("Module:string utilities").pattern_escape(mw.getContentLanguage():lcfirst(parent)) .. "$"
if key:find(parent_re) then
data.breadcrumb = key:gsub(parent_re, "")
break
end
if raw_categories[parent] then
parent = raw_categories[parent].parents[1]
else
break
end
else
break
end
end
end
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
insert(raw_handlers, function(data)
-- Allow 'Foo reference templates' for etym-only varieties.
local langname = data.category:match("^(.+) reference templates$")
if not langname then
return nil
end
local lang = require(languages_module).getByCanonicalName(langname, nil, true)
if lang and lang:hasType("etymology-only") then
local first_parent
local lang_parent = lang:getParent()
if lang_parent:hasType("etymology-only") then
-- In case there are nested etymology templates, return the parent's reference template cat, not the
-- full lang's reference template cat.
first_parent = lang_parent:getCanonicalName() .. " reference templates"
else
first_parent = {name = "reference templates", lang = lang_parent:getCode(), is_label = true}
end
return {
lang = lang:getCode(),
description = "Templates used to generate reference footnotes for {{{langname}}} entries.",
parents = {
first_parent,
lang:getCategoryName(),
},
breadcrumb_and_first_sort_key = langname,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
hqkhrd0nngaomt6m0kf84zac4qyilu1
Mòideal:category tree/terms by script
828
17740
88421
2026-04-15T09:16:42Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/terms by script]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88421
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by script"] = {
description = "{{{langname}}} terms categorized by the script they are written in (for languages with multiple native scripts).",
umbrella_parents = "Terms by lexical property subcategories by language",
parents = {"terms by orthographic property"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by script subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their script.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by script", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local name = data.label:match("^terms in (.+) script$")
if not name then
return
end
local sc = require("Module:scripts").getByCanonicalName(name)
if not sc then
return
end
return {
description = "{{{langname}}} terms written in " .. name .. " script.",
umbrella_parents = "Terms by script subcategories by language",
catfix_sc = sc:getCode(),
parents = {{
name = "terms by script",
sort = name,
}},
breadcrumb = name,
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
d81vjwk8gqz7b0raqpmovxxir5esisz
88422
88421
2026-07-27T00:18:56Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/terms_by_script]]
88421
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["terms by script"] = {
description = "{{{langname}}} terms categorized by the script they are written in (for languages with multiple native scripts).",
umbrella_parents = "Terms by lexical property subcategories by language",
parents = {"terms by orthographic property"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by script subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their script.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by script", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local name = data.label:match("^terms in (.+) script$")
if not name then
return
end
local sc = require("Module:scripts").getByCanonicalName(name)
if not sc then
return
end
return {
description = "{{{langname}}} terms written in " .. name .. " script.",
umbrella_parents = "Terms by script subcategories by language",
catfix_sc = sc:getCode(),
parents = {{
name = "terms by script",
sort = name,
}},
breadcrumb = name,
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
d81vjwk8gqz7b0raqpmovxxir5esisz
Mòideal:category tree/transliterations
828
17741
88423
2026-04-15T09:16:42Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/transliterations]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88423
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["romanizations"] = {
description = "{{{langname}}} terms transliterated into the Latin alphabet.",
parents = {"non-lemma forms"},
umbrella_parents = "Transliterations subcategories by language",
-- Special romanization-specific table-of-contents bars are used on romanization pages
-- (e.g. [[Template:got-rom-categoryTOC]]) because they hold Latin-script terms in a
-- language-specific romanization scheme, rather than terms in the language's normal script.
-- For the same reason, we specify catfix = false to disable script-specific font
-- formatting.
toc_template = {"{{{langcode}}}-rom-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-rom-categoryTOC/full", "{{{langcode}}}-rom-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Latn",
}
labels["romanizations without a main entry"] = {
description = "{{{langname}}} romanizations where the corresponding entry in the language's normal script does not exist. Automatically added by <code>{{[[Template:romanization of|romanization of]]}}</code> when applicable.",
parents = {"entry maintenance", {name = "romanizations", sort = " "}},
umbrella_parents = "Entry maintenance subcategories by language",
--See 'romanizations' above.
toc_template = {"{{{langcode}}}-rom-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-rom-categoryTOC/full", "{{{langcode}}}-rom-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Latn",
can_be_empty = true,
hidden = true,
}
labels["terms transliterated from other languages"] = {
description = "{{{langname}}} terms that have been transliterated from other languages.",
parents = {{name = "borrowed terms", sort = " "}},
umbrella_parents = "Transliterations subcategories by language",
}
labels["arabicizations"] = {
description = "{{{langname}}} terms transliterated into the Arabic abjad.",
parents = {"non-lemma forms"},
umbrella_parents = "Transliterations subcategories by language",
-- Special romanization-specific table-of-contents bars are used on romanization pages
-- (e.g. [[Template:got-arab-categoryTOC]]) because they hold Latin-script terms in a
-- language-specific romanization scheme, rather than terms in the language's normal script.
-- For the same reason, we specify catfix = false to disable script-specific font
-- formatting.
toc_template = {"{{{langcode}}}-arab-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-arab-categoryTOC/full", "{{{langcode}}}-arab-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Arab",
}
labels["arabicizations without a main entry"] = {
description = "{{{langname}}} arabicization where the corresponding entry in the language's normal script does not exist. Automatically added by <code>{{[[Template:arabicization of|arabicization of]]}}</code> when applicable.",
parents = {"entry maintenance", {name = "arabicizations", sort = " "}},
umbrella_parents = "Entry maintenance subcategories by language",
--See 'romanizations' above.
toc_template = {"{{{langcode}}}-arab-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-arab-categoryTOC/full", "{{{langcode}}}-arab-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Arab",
can_be_empty = true,
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Transliterations subcategories by language"] = {
description = "Umbrella categories covering topics related to transliterations.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local source_name = data.label:match("^transliterations of (.+) terms$")
if not source_name then
return
end
local source = require("Module:languages").getByCanonicalName(source_name, true, true, true)
if source_name ~= source:getCanonicalName() then
return
end
local display_form = source:getDisplayForm()
local source_desc = source:makeCategoryLink()
return {
description = "{{{langname}}} terms that have been transliterated from " .. source_desc .. ".",
breadcrumb = display_form,
parents = {
{ name = "terms transliterated from other languages", sort = display_form },
{ name = "terms borrowed from " .. display_form, sort = " "},
},
umbrella = {
no_by_language = true,
parents = {
{ name = "terms borrowed from " .. display_form, is_label = true, sort = " " }
}
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
m8v471isne43digld5b06hp9v7owb8k
88424
88423
2026-07-27T00:19:06Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/transliterations]]
88423
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["romanizations"] = {
description = "{{{langname}}} terms transliterated into the Latin alphabet.",
parents = {"non-lemma forms"},
umbrella_parents = "Transliterations subcategories by language",
-- Special romanization-specific table-of-contents bars are used on romanization pages
-- (e.g. [[Template:got-rom-categoryTOC]]) because they hold Latin-script terms in a
-- language-specific romanization scheme, rather than terms in the language's normal script.
-- For the same reason, we specify catfix = false to disable script-specific font
-- formatting.
toc_template = {"{{{langcode}}}-rom-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-rom-categoryTOC/full", "{{{langcode}}}-rom-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Latn",
}
labels["romanizations without a main entry"] = {
description = "{{{langname}}} romanizations where the corresponding entry in the language's normal script does not exist. Automatically added by <code>{{[[Template:romanization of|romanization of]]}}</code> when applicable.",
parents = {"entry maintenance", {name = "romanizations", sort = " "}},
umbrella_parents = "Entry maintenance subcategories by language",
--See 'romanizations' above.
toc_template = {"{{{langcode}}}-rom-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-rom-categoryTOC/full", "{{{langcode}}}-rom-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Latn",
can_be_empty = true,
hidden = true,
}
labels["terms transliterated from other languages"] = {
description = "{{{langname}}} terms that have been transliterated from other languages.",
parents = {{name = "borrowed terms", sort = " "}},
umbrella_parents = "Transliterations subcategories by language",
}
labels["arabicizations"] = {
description = "{{{langname}}} terms transliterated into the Arabic abjad.",
parents = {"non-lemma forms"},
umbrella_parents = "Transliterations subcategories by language",
-- Special romanization-specific table-of-contents bars are used on romanization pages
-- (e.g. [[Template:got-arab-categoryTOC]]) because they hold Latin-script terms in a
-- language-specific romanization scheme, rather than terms in the language's normal script.
-- For the same reason, we specify catfix = false to disable script-specific font
-- formatting.
toc_template = {"{{{langcode}}}-arab-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-arab-categoryTOC/full", "{{{langcode}}}-arab-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Arab",
}
labels["arabicizations without a main entry"] = {
description = "{{{langname}}} arabicization where the corresponding entry in the language's normal script does not exist. Automatically added by <code>{{[[Template:arabicization of|arabicization of]]}}</code> when applicable.",
parents = {"entry maintenance", {name = "arabicizations", sort = " "}},
umbrella_parents = "Entry maintenance subcategories by language",
--See 'romanizations' above.
toc_template = {"{{{langcode}}}-arab-categoryTOC", "en-categoryTOC"},
toc_template_full = {"{{{langcode}}}-arab-categoryTOC/full", "{{{langcode}}}-arab-categoryTOC", "en-categoryTOC/full"},
catfix_sc = "Arab",
can_be_empty = true,
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Transliterations subcategories by language"] = {
description = "Umbrella categories covering topics related to transliterations.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(handlers, function(data)
local source_name = data.label:match("^transliterations of (.+) terms$")
if not source_name then
return
end
local source = require("Module:languages").getByCanonicalName(source_name, true, true, true)
if source_name ~= source:getCanonicalName() then
return
end
local display_form = source:getDisplayForm()
local source_desc = source:makeCategoryLink()
return {
description = "{{{langname}}} terms that have been transliterated from " .. source_desc .. ".",
breadcrumb = display_form,
parents = {
{ name = "terms transliterated from other languages", sort = display_form },
{ name = "terms borrowed from " .. display_form, sort = " "},
},
umbrella = {
no_by_language = true,
parents = {
{ name = "terms borrowed from " .. display_form, is_label = true, sort = " " }
}
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
m8v471isne43digld5b06hp9v7owb8k
Mòideal:category tree/unicode
828
17742
88425
2026-04-15T09:16:43Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/unicode]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88425
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Unicode blocks"] = {
topright = "{{shortcut|CAT:UC}}",
description = "Categories with blocks of particular Unicode characters.",
parents = {
"Fundamental",
"Category:Appendices",
},
}
raw_categories["Unicode blocks by number of entries"] = {
description = "Categories that group blocks of Unicode characters by the number of characters in those blocks.",
parents = {
{name = "Unicode blocks", sort = " "},
},
}
for _, block in ipairs({
{num = "0", desc = "no other", sort = "*000"},
{num = "1–10", desc = "1 to 10", sort = "*001"},
{num = "11–50", desc = "11 to 50", sort = "*011"},
{num = "51–100", desc = "51 to 100", sort = "*051"},
{num = "101+", desc = "at least 101", sort = "*101"},
}) do
raw_categories["Unicode blocks with " .. block.num .. " entries"] = {
description = "Unicode block categories containing 1 appendix + " .. block.desc .. " entries.",
parents = {{name = "Unicode blocks by number of entries", sort = block.sort}},
breadcrumb = block.num,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(raw_handlers, function(data)
local block = data.category:match("^(.*) block$")
if block then
local pages_in_category = mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "pages") -- DO NOT replace with mw.loadData("Module:headword/data").pagename as we need the root portion
local entry_bucket
-- At least 1 page is the appendix for the current Unicode block.
if pages_in_category == 1 then
entry_bucket = "0"
elseif pages_in_category <= 11 then
entry_bucket = "1–10"
elseif pages_in_category <= 51 then
entry_bucket = "11–50"
elseif pages_in_category <= 101 then
entry_bucket = "51–100"
else
entry_bucket = "101+"
end
return {
description = "Entries for characters in the '''[[Appendix:Unicode/" .. block .. "|" .. block .. "]]''' block, " ..
"as categorized by the character boxes.",
additional = "Some entries may define characters from multiple Unicode codepoints at once, so the page title " ..
"could be an entry that is not from this block.",
breadcrumb = block,
parents = {
"Unicode blocks",
"Unicode blocks with " .. entry_bucket .. " entries",
},
}
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
6mhm04cadgsk4rmzh1rbgpzvn5trkhv
88426
88425
2026-07-27T00:19:15Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/unicode]]
88425
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Unicode blocks"] = {
topright = "{{shortcut|CAT:UC}}",
description = "Categories with blocks of particular Unicode characters.",
parents = {
"Fundamental",
"Category:Appendices",
},
}
raw_categories["Unicode blocks by number of entries"] = {
description = "Categories that group blocks of Unicode characters by the number of characters in those blocks.",
parents = {
{name = "Unicode blocks", sort = " "},
},
}
for _, block in ipairs({
{num = "0", desc = "no other", sort = "*000"},
{num = "1–10", desc = "1 to 10", sort = "*001"},
{num = "11–50", desc = "11 to 50", sort = "*011"},
{num = "51–100", desc = "51 to 100", sort = "*051"},
{num = "101+", desc = "at least 101", sort = "*101"},
}) do
raw_categories["Unicode blocks with " .. block.num .. " entries"] = {
description = "Unicode block categories containing 1 appendix + " .. block.desc .. " entries.",
parents = {{name = "Unicode blocks by number of entries", sort = block.sort}},
breadcrumb = block.num,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
table.insert(raw_handlers, function(data)
local block = data.category:match("^(.*) block$")
if block then
local pages_in_category = mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "pages") -- DO NOT replace with mw.loadData("Module:headword/data").pagename as we need the root portion
local entry_bucket
-- At least 1 page is the appendix for the current Unicode block.
if pages_in_category == 1 then
entry_bucket = "0"
elseif pages_in_category <= 11 then
entry_bucket = "1–10"
elseif pages_in_category <= 51 then
entry_bucket = "11–50"
elseif pages_in_category <= 101 then
entry_bucket = "51–100"
else
entry_bucket = "101+"
end
return {
description = "Entries for characters in the '''[[Appendix:Unicode/" .. block .. "|" .. block .. "]]''' block, " ..
"as categorized by the character boxes.",
additional = "Some entries may define characters from multiple Unicode codepoints at once, so the page title " ..
"could be an entry that is not from this block.",
breadcrumb = block,
parents = {
"Unicode blocks",
"Unicode blocks with " .. entry_bucket .. " entries",
},
}
end
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
6mhm04cadgsk4rmzh1rbgpzvn5trkhv
Mòideal:category tree/wiktionary maintenance
828
17743
88427
2026-07-22T21:28:09Z
en>Kiril kovachev
0
Also can use currencies label
88427
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local m_template_parser = require("Module:template parser")
local get_lang = require("Module:languages").getByCode
local insert = table.insert
local is_internal_title = require("Module:pages").is_internal_title
local new_title = mw.title.new
local split_lang_label = require("Module:category tree").split_lang_label
local php_trim = require("Module:Scribunto").php_trim
local uses_hidden_category = require("Module:maintenance category").uses_hidden_category
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary maintenance"] = {
description = "Categories containing pages that are being tracked for attention and improvement by editors.",
breadcrumb = "Maintenance",
parents = "Wiktionary",
}
raw_categories["Empty categories"] = {
topright = "{{shortcut|CAT:EC}}",
description = "Categories with no members.",
additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories.
Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up.
Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories with incorrect names"] = {
description = "Categories with names that do not match the expected form within the category tree.",
additional =
[=[This usually happens when additional parameters have been given to {{tl|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name.
==See also==
* [[:Category:Categories that are not defined in the category tree]]]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories that are not defined in the category tree"] = {
description = "Categories which use {{tl|auto cat}}, but which are not registered in the category tree data modules.",
additional = [=[See the error box displayed on any of these categories for more info.
==See also==
* [[:Category:Categories with incorrect names]]]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Entries tagged as derogatory"] = {
description =
"Entries are placed in this category automatically when tagged with {{temp|derogatory}}. Do not add entries to this category manually.",
parents = "Wiktionary maintenance",
breadcrumb = "Tagged as derogatory",
can_be_empty = true,
hidden = true,
}
raw_categories["Entries with deprecated labels"] = {
description =
"Entries which use labels which have been marked as deprecated and should no longer be used; these should be replaced according to the table below.",
additional =
[=[See all labels: [[Module:labels/data]], [[Module:labels/data/regional]], [[Module:labels/data/topical]].
{| class="wikitable sortable"
! Label
! Replace with
|-
| christianity || Christianity
|-
| currency || currencies, numismatics
|-
| emergency || emergency medicine
|-
| greekmyth || Greek mythology
|-
| industry || manufacturing
|-
| islam || Islam
|-
| morphology || linguistic morphology
|-
| musici || musical instruments
|-
| ordinal || ex. 1: [[14th]]: <nowiki>{{abbreviation of|fourteenth|lang=en}}</nowiki> <br> ex. 2: [[fourth]] (in definition): "The [[ordinal]] form of the number [[four]]."
|-
| plural || in the plural (usually)
|-
| quantum || quantum mechanics
|-
| singular || in the singular (usually)
|-
| usually plural<br/>usually in plural</br>usually in the plural || usually<nowiki>|</nowiki>in the plural
|-
| dual || in the dual
|-
| usually dual<br/>usually in dual</br>usually in the dual || usually<nowiki>|</nowiki>in the dual
|-
| vector || linear algebra
|}]=],
breadcrumb = "With deprecated labels",
can_be_empty = true,
hidden = true,
parents = "Wiktionary maintenance",
}
raw_categories["Hidden categories"] = {
description =
"Categories using the <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> behavior switch, which hides the category from the lists of categories in its members and subcategories.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Huge categories"] = {
description = "Categories with more than 1 million members.",
additional =
"Such categories have the [[mw:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] extension disabled, which is normally used to list the newest and oldest pages in a category. This is because categories above that size load very slowly when it is enabled, and in some cases become inaccessible due to timing-out.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Indexed pages"] = {
description =
"Pages using the <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> behavior switch, which tells search engines to index the page.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Noindexed pages"] = {
description =
"Pages using the <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code> behavior switch, which tells search engines not to index the page.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using deprecated templates"] = {
description =
"This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.",
additional =
[=[This category is populated by {{tl|deprecated code}} and {{tl|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Category:Successfully deprecated templates]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Category:Pages using deprecated templates]]. Ideally, this category will be empty.
Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=],
breadcrumb = "Using deprecated templates",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using lite templates"] = {
description = "Pages which use at least one of the lite templates.",
additional = "See [[:Category:Lua-free templates]].",
breadcrumb = "Using lite templates",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with redundant inline etymon"] = {
description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.",
additional = "These should be reviewed and simplified to avoid redundant specification.",
breadcrumb = "Redundant inline etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using etymon with no ID"] = {
description =
"Pages where {{tl|etymon}} is used without an ID and the linked page has only one etymon template for the language.",
additional = "These should be updated to specify an explicit ID to avoid ambiguity if more etymons are added later.",
breadcrumb = "ID-less etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with inline etymon for redlinks"] = {
description = "Pages where {{tl|etymon}} is used inside another {{tl|etymon}} and the target term is a redlink.",
additional = "These should be reviewed once the target entries are created.",
breadcrumb = "Inline etymon for redlinks",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with etymon"] = {
description = "Pages that use the {{tl|etymon}} template.",
breadcrumb = "Etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with etymology trees"] = {
description = "Pages that display an etymology tree generated by the {{tl|etymon}} template.",
breadcrumb = "Etymology trees",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with etymology text stop language not in chain"] = {
description = "Pages where {{tl|etymon}} is used with {{para|text}} set to stop at a language (e.g. {{code|text=:el}}) but that language never appears in the rendered etymology chain.",
additional = "These should be reviewed and the {{para|text}} parameter corrected.",
breadcrumb = "Etymology text stop language not in chain",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with tab characters"] = {
description = "Pages which contain a tab character in their wikitext.",
additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].",
breadcrumb = "Tab characters",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with language headings in the wrong order"] = {
description = "Pages in which the headings for each language's entry are in the wrong order.",
additional =
"Level 2 language headings should be in alphabetical order, except for Translingual and English, which go at the top (in that order).",
breadcrumb = "Language headings in the wrong order",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with nonstandard language headings"] = {
description = "Pages which contain a level 2 heading which does not match any language's canonical name.",
additional = "The level 2 language heading for each language should always be that language's canonical name.",
breadcrumb = "Nonstandard language headings",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with unwanted L1 headings"] = {
description = "Pages which contain an unwanted level 1 heading.",
additional =
"Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.",
breadcrumb = "Unwanted L1 headings",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with raw triple-brace template parameters"] = {
description = "Pages which contain raw template parameters in the form of triple braces.",
additional =
"Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.",
breadcrumb = "Raw template parameters",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with DEFAULTSORT conflicts"] = {
topright = "{{shortcut|CAT:DEFAULTSORT}}",
description = "Pages on which the {{tl|DEFAULTSORT:}} magic word has been used multiple times with different values.",
additional =
"In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{tl|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{tl|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." ..
"\n\nSee also [[:Category:Pages with DISPLAYTITLE conflicts]].",
breadcrumb = "DEFAULTSORT conflicts",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with DISPLAYTITLE conflicts"] = {
topright = "{{shortcut|CAT:DISPLAYTITLE}}",
description =
"Pages on which the {{tl|DISPLAYTITLE:}} magic word has been used multiple times with different values.",
additional =
"In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{tl|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{tl|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." ..
"\n\nSee also [[:Category:Pages with DEFAULTSORT conflicts]].",
breadcrumb = "DISPLAYTITLE conflicts",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with raw sortkeys"] = {
description = "Pages on which a sortkey has been used with a raw category.",
additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." ..
"\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" ..
"By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.",
breadcrumb = "Raw sortkeys",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with module errors"] = {
topright = "{{shortcut|CAT:E|CAT:ERR|CAT:ERROR}}",
description = "Pages that have errors in a [[Wiktionary:Scribunto|Lua]] module.",
additional =
"If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]. Memory errors are a common source of these errors; see the discussion at [[Wiktionary:Lua memory errors]]." ..
"\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[mw:Help:Dummy_edit#A_null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." ..
"\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20module%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." ..
"\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." ..
"\n\nSee also [[:Category:Pages with ParserFunction errors]].",
breadcrumb = "Module errors",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with ParserFunction errors"] = {
topright = "{{shortcut|CAT:PFE}}",
description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.",
additional =
"Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." ..
"\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." ..
"\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." ..
"\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." ..
"\n\nSee also [[:Category:Pages with module errors]].",
breadcrumb = "ParserFunction errors",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Requests for moves, mergers and splits"] = {
description = "Pages and categories which have been tagged with a request for them to be moved, merged or split.",
breadcrumb = "Moves, mergers and splits",
parents = { "Wiktionary maintenance", "Requests" },
can_be_empty = true,
hidden = true,
}
raw_categories["Pages to be merged"] = {
description = "Pages tagged to be merged by the {{tl|merge}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Pages to be moved"] = {
description = "Pages tagged to be moved by the {{tl|move}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Pages to be split"] = {
description = "Pages tagged to be split by the {{tl|split}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Category and label treatment requests"] = {
description = "Content categories which have been tagged with {{tl|cltr}}, a request for them to be renamed, merged, split or deleted.",
parents = { "Wiktionary maintenance", "Requests" },
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using invalid parameters when calling templates"] = {
description = "Pages that use unrecognized parameters when calling a template.",
breadcrumb = "Invalid template parameters",
parents = "Wiktionary maintenance",
can_be_empty = true,
}
raw_categories["Pages using catfix"] = {
description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.",
additional =
"This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages calling Template:minitoc"] = {
description = "Pages that display a mini table of contents by calling {{tl|minitoc}}.",
additional = "This is used on very large pages with many entries, to assist with navigation.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories calling Template:auto cat"] = {
description = "Categories that have been placed in another category by calling {{tl|auto cat}}.",
additional =
"This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{tl|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories with categories using raw markup"] = {
description =
"Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Documentation subpages"] = {
description = "Documentation subpages of templates and modules.",
parents = "Template documentation",
}
raw_categories["Orphaned documentation subpages"] = {
description = "Documentation subpages whose main page was deleted, leaving the documentation orphaned.",
additional = "Pages whose documentation page was created before the main page was created will also appear here. These should not be deleted; a null edit (edit with no changes) should fix this.",
parents = {"Documentation subpages", "Wiktionary maintenance"},
breadcrumb_and_first_sort_key = "Orphaned",
can_be_empty = true,
}
raw_categories["Template documentation"] = {
description = "Pages and categories relating to template documentation.",
parents = "Wiktionary",
}
raw_categories["Templates and modules needing documentation"] = {
preceding = "{{also|:Category:Templates and modules with outdated documentation}}",
description =
"[[Wiktionary:Templates|Templates]] and [[Wiktionary:Modules|modules]] that require a documentation subpage.",
additional = "See [[Help:Documenting templates and modules]] for more information.",
parents = {"Template documentation", "Wiktionary maintenance"},
can_be_empty = true,
}
raw_categories["Templates and modules with outdated documentation"] = {
preceding = "{{also|:Category:Templates and modules needing documentation}}",
description =
"[[Wiktionary:Templates|Templates]] and [[Wiktionary:Modules|modules]] whose documentation is out of date.",
additional = "See [[Help:Documenting templates]] for more information.",
parents = {"Template documentation", "Wiktionary maintenance"},
can_be_empty = true,
}
raw_categories["Pages using deprecated source tags"] = {
description =
"Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.",
breadcrumb = "Deprecated source tags",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
insert(raw_handlers, function(data)
local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$")
if not template_type then
return
end
local parents = { {
name = "Pages using invalid parameters when calling templates",
sort = template_type == "general use" and "*" or template_type,
} }
local lang = require("Module:languages").getByCanonicalName(template_type, nil, true)
if lang then
insert(parents, { name = "entry maintenance", is_label = true, lang = lang:getCode() })
end
return {
lang = lang and lang:getCode() or nil,
description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.",
parents = parents,
breadcrumb = template_type,
}
end)
do
local prefixes = require("Module:table").listToSet { "list", "P", "R", "RQ", "table", "U" }
local function add_parent(parents, seen, cat_type, sortkey)
if seen[cat_type] then
return
end
insert(parents, {
name = ("Pages using invalid parameters when calling %s templates"):format(cat_type),
sort = sortkey,
})
seen[cat_type] = true
end
insert(raw_handlers, function(data)
local template = data.category:match("^Pages using invalid parameters when calling (.+)$")
if not template then
return
end
-- Resolve any redirects.
template = new_title(template)
while template do
local redirect = template.redirectTarget
if not (redirect and is_internal_title(redirect)) then
break
end
template = redirect
end
-- Disallow templates which would always hidden maintennace categories (e.g. sandboxes).
if not (template and not uses_hidden_category(template)) then
return
end
local prefixed_text, lang = template.prefixedText
if template.namespace == 10 then
local name = template.text
-- Remove the prefix if present (e.g. "R:" or "RQ:").
local prefix, text = name:match("^(.-):(.+)")
if not (prefix and prefixes[prefix]) then
text = name
end
-- Check the initial language code, chopping off hyphenated sections until there's a match or they run out.
local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]")
while code do
lang = get_lang(code)
if lang then
break
end
code = code:match("(.+)%-%a*$")
end
-- If no match and it's a list: or table: template, check if the template name ends "/CODE".
if not lang and (prefix == "list" or prefix == "table") then
code = text:match("%f[^/]%l[%a-]*%a$")
if code then
lang = get_lang(code)
end
end
end
local sortkey = template.text
local parents, seen = {}, {}
-- Categorize as language-specific if a language was found.
if lang then
add_parent(parents, seen, lang:getCanonicalName(), sortkey)
end
-- Also grab any language categories from the template page.
for _, cat in ipairs(template.categories) do
if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then
local cat_lang = split_lang_label(new_title(cat).text)
if cat_lang then
add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey)
end
end
end
-- If none were found, categorize as general use.
if #parents == 0 then
add_parent(parents, seen, "general use", sortkey)
end
-- Only add can_be_empty if the template exists and contains checkparams.
local content, can_be_empty = template:getContent()
if content then
-- Check for {{#invoke:checkparams|warn|...}}.
-- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present.
for template in require("Module:template parser").find_templates(content) do
if template:get_name() == "#INVOKE:" then
local args = template:get_arguments()
local arg_2 = args[2]
if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then
can_be_empty = true
break
end
end
end
end
return {
canonical_name = "Pages using invalid parameters when calling " .. prefixed_text,
lang = lang and lang:getCode() or nil,
description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.")
:format(m_template_parser.getTemplateInvocationName(template)),
additional =
"These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.",
breadcrumb = prefixed_text,
parents = parents,
can_be_empty = can_be_empty,
hidden = true,
}
end)
end
return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers }
51rzihsgnuzv4q36f8761jp7s9swfc3
88428
88427
2026-07-27T00:19:26Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/wiktionary_maintenance]]
88427
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local m_template_parser = require("Module:template parser")
local get_lang = require("Module:languages").getByCode
local insert = table.insert
local is_internal_title = require("Module:pages").is_internal_title
local new_title = mw.title.new
local split_lang_label = require("Module:category tree").split_lang_label
local php_trim = require("Module:Scribunto").php_trim
local uses_hidden_category = require("Module:maintenance category").uses_hidden_category
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary maintenance"] = {
description = "Categories containing pages that are being tracked for attention and improvement by editors.",
breadcrumb = "Maintenance",
parents = "Wiktionary",
}
raw_categories["Empty categories"] = {
topright = "{{shortcut|CAT:EC}}",
description = "Categories with no members.",
additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories.
Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up.
Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories with incorrect names"] = {
description = "Categories with names that do not match the expected form within the category tree.",
additional =
[=[This usually happens when additional parameters have been given to {{tl|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name.
==See also==
* [[:Category:Categories that are not defined in the category tree]]]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories that are not defined in the category tree"] = {
description = "Categories which use {{tl|auto cat}}, but which are not registered in the category tree data modules.",
additional = [=[See the error box displayed on any of these categories for more info.
==See also==
* [[:Category:Categories with incorrect names]]]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Entries tagged as derogatory"] = {
description =
"Entries are placed in this category automatically when tagged with {{temp|derogatory}}. Do not add entries to this category manually.",
parents = "Wiktionary maintenance",
breadcrumb = "Tagged as derogatory",
can_be_empty = true,
hidden = true,
}
raw_categories["Entries with deprecated labels"] = {
description =
"Entries which use labels which have been marked as deprecated and should no longer be used; these should be replaced according to the table below.",
additional =
[=[See all labels: [[Module:labels/data]], [[Module:labels/data/regional]], [[Module:labels/data/topical]].
{| class="wikitable sortable"
! Label
! Replace with
|-
| christianity || Christianity
|-
| currency || currencies, numismatics
|-
| emergency || emergency medicine
|-
| greekmyth || Greek mythology
|-
| industry || manufacturing
|-
| islam || Islam
|-
| morphology || linguistic morphology
|-
| musici || musical instruments
|-
| ordinal || ex. 1: [[14th]]: <nowiki>{{abbreviation of|fourteenth|lang=en}}</nowiki> <br> ex. 2: [[fourth]] (in definition): "The [[ordinal]] form of the number [[four]]."
|-
| plural || in the plural (usually)
|-
| quantum || quantum mechanics
|-
| singular || in the singular (usually)
|-
| usually plural<br/>usually in plural</br>usually in the plural || usually<nowiki>|</nowiki>in the plural
|-
| dual || in the dual
|-
| usually dual<br/>usually in dual</br>usually in the dual || usually<nowiki>|</nowiki>in the dual
|-
| vector || linear algebra
|}]=],
breadcrumb = "With deprecated labels",
can_be_empty = true,
hidden = true,
parents = "Wiktionary maintenance",
}
raw_categories["Hidden categories"] = {
description =
"Categories using the <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> behavior switch, which hides the category from the lists of categories in its members and subcategories.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Huge categories"] = {
description = "Categories with more than 1 million members.",
additional =
"Such categories have the [[mw:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] extension disabled, which is normally used to list the newest and oldest pages in a category. This is because categories above that size load very slowly when it is enabled, and in some cases become inaccessible due to timing-out.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Indexed pages"] = {
description =
"Pages using the <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> behavior switch, which tells search engines to index the page.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Noindexed pages"] = {
description =
"Pages using the <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code> behavior switch, which tells search engines not to index the page.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using deprecated templates"] = {
description =
"This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.",
additional =
[=[This category is populated by {{tl|deprecated code}} and {{tl|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Category:Successfully deprecated templates]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Category:Pages using deprecated templates]]. Ideally, this category will be empty.
Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=],
breadcrumb = "Using deprecated templates",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using lite templates"] = {
description = "Pages which use at least one of the lite templates.",
additional = "See [[:Category:Lua-free templates]].",
breadcrumb = "Using lite templates",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with redundant inline etymon"] = {
description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.",
additional = "These should be reviewed and simplified to avoid redundant specification.",
breadcrumb = "Redundant inline etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using etymon with no ID"] = {
description =
"Pages where {{tl|etymon}} is used without an ID and the linked page has only one etymon template for the language.",
additional = "These should be updated to specify an explicit ID to avoid ambiguity if more etymons are added later.",
breadcrumb = "ID-less etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with inline etymon for redlinks"] = {
description = "Pages where {{tl|etymon}} is used inside another {{tl|etymon}} and the target term is a redlink.",
additional = "These should be reviewed once the target entries are created.",
breadcrumb = "Inline etymon for redlinks",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with etymon"] = {
description = "Pages that use the {{tl|etymon}} template.",
breadcrumb = "Etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with etymology trees"] = {
description = "Pages that display an etymology tree generated by the {{tl|etymon}} template.",
breadcrumb = "Etymology trees",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with etymology text stop language not in chain"] = {
description = "Pages where {{tl|etymon}} is used with {{para|text}} set to stop at a language (e.g. {{code|text=:el}}) but that language never appears in the rendered etymology chain.",
additional = "These should be reviewed and the {{para|text}} parameter corrected.",
breadcrumb = "Etymology text stop language not in chain",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with tab characters"] = {
description = "Pages which contain a tab character in their wikitext.",
additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].",
breadcrumb = "Tab characters",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with language headings in the wrong order"] = {
description = "Pages in which the headings for each language's entry are in the wrong order.",
additional =
"Level 2 language headings should be in alphabetical order, except for Translingual and English, which go at the top (in that order).",
breadcrumb = "Language headings in the wrong order",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with nonstandard language headings"] = {
description = "Pages which contain a level 2 heading which does not match any language's canonical name.",
additional = "The level 2 language heading for each language should always be that language's canonical name.",
breadcrumb = "Nonstandard language headings",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with unwanted L1 headings"] = {
description = "Pages which contain an unwanted level 1 heading.",
additional =
"Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.",
breadcrumb = "Unwanted L1 headings",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with raw triple-brace template parameters"] = {
description = "Pages which contain raw template parameters in the form of triple braces.",
additional =
"Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.",
breadcrumb = "Raw template parameters",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with DEFAULTSORT conflicts"] = {
topright = "{{shortcut|CAT:DEFAULTSORT}}",
description = "Pages on which the {{tl|DEFAULTSORT:}} magic word has been used multiple times with different values.",
additional =
"In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{tl|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{tl|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." ..
"\n\nSee also [[:Category:Pages with DISPLAYTITLE conflicts]].",
breadcrumb = "DEFAULTSORT conflicts",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with DISPLAYTITLE conflicts"] = {
topright = "{{shortcut|CAT:DISPLAYTITLE}}",
description =
"Pages on which the {{tl|DISPLAYTITLE:}} magic word has been used multiple times with different values.",
additional =
"In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{tl|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{tl|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." ..
"\n\nSee also [[:Category:Pages with DEFAULTSORT conflicts]].",
breadcrumb = "DISPLAYTITLE conflicts",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with raw sortkeys"] = {
description = "Pages on which a sortkey has been used with a raw category.",
additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." ..
"\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" ..
"By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.",
breadcrumb = "Raw sortkeys",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with module errors"] = {
topright = "{{shortcut|CAT:E|CAT:ERR|CAT:ERROR}}",
description = "Pages that have errors in a [[Wiktionary:Scribunto|Lua]] module.",
additional =
"If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]. Memory errors are a common source of these errors; see the discussion at [[Wiktionary:Lua memory errors]]." ..
"\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[mw:Help:Dummy_edit#A_null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." ..
"\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20module%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." ..
"\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." ..
"\n\nSee also [[:Category:Pages with ParserFunction errors]].",
breadcrumb = "Module errors",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with ParserFunction errors"] = {
topright = "{{shortcut|CAT:PFE}}",
description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.",
additional =
"Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." ..
"\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." ..
"\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." ..
"\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." ..
"\n\nSee also [[:Category:Pages with module errors]].",
breadcrumb = "ParserFunction errors",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Requests for moves, mergers and splits"] = {
description = "Pages and categories which have been tagged with a request for them to be moved, merged or split.",
breadcrumb = "Moves, mergers and splits",
parents = { "Wiktionary maintenance", "Requests" },
can_be_empty = true,
hidden = true,
}
raw_categories["Pages to be merged"] = {
description = "Pages tagged to be merged by the {{tl|merge}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Pages to be moved"] = {
description = "Pages tagged to be moved by the {{tl|move}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Pages to be split"] = {
description = "Pages tagged to be split by the {{tl|split}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Category and label treatment requests"] = {
description = "Content categories which have been tagged with {{tl|cltr}}, a request for them to be renamed, merged, split or deleted.",
parents = { "Wiktionary maintenance", "Requests" },
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using invalid parameters when calling templates"] = {
description = "Pages that use unrecognized parameters when calling a template.",
breadcrumb = "Invalid template parameters",
parents = "Wiktionary maintenance",
can_be_empty = true,
}
raw_categories["Pages using catfix"] = {
description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.",
additional =
"This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages calling Template:minitoc"] = {
description = "Pages that display a mini table of contents by calling {{tl|minitoc}}.",
additional = "This is used on very large pages with many entries, to assist with navigation.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories calling Template:auto cat"] = {
description = "Categories that have been placed in another category by calling {{tl|auto cat}}.",
additional =
"This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{tl|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories with categories using raw markup"] = {
description =
"Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Documentation subpages"] = {
description = "Documentation subpages of templates and modules.",
parents = "Template documentation",
}
raw_categories["Orphaned documentation subpages"] = {
description = "Documentation subpages whose main page was deleted, leaving the documentation orphaned.",
additional = "Pages whose documentation page was created before the main page was created will also appear here. These should not be deleted; a null edit (edit with no changes) should fix this.",
parents = {"Documentation subpages", "Wiktionary maintenance"},
breadcrumb_and_first_sort_key = "Orphaned",
can_be_empty = true,
}
raw_categories["Template documentation"] = {
description = "Pages and categories relating to template documentation.",
parents = "Wiktionary",
}
raw_categories["Templates and modules needing documentation"] = {
preceding = "{{also|:Category:Templates and modules with outdated documentation}}",
description =
"[[Wiktionary:Templates|Templates]] and [[Wiktionary:Modules|modules]] that require a documentation subpage.",
additional = "See [[Help:Documenting templates and modules]] for more information.",
parents = {"Template documentation", "Wiktionary maintenance"},
can_be_empty = true,
}
raw_categories["Templates and modules with outdated documentation"] = {
preceding = "{{also|:Category:Templates and modules needing documentation}}",
description =
"[[Wiktionary:Templates|Templates]] and [[Wiktionary:Modules|modules]] whose documentation is out of date.",
additional = "See [[Help:Documenting templates]] for more information.",
parents = {"Template documentation", "Wiktionary maintenance"},
can_be_empty = true,
}
raw_categories["Pages using deprecated source tags"] = {
description =
"Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.",
breadcrumb = "Deprecated source tags",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
insert(raw_handlers, function(data)
local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$")
if not template_type then
return
end
local parents = { {
name = "Pages using invalid parameters when calling templates",
sort = template_type == "general use" and "*" or template_type,
} }
local lang = require("Module:languages").getByCanonicalName(template_type, nil, true)
if lang then
insert(parents, { name = "entry maintenance", is_label = true, lang = lang:getCode() })
end
return {
lang = lang and lang:getCode() or nil,
description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.",
parents = parents,
breadcrumb = template_type,
}
end)
do
local prefixes = require("Module:table").listToSet { "list", "P", "R", "RQ", "table", "U" }
local function add_parent(parents, seen, cat_type, sortkey)
if seen[cat_type] then
return
end
insert(parents, {
name = ("Pages using invalid parameters when calling %s templates"):format(cat_type),
sort = sortkey,
})
seen[cat_type] = true
end
insert(raw_handlers, function(data)
local template = data.category:match("^Pages using invalid parameters when calling (.+)$")
if not template then
return
end
-- Resolve any redirects.
template = new_title(template)
while template do
local redirect = template.redirectTarget
if not (redirect and is_internal_title(redirect)) then
break
end
template = redirect
end
-- Disallow templates which would always hidden maintennace categories (e.g. sandboxes).
if not (template and not uses_hidden_category(template)) then
return
end
local prefixed_text, lang = template.prefixedText
if template.namespace == 10 then
local name = template.text
-- Remove the prefix if present (e.g. "R:" or "RQ:").
local prefix, text = name:match("^(.-):(.+)")
if not (prefix and prefixes[prefix]) then
text = name
end
-- Check the initial language code, chopping off hyphenated sections until there's a match or they run out.
local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]")
while code do
lang = get_lang(code)
if lang then
break
end
code = code:match("(.+)%-%a*$")
end
-- If no match and it's a list: or table: template, check if the template name ends "/CODE".
if not lang and (prefix == "list" or prefix == "table") then
code = text:match("%f[^/]%l[%a-]*%a$")
if code then
lang = get_lang(code)
end
end
end
local sortkey = template.text
local parents, seen = {}, {}
-- Categorize as language-specific if a language was found.
if lang then
add_parent(parents, seen, lang:getCanonicalName(), sortkey)
end
-- Also grab any language categories from the template page.
for _, cat in ipairs(template.categories) do
if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then
local cat_lang = split_lang_label(new_title(cat).text)
if cat_lang then
add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey)
end
end
end
-- If none were found, categorize as general use.
if #parents == 0 then
add_parent(parents, seen, "general use", sortkey)
end
-- Only add can_be_empty if the template exists and contains checkparams.
local content, can_be_empty = template:getContent()
if content then
-- Check for {{#invoke:checkparams|warn|...}}.
-- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present.
for template in require("Module:template parser").find_templates(content) do
if template:get_name() == "#INVOKE:" then
local args = template:get_arguments()
local arg_2 = args[2]
if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then
can_be_empty = true
break
end
end
end
end
return {
canonical_name = "Pages using invalid parameters when calling " .. prefixed_text,
lang = lang and lang:getCode() or nil,
description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.")
:format(m_template_parser.getTemplateInvocationName(template)),
additional =
"These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.",
breadcrumb = prefixed_text,
parents = parents,
can_be_empty = can_be_empty,
hidden = true,
}
end)
end
return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers }
51rzihsgnuzv4q36f8761jp7s9swfc3
Mòideal:category tree/wiktionary users
828
17744
88429
2026-04-15T09:16:48Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/wiktionary users]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88429
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local concat = table.concat
local insert = table.insert
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local string_utilities_module = "Module:string utilities"
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary"] = {
description = "High level category for material about Wiktionary and its operation.",
parents = "Fundamental",
}
raw_categories["Wiktionary statistics"] = {
description = "Categories and pages containing statistics about how Wiktionary is used.",
parents = {"Wiktionary", sort = "Statistics"},
}
raw_categories["Wiktionary users"] = {
description = "Pages listing Wiktionarians according to their user rights and categories listing Wiktionarians according to their linguistic and coding abilities.",
breadcrumb = "Users",
additional = "For an automatically generated list of all users, see [[Special:ListUsers]].",
parents = {"Wiktionary", sort = "Users"},
}
raw_categories["Wikimedians banned by the WMF"] = {
description = "Users who have received a [[m:Global bans|global ban]] imposed by the [[m:Wikimedia Foundation|Wikimedia Foundation]], in accordance with the [[m:WMF Global Ban Policy|WMF Global Ban Policy]].",
breadcrumb = "Banned by the WMF",
parents = "Wiktionary users",
}
raw_categories["User languages"] = {
description = "Categories listing Wiktionarians according to their linguistic abilities.",
parents = {
"Wiktionary users",
"Category:Wiktionary multilingual issues",
},
}
raw_categories["User languages with invalid code"] = {
description = "Categories listing Wiktionarians according to their linguistic abilities, where the language code is invalid for Wiktionary.",
additional = "Most of these codes are valid ISO 639-3 codes but are invalid in Wiktionary for various reasons, " ..
"typically due to different choices made regarding splitting and merging languages.",
parents = {name = "User languages", sort = " "},
}
raw_categories["User scripts"] = {
description = "Categories listing Wiktionarians according to their abilities to read a given script.",
parents = {
"Wiktionary users",
"Category:Wiktionary multilingual issues",
},
}
raw_categories["User coders"] = {
description = "Categories listing Wiktionarians according to their coding abilities.",
parents = "Wiktionary users",
}
raw_categories["User families"] = {
description = "Categories listing Wiktionarians according to their knowledge about a given language family.",
parents = "Wiktionary users"
}
raw_categories["Pages with entries"] = {
description = "Pages which contain language entries.",
additional = "The subcategories within this category are used to determine the total number of entries on the English Wiktionary.",
parents = "Wiktionary",
can_be_empty = true,
hidden = true,
}
raw_categories["Redirects connected to a Wikidata item"] = {
description = "Redirect pages which are connected to a [[d:|Wikidata]] item.",
additional = "These are rarely needed, but are occasionally useful following a page merger, where other wikis may still separate the two.",
parents = "Wiktionary statistics",
can_be_empty = true,
hidden = true,
}
raw_categories["Unsupported titles"] = {
description = "Pages with titles that are not supported by the MediaWiki software.",
additional = "For an explanation of the reasons why certain titles are not supported, see [[Appendix:Unsupported titles]].",
parents = "Wiktionary",
can_be_empty = true,
hidden = true,
}
-- Tracked according to [[phab:T347324]].
for ext, data in pairs {
["DynamicPageList"] = {"DynamicPageList (Wikimedia)", "T287380"},
["EasyTimeline"] = {"EasyTimeline", "T137291"},
["Graph"] = {"Graph", "T334940"},
["Kartographer"] = {"Kartographer"},
["Phonos"] = {"Phonos"},
["Score"] = {"Score"},
["WikiHiero"] = {"WikiHiero", "T344534"},
} do
local link, phab = unpack(data)
raw_categories["Pages using the " .. ext .. " extension"] = {
description = ("Pages which make use of the [[mw:Extension:%s|%s]] extension."):format(link, ext),
additional = phab and ("See [[phab:%s|%s]] on Phabricator for background information on why this extension is tracked."):format(phab, phab) or nil,
breadcrumb = ("Using the %s extension"):format(ext),
parents = "Wiktionary statistics",
can_be_empty = true,
hidden = true,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_level_params(data)
local speak_verb = "speak"
if data.typ == "lang" then
local is_sign_language = data.obj and data.obj:getFamilyCode() and data.obj:getFamilyCode():find("^sgn") or data.langfam:find("Sign Language$")
speak_verb = data.args.verb or is_sign_language and "communicate in" or "speak"
end
return {
["-"] = {
cssclass = "babel-3",
lang = "These users " .. speak_verb .. " !LANGFAM!.",
script = "These users read !SCRIPT!.",
coder = "These users know how to code in !LANGFAM!.",
family = "These users know !LANGFAM!.",
},
["1"] = {
cssclass = "babel-1",
lang = "These users " .. speak_verb .. " !LANGFAM! at a '''basic''' level.",
script = "These users can read !SCRIPT! at a '''basic''' level.",
coder = "These users know the '''basics''' of how to write !LANGFAM! code and make minor tweaks.",
family = "These users know the '''basics''' of contributing to !LANGFAM!.",
},
["2"] = {
cssclass = "babel-2",
lang = "These users " .. speak_verb .. " !LANGFAM! at an '''intermediate''' level.",
script = "These users can read !SCRIPT! at an '''intermediate''' level.",
coder = "These users have a '''fair command''' of !LANGFAM!, and can understand some scripts written by others.",
family = "These users are '''fairly familiar''' with !LANGFAM!.",
},
["3"] = {
cssclass = "babel-3",
lang = "These users " .. speak_verb .. " !LANGFAM! at an '''advanced''' level.",
script = "These users can read !SCRIPT! at an '''advanced''' level.",
coder = "These users can write '''more complex''' !LANGFAM! code, and can understand and modify most scripts written by others.",
family = "These users '''regularly''' contribute to !LANGFAM!.",
},
["4"] = {
cssclass = "babel-4",
lang = "These users " .. speak_verb .. " !LANGFAM! at a '''near-native''' level.",
script = "These users can read !SCRIPT! at a '''near native''' level.",
coder = "These users can write and understand '''very complex''' !LANGFAM! code.",
},
["5"] = {
cssclass = "babel-5",
lang = "These users " .. speak_verb .. " !LANGFAM! at a '''professional''' level.",
script = "These users can read !SCRIPT! at a '''professional''' level.",
coder = "These users can write and understand !LANGFAM! code at a '''professional''' level.",
},
["N"] = {
cssclass = "babel-N",
lang = "These users are '''native''' speakers of !LANGFAM!.",
script = "These users' '''native''' script is !SCRIPT!.",
},
}
end
local coder_links = {
Asm = "w:Assembly language",
Bash = "w:Bash (Unix shell)",
C = "w:C (programming language)",
["C++"] = "w:C++",
["C Sharp"] = {link = "w:C Sharp (programming language)", lang = "C#"},
CSS = "w:CSS",
Go = "w:Go (programming language)",
Haskell = "w:Haskell",
HTML = "w:HTML",
Java = "w:Java (programming language)",
JavaScript = "w:JavaScript",
Julia = "w:Julia (programming language)",
Kotlin = "w:Kotlin (programming language)",
Lisp = "w:Lisp (programming language)",
Lua = "Wiktionary:Scripting",
Perl = "w:Perl",
PHP = "w:PHP",
Python = "w:Python (programming language)",
regex = {link = "w:Regular expression", name = "regular expressions"},
Ruby = "w:Ruby (programming language)",
Rust = "w:Rust (programming language)",
Scala = "w:Scala (programming language)",
Scheme = "w:Scheme (programming language)",
SQL = "w:SQL",
template = {link = "Wiktionary:Templates", name = "wiki templates"},
TypeScript = "w:TypeScript",
VBScript = "w:VBScript",
}
local custom_script_links = {
IPA = "w:International Phonetic Alphabet",
UPA = "w:Uralic Phonetic Alphabet",
}
-- Generic implementation of competency handler for (natural) languages, scripts, families and "coders" (= programming languages).
local function competency_handler(data)
local category = data.category
local langtext = data.langtext
local typ = data.typ
local args = data.args
local code = data.code
local langfam = data.langfam
local langfamcat = data.langfamcat
local script = data.script
local scriptcat = data.scriptcat
local level = data.level
local parents = data.parents
local addl_parents = data.addl_parents
local topright = data.topright
local data_addl = data.additional
local inactive = data.inactive
local parts = {}
local function ins(txt)
insert(parts, txt)
end
local level_params = get_level_params(data)
local params = level_params[level or "-"]
if not params then
error(("Internal error: No params for for code '%s', level %s"):format(code, level or "-"))
end
local function insert_text()
if langtext then
ins(langtext)
ins("<hr />")
end
if not params[typ] then
error(("No English text for code '%s', type '%s', level %s"):format(code, typ, level or "-"))
end
local pattern, repl
if typ == "script" then
pattern = "!SCRIPT!"
repl = ("'''" .. scriptcat .. "'''"):format(script)
else
pattern = "!LANGFAM!"
repl = ("'''" .. langfamcat .. "'''"):format(langfam)
if script then
repl = repl .. (" written in '''" .. scriptcat .. "'''"):format(script)
end
end
ins(params[typ]:gsub(pattern, repl))
end
local additional = {}
if level then
insert(additional, ("To be included on this list, add {{tl|Babel|%s}} to your user page. Complete instructions are " ..
"available at [[Wiktionary:Babel]]."):format(level == "N" and code or ("%s-%s"):format(code, level)))
else
insert(additional, "To be included on this list, use {{tl|Babel}} on your user page. Complete instructions are " ..
"available at [[Wiktionary:Babel]].")
end
if inactive then
insert(additional, "'''NOTE:''' Users in this category have not been active on the English Wiktionary for at " ..
"least two years and have been moved into the 'inactive' state due to " ..
"[[Wiktionary:Votes/pl-2017-04/Removing inactive editors from user-proficiency categories]].")
parents = {{name = category, sort = " "}}
end
if addl_parents then
for _, addl_parent in ipairs(addl_parents) do
insert(parents, addl_parent)
end
end
if data_addl then
insert(additional, data_addl)
end
local babel_templatestyles = require("Module:TemplateStyles")("Template:Babel/style.css")
if level then
ins(('<div class="babel-box %s">'):format(params.cssclass))
ins('<table class="babel-content" style="width:238px"><tr>')
ins('<td class="babel-code" style="font-size:14pt">')
ins(("'''%s-%s'''</td>"):format(code, level))
ins('<td class="babel-text">')
insert_text()
ins('</td></tr></table></div><br clear="left">')
return {
description = concat(parts) .. babel_templatestyles,
additional = concat(additional, "\n\n"),
breadcrumb = inactive and "Inactive" or "Level " .. level,
parents = parents,
}, not not args
else
ins(('<div class="babel-box %s">\n'):format(params.cssclass))
ins('{| class="babel-content" style="width:260px;"\n')
ins('| class="babel-code" style="font-size:14pt;" | ')
ins(("'''%s'''\n"):format(code))
ins('| class="babel-text" style="text-align:center;" | ')
insert_text()
ins('\n|}</div><br clear="left">')
return {
topright = topright,
description = concat(parts) .. babel_templatestyles,
additional = concat(additional, "\n\n"),
breadcrumb = inactive and "Inactive" or lang,
parents = parents,
}, not not args
end
end
-- Guts of implementation of competency handlers for natural languages (full or etymology-only), possibly with a
-- script attached (e.g. [[Category:User ko-Kore]]).
local function handle_user_lang_maybe_script(data, category, inactive, code, sccode, level, args)
local lang = require("Module:languages").getByCode(code, nil, "allow etym")
local langname = args.langname
local sc, scriptname
if sccode then
sc = require("Module:scripts").getByCode(sccode)
scriptname = args.scriptname
end
local code_with_script = code .. (sccode and "-" .. sccode or "")
if not lang or sccode and not sc then
-- If unrecognized language and called from inside, we're handling the parents and breadcrumb for a
-- higher-level category, so at least return something.
if not level and data.called_from_inside then
return {
-- FIXME, scrape langname= category?
breadcrumb = {name = code_with_script, nocap = true},
parents = {name = lang and "User languages with invalid script code" or
"User languages with invalid code", sort = code_with_script}
}, true
end
if not langname then
-- Check if the code matches a Wikimedia language (e.g. "ku" for Kurdish). If it does, treat
-- its canonical name as though it had been given as langname=.
local wm_lang = require("Module:wikimedia languages").getByCode(code)
if not wm_lang then
mw.log(("Skipping category '%s' because lang code '%s' is unrecognized and langname= not given"):
format(data.category, code))
return
end
langname = wm_lang:getCanonicalName()
end
if sccode and not sc and not scriptname then
mw.log(("Skipping category '%s' because script code '%s' is unrecognized and scriptname= not given"):
format(data.category, sccode))
return
end
end
if not langname then
if not lang then
error("Internal error: Something went wrong, undefined lang= should have been caught above")
end
langname = lang:getCanonicalName()
end
if not scriptname and sccode then
if not sc then
error("Internal error: Something went wrong, undefined sc= should have been caught above")
end
-- Use `getCategoryName` not `getCanonicalName` to display 'Foo script' than just 'Foo', as so many scripts
-- are the same as language names, and otherwise we get nonsensical output like "These users are native speakers
-- of Korean written in Korean".
scriptname = sc:getCategoryName()
end
-- Insert text, appropriately script-tagged, unless already script-tagged (we check for '<span'), in which case we
-- insert it directly. Also handle <<...>> and <<<...>>> in text and convert to bolded link to parent category.
local function wrap(txt)
if not txt then
return
end
if sccode then
-- Substitute <<<...>>> (where ... is supposed to be the native rendering of the script) with a link to the
-- top-level 'User SCRIPT' category (e.g. [[:Category:User Kore]] if we're in a sublevel category, or to the
-- top-level script category (e.g. [[:Category:Korean script]]) if we're in a top-level 'User CODE-SCRIPT'
-- category.
txt = txt:gsub("<<<(.-)>>>", function(inside)
if level then
return ("'''[[:Category:User %s|%s]]'''"):format(sccode, inside)
elseif sc then
return ("'''[[:Category:%s|%s]]'''"):format(sc:getCategoryName(), inside)
else
return ("'''%s'''"):format(inside)
end
end)
end
-- Substitute <<...>> (where ... is supposed to be the native rendering of the language) with a link to the
-- top-level 'User CODE' category (e.g. [[:Category:User fr]] or [[:Category:User fr-CA]]) if we're in a
-- sublevel category, or to the top-level language category (e.g. [[:Category:French language]] or
-- [[:Category:Canadian English]]) if we're in a top-level 'User CODE' category.
txt = txt:gsub("<<(.-)>>", function(inside)
if level then
return ("'''[[:Category:User %s|%s]]'''"):format(code, inside)
elseif lang then
return ("'''[[:Category:%s|%s]]'''"):format(lang:getCategoryName(), inside)
else
return ("'''%s'''"):format(inside)
end
end)
if txt:find("<span") or not lang then
return txt
else
return require("Module:script utilities").tag_text(txt, lang, sc)
end
end
local function get_request_cats()
if args.text or code == "en" or code:find("^en%-") or inactive then
return
end
local num_pages = mw.site.stats.pagesInCategory(data.category, "pages")
local count_cat, count_sort
if num_pages == 0 then
count_cat = "Requests for translations in user-competency categories with 0 users"
count_sort = "*" .. code_with_script
elseif num_pages == 1 then
count_cat = "Requests for translations in user-competency categories with 1 user"
count_sort = "*" .. code_with_script
else
local lowernum, uppernum
lowernum = 2
while true do
uppernum = lowernum * 2 - 1
if num_pages <= uppernum then
break
end
lowernum = lowernum * 2
end
count_cat = ("Requests for translations in user-competency categories with %s-%s users"):format(
lowernum, uppernum)
count_sort = "*" .. ("%0" .. #(tostring(uppernum)) .. "d"):format(num_pages)
end
local addl_parents = {}
insert(addl_parents, {
name = "Requests for translations in user-competency categories by language",
sort = code_with_script,
})
insert(addl_parents, {
name = count_cat,
sort = count_sort,
})
return addl_parents
end
local invalid_lang_warning
if not lang then
invalid_lang_warning = "'''WARNING''': The specified language code is invalid on Wiktionary. Please migrate " ..
"all competency ratings to the closest valid code."
end
local parents
if level then
parents = {("User %s"):format(code_with_script), sort = level}
elseif sccode then
parents = {}
insert(parents, {name = ("User %s"):format(code), sort = sccode})
insert(parents, {name = ("User %s"):format(sccode), sort = code})
elseif lang then
parents = {}
if lang:hasType("etymology-only") then
local full_code = lang:getFullCode()
local sort_key = code:gsub(("^%s%%-"):format(require(string_utilities_module).pattern_escape(full_code)),
"")
insert(parents, {name = ("User %s"):format(full_code), sort = sort_key})
else
insert(parents, {name = "User languages", sort = code})
end
insert(parents, {name = lang:getCategoryName(), sort = "user"})
else
parents = {"User languages with invalid code", sort = code}
end
local addl_parents = get_request_cats()
local topright
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
topright = ("{{commonscat|%s}}"):format(commonscat)
end
end
local langcat
if level then
langcat = ("[[:Category:User %s|%%s]]"):format(code)
elseif lang then
langcat = ("[[:Category:%s|%%s]]"):format(lang:getCategoryName())
else
langcat = "[[%s]]"
end
local scriptcat
if sccode then
if level then
scriptcat = ("[[:Category:User %s|%%s]]"):format(sccode)
elseif sc then
scriptcat = ("[[:Category:%s|%%s]]"):format(sc:getCategoryName())
else
scriptcat = "[[%s]]"
end
end
return competency_handler {
category = category,
inactive = inactive,
langtext = wrap(args.text),
typ = "lang",
args = args,
obj = lang,
code = code_with_script,
langfam = langname,
langfamcat = langcat,
script = scriptname,
scriptcat = scriptcat,
level = level,
parents = parents,
addl_parents = addl_parents,
topright = topright,
additional = invalid_lang_warning,
}
end
-- Hander for categories named [[Category:User LANG-SCRIPT]] or [[Category:User LANG-SCRIPT-#]] where # is a
-- competency level (0 through 5 or N), e.g. [[Category:zh-Hans]] or [[Category:yue-Hant-N]]. It's a bit tricky because
-- of the multitude of language formats, e.g. ko-KP is a language code (etym variety) but ko-Kore is a combination
-- lang + script code. We depend on the fact that all script codes are currently of the form Xxxx or Xxxxx, and check
-- for that first. We also need to run prior to the lang-only handler (next handler) so it doesn't try to interpret
-- the script code as an etym variant code.
--
-- Note that there are current categories named things like 'zh-Hant-TW' and 'zh-Hant-HK-3', which we don't support.
-- They should be renamed to some supported code, e.g. 'cmn-TW-Hant' and 'yue-HK-Hant-3'.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, sccode, level = category:match("^User ([a-z][a-z][a-z]?)%-([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code, sccode, level =
category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
end
if not code then
code, sccode = category:match("^User ([a-z][a-z][a-z]?)%-([A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
code, sccode = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
return
end
local args = require("Module:parameters").process(data.args, {
text = true,
verb = true,
langname = true,
scriptname = true,
scname = {alias_of = "scriptname"},
commonscat = true,
})
return handle_user_lang_maybe_script(data, category, inactive, code, sccode, level, args)
end)
-- Hander for categories named [[Category:User LANG]] e.g. [[Category:User en]], [[Category:User en-US]],
-- [[Category:User ine-pro]] or [[Category:User LANG-#]] where # is a competency level (0 through 5 or N) e.g.
-- [[Category:User en-N]] or [[Category:User ndl-nl-1]].
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level = category:match("^User ([a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code, level = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([0-5N])$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?)$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)$")
end
if not code then
return
end
local args = require("Module:parameters").process(data.args, {
text = true,
verb = true,
langname = true,
commonscat = true,
})
return handle_user_lang_maybe_script(data, category, inactive, code, nil, level, args)
end)
-- Handler for scripts.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level = category:match("^User ([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code = category:match("^User ([A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
code, level = category:match("^User ([a-z][a-z][a-z]?%-[A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?%-[A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
return
end
local sc = require("Module:scripts").getByCode(code)
if not sc then
return
end
local parents
if level then
parents = {("User %s"):format(code), sort = level}
else
parents = {
{name = "User scripts", sort = code},
{name = sc:getCategoryName(), sort = "user"},
}
end
local scriptcat
-- Better to display 'Foo script' than just 'Foo', as so many scripts are the same as language names.
if level then
scriptcat = ("[[:Category:User %s|%s]]"):format(code, sc:getCategoryName())
else
scriptcat = ("[[:Category:%s|%s]]"):format(sc:getCategoryName(), sc:getCategoryName())
end
return competency_handler {
category = category,
inactive = inactive,
typ = "script",
obj = sc,
code = code,
script = sc:getCanonicalName(),
scriptcat = scriptcat,
level = level,
parents = parents,
}
end)
-- Handler for "custom" scripts (e.g. IPA).
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level
if not code then
code, level = category:match("^User ([A-Za-z-]+)%-([0-5N])$")
end
if not code then
code = category:match("^User ([A-Za-z-]+)$")
end
if not code or not custom_script_links[code] then
return
end
local parents
if level then
parents = {("User %s"):format(code), sort = level}
else
parents = {"User scripts", sort = code}
end
local scriptdata = custom_script_links[code]
if type(scriptdata) == "string" then
scriptdata = {link = scriptdata}
end
local scriptcat = ("[[%s|%%s]]"):format(scriptdata.link)
return competency_handler {
category = category,
inactive = inactive,
typ = "script",
code = code,
script = scriptdata.script or code,
scriptcat = scriptcat,
level = level,
parents = parents,
}
end)
-- Handler for programming languages.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level
if not code then
code, level = category:match("^User ([A-Za-z+-]+) coder%-([0-5N])$")
end
if not code then
code = category:match("^User ([A-Za-z+-]+) coder$")
end
if not code or not coder_links[code] then
return
end
local parents
if level then
parents = {("User %s coder"):format(code), sort = level}
else
parents = {"User coders", sort = code}
end
local langdata = coder_links[code]
if type(langdata) == "string" then
langdata = {link = langdata}
end
local langcat = ("[[%s|%%s]]"):format(langdata.link)
return competency_handler {
category = category,
inactive = inactive,
typ = "coder",
code = code,
langfam = langdata.lang or code,
langfamcat = langcat,
level = level,
parents = parents,
}
end)
-- Handler for language families.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level = category:match("^User ([a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code, level = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([0-5N])$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?)$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)$")
end
if not code then
return
end
local fam = require("Module:families").getByCode(code)
if not fam then
return
end
local parents
if level then
parents = {("User %s"):format(code), sort = level}
else
parents = {
{name = "User families", sort = code},
{name = fam:getCategoryName(), sort = "user"},
}
end
local famcat
if level then
famcat = ("[[:Category:User %s|%s]]"):format(code, fam:getCategoryName())
else
famcat = ("[[:Category:%s|%s]]"):format(fam:getCategoryName(), fam:getCategoryName())
end
return competency_handler {
category = category,
inactive = inactive,
typ = "family",
obj = fam,
code = code,
langfam = fam:getCanonicalName(),
langfamcat = famcat,
level = level,
parents = parents,
}
end)
insert(raw_handlers, function(data)
local n, suffix = data.category:match("^Pages with (%d+) entr(.+)$")
-- Only match if there are no leading zeroes and the suffix is correct.
if not (n and not n:match("^0%d") and suffix == (n == "1" and "y" or "ies")) then
return
end
return {
breadcrumb = ("%d entr%s"):format(n, suffix),
description = ("Pages which contain %s language entr%s."):format(n, suffix),
additional = "This category, and others like it, are used to determine the total number of entries on the English Wiktionary",
hidden = true,
can_be_empty = true,
parents = {
{name = "Pages with entries", sort = require("Module:category tree").numeral_sortkey(n)},
n == "0" and "Wiktionary maintenance" or nil, -- "Pages with 0 entries" only contains pages with something wrong.
},
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
sr3xn1jzvghqmzhqu4ug8w02d5mr32j
88430
88429
2026-07-27T00:19:34Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/wiktionary_users]]
88429
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local concat = table.concat
local insert = table.insert
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local string_utilities_module = "Module:string utilities"
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary"] = {
description = "High level category for material about Wiktionary and its operation.",
parents = "Fundamental",
}
raw_categories["Wiktionary statistics"] = {
description = "Categories and pages containing statistics about how Wiktionary is used.",
parents = {"Wiktionary", sort = "Statistics"},
}
raw_categories["Wiktionary users"] = {
description = "Pages listing Wiktionarians according to their user rights and categories listing Wiktionarians according to their linguistic and coding abilities.",
breadcrumb = "Users",
additional = "For an automatically generated list of all users, see [[Special:ListUsers]].",
parents = {"Wiktionary", sort = "Users"},
}
raw_categories["Wikimedians banned by the WMF"] = {
description = "Users who have received a [[m:Global bans|global ban]] imposed by the [[m:Wikimedia Foundation|Wikimedia Foundation]], in accordance with the [[m:WMF Global Ban Policy|WMF Global Ban Policy]].",
breadcrumb = "Banned by the WMF",
parents = "Wiktionary users",
}
raw_categories["User languages"] = {
description = "Categories listing Wiktionarians according to their linguistic abilities.",
parents = {
"Wiktionary users",
"Category:Wiktionary multilingual issues",
},
}
raw_categories["User languages with invalid code"] = {
description = "Categories listing Wiktionarians according to their linguistic abilities, where the language code is invalid for Wiktionary.",
additional = "Most of these codes are valid ISO 639-3 codes but are invalid in Wiktionary for various reasons, " ..
"typically due to different choices made regarding splitting and merging languages.",
parents = {name = "User languages", sort = " "},
}
raw_categories["User scripts"] = {
description = "Categories listing Wiktionarians according to their abilities to read a given script.",
parents = {
"Wiktionary users",
"Category:Wiktionary multilingual issues",
},
}
raw_categories["User coders"] = {
description = "Categories listing Wiktionarians according to their coding abilities.",
parents = "Wiktionary users",
}
raw_categories["User families"] = {
description = "Categories listing Wiktionarians according to their knowledge about a given language family.",
parents = "Wiktionary users"
}
raw_categories["Pages with entries"] = {
description = "Pages which contain language entries.",
additional = "The subcategories within this category are used to determine the total number of entries on the English Wiktionary.",
parents = "Wiktionary",
can_be_empty = true,
hidden = true,
}
raw_categories["Redirects connected to a Wikidata item"] = {
description = "Redirect pages which are connected to a [[d:|Wikidata]] item.",
additional = "These are rarely needed, but are occasionally useful following a page merger, where other wikis may still separate the two.",
parents = "Wiktionary statistics",
can_be_empty = true,
hidden = true,
}
raw_categories["Unsupported titles"] = {
description = "Pages with titles that are not supported by the MediaWiki software.",
additional = "For an explanation of the reasons why certain titles are not supported, see [[Appendix:Unsupported titles]].",
parents = "Wiktionary",
can_be_empty = true,
hidden = true,
}
-- Tracked according to [[phab:T347324]].
for ext, data in pairs {
["DynamicPageList"] = {"DynamicPageList (Wikimedia)", "T287380"},
["EasyTimeline"] = {"EasyTimeline", "T137291"},
["Graph"] = {"Graph", "T334940"},
["Kartographer"] = {"Kartographer"},
["Phonos"] = {"Phonos"},
["Score"] = {"Score"},
["WikiHiero"] = {"WikiHiero", "T344534"},
} do
local link, phab = unpack(data)
raw_categories["Pages using the " .. ext .. " extension"] = {
description = ("Pages which make use of the [[mw:Extension:%s|%s]] extension."):format(link, ext),
additional = phab and ("See [[phab:%s|%s]] on Phabricator for background information on why this extension is tracked."):format(phab, phab) or nil,
breadcrumb = ("Using the %s extension"):format(ext),
parents = "Wiktionary statistics",
can_be_empty = true,
hidden = true,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_level_params(data)
local speak_verb = "speak"
if data.typ == "lang" then
local is_sign_language = data.obj and data.obj:getFamilyCode() and data.obj:getFamilyCode():find("^sgn") or data.langfam:find("Sign Language$")
speak_verb = data.args.verb or is_sign_language and "communicate in" or "speak"
end
return {
["-"] = {
cssclass = "babel-3",
lang = "These users " .. speak_verb .. " !LANGFAM!.",
script = "These users read !SCRIPT!.",
coder = "These users know how to code in !LANGFAM!.",
family = "These users know !LANGFAM!.",
},
["1"] = {
cssclass = "babel-1",
lang = "These users " .. speak_verb .. " !LANGFAM! at a '''basic''' level.",
script = "These users can read !SCRIPT! at a '''basic''' level.",
coder = "These users know the '''basics''' of how to write !LANGFAM! code and make minor tweaks.",
family = "These users know the '''basics''' of contributing to !LANGFAM!.",
},
["2"] = {
cssclass = "babel-2",
lang = "These users " .. speak_verb .. " !LANGFAM! at an '''intermediate''' level.",
script = "These users can read !SCRIPT! at an '''intermediate''' level.",
coder = "These users have a '''fair command''' of !LANGFAM!, and can understand some scripts written by others.",
family = "These users are '''fairly familiar''' with !LANGFAM!.",
},
["3"] = {
cssclass = "babel-3",
lang = "These users " .. speak_verb .. " !LANGFAM! at an '''advanced''' level.",
script = "These users can read !SCRIPT! at an '''advanced''' level.",
coder = "These users can write '''more complex''' !LANGFAM! code, and can understand and modify most scripts written by others.",
family = "These users '''regularly''' contribute to !LANGFAM!.",
},
["4"] = {
cssclass = "babel-4",
lang = "These users " .. speak_verb .. " !LANGFAM! at a '''near-native''' level.",
script = "These users can read !SCRIPT! at a '''near native''' level.",
coder = "These users can write and understand '''very complex''' !LANGFAM! code.",
},
["5"] = {
cssclass = "babel-5",
lang = "These users " .. speak_verb .. " !LANGFAM! at a '''professional''' level.",
script = "These users can read !SCRIPT! at a '''professional''' level.",
coder = "These users can write and understand !LANGFAM! code at a '''professional''' level.",
},
["N"] = {
cssclass = "babel-N",
lang = "These users are '''native''' speakers of !LANGFAM!.",
script = "These users' '''native''' script is !SCRIPT!.",
},
}
end
local coder_links = {
Asm = "w:Assembly language",
Bash = "w:Bash (Unix shell)",
C = "w:C (programming language)",
["C++"] = "w:C++",
["C Sharp"] = {link = "w:C Sharp (programming language)", lang = "C#"},
CSS = "w:CSS",
Go = "w:Go (programming language)",
Haskell = "w:Haskell",
HTML = "w:HTML",
Java = "w:Java (programming language)",
JavaScript = "w:JavaScript",
Julia = "w:Julia (programming language)",
Kotlin = "w:Kotlin (programming language)",
Lisp = "w:Lisp (programming language)",
Lua = "Wiktionary:Scripting",
Perl = "w:Perl",
PHP = "w:PHP",
Python = "w:Python (programming language)",
regex = {link = "w:Regular expression", name = "regular expressions"},
Ruby = "w:Ruby (programming language)",
Rust = "w:Rust (programming language)",
Scala = "w:Scala (programming language)",
Scheme = "w:Scheme (programming language)",
SQL = "w:SQL",
template = {link = "Wiktionary:Templates", name = "wiki templates"},
TypeScript = "w:TypeScript",
VBScript = "w:VBScript",
}
local custom_script_links = {
IPA = "w:International Phonetic Alphabet",
UPA = "w:Uralic Phonetic Alphabet",
}
-- Generic implementation of competency handler for (natural) languages, scripts, families and "coders" (= programming languages).
local function competency_handler(data)
local category = data.category
local langtext = data.langtext
local typ = data.typ
local args = data.args
local code = data.code
local langfam = data.langfam
local langfamcat = data.langfamcat
local script = data.script
local scriptcat = data.scriptcat
local level = data.level
local parents = data.parents
local addl_parents = data.addl_parents
local topright = data.topright
local data_addl = data.additional
local inactive = data.inactive
local parts = {}
local function ins(txt)
insert(parts, txt)
end
local level_params = get_level_params(data)
local params = level_params[level or "-"]
if not params then
error(("Internal error: No params for for code '%s', level %s"):format(code, level or "-"))
end
local function insert_text()
if langtext then
ins(langtext)
ins("<hr />")
end
if not params[typ] then
error(("No English text for code '%s', type '%s', level %s"):format(code, typ, level or "-"))
end
local pattern, repl
if typ == "script" then
pattern = "!SCRIPT!"
repl = ("'''" .. scriptcat .. "'''"):format(script)
else
pattern = "!LANGFAM!"
repl = ("'''" .. langfamcat .. "'''"):format(langfam)
if script then
repl = repl .. (" written in '''" .. scriptcat .. "'''"):format(script)
end
end
ins(params[typ]:gsub(pattern, repl))
end
local additional = {}
if level then
insert(additional, ("To be included on this list, add {{tl|Babel|%s}} to your user page. Complete instructions are " ..
"available at [[Wiktionary:Babel]]."):format(level == "N" and code or ("%s-%s"):format(code, level)))
else
insert(additional, "To be included on this list, use {{tl|Babel}} on your user page. Complete instructions are " ..
"available at [[Wiktionary:Babel]].")
end
if inactive then
insert(additional, "'''NOTE:''' Users in this category have not been active on the English Wiktionary for at " ..
"least two years and have been moved into the 'inactive' state due to " ..
"[[Wiktionary:Votes/pl-2017-04/Removing inactive editors from user-proficiency categories]].")
parents = {{name = category, sort = " "}}
end
if addl_parents then
for _, addl_parent in ipairs(addl_parents) do
insert(parents, addl_parent)
end
end
if data_addl then
insert(additional, data_addl)
end
local babel_templatestyles = require("Module:TemplateStyles")("Template:Babel/style.css")
if level then
ins(('<div class="babel-box %s">'):format(params.cssclass))
ins('<table class="babel-content" style="width:238px"><tr>')
ins('<td class="babel-code" style="font-size:14pt">')
ins(("'''%s-%s'''</td>"):format(code, level))
ins('<td class="babel-text">')
insert_text()
ins('</td></tr></table></div><br clear="left">')
return {
description = concat(parts) .. babel_templatestyles,
additional = concat(additional, "\n\n"),
breadcrumb = inactive and "Inactive" or "Level " .. level,
parents = parents,
}, not not args
else
ins(('<div class="babel-box %s">\n'):format(params.cssclass))
ins('{| class="babel-content" style="width:260px;"\n')
ins('| class="babel-code" style="font-size:14pt;" | ')
ins(("'''%s'''\n"):format(code))
ins('| class="babel-text" style="text-align:center;" | ')
insert_text()
ins('\n|}</div><br clear="left">')
return {
topright = topright,
description = concat(parts) .. babel_templatestyles,
additional = concat(additional, "\n\n"),
breadcrumb = inactive and "Inactive" or lang,
parents = parents,
}, not not args
end
end
-- Guts of implementation of competency handlers for natural languages (full or etymology-only), possibly with a
-- script attached (e.g. [[Category:User ko-Kore]]).
local function handle_user_lang_maybe_script(data, category, inactive, code, sccode, level, args)
local lang = require("Module:languages").getByCode(code, nil, "allow etym")
local langname = args.langname
local sc, scriptname
if sccode then
sc = require("Module:scripts").getByCode(sccode)
scriptname = args.scriptname
end
local code_with_script = code .. (sccode and "-" .. sccode or "")
if not lang or sccode and not sc then
-- If unrecognized language and called from inside, we're handling the parents and breadcrumb for a
-- higher-level category, so at least return something.
if not level and data.called_from_inside then
return {
-- FIXME, scrape langname= category?
breadcrumb = {name = code_with_script, nocap = true},
parents = {name = lang and "User languages with invalid script code" or
"User languages with invalid code", sort = code_with_script}
}, true
end
if not langname then
-- Check if the code matches a Wikimedia language (e.g. "ku" for Kurdish). If it does, treat
-- its canonical name as though it had been given as langname=.
local wm_lang = require("Module:wikimedia languages").getByCode(code)
if not wm_lang then
mw.log(("Skipping category '%s' because lang code '%s' is unrecognized and langname= not given"):
format(data.category, code))
return
end
langname = wm_lang:getCanonicalName()
end
if sccode and not sc and not scriptname then
mw.log(("Skipping category '%s' because script code '%s' is unrecognized and scriptname= not given"):
format(data.category, sccode))
return
end
end
if not langname then
if not lang then
error("Internal error: Something went wrong, undefined lang= should have been caught above")
end
langname = lang:getCanonicalName()
end
if not scriptname and sccode then
if not sc then
error("Internal error: Something went wrong, undefined sc= should have been caught above")
end
-- Use `getCategoryName` not `getCanonicalName` to display 'Foo script' than just 'Foo', as so many scripts
-- are the same as language names, and otherwise we get nonsensical output like "These users are native speakers
-- of Korean written in Korean".
scriptname = sc:getCategoryName()
end
-- Insert text, appropriately script-tagged, unless already script-tagged (we check for '<span'), in which case we
-- insert it directly. Also handle <<...>> and <<<...>>> in text and convert to bolded link to parent category.
local function wrap(txt)
if not txt then
return
end
if sccode then
-- Substitute <<<...>>> (where ... is supposed to be the native rendering of the script) with a link to the
-- top-level 'User SCRIPT' category (e.g. [[:Category:User Kore]] if we're in a sublevel category, or to the
-- top-level script category (e.g. [[:Category:Korean script]]) if we're in a top-level 'User CODE-SCRIPT'
-- category.
txt = txt:gsub("<<<(.-)>>>", function(inside)
if level then
return ("'''[[:Category:User %s|%s]]'''"):format(sccode, inside)
elseif sc then
return ("'''[[:Category:%s|%s]]'''"):format(sc:getCategoryName(), inside)
else
return ("'''%s'''"):format(inside)
end
end)
end
-- Substitute <<...>> (where ... is supposed to be the native rendering of the language) with a link to the
-- top-level 'User CODE' category (e.g. [[:Category:User fr]] or [[:Category:User fr-CA]]) if we're in a
-- sublevel category, or to the top-level language category (e.g. [[:Category:French language]] or
-- [[:Category:Canadian English]]) if we're in a top-level 'User CODE' category.
txt = txt:gsub("<<(.-)>>", function(inside)
if level then
return ("'''[[:Category:User %s|%s]]'''"):format(code, inside)
elseif lang then
return ("'''[[:Category:%s|%s]]'''"):format(lang:getCategoryName(), inside)
else
return ("'''%s'''"):format(inside)
end
end)
if txt:find("<span") or not lang then
return txt
else
return require("Module:script utilities").tag_text(txt, lang, sc)
end
end
local function get_request_cats()
if args.text or code == "en" or code:find("^en%-") or inactive then
return
end
local num_pages = mw.site.stats.pagesInCategory(data.category, "pages")
local count_cat, count_sort
if num_pages == 0 then
count_cat = "Requests for translations in user-competency categories with 0 users"
count_sort = "*" .. code_with_script
elseif num_pages == 1 then
count_cat = "Requests for translations in user-competency categories with 1 user"
count_sort = "*" .. code_with_script
else
local lowernum, uppernum
lowernum = 2
while true do
uppernum = lowernum * 2 - 1
if num_pages <= uppernum then
break
end
lowernum = lowernum * 2
end
count_cat = ("Requests for translations in user-competency categories with %s-%s users"):format(
lowernum, uppernum)
count_sort = "*" .. ("%0" .. #(tostring(uppernum)) .. "d"):format(num_pages)
end
local addl_parents = {}
insert(addl_parents, {
name = "Requests for translations in user-competency categories by language",
sort = code_with_script,
})
insert(addl_parents, {
name = count_cat,
sort = count_sort,
})
return addl_parents
end
local invalid_lang_warning
if not lang then
invalid_lang_warning = "'''WARNING''': The specified language code is invalid on Wiktionary. Please migrate " ..
"all competency ratings to the closest valid code."
end
local parents
if level then
parents = {("User %s"):format(code_with_script), sort = level}
elseif sccode then
parents = {}
insert(parents, {name = ("User %s"):format(code), sort = sccode})
insert(parents, {name = ("User %s"):format(sccode), sort = code})
elseif lang then
parents = {}
if lang:hasType("etymology-only") then
local full_code = lang:getFullCode()
local sort_key = code:gsub(("^%s%%-"):format(require(string_utilities_module).pattern_escape(full_code)),
"")
insert(parents, {name = ("User %s"):format(full_code), sort = sort_key})
else
insert(parents, {name = "User languages", sort = code})
end
insert(parents, {name = lang:getCategoryName(), sort = "user"})
else
parents = {"User languages with invalid code", sort = code}
end
local addl_parents = get_request_cats()
local topright
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
topright = ("{{commonscat|%s}}"):format(commonscat)
end
end
local langcat
if level then
langcat = ("[[:Category:User %s|%%s]]"):format(code)
elseif lang then
langcat = ("[[:Category:%s|%%s]]"):format(lang:getCategoryName())
else
langcat = "[[%s]]"
end
local scriptcat
if sccode then
if level then
scriptcat = ("[[:Category:User %s|%%s]]"):format(sccode)
elseif sc then
scriptcat = ("[[:Category:%s|%%s]]"):format(sc:getCategoryName())
else
scriptcat = "[[%s]]"
end
end
return competency_handler {
category = category,
inactive = inactive,
langtext = wrap(args.text),
typ = "lang",
args = args,
obj = lang,
code = code_with_script,
langfam = langname,
langfamcat = langcat,
script = scriptname,
scriptcat = scriptcat,
level = level,
parents = parents,
addl_parents = addl_parents,
topright = topright,
additional = invalid_lang_warning,
}
end
-- Hander for categories named [[Category:User LANG-SCRIPT]] or [[Category:User LANG-SCRIPT-#]] where # is a
-- competency level (0 through 5 or N), e.g. [[Category:zh-Hans]] or [[Category:yue-Hant-N]]. It's a bit tricky because
-- of the multitude of language formats, e.g. ko-KP is a language code (etym variety) but ko-Kore is a combination
-- lang + script code. We depend on the fact that all script codes are currently of the form Xxxx or Xxxxx, and check
-- for that first. We also need to run prior to the lang-only handler (next handler) so it doesn't try to interpret
-- the script code as an etym variant code.
--
-- Note that there are current categories named things like 'zh-Hant-TW' and 'zh-Hant-HK-3', which we don't support.
-- They should be renamed to some supported code, e.g. 'cmn-TW-Hant' and 'yue-HK-Hant-3'.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, sccode, level = category:match("^User ([a-z][a-z][a-z]?)%-([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code, sccode, level =
category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
end
if not code then
code, sccode = category:match("^User ([a-z][a-z][a-z]?)%-([A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
code, sccode = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
return
end
local args = require("Module:parameters").process(data.args, {
text = true,
verb = true,
langname = true,
scriptname = true,
scname = {alias_of = "scriptname"},
commonscat = true,
})
return handle_user_lang_maybe_script(data, category, inactive, code, sccode, level, args)
end)
-- Hander for categories named [[Category:User LANG]] e.g. [[Category:User en]], [[Category:User en-US]],
-- [[Category:User ine-pro]] or [[Category:User LANG-#]] where # is a competency level (0 through 5 or N) e.g.
-- [[Category:User en-N]] or [[Category:User ndl-nl-1]].
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level = category:match("^User ([a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code, level = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([0-5N])$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?)$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)$")
end
if not code then
return
end
local args = require("Module:parameters").process(data.args, {
text = true,
verb = true,
langname = true,
commonscat = true,
})
return handle_user_lang_maybe_script(data, category, inactive, code, nil, level, args)
end)
-- Handler for scripts.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level = category:match("^User ([A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code = category:match("^User ([A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
code, level = category:match("^User ([a-z][a-z][a-z]?%-[A-Z][a-z][a-z][a-z][a-z]?)%-([0-5N])$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?%-[A-Z][a-z][a-z][a-z][a-z]?)$")
end
if not code then
return
end
local sc = require("Module:scripts").getByCode(code)
if not sc then
return
end
local parents
if level then
parents = {("User %s"):format(code), sort = level}
else
parents = {
{name = "User scripts", sort = code},
{name = sc:getCategoryName(), sort = "user"},
}
end
local scriptcat
-- Better to display 'Foo script' than just 'Foo', as so many scripts are the same as language names.
if level then
scriptcat = ("[[:Category:User %s|%s]]"):format(code, sc:getCategoryName())
else
scriptcat = ("[[:Category:%s|%s]]"):format(sc:getCategoryName(), sc:getCategoryName())
end
return competency_handler {
category = category,
inactive = inactive,
typ = "script",
obj = sc,
code = code,
script = sc:getCanonicalName(),
scriptcat = scriptcat,
level = level,
parents = parents,
}
end)
-- Handler for "custom" scripts (e.g. IPA).
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level
if not code then
code, level = category:match("^User ([A-Za-z-]+)%-([0-5N])$")
end
if not code then
code = category:match("^User ([A-Za-z-]+)$")
end
if not code or not custom_script_links[code] then
return
end
local parents
if level then
parents = {("User %s"):format(code), sort = level}
else
parents = {"User scripts", sort = code}
end
local scriptdata = custom_script_links[code]
if type(scriptdata) == "string" then
scriptdata = {link = scriptdata}
end
local scriptcat = ("[[%s|%%s]]"):format(scriptdata.link)
return competency_handler {
category = category,
inactive = inactive,
typ = "script",
code = code,
script = scriptdata.script or code,
scriptcat = scriptcat,
level = level,
parents = parents,
}
end)
-- Handler for programming languages.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level
if not code then
code, level = category:match("^User ([A-Za-z+-]+) coder%-([0-5N])$")
end
if not code then
code = category:match("^User ([A-Za-z+-]+) coder$")
end
if not code or not coder_links[code] then
return
end
local parents
if level then
parents = {("User %s coder"):format(code), sort = level}
else
parents = {"User coders", sort = code}
end
local langdata = coder_links[code]
if type(langdata) == "string" then
langdata = {link = langdata}
end
local langcat = ("[[%s|%%s]]"):format(langdata.link)
return competency_handler {
category = category,
inactive = inactive,
typ = "coder",
code = code,
langfam = langdata.lang or code,
langfamcat = langcat,
level = level,
parents = parents,
}
end)
-- Handler for language families.
insert(raw_handlers, function(data)
local category, inactive = data.category:match("^(.*) (%(inactive%))$")
category = category or data.category
local code, level = category:match("^User ([a-z][a-z][a-z]?)%-([0-5N])$")
if not code then
code, level = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)%-([0-5N])$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?)$")
end
if not code then
code = category:match("^User ([a-z][a-z][a-z]?%-[a-zA-Z-]+)$")
end
if not code then
return
end
local fam = require("Module:families").getByCode(code)
if not fam then
return
end
local parents
if level then
parents = {("User %s"):format(code), sort = level}
else
parents = {
{name = "User families", sort = code},
{name = fam:getCategoryName(), sort = "user"},
}
end
local famcat
if level then
famcat = ("[[:Category:User %s|%s]]"):format(code, fam:getCategoryName())
else
famcat = ("[[:Category:%s|%s]]"):format(fam:getCategoryName(), fam:getCategoryName())
end
return competency_handler {
category = category,
inactive = inactive,
typ = "family",
obj = fam,
code = code,
langfam = fam:getCanonicalName(),
langfamcat = famcat,
level = level,
parents = parents,
}
end)
insert(raw_handlers, function(data)
local n, suffix = data.category:match("^Pages with (%d+) entr(.+)$")
-- Only match if there are no leading zeroes and the suffix is correct.
if not (n and not n:match("^0%d") and suffix == (n == "1" and "y" or "ies")) then
return
end
return {
breadcrumb = ("%d entr%s"):format(n, suffix),
description = ("Pages which contain %s language entr%s."):format(n, suffix),
additional = "This category, and others like it, are used to determine the total number of entries on the English Wiktionary",
hidden = true,
can_be_empty = true,
parents = {
{name = "Pages with entries", sort = require("Module:category tree").numeral_sortkey(n)},
n == "0" and "Wiktionary maintenance" or nil, -- "Pages with 0 entries" only contains pages with something wrong.
},
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
sr3xn1jzvghqmzhqu4ug8w02d5mr32j
Mòideal:category tree/wiktionary votes
828
17745
88431
2026-06-06T09:30:49Z
en>Surjection
0
Protected "[[Module:category tree/wiktionary votes]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88431
Scribunto
text/plain
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary votes"] = {
preceding = "{{also|Wiktionary:Votes}}",
description = "This category is for votes.",
breadcrumb = "Votes",
parents = "Wiktionary",
}
raw_categories["Closed votes"] = {
preceding = "{{also|WT:Votes|WT:Votes/Timeline}}",
description = "This category contains votes that are no longer active. They are kept for reference and should not be modified.",
parents = "Wiktionary votes",
}
raw_categories["Closed votes that failed"] = {
description = "Closed votes that failed.",
parents = {{name = "Closed votes", sort = "failed"}},
can_be_empty = true,
}
raw_categories["Closed votes that had no consensus"] = {
description = "Closed votes that had no consensus.",
parents = {{name = "Closed votes", sort = "had no consensus"}},
can_be_empty = true,
}
raw_categories["Closed votes that passed"] = {
description = "Closed votes that passed.",
parents = {{name = "Closed votes", sort = "passed"}},
can_be_empty = true,
}
raw_categories["Closed votes that were suspended"] = {
description = "Closed votes that were suspended.",
parents = {{name = "Closed votes", sort = "were suspended"}},
can_be_empty = true,
}
raw_categories["Votes that have not been closed"] = {
description = "This category is intended for votes that have not been started, concluded, or withdrawn.",
additional = "The category is included automatically upon creation of a new vote, as coded in the preloaded templates. It may be removed from the decision section at the time that such decision is made.",
parents = {{name = "Wiktionary votes", sort = "not been closed"}},
can_be_empty = true,
}
raw_categories["Votes that have not been opened"] = {
description = "This category contains proposed votes. Votes that are still being reread and corrected and are not ready to face editors' approval.",
parents = {{name = "Wiktionary votes", sort = "not been opened"}},
can_be_empty = true,
}
return { RAW_CATEGORIES = raw_categories }
ov64pfijzcgz73dqnu1v1j8eju1by4z
88432
88431
2026-07-27T00:19:41Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/wiktionary_votes]]
88431
Scribunto
text/plain
local raw_categories = {}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary votes"] = {
preceding = "{{also|Wiktionary:Votes}}",
description = "This category is for votes.",
breadcrumb = "Votes",
parents = "Wiktionary",
}
raw_categories["Closed votes"] = {
preceding = "{{also|WT:Votes|WT:Votes/Timeline}}",
description = "This category contains votes that are no longer active. They are kept for reference and should not be modified.",
parents = "Wiktionary votes",
}
raw_categories["Closed votes that failed"] = {
description = "Closed votes that failed.",
parents = {{name = "Closed votes", sort = "failed"}},
can_be_empty = true,
}
raw_categories["Closed votes that had no consensus"] = {
description = "Closed votes that had no consensus.",
parents = {{name = "Closed votes", sort = "had no consensus"}},
can_be_empty = true,
}
raw_categories["Closed votes that passed"] = {
description = "Closed votes that passed.",
parents = {{name = "Closed votes", sort = "passed"}},
can_be_empty = true,
}
raw_categories["Closed votes that were suspended"] = {
description = "Closed votes that were suspended.",
parents = {{name = "Closed votes", sort = "were suspended"}},
can_be_empty = true,
}
raw_categories["Votes that have not been closed"] = {
description = "This category is intended for votes that have not been started, concluded, or withdrawn.",
additional = "The category is included automatically upon creation of a new vote, as coded in the preloaded templates. It may be removed from the decision section at the time that such decision is made.",
parents = {{name = "Wiktionary votes", sort = "not been closed"}},
can_be_empty = true,
}
raw_categories["Votes that have not been opened"] = {
description = "This category contains proposed votes. Votes that are still being reread and corrected and are not ready to face editors' approval.",
parents = {{name = "Wiktionary votes", sort = "not been opened"}},
can_be_empty = true,
}
return { RAW_CATEGORIES = raw_categories }
ov64pfijzcgz73dqnu1v1j8eju1by4z
Mòideal:category tree/word of the day
828
17746
88433
2026-04-15T09:16:49Z
en>Surjection
0
Changed protection settings for "[[Module:category tree/word of the day]]": Highly visible template/module ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88433
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Words of the day"] = {
description = "This is a grouping category to weed out [[WT:WOTD|WOTD]] entries from the Wiktionary: namespace, in particular, for [[WT:RP]].",
parents = "Category:Wiktionary tracking categories",
}
raw_categories["Word of the day archive"] = {
description = "Entries previously selected as [[WT:WOD|word of the day]].",
parents = "Words of the day",
breadcrumb = "English",
hidden = true,
}
raw_categories["Foreign word of the day archive"] = {
description = "Entries previously selected as [[WT:FW|foreign word of the day]].",
parents = "Words of the day",
breadcrumb = "foreign",
hidden = true,
}
raw_categories["Foreign words of the day by language"] = {
description = "Categories with foreign words of day in various languages.",
additional = "{{{umbrella_msg}}}",
parents = "Foreign word of the day archive",
breadcrumb = "by language",
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- WOTD by year and month
insert(raw_handlers, function(data)
local year, month = data.category:match("^Word of the day archive/(%d+)/(%w+)$")
if not year then
year = data.category:match("^Word of the day archive/(%d+)$")
if not year then
return
end
return {
breadcrumb = year,
description = "Words of the day from " .. year .. ".",
parents = {
{name = "Word of the day archive", sort = year},
},
hidden = true,
}
else
return {
breadcrumb = month,
description = "Words of the day from " .. month .. " of " .. year .. ".",
parents = {
{name = "Word of the day archive/" .. year, sort = month},
},
hidden = true,
}
end
end)
-- FWOTD by year and month
insert(raw_handlers, function(data)
local year, month = data.category:match("^Foreign word of the day archive/(%d+)/(%w+)$")
if not year then
year = data.category:match("^Foreign word of the day archive/(%d+)$")
if not year then
return
end
return {
breadcrumb = year,
description = "Foreign words of the day from " .. year .. ".",
parents = {
{name = "Foreign word of the day archive", sort = year},
},
hidden = true,
}
else
return {
breadcrumb = month,
description = "Foreign words of the day from " .. month .. " of " .. year .. ".",
parents = {
{name = "Foreign word of the day archive/" .. year, sort = month},
},
hidden = true,
}
end
end)
-- FWOTD by language and year
insert(raw_handlers, function(data)
local langname, year = data.category:match("^Foreign words of the day in ([^/]+)/(%d+)$")
if not langname then
langname = data.category:match("^Foreign words of the day in ([^/]+)$")
end
if not (langname and langname ~= "English") then
return
end
local lang = require("Module:languages").getByCanonicalName(langname, true)
local parents
local description
local breadcrumb
if year then
description = "Foreign words of the day in " .. lang:makeCategoryLink() .. " from " .. year .. "."
parents = {
{name = "Foreign words of the day in " .. langname, sort = year},
{name = "Foreign word of the day archive/" .. year, sort = langname},
}
breadcrumb = year
else
description = "Foreign words of the day in " .. lang:makeCategoryLink() .. "."
parents = {
{name = "Foreign words of the day by language", sort = langname},
lang:getCategoryName(),
}
breadcrumb = langname
end
return {
lang = lang:getCode(),
description = description,
parents = parents,
breadcrumb = breadcrumb,
hidden = true,
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
s2gp837sksf3ei13lvmkq7meqqti5m9
88434
88433
2026-07-27T00:19:52Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/word_of_the_day]]
88433
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Words of the day"] = {
description = "This is a grouping category to weed out [[WT:WOTD|WOTD]] entries from the Wiktionary: namespace, in particular, for [[WT:RP]].",
parents = "Category:Wiktionary tracking categories",
}
raw_categories["Word of the day archive"] = {
description = "Entries previously selected as [[WT:WOD|word of the day]].",
parents = "Words of the day",
breadcrumb = "English",
hidden = true,
}
raw_categories["Foreign word of the day archive"] = {
description = "Entries previously selected as [[WT:FW|foreign word of the day]].",
parents = "Words of the day",
breadcrumb = "foreign",
hidden = true,
}
raw_categories["Foreign words of the day by language"] = {
description = "Categories with foreign words of day in various languages.",
additional = "{{{umbrella_msg}}}",
parents = "Foreign word of the day archive",
breadcrumb = "by language",
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- WOTD by year and month
insert(raw_handlers, function(data)
local year, month = data.category:match("^Word of the day archive/(%d+)/(%w+)$")
if not year then
year = data.category:match("^Word of the day archive/(%d+)$")
if not year then
return
end
return {
breadcrumb = year,
description = "Words of the day from " .. year .. ".",
parents = {
{name = "Word of the day archive", sort = year},
},
hidden = true,
}
else
return {
breadcrumb = month,
description = "Words of the day from " .. month .. " of " .. year .. ".",
parents = {
{name = "Word of the day archive/" .. year, sort = month},
},
hidden = true,
}
end
end)
-- FWOTD by year and month
insert(raw_handlers, function(data)
local year, month = data.category:match("^Foreign word of the day archive/(%d+)/(%w+)$")
if not year then
year = data.category:match("^Foreign word of the day archive/(%d+)$")
if not year then
return
end
return {
breadcrumb = year,
description = "Foreign words of the day from " .. year .. ".",
parents = {
{name = "Foreign word of the day archive", sort = year},
},
hidden = true,
}
else
return {
breadcrumb = month,
description = "Foreign words of the day from " .. month .. " of " .. year .. ".",
parents = {
{name = "Foreign word of the day archive/" .. year, sort = month},
},
hidden = true,
}
end
end)
-- FWOTD by language and year
insert(raw_handlers, function(data)
local langname, year = data.category:match("^Foreign words of the day in ([^/]+)/(%d+)$")
if not langname then
langname = data.category:match("^Foreign words of the day in ([^/]+)$")
end
if not (langname and langname ~= "English") then
return
end
local lang = require("Module:languages").getByCanonicalName(langname, true)
local parents
local description
local breadcrumb
if year then
description = "Foreign words of the day in " .. lang:makeCategoryLink() .. " from " .. year .. "."
parents = {
{name = "Foreign words of the day in " .. langname, sort = year},
{name = "Foreign word of the day archive/" .. year, sort = langname},
}
breadcrumb = year
else
description = "Foreign words of the day in " .. lang:makeCategoryLink() .. "."
parents = {
{name = "Foreign words of the day by language", sort = langname},
lang:getCategoryName(),
}
breadcrumb = langname
end
return {
lang = lang:getCode(),
description = description,
parents = parents,
breadcrumb = breadcrumb,
hidden = true,
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
s2gp837sksf3ei13lvmkq7meqqti5m9
Mòideal:category tree/topic/data
828
17747
88435
2025-12-12T03:06:56Z
en>WingerBot
0
use mw.loadData("Module:headword/data").pagename in place of directly fetching pagename using mw.title.getCurrentTitle().text or .subpageText to properly support mammoth (split) pages and unsupported titles (manually assisted)
88435
Scribunto
text/plain
local labels = {}
local handlers = {}
local top_level_data_module = "Module:category tree/topic/data"
local data_module_prefix = "Module:category tree/topic/"
local subpages = {
"Body",
"Buildings and structures",
"Communication",
"Culture",
"Religion",
"Food and drink",
"Games",
"History",
"Human",
"People",
"Lifeforms",
"Animals",
"Plants",
"Miscellaneous",
"Music",
"Names",
"Places",
"Nature",
"Numbers",
"Philosophy",
"Sciences",
"Mathematics",
"Sex",
"Society",
"Sports",
"Technology",
"Thesaurus",
"Time",
"Transport",
"Physical actions",
}
labels["all topics"] = {
type = "toplevel",
description = "{{{langname}}} terms organized by topic, such as \"Family\", \"Chemistry\", \"Planets\", \"Canids\" or \"Cities in France\".",
topic = "listing of all topics",
parents = {{name = "{{{langcat}}}", nontopic = true}},
}
for _, typ in ipairs { "related-to", "set", "type", "name", "grouping" } do
labels["list of " .. typ .. " categories"] = {
type = "toplevel",
description = "All " .. typ .. " categories currently available in {{{langname}}}.",
parents = {{name = "all topics", sort = " *"}},
}
end
labels["list of mixed categories"] = {
type = "toplevel",
description = "All categories currently available in {{{langname}}} that belong to more than one type.",
parents = {{name = "all topics", sort = " *"}},
}
for label, data in pairs(labels) do
data.module = top_level_data_module
end
-- Don't throw error on every single category, but on a subset of them, especially the top-level ones.
local function should_throw_error()
local title = mw.title.getCurrentTitle().text -- Don't replace with mw.loadData("Module:headword/data").pagename; we're in Category space
return title:find("List of") or title:find("All ") or title:find(" lemmas")
end
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = data_module_prefix .. subpage
local retval = require(datamodule)
if not retval["LABELS"] then
retval = {LABELS = retval}
end
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
-- Avoid throwing an error on every single topic category and any other invoking category that calls the
-- topic code.
if should_throw_error() then
error("Label " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. labels[label].module .. "]].")
end
end
data.module = datamodule
labels[label] = data
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
end
return {LABELS = labels, HANDLERS = handlers}
mtt459joq952a4h967itezsx4jv9b1i
88436
88435
2026-07-27T00:20:02Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/data]]
88435
Scribunto
text/plain
local labels = {}
local handlers = {}
local top_level_data_module = "Module:category tree/topic/data"
local data_module_prefix = "Module:category tree/topic/"
local subpages = {
"Body",
"Buildings and structures",
"Communication",
"Culture",
"Religion",
"Food and drink",
"Games",
"History",
"Human",
"People",
"Lifeforms",
"Animals",
"Plants",
"Miscellaneous",
"Music",
"Names",
"Places",
"Nature",
"Numbers",
"Philosophy",
"Sciences",
"Mathematics",
"Sex",
"Society",
"Sports",
"Technology",
"Thesaurus",
"Time",
"Transport",
"Physical actions",
}
labels["all topics"] = {
type = "toplevel",
description = "{{{langname}}} terms organized by topic, such as \"Family\", \"Chemistry\", \"Planets\", \"Canids\" or \"Cities in France\".",
topic = "listing of all topics",
parents = {{name = "{{{langcat}}}", nontopic = true}},
}
for _, typ in ipairs { "related-to", "set", "type", "name", "grouping" } do
labels["list of " .. typ .. " categories"] = {
type = "toplevel",
description = "All " .. typ .. " categories currently available in {{{langname}}}.",
parents = {{name = "all topics", sort = " *"}},
}
end
labels["list of mixed categories"] = {
type = "toplevel",
description = "All categories currently available in {{{langname}}} that belong to more than one type.",
parents = {{name = "all topics", sort = " *"}},
}
for label, data in pairs(labels) do
data.module = top_level_data_module
end
-- Don't throw error on every single category, but on a subset of them, especially the top-level ones.
local function should_throw_error()
local title = mw.title.getCurrentTitle().text -- Don't replace with mw.loadData("Module:headword/data").pagename; we're in Category space
return title:find("List of") or title:find("All ") or title:find(" lemmas")
end
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = data_module_prefix .. subpage
local retval = require(datamodule)
if not retval["LABELS"] then
retval = {LABELS = retval}
end
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
-- Avoid throwing an error on every single topic category and any other invoking category that calls the
-- topic code.
if should_throw_error() then
error("Label " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. labels[label].module .. "]].")
end
end
data.module = datamodule
labels[label] = data
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
end
return {LABELS = labels, HANDLERS = handlers}
mtt459joq952a4h967itezsx4jv9b1i
Mòideal:category tree/topic/Body
828
17748
88437
2026-07-23T19:35:54Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88437
Scribunto
text/plain
local labels = {}
labels["body"] = {
type = "related-to",
description = "=the [[body]] and its parts",
parents = {"all topics"}, -- This should not go in "anatomy", which is for terms used in the *study* of the body
}
labels["abortion"] = {
type = "related-to",
description = "=[[abortion]] of a pregnancy",
parents = {"pregnancy"},
}
labels["age"] = {
type = "related-to",
parents = {"human", "time"},
}
labels["amoebozoal diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["amputation"] = {
type = "related-to,type", -- FIXME: Split into 'amputation' and 'amputations'
parents = {"disability", "surgery"},
}
labels["anger"] = {
type = "related-to",
parents = {"emotions"},
}
labels["animal body parts"] = {
type = "set",
description = "=[[body part]]s of [[animal]]s besides [[human]]s",
parents = {"body parts", "animals"},
}
labels["animal tissues"] = {
type = "set",
description = "=[[tissue]]s (groups of similar [[cell]]s that function together to do a specific job) in [[animal]]s, including [[human]]s",
parents = {"tissues"},
}
labels["appearance"] = {
type = "related-to",
parents = {"perception"},
}
labels["arms"] = {
type = "related-to",
parents = {"body parts"},
}
labels["bacterial diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["bathing"] = {
type = "related-to",
parents = {"hygiene", "cleaning"},
}
labels["beards"] = {
type = "type,related-to",
parents = {"face", "fashion", "hair"},
}
labels["biomolecules"] = {
type = "set",
description = "=[[biomolecule]]s: organic compounds that are present in and used by organisms",
parents = {"body parts", "organic compounds", "biochemistry"},
}
labels["blindness"] = {
type = "related-to",
parents = {"disability", "eye"},
}
labels["blood"] = {
type = "related-to",
parents = {"bodily fluids"},
}
labels["bodily fluids"] = {
type = "set",
description = "=[[fluid]]s ([[liquid]]s) of the body",
parents = {"body", "liquids"},
}
labels["bodily functions"] = {
type = "set",
description = "=[[function]]s and [[process]]es of the [[human]] or [[animal]] [[body]]",
parents = {"body"},
}
labels["body parts"] = {
type = "set",
description = "=parts of the [[body]] of any [[lifeform]], both macroscopic and microscopic",
parents = {"body"}, -- This should not go in "anatomy", which is for terms used in the *study* of the body
}
labels["bones"] = {
type = "set",
description = "=the [[bone]]s of the [[body]]",
parents = {"skeleton"},
}
labels["brain"] = {
type = "related-to",
parents = {"body parts"},
}
labels["brain regions"] = {
type = "set",
parents = {"body parts", "brain"},
}
labels["breasts"] = {
type = "related-to",
parents = {"chest", "female"},
}
labels["buttocks"] = {
type = "related-to",
parents = {"body parts"},
}
labels["castration"] = {
type = "related-to",
parents = {"genitalia", "male", "surgery"},
}
labels["chest"] = {
type = "related-to",
parents = {"body parts"},
}
labels["circulatory system"] = {
type = "related-to",
description = "=the {{w|circulatory system}}",
parents = {"organ systems", "blood"},
}
labels["circumcision"] = {
type = "related-to",
parents = {"genitalia", "surgery"},
}
labels["coccidial diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["coronaviruses"] = {
type = "related-to",
parents = {"viral diseases"},
}
labels["types of coronaviruses"] = {
type = "type",
topic = "coronaviruses",
breadcrumb = "types",
description = "=[[coronavirus]]es",
parents = {"coronaviruses"},
}
labels["COVID-19"] = {
type = "related-to",
parents = {"coronaviruses"},
}
labels["courage"] = {
type = "related-to",
parents = {"emotions", "virtue"},
}
labels["cranial nerves"] = {
type = "set",
description = "=[[nerve]]s found in the [[cranium]]",
parents = {"nerves"},
}
labels["deafness"] = {
type = "related-to",
parents = {"disability", "hearing"},
}
labels["death"] = {
type = "related-to",
parents = {"life", "body"},
}
labels["dental hygiene"] = {
type = "related-to",
parents = {"hygiene", "teeth"},
}
labels["disability"] = {
type = "related-to",
description = "=[[disability]] and its social implications",
parents = {"health", "society"},
}
labels["disease"] = {
type = "related-to",
parents = {"health"},
}
labels["diseases"] = {
type = "set",
description = "=[[disease]]s, [[symptom]]s, or [[abnormality|abnormalities]] of human [[pathology]], [[physiology]] or [[psychology]]",
parents = {"disease"},
}
labels["dreams"] = {
type = "related-to",
parents = {"sleep"},
}
labels["eggs"] = {
type = "set",
parents = {"reproduction", "birds", "foods"},
}
labels["emotions"] = {
type = "related-to",
parents = {"mind"},
}
labels["eye"] = {
type = "related-to",
description = "=[[eye]]s",
parents = {"face", "vision"},
}
labels["face"] = {
type = "related-to",
description = "default with the",
parents = {"head and neck"},
}
labels["fear"] = {
type = "related-to",
parents = {"emotions"},
}
labels["feathers"] = {
type = "related-to",
parents = {"animal body parts", "birds"},
}
labels["feces"] = {
type = "related-to",
description = "default no singularize",
parents = {"body", "toilet (room)"},
}
labels["foot"] = { -- FIXME: "feet", not "foot"
type = "related-to",
parents = {"legs"},
}
labels["female"] = {
type = "related-to",
description = "=the [[female]] sex or gender",
parents = {"gender"},
}
labels["female genitalia"] = {
type = "related-to",
description = "=the [[female]] [[genitalia]]",
parents = {"genitalia", "female"},
}
labels["fingers"] = {
type = "related-to",
parents = {"hand"},
}
labels["terms for fingers"] = {
type = "set",
topic = "fingers",
description = "=[[finger]]s",
parents = {"fingers"},
}
labels["fungal diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["gaits"] = {
type = "set",
parents = {"body"},
}
labels["gender"] = {
type = "related-to",
description = "=[[sex]] and [[gender]]",
additional = "See [[:Category:Sex]] for terms related to sexual intercourse and sexuality.",
parents = {"biology", "psychology", "sociology"},
}
labels["genetic disorders"] = {
type = "set",
parents = {"diseases", "medical genetics"},
}
labels["genitalia"] = {
type = "set",
description = "=[[sex organ]]s, both [[external]] and [[internal]]",
parents = {"body parts", "reproduction", "sex"}, -- This should not go in "anatomy", which is for terms used in the *study* of the body
}
labels["hair"] = {
type = "related-to",
parents = {"body parts"},
}
labels["hand"] = { -- FIXME: "hands", not "hand"
type = "related-to",
parents = {"arms"},
}
labels["happiness"] = {
type = "related-to",
parents = {"emotions"},
}
labels["hatred"] = {
type = "related-to",
parents = {"emotions"},
}
labels["head and neck"] = {
type = "related-to",
parents = {"body parts"},
}
labels["health"] = {
type = "related-to",
parents = {"body"},
}
labels["healthcare"] = {
type = "related-to",
parents = {"health"},
}
labels["hearing"] = {
type = "related-to",
parents = {"senses"},
}
labels["helminthic diseases"] = {
type = "set",
description = "=[[disease]]s caused by [[parasitic]] worms",
parents = {"infestations"},
}
labels["HIV/AIDS"] = {
type = "related-to",
description = "=[[HIV]] and [[AIDS]]",
parents = {"viral diseases", "sexually transmitted diseases"},
}
labels["hormones"] = {
type = "set",
parents = {"biomolecules"},
}
labels["horse gaits"] = {
type = "set",
parents = {"gaits"},
}
labels["humiliation"] = {
type = "related-to",
parents = {"emotions", "abuse"},
}
labels["hygiene"] = {
type = "related-to",
parents = {"health"},
}
labels["perception"] = {
type = "related-to",
parents = {"body"},
}
labels["infestations"] = {
type = "set",
description = "=[[disease]]s where [[macroscopic]] [[organism]]s are living on or in the host",
parents = {"diseases"},
}
labels["insect-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by [[insect]]s",
parents = {"vector-borne diseases"},
}
labels["intersex"] = {
type = "related-to",
description = "=''[[intersex]]''",
parents = {"gender", "LGBTQ"},
}
labels["injuries"] = {
type = "set",
parents = {"health"},
}
labels["jealousy"] = {
type = "related-to",
parents = {"emotions"},
}
labels["legs"] = {
type = "related-to",
parents = {"body parts"},
}
labels["leprosy"] = {
type = "related-to",
parents = {"bacterial diseases"},
}
labels["limbs"] = {
type = "set",
parents = {"body parts"},
}
labels["lipids"] = {
type = "set",
parents = {"biomolecules"},
}
labels["love"] = {
type = "related-to",
parents = {"emotions", "virtue"},
}
labels["male"] = {
type = "related-to",
description = "=the [[male]] sex or gender",
parents = {"gender"},
}
labels["male genitalia"] = {
type = "related-to",
description = "=the [[male]] [[genitalia]]",
parents = {"genitalia", "male"},
}
labels["medical signs and symptoms"] = {
type = "set",
parents = {"health", "medicine"},
}
labels["memory"] = {
type = "related-to",
parents = {"mind"},
}
labels["menstruation"] = {
type = "related-to",
parents = {"body", "gynaecology"},
}
labels["mental health"] = {
type = "related-to",
parents = {"health", "society"},
}
labels["metabolism"] = {
type = "related-to",
parents = {"body"},
}
labels["mind"] = {
type = "related-to",
description = "default with the",
parents = {"human"},
}
labels["mobility aids"] = {
type = "related-to",
parents = {"disability"},
}
labels["mosquito-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by [[mosquito]]es",
parents = {"insect-borne diseases", "mosquitoes"},
}
labels["motion sickness"] = {
type = "related-to",
parents = {"diseases"},
}
labels["mouth"] = {
type = "related-to",
description = "default with the",
parents = {"face"},
}
labels["muscles"] = {
type = "set",
parents = {"body parts"},
}
labels["muteness"] = {
type = "related-to",
parents = {"disability", "talking"},
}
labels["nerves"] = {
type = "set",
description = "=[[nerve]]s found in the body",
parents = {"body parts"},
}
labels["neurotransmitters"] = {
type = "name,related-to",
description = "=known [[neurotransmitter]]s",
parents = {"biomolecules"},
}
labels["non-binary"] = {
type = "related-to",
description = "=[[non-binary]] [[gender identity|gender identities]]",
parents = {"gender", "transgender"},
}
labels["nostalgia"] = {
type = "related-to",
parents = {"emotions", "history", "memory"},
}
labels["nutrition"] = {
type = "related-to",
parents = {"health"},
}
labels["obesity"] = {
type = "related-to",
parents = {"health"},
}
labels["optical illusions"] = {
type = "name",
parents = {"vision"},
}
labels["organs"] = {
type = "set",
description = "=[[organ]]s of the [[body]]",
parents = {"body parts"},
}
labels["organ systems"] = {
type = "set",
parents = {"body parts", "systems"},
}
labels["pain"] = {
type = "related-to",
parents = {"perception", "medical signs and symptoms"},
}
labels["personality"] = {
type = "related-to",
parents = {"mind"},
}
labels["philias"] = {
type = "set",
parents = {"love"},
}
labels["phobias"] = {
type = "set",
parents = {"fear"},
}
labels["plant diseases"] = {
type = "set",
parents = {"diseases", "phytopathology"},
}
labels["plant tissues"] = {
type = "set",
description = "=[[plant]] [[tissue]]s (groups of similar [[cell]]s that function together to do a specific job)",
parents = {"tissues"},
}
labels["pregnancy"] = {
type = "related-to",
parents = {"body", "gynaecology"},
}
labels["pride"] = {
type = "related-to",
parents = {"emotions"},
}
labels["proteins"] = {
type = "set",
parents = {"biomolecules"},
}
labels["reproduction"] = {
type = "related-to",
parents = {"life"},
}
labels["rest"] = {
type = "related-to",
parents = {"body"},
}
labels["sadness"] = {
type = "related-to",
parents = {"emotions"},
}
labels["sauna"] = {
type = "related-to",
parents = {"bathing"},
}
labels["scents"] = {
type = "name",
parents = {"smell"},
}
labels["senses"] = {
type = "set,related-to",
description = "=the [[physical]] [[senses]]",
parents = {"perception"},
}
labels["sexually transmitted diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["sitting"] = {
type = "related-to",
parents = {"body"},
}
labels["skeleton"] = {
type = "related-to",
description = "default with the",
parents = {"body parts"},
}
labels["skin"] = {
type = "related-to",
parents = {"body parts"},
}
labels["sleep"] = {
type = "related-to",
parents = {"body"},
}
labels["smell"] = {
type = "related-to",
description = "=the [[sense]] of [[smell]]",
parents = {"senses"},
}
labels["sneeze"] = {
type = "related-to",
parents = {"bodily functions", "reflexes", "medical signs and symptoms"},
}
labels["suicide"] = {
type = "related-to",
parents = {"death"},
}
labels["syndromes"] = {
type = "set",
parents = {"health", "pathology"},
}
labels["taste"] = {
type = "related-to",
parents = {"senses", "eating", "drinking", "food and drink"},
}
labels["teeth"] = {
type = "related-to",
description = "=[[tooth|teeth]]",
parents = {"mouth"},
}
labels["thinking"] = {
type = "related-to",
parents = {"mind"},
}
labels["tick-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by [[tick]]s",
parents = {"vector-borne diseases"},
}
labels["tissues"] = {
type = "related-to",
description = "=[[tissue]]s (groups of similar [[cell]]s that function together to do a specific job)",
parents = {"body parts"},
}
labels["toiletries"] = {
type = "set",
description = "=items used for [[grooming]] or [[personal hygiene]]",
additional = "For terms related to [[lavatory|lavatories]], use [[:Category:Toilet (room)]].",
parents = {"hygiene"},
}
labels["touch"] = {
type = "related-to",
parents = {"senses"},
}
labels["transgender"] = {
type = "related-to",
description = "=the ''[[transgender]]'' community in the broad sense of that term",
additional = "This includes terms related to the ''[[genderqueer]]'' community, i.e. transgender and transsexual people, and to [[transition]]ing from female to male or vice versa, as well as terms related to [[agender]], [[androgynous]] or [[third gender]] people.",
parents = {"gender", "LGBTQ"},
}
labels["trypanosomal diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["urine"] = {
type = "related-to",
parents = {"bodily fluids"},
}
labels["vector-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by other [[organism]]s",
parents = {"diseases"},
}
labels["veterinary diseases"] = {
description = "=[[diseases]] of [[animal#Noun|animals]]. To add entries to this category, specify {{temp|lb|{{{langcode}}}|veterinary disease}}",
parents = {"diseases", "veterinary medicine"},
}
labels["viral diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["vision"] = {
type = "related-to",
parents = {"senses"},
}
labels["vitamins"] = {
type = "set",
parents = {"biomolecules"},
}
labels["vomit"] = {
type = "related-to",
parents = {"bodily fluids"},
}
labels["womb"] = {
type = "related-to",
parents = {"organs", "reproduction"},
}
return labels
seaufarukhtdkb1gc4evh44pxjfy5r8
88438
88437
2026-07-27T00:20:09Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Body]]
88437
Scribunto
text/plain
local labels = {}
labels["body"] = {
type = "related-to",
description = "=the [[body]] and its parts",
parents = {"all topics"}, -- This should not go in "anatomy", which is for terms used in the *study* of the body
}
labels["abortion"] = {
type = "related-to",
description = "=[[abortion]] of a pregnancy",
parents = {"pregnancy"},
}
labels["age"] = {
type = "related-to",
parents = {"human", "time"},
}
labels["amoebozoal diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["amputation"] = {
type = "related-to,type", -- FIXME: Split into 'amputation' and 'amputations'
parents = {"disability", "surgery"},
}
labels["anger"] = {
type = "related-to",
parents = {"emotions"},
}
labels["animal body parts"] = {
type = "set",
description = "=[[body part]]s of [[animal]]s besides [[human]]s",
parents = {"body parts", "animals"},
}
labels["animal tissues"] = {
type = "set",
description = "=[[tissue]]s (groups of similar [[cell]]s that function together to do a specific job) in [[animal]]s, including [[human]]s",
parents = {"tissues"},
}
labels["appearance"] = {
type = "related-to",
parents = {"perception"},
}
labels["arms"] = {
type = "related-to",
parents = {"body parts"},
}
labels["bacterial diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["bathing"] = {
type = "related-to",
parents = {"hygiene", "cleaning"},
}
labels["beards"] = {
type = "type,related-to",
parents = {"face", "fashion", "hair"},
}
labels["biomolecules"] = {
type = "set",
description = "=[[biomolecule]]s: organic compounds that are present in and used by organisms",
parents = {"body parts", "organic compounds", "biochemistry"},
}
labels["blindness"] = {
type = "related-to",
parents = {"disability", "eye"},
}
labels["blood"] = {
type = "related-to",
parents = {"bodily fluids"},
}
labels["bodily fluids"] = {
type = "set",
description = "=[[fluid]]s ([[liquid]]s) of the body",
parents = {"body", "liquids"},
}
labels["bodily functions"] = {
type = "set",
description = "=[[function]]s and [[process]]es of the [[human]] or [[animal]] [[body]]",
parents = {"body"},
}
labels["body parts"] = {
type = "set",
description = "=parts of the [[body]] of any [[lifeform]], both macroscopic and microscopic",
parents = {"body"}, -- This should not go in "anatomy", which is for terms used in the *study* of the body
}
labels["bones"] = {
type = "set",
description = "=the [[bone]]s of the [[body]]",
parents = {"skeleton"},
}
labels["brain"] = {
type = "related-to",
parents = {"body parts"},
}
labels["brain regions"] = {
type = "set",
parents = {"body parts", "brain"},
}
labels["breasts"] = {
type = "related-to",
parents = {"chest", "female"},
}
labels["buttocks"] = {
type = "related-to",
parents = {"body parts"},
}
labels["castration"] = {
type = "related-to",
parents = {"genitalia", "male", "surgery"},
}
labels["chest"] = {
type = "related-to",
parents = {"body parts"},
}
labels["circulatory system"] = {
type = "related-to",
description = "=the {{w|circulatory system}}",
parents = {"organ systems", "blood"},
}
labels["circumcision"] = {
type = "related-to",
parents = {"genitalia", "surgery"},
}
labels["coccidial diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["coronaviruses"] = {
type = "related-to",
parents = {"viral diseases"},
}
labels["types of coronaviruses"] = {
type = "type",
topic = "coronaviruses",
breadcrumb = "types",
description = "=[[coronavirus]]es",
parents = {"coronaviruses"},
}
labels["COVID-19"] = {
type = "related-to",
parents = {"coronaviruses"},
}
labels["courage"] = {
type = "related-to",
parents = {"emotions", "virtue"},
}
labels["cranial nerves"] = {
type = "set",
description = "=[[nerve]]s found in the [[cranium]]",
parents = {"nerves"},
}
labels["deafness"] = {
type = "related-to",
parents = {"disability", "hearing"},
}
labels["death"] = {
type = "related-to",
parents = {"life", "body"},
}
labels["dental hygiene"] = {
type = "related-to",
parents = {"hygiene", "teeth"},
}
labels["disability"] = {
type = "related-to",
description = "=[[disability]] and its social implications",
parents = {"health", "society"},
}
labels["disease"] = {
type = "related-to",
parents = {"health"},
}
labels["diseases"] = {
type = "set",
description = "=[[disease]]s, [[symptom]]s, or [[abnormality|abnormalities]] of human [[pathology]], [[physiology]] or [[psychology]]",
parents = {"disease"},
}
labels["dreams"] = {
type = "related-to",
parents = {"sleep"},
}
labels["eggs"] = {
type = "set",
parents = {"reproduction", "birds", "foods"},
}
labels["emotions"] = {
type = "related-to",
parents = {"mind"},
}
labels["eye"] = {
type = "related-to",
description = "=[[eye]]s",
parents = {"face", "vision"},
}
labels["face"] = {
type = "related-to",
description = "default with the",
parents = {"head and neck"},
}
labels["fear"] = {
type = "related-to",
parents = {"emotions"},
}
labels["feathers"] = {
type = "related-to",
parents = {"animal body parts", "birds"},
}
labels["feces"] = {
type = "related-to",
description = "default no singularize",
parents = {"body", "toilet (room)"},
}
labels["foot"] = { -- FIXME: "feet", not "foot"
type = "related-to",
parents = {"legs"},
}
labels["female"] = {
type = "related-to",
description = "=the [[female]] sex or gender",
parents = {"gender"},
}
labels["female genitalia"] = {
type = "related-to",
description = "=the [[female]] [[genitalia]]",
parents = {"genitalia", "female"},
}
labels["fingers"] = {
type = "related-to",
parents = {"hand"},
}
labels["terms for fingers"] = {
type = "set",
topic = "fingers",
description = "=[[finger]]s",
parents = {"fingers"},
}
labels["fungal diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["gaits"] = {
type = "set",
parents = {"body"},
}
labels["gender"] = {
type = "related-to",
description = "=[[sex]] and [[gender]]",
additional = "See [[:Category:Sex]] for terms related to sexual intercourse and sexuality.",
parents = {"biology", "psychology", "sociology"},
}
labels["genetic disorders"] = {
type = "set",
parents = {"diseases", "medical genetics"},
}
labels["genitalia"] = {
type = "set",
description = "=[[sex organ]]s, both [[external]] and [[internal]]",
parents = {"body parts", "reproduction", "sex"}, -- This should not go in "anatomy", which is for terms used in the *study* of the body
}
labels["hair"] = {
type = "related-to",
parents = {"body parts"},
}
labels["hand"] = { -- FIXME: "hands", not "hand"
type = "related-to",
parents = {"arms"},
}
labels["happiness"] = {
type = "related-to",
parents = {"emotions"},
}
labels["hatred"] = {
type = "related-to",
parents = {"emotions"},
}
labels["head and neck"] = {
type = "related-to",
parents = {"body parts"},
}
labels["health"] = {
type = "related-to",
parents = {"body"},
}
labels["healthcare"] = {
type = "related-to",
parents = {"health"},
}
labels["hearing"] = {
type = "related-to",
parents = {"senses"},
}
labels["helminthic diseases"] = {
type = "set",
description = "=[[disease]]s caused by [[parasitic]] worms",
parents = {"infestations"},
}
labels["HIV/AIDS"] = {
type = "related-to",
description = "=[[HIV]] and [[AIDS]]",
parents = {"viral diseases", "sexually transmitted diseases"},
}
labels["hormones"] = {
type = "set",
parents = {"biomolecules"},
}
labels["horse gaits"] = {
type = "set",
parents = {"gaits"},
}
labels["humiliation"] = {
type = "related-to",
parents = {"emotions", "abuse"},
}
labels["hygiene"] = {
type = "related-to",
parents = {"health"},
}
labels["perception"] = {
type = "related-to",
parents = {"body"},
}
labels["infestations"] = {
type = "set",
description = "=[[disease]]s where [[macroscopic]] [[organism]]s are living on or in the host",
parents = {"diseases"},
}
labels["insect-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by [[insect]]s",
parents = {"vector-borne diseases"},
}
labels["intersex"] = {
type = "related-to",
description = "=''[[intersex]]''",
parents = {"gender", "LGBTQ"},
}
labels["injuries"] = {
type = "set",
parents = {"health"},
}
labels["jealousy"] = {
type = "related-to",
parents = {"emotions"},
}
labels["legs"] = {
type = "related-to",
parents = {"body parts"},
}
labels["leprosy"] = {
type = "related-to",
parents = {"bacterial diseases"},
}
labels["limbs"] = {
type = "set",
parents = {"body parts"},
}
labels["lipids"] = {
type = "set",
parents = {"biomolecules"},
}
labels["love"] = {
type = "related-to",
parents = {"emotions", "virtue"},
}
labels["male"] = {
type = "related-to",
description = "=the [[male]] sex or gender",
parents = {"gender"},
}
labels["male genitalia"] = {
type = "related-to",
description = "=the [[male]] [[genitalia]]",
parents = {"genitalia", "male"},
}
labels["medical signs and symptoms"] = {
type = "set",
parents = {"health", "medicine"},
}
labels["memory"] = {
type = "related-to",
parents = {"mind"},
}
labels["menstruation"] = {
type = "related-to",
parents = {"body", "gynaecology"},
}
labels["mental health"] = {
type = "related-to",
parents = {"health", "society"},
}
labels["metabolism"] = {
type = "related-to",
parents = {"body"},
}
labels["mind"] = {
type = "related-to",
description = "default with the",
parents = {"human"},
}
labels["mobility aids"] = {
type = "related-to",
parents = {"disability"},
}
labels["mosquito-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by [[mosquito]]es",
parents = {"insect-borne diseases", "mosquitoes"},
}
labels["motion sickness"] = {
type = "related-to",
parents = {"diseases"},
}
labels["mouth"] = {
type = "related-to",
description = "default with the",
parents = {"face"},
}
labels["muscles"] = {
type = "set",
parents = {"body parts"},
}
labels["muteness"] = {
type = "related-to",
parents = {"disability", "talking"},
}
labels["nerves"] = {
type = "set",
description = "=[[nerve]]s found in the body",
parents = {"body parts"},
}
labels["neurotransmitters"] = {
type = "name,related-to",
description = "=known [[neurotransmitter]]s",
parents = {"biomolecules"},
}
labels["non-binary"] = {
type = "related-to",
description = "=[[non-binary]] [[gender identity|gender identities]]",
parents = {"gender", "transgender"},
}
labels["nostalgia"] = {
type = "related-to",
parents = {"emotions", "history", "memory"},
}
labels["nutrition"] = {
type = "related-to",
parents = {"health"},
}
labels["obesity"] = {
type = "related-to",
parents = {"health"},
}
labels["optical illusions"] = {
type = "name",
parents = {"vision"},
}
labels["organs"] = {
type = "set",
description = "=[[organ]]s of the [[body]]",
parents = {"body parts"},
}
labels["organ systems"] = {
type = "set",
parents = {"body parts", "systems"},
}
labels["pain"] = {
type = "related-to",
parents = {"perception", "medical signs and symptoms"},
}
labels["personality"] = {
type = "related-to",
parents = {"mind"},
}
labels["philias"] = {
type = "set",
parents = {"love"},
}
labels["phobias"] = {
type = "set",
parents = {"fear"},
}
labels["plant diseases"] = {
type = "set",
parents = {"diseases", "phytopathology"},
}
labels["plant tissues"] = {
type = "set",
description = "=[[plant]] [[tissue]]s (groups of similar [[cell]]s that function together to do a specific job)",
parents = {"tissues"},
}
labels["pregnancy"] = {
type = "related-to",
parents = {"body", "gynaecology"},
}
labels["pride"] = {
type = "related-to",
parents = {"emotions"},
}
labels["proteins"] = {
type = "set",
parents = {"biomolecules"},
}
labels["reproduction"] = {
type = "related-to",
parents = {"life"},
}
labels["rest"] = {
type = "related-to",
parents = {"body"},
}
labels["sadness"] = {
type = "related-to",
parents = {"emotions"},
}
labels["sauna"] = {
type = "related-to",
parents = {"bathing"},
}
labels["scents"] = {
type = "name",
parents = {"smell"},
}
labels["senses"] = {
type = "set,related-to",
description = "=the [[physical]] [[senses]]",
parents = {"perception"},
}
labels["sexually transmitted diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["sitting"] = {
type = "related-to",
parents = {"body"},
}
labels["skeleton"] = {
type = "related-to",
description = "default with the",
parents = {"body parts"},
}
labels["skin"] = {
type = "related-to",
parents = {"body parts"},
}
labels["sleep"] = {
type = "related-to",
parents = {"body"},
}
labels["smell"] = {
type = "related-to",
description = "=the [[sense]] of [[smell]]",
parents = {"senses"},
}
labels["sneeze"] = {
type = "related-to",
parents = {"bodily functions", "reflexes", "medical signs and symptoms"},
}
labels["suicide"] = {
type = "related-to",
parents = {"death"},
}
labels["syndromes"] = {
type = "set",
parents = {"health", "pathology"},
}
labels["taste"] = {
type = "related-to",
parents = {"senses", "eating", "drinking", "food and drink"},
}
labels["teeth"] = {
type = "related-to",
description = "=[[tooth|teeth]]",
parents = {"mouth"},
}
labels["thinking"] = {
type = "related-to",
parents = {"mind"},
}
labels["tick-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by [[tick]]s",
parents = {"vector-borne diseases"},
}
labels["tissues"] = {
type = "related-to",
description = "=[[tissue]]s (groups of similar [[cell]]s that function together to do a specific job)",
parents = {"body parts"},
}
labels["toiletries"] = {
type = "set",
description = "=items used for [[grooming]] or [[personal hygiene]]",
additional = "For terms related to [[lavatory|lavatories]], use [[:Category:Toilet (room)]].",
parents = {"hygiene"},
}
labels["touch"] = {
type = "related-to",
parents = {"senses"},
}
labels["transgender"] = {
type = "related-to",
description = "=the ''[[transgender]]'' community in the broad sense of that term",
additional = "This includes terms related to the ''[[genderqueer]]'' community, i.e. transgender and transsexual people, and to [[transition]]ing from female to male or vice versa, as well as terms related to [[agender]], [[androgynous]] or [[third gender]] people.",
parents = {"gender", "LGBTQ"},
}
labels["trypanosomal diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["urine"] = {
type = "related-to",
parents = {"bodily fluids"},
}
labels["vector-borne diseases"] = {
type = "set",
description = "=[[diseases]] spread by other [[organism]]s",
parents = {"diseases"},
}
labels["veterinary diseases"] = {
description = "=[[diseases]] of [[animal#Noun|animals]]. To add entries to this category, specify {{temp|lb|{{{langcode}}}|veterinary disease}}",
parents = {"diseases", "veterinary medicine"},
}
labels["viral diseases"] = {
type = "set",
parents = {"diseases"},
}
labels["vision"] = {
type = "related-to",
parents = {"senses"},
}
labels["vitamins"] = {
type = "set",
parents = {"biomolecules"},
}
labels["vomit"] = {
type = "related-to",
parents = {"bodily fluids"},
}
labels["womb"] = {
type = "related-to",
parents = {"organs", "reproduction"},
}
return labels
seaufarukhtdkb1gc4evh44pxjfy5r8
Mòideal:category tree/topic/Buildings and structures
828
17749
88439
2026-07-23T19:35:55Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88439
Scribunto
text/plain
local labels = {}
labels["buildings and structures"] = {
type = "type",
description = "=[[building]]s and [[structure]]s",
parents = {"architecture"},
}
labels["animal dwellings"] = {
type = "type",
parents = {"buildings and structures", "zoology"},
}
labels["bridges"] = {
type = "type",
parents = {"buildings and structures"},
}
labels["buildings"] = {
type = "type",
parents = {"buildings and structures"},
}
labels["pyramids"] = {
type = "set,related-to",
parents = {"buildings"},
}
labels["rooms"] = {
type = "type",
parents = {"buildings and structures"},
}
labels["kitchen"] = {
type = "related-to",
parents = {"rooms", "cooking"},
}
labels["ports and harbours"] = {
type = "related-to",
parents = {"buildings and structures", "nautical", "commerce"},
}
labels["shops"] = {
type = "type",
parents = {"buildings", "businesses"},
}
labels["walls and fences"] = {
type = "type",
description = "=[[wall]]s and [[fence]]s",
parents = {"buildings and structures"},
}
labels["toilet (room)"] = {
type = "related-to",
description = "=[[flush toilet]]s or rooms containing flush toilets",
parents = {"hygiene", "rooms"},
}
return labels
2n763btaewrwn483ho43sx0ihlkub0s
88440
88439
2026-07-27T00:20:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Buildings_and_structures]]
88439
Scribunto
text/plain
local labels = {}
labels["buildings and structures"] = {
type = "type",
description = "=[[building]]s and [[structure]]s",
parents = {"architecture"},
}
labels["animal dwellings"] = {
type = "type",
parents = {"buildings and structures", "zoology"},
}
labels["bridges"] = {
type = "type",
parents = {"buildings and structures"},
}
labels["buildings"] = {
type = "type",
parents = {"buildings and structures"},
}
labels["pyramids"] = {
type = "set,related-to",
parents = {"buildings"},
}
labels["rooms"] = {
type = "type",
parents = {"buildings and structures"},
}
labels["kitchen"] = {
type = "related-to",
parents = {"rooms", "cooking"},
}
labels["ports and harbours"] = {
type = "related-to",
parents = {"buildings and structures", "nautical", "commerce"},
}
labels["shops"] = {
type = "type",
parents = {"buildings", "businesses"},
}
labels["walls and fences"] = {
type = "type",
description = "=[[wall]]s and [[fence]]s",
parents = {"buildings and structures"},
}
labels["toilet (room)"] = {
type = "related-to",
description = "=[[flush toilet]]s or rooms containing flush toilets",
parents = {"hygiene", "rooms"},
}
return labels
2n763btaewrwn483ho43sx0ihlkub0s
Mòideal:category tree/topic/Communication
828
17750
88441
2026-07-23T19:36:24Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88441
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arabic", "Aramaic", {"Chinese", "the [[Chinese]] languages"}, {"Greek", "the [[Greek]] and [[Ancient Greek]] languages"}, "English", "German", "Japanese", "Latin", "Korean", "Okinawan",
"Portuguese", "Sanskrit", "Spanish", "Tamil", "Vietnamese"
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("the [[:Category:%s language|%s language]]"):format(lang, lang)
labels[lang] = {
type = "related-to",
description = "=" .. desc,
parents = {"languages"},
}
end
labels["communication"] = {
type = "related-to",
parents = {"all topics"},
}
labels["alphabets"] = {
type = "name",
parents = {"writing systems"},
}
labels["artificial languages"] = { -- distinguish from "cat:constructed languages" family category
type = "name",
description = "={{w|constructed language}}s",
parents = {"languages"},
}
labels["body language"] = {
type = "related-to",
parents = {"language", "nonverbal communication"},
}
labels["broadcasting"] = {
type = "related-to",
parents = {"media", "telecommunications"},
}
labels["Chinese character components"] = {
type = "set",
description = "=[[Chinese character]] [[component]]s",
parents = {"letters, symbols, and punctuation"},
}
labels["codicology"] = {
type = "related-to",
parents = {"books", "bibliography", "writing"},
}
labels["diacritical marks"] = {
type = "set",
parents = {"letters, symbols, and punctuation"},
}
labels["dialects"] = {
type = "set",
parents = {"language"},
}
labels["dictation"] = {
type = "related-to",
parents = {"communication"},
}
labels["epigraphy"] = {
type = "related-to",
parents = {"palaeography", "writing"},
}
labels["extinct languages"] = {
type = "name",
parents = {"languages"},
}
labels["facial expressions"] = {
type = "set",
parents = {"nonverbal communication", "face"},
}
labels["figures of speech"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"rhetoric"},
}
labels["flags"] = {
type = "related-to,name,type",
parents = {"communication"},
}
labels["jargon"] = {
type = "related-to",
parents = {"language"},
}
labels["Han characters"] = {
type = "related-to",
parents = {"writing systems"},
}
labels["language"] = {
type = "related-to",
parents = {"communication"},
}
labels["language families"] = {
type = "name",
description = "=[[language family|language families]], both accepted and controversial",
parents = {"language", "names"},
}
labels["languages"] = {
type = "name",
parents = {"language", "names"},
}
labels["letters, symbols, and punctuation"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"orthography"},
}
labels["logical fallacies"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Category:{{{langcode}}}:biases}}",
parents = {"rhetoric", "logic"},
}
labels["media"] = {
type = "related-to",
parents = {"communication"},
}
labels["mobile phones"] = {
type = "related-to,set",
parents = {"telephony"},
}
labels["nonverbal communication"] = {
type = "related-to",
parents = {"communication"},
}
labels["orthography"] = {
type = "related-to",
parents = {"writing"},
}
labels["palaeography"] = {
type = "related-to",
parents = {"writing"},
}
labels["post"] = {
type = "related-to",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"communication"},
}
labels["postal abbreviations"] = {
type = "name",
parents = {"post"},
}
labels["public relations"] = {
type = "related-to",
description = "default no singularize",
parents = {"communication"},
}
labels["punctuation marks"] = {
type = "set",
parents = {"letters, symbols, and punctuation"},
}
labels["radio"] = {
type = "related-to",
parents = {"telecommunications"},
}
labels["rhetoric"] = {
type = "related-to",
parents = {"language"},
}
labels["sign languages"] = {
type = "name",
parents = {"languages"},
}
labels["signs"] = {
type = "related-to,name,type",
parents = {"communication"},
}
labels["sociolects"] = {
type = "name",
parents = {"language"},
}
labels["symbols"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"letters, symbols, and punctuation"},
}
labels["talking"] = {
type = "related-to",
parents = {"language", "human behaviour"},
}
labels["telecommunications"] = {
type = "related-to",
description = "default no singularize",
parents = {"communication", "technology"},
}
labels["telegraphy"] = {
type = "related-to",
parents = {"telecommunications", "electronics"},
wpcat = true,
commonscat = true,
}
labels["telephony"] = {
type = "related-to",
parents = {"telecommunications", "electronics"},
}
labels["texting"] = {
type = "related-to",
parents = {"telecommunications"},
}
labels["textual division"] = {
type = "related-to",
parents = {"writing"},
}
labels["textual criticism"] = {
type = "related-to",
parents = {"writing", "bibliography"},
}
labels["typography"] = {
type = "related-to",
parents = {"writing", "printing"},
}
labels["writing"] = {
type = "related-to",
parents = {"language", "human behaviour"},
}
labels["writing systems"] = {
type = "set",
parents = {"writing"},
}
return labels
55lsff08a2d8nic7snbd3st7hmlb4wy
88442
88441
2026-07-27T00:21:27Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Communication]]
88441
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-- FIXME: Lookup langs in the language list.
for _, lang_etc in ipairs {
"Arabic", "Aramaic", {"Chinese", "the [[Chinese]] languages"}, {"Greek", "the [[Greek]] and [[Ancient Greek]] languages"}, "English", "German", "Japanese", "Latin", "Korean", "Okinawan",
"Portuguese", "Sanskrit", "Spanish", "Tamil", "Vietnamese"
} do
if type(lang_etc) ~= "table" then
lang_etc = {lang_etc}
end
local lang, desc = unpack(lang_etc)
desc = desc or ("the [[:Category:%s language|%s language]]"):format(lang, lang)
labels[lang] = {
type = "related-to",
description = "=" .. desc,
parents = {"languages"},
}
end
labels["communication"] = {
type = "related-to",
parents = {"all topics"},
}
labels["alphabets"] = {
type = "name",
parents = {"writing systems"},
}
labels["artificial languages"] = { -- distinguish from "cat:constructed languages" family category
type = "name",
description = "={{w|constructed language}}s",
parents = {"languages"},
}
labels["body language"] = {
type = "related-to",
parents = {"language", "nonverbal communication"},
}
labels["broadcasting"] = {
type = "related-to",
parents = {"media", "telecommunications"},
}
labels["Chinese character components"] = {
type = "set",
description = "=[[Chinese character]] [[component]]s",
parents = {"letters, symbols, and punctuation"},
}
labels["codicology"] = {
type = "related-to",
parents = {"books", "bibliography", "writing"},
}
labels["diacritical marks"] = {
type = "set",
parents = {"letters, symbols, and punctuation"},
}
labels["dialects"] = {
type = "set",
parents = {"language"},
}
labels["dictation"] = {
type = "related-to",
parents = {"communication"},
}
labels["epigraphy"] = {
type = "related-to",
parents = {"palaeography", "writing"},
}
labels["extinct languages"] = {
type = "name",
parents = {"languages"},
}
labels["facial expressions"] = {
type = "set",
parents = {"nonverbal communication", "face"},
}
labels["figures of speech"] = {
type = "set",
description = "=[[figure of speech|figures of speech]]",
parents = {"rhetoric"},
}
labels["flags"] = {
type = "related-to,name,type",
parents = {"communication"},
}
labels["jargon"] = {
type = "related-to",
parents = {"language"},
}
labels["Han characters"] = {
type = "related-to",
parents = {"writing systems"},
}
labels["language"] = {
type = "related-to",
parents = {"communication"},
}
labels["language families"] = {
type = "name",
description = "=[[language family|language families]], both accepted and controversial",
parents = {"language", "names"},
}
labels["languages"] = {
type = "name",
parents = {"language", "names"},
}
labels["letters, symbols, and punctuation"] = {
type = "set",
description = "=[[letter]]s, [[symbol]]s, and [[punctuation]]",
parents = {"orthography"},
}
labels["logical fallacies"] = {
type = "set",
description = "=[[logical fallacy|logical fallacies]], clearly defined errors in reasoning used to support or refute an argument",
additional = "{{also|Category:{{{langcode}}}:biases}}",
parents = {"rhetoric", "logic"},
}
labels["media"] = {
type = "related-to",
parents = {"communication"},
}
labels["mobile phones"] = {
type = "related-to,set",
parents = {"telephony"},
}
labels["nonverbal communication"] = {
type = "related-to",
parents = {"communication"},
}
labels["orthography"] = {
type = "related-to",
parents = {"writing"},
}
labels["palaeography"] = {
type = "related-to",
parents = {"writing"},
}
labels["post"] = {
type = "related-to",
description = "=[[post#Noun|post]] or [[mail#Noun|mail]]",
parents = {"communication"},
}
labels["postal abbreviations"] = {
type = "name",
parents = {"post"},
}
labels["public relations"] = {
type = "related-to",
description = "default no singularize",
parents = {"communication"},
}
labels["punctuation marks"] = {
type = "set",
parents = {"letters, symbols, and punctuation"},
}
labels["radio"] = {
type = "related-to",
parents = {"telecommunications"},
}
labels["rhetoric"] = {
type = "related-to",
parents = {"language"},
}
labels["sign languages"] = {
type = "name",
parents = {"languages"},
}
labels["signs"] = {
type = "related-to,name,type",
parents = {"communication"},
}
labels["sociolects"] = {
type = "name",
parents = {"language"},
}
labels["symbols"] = {
type = "set",
description = "=[[symbol]]s, especially [[mathematical]] and [[scientific]] symbols",
additional = "Most symbols have equivalent meanings in many languages and can therefore be found in [[:Category:Translingual symbols]].",
parents = {"letters, symbols, and punctuation"},
}
labels["talking"] = {
type = "related-to",
parents = {"language", "human behaviour"},
}
labels["telecommunications"] = {
type = "related-to",
description = "default no singularize",
parents = {"communication", "technology"},
}
labels["telegraphy"] = {
type = "related-to",
parents = {"telecommunications", "electronics"},
wpcat = true,
commonscat = true,
}
labels["telephony"] = {
type = "related-to",
parents = {"telecommunications", "electronics"},
}
labels["texting"] = {
type = "related-to",
parents = {"telecommunications"},
}
labels["textual division"] = {
type = "related-to",
parents = {"writing"},
}
labels["textual criticism"] = {
type = "related-to",
parents = {"writing", "bibliography"},
}
labels["typography"] = {
type = "related-to",
parents = {"writing", "printing"},
}
labels["writing"] = {
type = "related-to",
parents = {"language", "human behaviour"},
}
labels["writing systems"] = {
type = "set",
parents = {"writing"},
}
return labels
55lsff08a2d8nic7snbd3st7hmlb4wy
Mòideal:category tree/topic/Culture
828
17751
88443
2026-07-23T19:36:25Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88443
Scribunto
text/plain
local labels = {}
labels["culture"] = {
type = "related-to",
parents = {"society"},
}
labels["A Christmas Carol"] = {
type = "related-to",
wikidata = 62879,
displaytitle = "''A Christmas Carol''",
description = "{{{langname}}} terms that are used in the context of the tale ''{{w|A Christmas Carol}}'', by {{w|Charles Dickens}}, such as the names of its characters or author.",
parents = {"British fiction", "Charles Dickens"},
}
labels["A Song of Ice and Fire"] = {
type = "related-to",
wikidata = 45875,
displaytitle = "''A Song of Ice and Fire''",
description = "{{{langname}}} terms used in context of the ''{{w|Song of Ice and Fire}}'' novel series and its television adaptation ''{{w|Game of Thrones}}''.",
parents = {"American fiction", "fantasy", "literature"},
}
labels["acting"] = {
type = "related-to",
parents = {"art"},
}
labels["alternate history"] = {
type = "related-to",
parents = {"speculative fiction", "history"},
}
labels["American fiction"] = {
type = "related-to",
description = "=works of American fiction",
parents = {"fiction", "United States"},
}
labels["animation"] = {
type = "related-to",
parents = {"mass media"},
}
labels["Arabic fiction"] = {
type = "related-to",
description = "=works of [[fiction]] of [[Arabic]] origin",
parents = {"fiction"},
}
labels["Arabian deities"] = {
type = "name",
parents = {"gods", "Arabian mythology"},
}
labels["Arabian mythology"] = {
type = "related-to",
parents = {"mythology"},
}
labels["Armenian mythology"] = {
type = "related-to",
parents = {"mythology", "Armenia"},
}
labels["art"] = {
type = "related-to",
parents = {"culture"},
}
labels["Arthurian mythology"] = {
type = "related-to",
parents = {"mythology", "United Kingdom"},
}
labels["artistic works"] = {
type = "name,type",
parents = {"art"},
}
labels["astrobiology"] = {
type = "related-to",
parents = {"astronomy", "biology", "geology"},
}
labels["astrology"] = {
type = "related-to",
parents = {"divination", "pseudoscience", "obsolete scientific theories"},
}
labels["Asturian mythology"] = {
type = "related-to",
parents = {"mythology", "Asturias, Spain"},
}
labels["Avatar: The Last Airbender"] = {
type = "related-to",
wikidata = 11572,
displaytitle = "''Avatar: The Last Airbender''",
description = "{{{langname}}} terms derived from and/or related to the animated television series ''{{w|Avatar: The Last Airbender}}'' and its spin-off ''{{w|The Legend of Korra}}''.",
parents = {"American fiction", "animation"},
}
labels["Australian Aboriginal mythology"] = {
type = "related-to",
parents = {"mythology", "Australia"},
}
labels["ballet"] = {
type = "related-to",
parents = {"dance"},
}
labels["Barbie"] = {
type = "related-to",
wikidata = 167447,
description = "=the {{w|Barbie}} fashion doll produced by Mattel",
parents = {"toys"},
}
labels["Batman"] = {
type = "related-to",
wikidata = 2695156,
description = "=the fictional [[superhero]] [[Batman]]",
parents = {"DC Comics", "fictional characters"},
}
labels["bibliography"] = {
type = "related-to",
parents = {"books"},
}
labels["Bilibili"] = {
type = "related-to",
wikidata = 3077586,
description = "=the video-sharing website {{w|bilibili}}",
parents = {"social media", "World Wide Web"},
}
labels["blogging"] = {
type = "related-to",
parents = {"social media"},
}
labels["Bluesky"] = {
type = "related-to",
wikidata = 78194383,
description = "=the microblogging and social networking service {{w|Bluesky}}",
parents = {"social media", "World Wide Web"},
}
labels["body art"] = {
type = "related-to",
parents = {"art", "fashion"},
}
labels["Bollywood"] = {
type = "related-to",
wikidata = 93196,
parents = {"film", "India"},
}
labels["books"] = {
type = "related-to",
parents = {"mass media", "literature"},
}
labels["books of the Poetic Edda"] = {
type = "name",
displaytitle = "books of the ''Poetic Edda''",
description = "=[[book]]s of the ''[[Poetic Edda]]''",
parents = {"Norse mythology"},
}
labels["Brazilian folklore"] = {
type = "related-to",
parents = {"folklore", "Brazil"},
}
labels["British fiction"] = {
type = "related-to",
description = "=works of [[fiction]] of [[British]] origin",
parents = {"fiction", "United Kingdom"},
}
labels["Buffy the Vampire Slayer"] = {
type = "related-to",
wikidata = 183513,
displaytitle = "''Buffy the Vampire Slayer''",
description = "=the television series ''{{w|Buffy the Vampire Slayer}}'' (1997–2003)",
parents = {"American fiction", "television", "vampires"},
}
labels["Canadian fiction"] = {
type = "related-to",
description = "=works of [[fiction]] of [[Canada|Canadian]] origin",
parents = {"fiction", "Canada"},
}
labels["calligraphy"] = {
type = "related-to",
parents = {"art", "writing"},
}
labels["cartomancy"] = {
type = "related-to",
parents = {"divination"},
}
labels["castells"] = {
type = "related-to",
description = "=[[castell]]s, the Catalan tradition of human tower building",
additional = "See {{w|castells}}.",
parents = {"culture", "sports"},
}
labels["celestial inhabitants"] = {
type = "type",
description = "=inhabitants of known [[celestial body|celestial bodies]]",
parents = {"fictional characters", "science fiction", "demonyms"},
}
labels["Celtic mythology"] = {
type = "related-to",
parents = {"mythology", "Ireland", "Wales"},
}
labels["characters from folklore"] = {
type = "related-to",
parents = {"fictional characters", "folklore"},
}
labels["cheerleading"] = {
type = "related-to",
parents = {"dance", "gymnastics", "sports"},
}
labels["Church of England"] = {
type = "related-to",
description = "default with the",
parents = {"Anglicanism", "England"},
}
labels["Chinese fiction"] = {
type = "related-to",
description = "=works of [[fiction]], including [[anime]]s, [[manhua]]s, [[novel]]s, [[series]] and [[video game]]s, whose origin is of [[China]]",
parents = {"fiction", "China"},
}
labels["Chinese mythology"] = {
type = "related-to",
parents = {"mythology", "China"},
}
labels["cinematography"] = {
type = "related-to",
parents = {"film"},
}
labels["circus"] = {
type = "related-to",
description = "default no singularize",
parents = {"entertainment", "theater"},
}
labels["comedy"] = {
type = "related-to",
parents = {"drama"},
}
labels["comics"] = {
type = "related-to",
description = "default no singularize",
parents = {"literature"},
}
-- Confucianism: see [[Module:category tree/topic/Philosophy]]
labels["conlanging"] = {
type = "related-to",
description = "=[[conlanging]] (the making of [[constructed language]]s)",
parents = {"language", "culture"},
}
labels["conspiracy theories"] = {
type = "related-to,set",
description = "=[[conspiracy theory|conspiracy theories]] and theorists",
parents = {"culture"},
}
labels["constellations in the zodiac"] = {
type = "name",
description = "=the ring of [[constellations]] that line the [[ecliptic]], the apparent path of the [[Sun]] across the [[celestial sphere]] over the course of a year",
parents = {"constellations", "astrology"},
}
labels["cosmetics"] = {
type = "related-to",
parents = {"toiletries", "fashion"},
}
labels["cosplay"] = {
type = "related-to",
parents = {"fandom"},
}
labels["dance"] = {
type = "related-to",
parents = {"art", "recreation"},
}
labels["dances"] = {
type = "type",
parents = {"dance"},
}
labels["DC Comics"] = {
type = "related-to",
wikidata = 2924461,
description = "={{w|DC Comics}}",
parents = {"American fiction", "comics"},
}
labels["demoscene"] = {
type = "related-to",
parents = {"culture", "computing"},
}
labels["design"] = {
type = "related-to",
parents = {"art"},
}
labels["dictionaries"] = {
type = "type,name",
parents = {"reference works", "lexicography"},
}
labels["Disney"] = {
type = "related-to",
wikidata = 7414,
description = "=the properties of {{w|The Walt Disney Company}}",
additional = "This includes properties acquired jointly with or from other companies.",
parents = {"American fiction", "comics", "film", "television"},
}
labels["divination"] = {
type = "type",
parents = {"occult"},
}
labels["Doctor Who"] = {
type = "related-to",
wikidata = 34316,
displaytitle = "''Doctor Who''",
description = "=the ''{{w|Doctor Who}}'' franchise",
parents = {"British fiction", "science fiction", "television"},
}
labels["Dracula"] = {
type = "related-to",
wikidata = 41542,
displaytitle = "''Dracula''",
description = "=the 1897 gothic horror novel ''{{w|Dracula}}'' by {{w|Bram Stoker}}, and its cultural derivations.",
parents = {"fantasy", "literature", "vampires"},
}
labels["dragons"] = {
type = "related-to,type",
parents = {"mythological creatures"},
}
labels["drama"] = {
type = "related-to",
parents = {"theater"},
}
labels["Egyptian deities"] = {
type = "name",
parents = {"gods", "Egyptian mythology"},
}
labels["Egyptian mythology"] = {
type = "related-to",
parents = {"mythology", "Ancient Egypt"},
}
labels["entertainment"] = {
type = "related-to",
parents = {"culture"},
}
labels["erotic literature"] = {
type = "related-to",
parents = {"fiction", "literary genres", "sex"},
}
labels["Etruscan mythology"] = {
type = "related-to",
parents = {"mythology", "Etruria"},
}
labels["European folklore"] = {
type = "related-to",
parents = {"folklore", "Europe"},
}
labels["fairy tale"] = {
type = "related-to",
description = "=[[fairy tale]]s",
parents = {"fiction"},
}
labels["fairy tale characters"] = {
type = "name",
description = "=[[fairy tale]] [[character]]s",
parents = {"fictional characters", "fairy tale"},
}
labels["fairy tales"] = {
type = "name",
parents = {"fairy tale"},
}
labels["fan fiction"] = {
type = "related-to",
parents = {"fiction", "fandom", "literature"},
}
labels["fandom"] = {
type = "related-to",
description = "{{{langname}}} terms arising from [[fandom]] culture.",
parents = {"culture"},
}
labels["fantasy"] = {
type = "related-to",
description = "=the [[genre]] of [[fantasy]]",
parents = {"fiction", "speculative fiction"},
}
labels["fashion"] = {
type = "related-to",
parents = {"culture", "clothing"},
}
labels["faster-than-light travel"] = {
type = "related-to",
parents = {"travel", "science fiction", "astrophysics", "relativity"},
}
labels["Fediverse"] = {
type = "related-to",
wikidata = 30325419,
description = "=the decentralised social networking services collectively known as the {{w|Fediverse}}",
parents = {"social media", "World Wide Web"},
}
labels["fiction"] = {
type = "related-to",
description = "=specific works of [[fiction]]",
parents = {"artistic works"},
}
labels["fictional abilities"] = {
type = "related-to,type",
description = "=fictional [[ability|abilities]] and [[superpower]]s",
parents = {"fiction", "speculative fiction"},
}
labels["fictional characters"] = {
type = "name,type",
parents = {"fiction"},
}
labels["fictional locations"] = {
type = "name,type",
parents = {"fiction"},
}
labels["fictional planets"] = {
type = "name",
parents = {"fictional locations"},
}
labels["fictional universes"] = {
type = "name,type",
parents = {"fictional locations"},
}
labels["film"] = {
type = "related-to",
parents = {"mass media", "entertainment"},
}
labels["F/F ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between two female characters.",
parents = {"LGBTQ", "ships (fandom) by relationship type"},
}
labels["film genres"] = {
type = "type,related-to",
parents = {"film", "genres"},
}
labels["film industries"] = {
type = "name",
parents = {"film"},
}
labels["Finnic mythology"] = {
type = "related-to",
description = "=the [[mythology]] of the [[Finnic]] peoples",
additional = "This includes (but is not limited to) [[Finnish]] and [[Estonian]] mythology.",
parents = {"mythology", "Finland", "Estonia"},
}
labels["flamenco"] = {
type = "related-to",
parents = {"dance"},
}
labels["folklore"] = {
type = "related-to",
parents = {"culture"},
}
labels["furry fandom"] = {
type = "related-to",
parents = {"fandom", "subcultures"},
}
labels["Germanic deities"] = {
type = "name",
parents = {"gods", "Germanic mythology"},
}
labels["Germanic mythology"] = {
type = "name",
description = "=the [[mythology]] of the [[Germanic]] peoples",
parents = {"mythology"},
}
labels["genres"] = {
type = "type,related-to",
description = "=[[genre]]s and genre classifications",
parents = {"entertainment"},
wpcat = true,
}
labels["ghosts"] = {
type = "related-to",
parents = {"afterlife", "supernatural", "characters from folklore", "death", "fantasy", "horror", "mythological creatures", "occult"},
}
labels["Glee (TV series)"] = {
type = "related-to",
wikidata = 152178,
displaytitle = "''Glee'' (TV series)",
description = "=the television series ''[[w:Glee (TV series)|Glee]]'' (2009–2015)",
parents = {"American fiction", "television"},
}
labels["graphic design"] = {
type = "related-to",
parents = {"design"},
}
labels["Greek deities"] = {
type = "name",
parents = {"gods", "Greek mythology"},
}
labels["Greek mythology"] = {
type = "related-to",
description = "=the [[mythology]] of [[Ancient Greece]]",
parents = {"mythology", "Ancient Greece"},
}
labels["Gulliver's Travels"] = {
type = "related-to",
wikidata = 181488,
displaytitle = "''Gulliver's Travels''",
description = "=''[[w:Gulliver's Travels|Gulliver’s Travels]]''",
parents = {"literature"},
}
labels["Harry Potter"] = {
type = "related-to",
wikidata = 8337,
displaytitle = "''Harry Potter''",
description = "{{{langname}}} terms used in context of the ''{{w|Harry Potter}}'' franchise.",
parents = {"British fiction", "fantasy", "literature", "fictional characters"},
}
labels["Hawaiian mythology"] = {
type = "related-to",
parents = {"mythology", "Hawaii, USA"},
}
labels["F/M ships"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between female and male characters.",
parents = {"ships (fandom) by relationship type"},
}
labels["Hindu deities"] = {
type = "name",
parents = {"gods", "Hindu mythology"},
}
labels["Hindu mythology"] = {
type = "related-to",
parents = {"mythology", "Hinduism"},
}
labels["Homestuck"] = {
type = "related-to",
displaytitle ="''Homestuck''",
wikidata = 2618713,
description = "=the ''{{w|Homestuck}}'' multimedia fiction series",
parents = {"American fiction", "comics"},
}
labels["Hopi culture"] = {
type = "related-to",
parents = {"culture", "United States"},
}
labels["horror"] = {
type = "related-to",
description = "=the [[horror]] [[genre]]",
parents = {"literature", "speculative fiction"},
}
labels["humanities"] = {
type = "related-to",
description = "default no singularize",
parents = {"culture"},
commonscat = true;
}
labels["incestuous ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} involving fictional incestuous relationships.",
parents = {"incest", "ships (fandom) by relationship type"},
}
labels["idol fandom"] = {
type = "related-to",
parents = {"fandom"},
}
labels["Instagram"] = {
type = "related-to",
wikidata = 209330,
description = "=the photo sharing and social networking service [[Instagram]]",
parents = {"photography", "social media", "World Wide Web"},
}
labels["Iranian mythology"] = {
type = "related-to",
parents = {"mythology", "Iran"},
}
labels["Irish mythology"] = {
type = "related-to",
parents = {"Celtic mythology", "Ireland"},
}
labels["James Bond"] = {
type = "related-to",
wikidata = 844,
displaytitle = "''James Bond''",
description = "=the ''[[James Bond]]'' franchise",
parents = {"British fiction", "film"},
}
labels["Japanese deities"] = {
type = "name",
parents = {"gods", "Japanese mythology"},
}
labels["Japanese fiction"] = {
type = "related-to",
description = "=works of [[fiction]], including [[anime]]s, [[manga]]s, [[novel]]s, [[series]] and [[video game]]s, whose origin is of [[Japan]]",
parents = {"fiction", "Japan"},
}
labels["Japanese mythology"] = {
type = "related-to",
parents = {"mythology", "Japan"},
}
labels["job titles in Romance of the Three Kingdoms"] = {
type = "type",
displaytitle = "job titles in ''Romance of the Three Kingdoms''",
description = "=job titles in ''{{w|Romance of the Three Kingdoms}}''",
parents = {"Romance of the Three Kingdoms", "titles"},
}
labels["journalism"] = {
type = "related-to",
parents = {"writing"},
}
labels["Kachinas"] = {
type = "name",
parents = {"Hopi culture"},
}
labels["Komi mythology"] = {
type = "related-to",
parents = {"mythology", "Komi, Russia"},
}
labels["Korean fiction"] = {
type = "related-to",
description = "=works of [[fiction]], including [[anime]]s, [[manhwa]]s, [[novel]]s, [[series]] and [[video game]]s, whose origin is of [[Korea]]",
parents = {"fiction", "Korea"},
}
labels["Korean mythology"] = {
type = "related-to",
parents = {"mythology", "Korea"},
}
labels["literary genres"] = {
type = "type",
description = "{{{langname}}} terms for [[literary]] [[genre]]s.",
parents = {"literature", "fiction", "genres"},
}
labels["literature"] = {
type = "related-to",
parents = {"culture", "entertainment", "writing"},
}
labels["Lost (TV series)"] = {
type = "related-to",
wikidata = 23567,
displaytitle = "''Lost'' (TV series)",
description = "=the television series ''{{w|Lost (2004 TV series)|Lost}}'' (2004–2010)",
parents = {"American fiction", "science fiction", "television"},
}
labels["Lovecraftian horror"] = {
type = "related-to",
wikidata = 2448865,
description = "=the [[literature|literary]] works of {{w|H. P. Lovecraft}}",
parents = {"horror", "literature", "fiction", "supernatural"},
}
labels["magic"] = {
type = "related-to",
parents = {"supernatural"},
}
labels["magic words"] = {
type = "set",
wikidata = 1135882,
description = "{{{langname}}} magic words; terms that serve the purpose of effectively or apparently triggering a [[magical]] or [[illusionist]] event.",
parents = {"plot devices", "fiction"},
}
labels["manga genres"] = {
type = "type",
description = "{{{langname}}} terms for [[manga]] [[genre]]s.",
parents = {"literary genres"},
}
labels["marriage"] = {
type = "related-to",
parents = {"culture", "family"},
}
labels["Marvel Comics"] = {
type = "related-to",
wikidata = 173496,
description = "={{w|Marvel Comics}}",
parents = {"American fiction", "comics"},
}
labels["mass media"] = {
type = "related-to",
parents = {"media", "culture"},
}
labels["Meitei deities"] = {
type = "name",
parents = {"gods", "Meitei mythology"},
}
labels["Meitei mythology"] = {
type = "related-to",
parents = {"mythology", "Manipur, India"},
}
labels["merpeople"] = {
type = "related-to",
parents = {"mythological creatures"},
}
labels["Mesopotamian deities"] = {
type = "name",
parents = {"gods", "Mesopotamian mythology"},
}
labels["Mesopotamian mythology"] = {
type = "related-to",
description = "=the [[mythology]] of ancient [[Mesopotamia]]",
parents = {"mythology", "Ancient Near East"},
}
labels["M/M ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between two male characters.",
parents = {"LGBTQ", "ships (fandom) by relationship type"},
}
labels["modern art"] = {
type = "related-to",
parents = {"art"},
}
labels["Mongolian tribes"] = {
type = "name",
description = "{{{langname}}} names for Mongolian tribes.",
parents = {"ethnonyms", "Mongolia"},
}
labels["moustaches"] = {
type = "type",
parents = {"face", "fashion", "hair"},
}
labels["My Hero Academia"] = {
type = "related-to",
wikidata = 18047903,
displaytitle ="''My Hero Academia''",
description = "=the ''{{w|My Hero Academia}}'' series",
parents = {"Japanese fiction", "animation", "comics"},
}
labels["My Little Pony"] = {
type = "related-to",
wikidata = 1071312,
displaytitle = "''My Little Pony''",
description = "=the ''{{w|My Little Pony}}'' franchise (which includes toys and animated series) and its fandom",
parents = {"American fiction", "animation", "toys"},
}
labels["mythological creatures"] = {
type = "type",
parents = {"mythology", "fantasy"},
}
labels["mythological figures"] = {
type = "name",
parents = {"mythology"},
}
labels["mythological locations"] = {
type = "name",
parents = {"mythology"},
}
labels["mythological plants"] = {
type = "type,name",
parents = {"mythology", "plants"},
}
labels["mythology"] = {
type = "related-to",
parents = {"culture"},
}
labels["narratology"] = {
type = "related-to",
parents = {"literature", "drama"},
}
labels["Navajo mythology"] = {
type = "related-to",
parents = {"mythology"},
}
labels["newspapers"] = {
type = "name",
parents = {"periodicals"},
}
labels["Niconico"] = {
type = "related-to",
wikidata = 697233,
description = "=the video-sharing website {{w|Niconico}}",
parents = {"social media", "World Wide Web"},
}
labels["Norse deities"] = {
type = "name",
parents = {"gods", "Germanic deities", "Norse mythology"},
}
labels["Norse mythology"] = {
type = "related-to",
parents = {"mythology", "Germanic mythology"},
}
labels["occult"] = {
type = "related-to",
description = "default with the",
parents = {"supernatural", "paranormal"},
}
labels["omegaverse"] = {
type = "related-to",
wikidata = 96397374,
description = "=the [[omegaverse]] genre",
parents = {"erotic literature", "fan fiction", "speculative fiction"},
}
labels["Omori"] = {
type = "related-to",
wikidata = 105618699,
displaytitle ="''Omori''",
description = "=the ''{{w|Omori (video game)|Omori}}'' series",
parents = {"American fiction", "video games"},
}
labels["Once Upon a Time"] = {
type = "related-to",
wikidata = 23673,
displaytitle = "''Once Upon a Time''",
description = "=the television series ''{{w|Once Upon a Time (TV series)|Once Upon a Time}}'' (2011–2018)",
parents = {"American fiction", "Disney", "television"},
}
labels["otherkin"] = {
type = "related-to",
description = "=the [[otherkin]] subculture",
parents = {"subcultures", "mysticism"},
}
labels["painting"] = {
type = "related-to",
parents = {"art"},
}
labels["palmistry"] = {
type = "related-to",
parents = {"divination"},
}
labels["parties"] = {
type = "type,related-to",
parents = {"entertainment", "culture"},
}
labels["people in Romance of the Three Kingdoms"] = {
type = "name",
displaytitle = "people in ''Romance of the Three Kingdoms''",
description = "=people in ''{{w|Romance of the Three Kingdoms}}''",
parents = {"Romance of the Three Kingdoms"},
}
labels["perfumes"] = {
type = "type,set",
parents = {"fashion", "scents", "perfumery"},
}
labels["periodicals"] = {
type = "type,related-to",
parents = {"mass media", "literature"},
}
labels["personifications"] = {
type = "name",
parents = {"narratology"},
}
labels["places in Romance of the Three Kingdoms"] = {
type = "name",
displaytitle = "places in ''Romance of the Three Kingdoms''",
description = "=places in ''{{w|Romance of the Three Kingdoms}}''",
parents = {"Romance of the Three Kingdoms", "China"},
}
labels["plot devices"] = {
type = "type",
parents = {"narratology", "fiction"},
}
labels["poetry"] = {
type = "related-to",
parents = {"literature", "art"},
}
labels["polyamorous ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between three or more characters.",
parents = {"ships (fandom) by relationship type"},
}
labels["Private Eye"] = {
type = "related-to",
displaytitle = "''Private Eye''",
description = "=the ''{{w|Private Eye}}'' franchise",
parents = {"British fiction"},
}
labels["Reddit"] = {
type = "related-to",
wikidata = 2195701,
description = "=the social news aggregation and discussion website {{w|Reddit}}",
parents = {"social media", "World Wide Web"},
}
labels["reference works"] = {
type = "type",
parents = {"books"},
}
labels["Roman deities"] = {
type = "name",
parents = {"gods", "Roman mythology"},
}
labels["Roman mythology"] = {
type = "related-to",
parents = {"mythology", "Ancient Rome"},
}
labels["romance fiction"] = {
type = "related-to",
parents = {"literary genres", "love"},
}
labels["Romance of the Three Kingdoms"] = {
type = "related-to",
wikidata = 70806,
displaytitle = "''Romance of the Three Kingdoms''",
description = "=''{{w|Romance of the Three Kingdoms}}''",
parents = {"fiction", "literature", "China"},
}
labels["RPF ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} involving real people in a fictional relationship.",
additional = "For actual relationships between real people, see [[:Category:Couple nicknames]].",
parents = {"ships (fandom) by relationship type"},
}
labels["science fiction"] = {
type = "related-to",
parents = {"speculative fiction", "fiction"},
}
labels["SCP Foundation"] = {
type = "related-to",
wikidata = 17439649,
description = "English terms related to the SCP Wiki collaborative writing website and its setting of the {{w|SCP Foundation}}.",
parents = {"fantasy", "fiction", "horror", "science fiction", "supernatural"},
}
labels["sculpture"] = {
type = "related-to",
parents = {"art"},
}
labels["Shahnameh"] = {
type = "related-to",
wikidata = 8279,
displaytitle = "''Shahnameh''",
description = "=''Shahnameh''",
parents = {"fiction", "poetry", "literature", "Persia"},
}
labels["Shahnameh characters"] = {
type = "name",
description = "=characters in the [[Shahnameh]]",
parents = {"Shahnameh"},
}
labels["shapeshifters"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore"},
}
labels["Sherlock Holmes"] = {
type = "related-to",
wikidata = 2316684,
description = "=the [[Sherlock Holmes]] stories by {{w|Arthur Conan Doyle}} and adaptations of them",
parents = {"British fiction", "literature"},
}
labels["Sherlock (TV series)"] = {
type = "related-to",
wikidata = 192837,
displaytitle = "''Sherlock'' (TV series)",
description = "=the television series ''[[w:Sherlock (TV series)|Sherlock]]'' (2010–2017)",
parents = {"Sherlock Holmes", "television"},
}
labels["shipping (fandom)"] = {
type = "related-to",
description = "={{l|en|ship|shipping|id=fandomverb}} (i.e., in [[fandom]], supporting a fictional romantic relationship between two characters)",
parents = {"fandom", "romance fiction"},
}
labels["ships (fandom)"] = {
type = "grouping",
description = "=names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} i.e., a fictional relationship between two fictional characters or real people)",
parents = {"shipping (fandom)"},
}
labels["ships (fandom) by relationship type"] = {
type = "grouping",
description = "={{l|en|ship|ship|id=fandomnoun}} names organized by the type of relationship (e.g, [[heterosexual]], [[homosexual]], etc.)",
parents = {"ships (fandom)"},
}
labels["shippers (fandom)"] = {
type = "type",
description = "=[[shipper]]s (i.e., people who support a romantic or sexual relationship between characters or real people)",
parents = {"shipping (fandom)"},
}
labels["Slavic deities"] = {
type = "name",
parents = {"gods", "Slavic mythology"},
}
labels["Slavic mythology"] = {
type = "related-to",
description = "=the [[mythology]] of the [[Slav]]s",
parents = {"mythology"},
}
labels["Smallville (TV series)"] = {
type = "related-to",
wikidata = 180228,
displaytitle = "''Smallville'' (TV series)",
description = "=the television series ''{{w|Smallville}}'' (2001–2011)",
parents = {"American fiction", "Superman", "television"},
}
labels["social media"] = {
type = "related-to",
wikidata = 202833,
parents = {"mass media", "Internet"},
}
labels["South Korean idol fandom"] = {
type = "related-to",
wikidata = 39086123,
description = "=[[South Korea|South Korean]] [[idol]] [[fandom]]",
parents = {"idol fandom", "South Korea"},
}
labels["South Park"] = {
type = "related-to",
wikidata = 16538,
displaytitle = "''South Park''",
description = "{{{langname}}} terms derived from and/or related to the animated television series ''{{w|South Park}}''.",
parents = {"American fiction", "animation"},
}
labels["Star Trek"] = {
type = "related-to",
wikidata = 1092,
displaytitle = "''Star Trek''",
description = "=the ''{{w|Star Trek}}'' franchise",
parents = {"American fiction", "film", "science fiction", "television"},
}
labels["Star Wars"] = {
type = "related-to",
wikidata = 462,
displaytitle = "''Star Wars''",
description = "=the ''{{w|Star Wars}}'' franchise",
parents = {"American fiction", "film", "science fiction", "Disney"},
}
labels["Steven Universe"] = {
type = "related-to",
wikidata = 7615342,
displaytitle = "''Steven Universe''",
description = "=the animated television series ''{{w|Steven Universe}}''",
parents = {"American fiction", "animation"},
}
labels["stock characters"] = {
type = "type",
wikidata = 636497,
parents = {"fictional characters"},
}
labels["speculative fiction"] = {
type = "related-to",
wikidata = 9326077,
parents = {"fiction", "genres"},
}
labels["spider fighting"] = {
type = "related-to",
wikidata = 7577058,
description = "={{w|spider fighting}}",
parents = {"spiders", "human activity"},
}
labels["subcultures"] = {
type = "related-to",
description = "=[[subculture]]s",
parents = {"culture"},
}
labels["superheroes"] = {
type = "name",
wikidata = 188784,
description = "=[[superhero]]es",
parents = {"fictional characters"},
}
labels["Superman"] = {
type = "related-to",
wikidata = 79015,
description = "=the fictional [[superhero]] [[Superman]]",
parents = {"DC Comics", "fictional characters"},
}
labels["supernatural"] = {
type = "related-to",
wikidata = 80837,
description = "default with the",
parents = {"folklore"},
}
labels["Supernatural (TV series)"] = {
type = "related-to",
wikidata = 130585,
displaytitle = "''Supernatural'' (TV series)",
description = "=the television series ''[[w:Supernatural (American TV series)|Supernatural]]'' (2005–2020)",
parents = {"American fiction", "television"},
}
labels["Tamil deities"] = {
type = "name",
additional = "See [[w:Dravidian folk religion|Dravidian religion]] or [[w:Religion in ancient Tamilakam|Tamil region]] for more.",
parents = {"gods", "Hindu deities", "Tamil mythology"},
}
labels["Tamil mythology"] = {
type = "name",
additional = "See [[w:Dravidian folk religion|Dravidian religion]] or [[w:Religion in ancient Tamilakam|Tamil region]] for more.",
parents = {"mythology", "Hindu mythology", "Tamil Nadu, India"},
}
labels["television"] = {
type = "related-to",
wikidata = 289,
parents = {"mass media", "broadcasting"},
}
labels["The Handmaid's Tale"] = {
type = "related-to",
wikidata = 25207350,
displaytitle = "''The Handmaid's Tale''",
description = "=the 1985 novel ''{{w|The Handmaid's Tale}}'' by {{w|Margaret Atwood}} and its [[w:The Handmaid's Tale (TV series)|television adaptation]] (2017–)",
parents = {"Canadian fiction", "utopian and dystopian fiction", "literature"},
}
labels["The Hunger Games"] = {
type = "related-to",
wikidata = 11679,
displaytitle = "''The Hunger Games''",
description = "=''{{w|The Hunger Games}}'' novel series by {{w|Suzanne Collins}} and its film adaptations",
parents = {"American fiction", "science fiction", "utopian and dystopian fiction", "literature"},
}
labels["The Matrix"] = {
type = "related-to",
wikidata = 83495,
displaytitle = "''The Matrix''",
description = "=''{{w|The Matrix}}''",
parents = {"American fiction", "science fiction", "utopian and dystopian fiction"},
}
labels["The Simpsons"] = {
type = "related-to",
wikidata = 886,
displaytitle = "''The Simpsons''",
description = "{{{langname}}} terms derived from and/or related to the animated television series ''{{w|The Simpsons}}''.",
parents = {"American fiction", "animation", "Disney"},
}
labels["The Walking Dead"] = {
type = "related-to",
wikidata = 232737,
displaytitle = "''The Walking Dead''",
description = "=the television series ''[[w:The Walking Dead (TV series)|The Walking Dead]]'' (2010–2022) and the comic series from which it was adapted",
parents = {"American fiction", "television", "utopian and dystopian fiction", "zombies"},
}
labels["The Wizard of Oz"] = {
type = "related-to",
wikidata = 130295,
displaytitle = "''The Wizard of Oz''",
description = "=the fantasy novel ''{{w|The Wonderful Wizard of Oz}}'', subsequent books or films derived from it, such as the ''[[w:The Wizard of Oz (1939 film)|1939 film]]''.",
parents = {"American fiction", "fantasy", "literature"},
}
labels["The X-Files"] = {
type = "related-to",
wikidata = 2744,
displaytitle = "''The X-Files''",
description = "=the ''{{w|The X-Files}}'' franchise",
parents = {"American fiction", "science fiction", "television"},
}
labels["theater"] = {
type = "related-to",
parents = {"art", "entertainment"},
}
labels["Thracian deities"] = {
type = "name",
parents = {"gods"},
}
labels["TikTok"] = {
type = "related-to",
wikidata = 48938223,
description = "=the video-sharing and social-networking service {{w|TikTok}}",
parents = {"social media", "World Wide Web"},
}
labels["Tupi mythology"] = {
type = "related-to",
parents = {"mythology", "Brazil"},
}
labels["Twilight (novel series)"] = {
type = "related-to",
wikidata = 44523,
displaytitle = "''Twilight'' (novel series)",
description = "=the ''[[w:Twilight (series)|Twilight]]'' franchise",
parents = {"American fiction", "fantasy", "literature", "vampires"},
}
labels["Twitter"] = {
type = "related-to",
wikidata = 918,
description = "=the social networking and microblogging service {{w|Twitter}}",
parents = {"social media", "World Wide Web"},
}
labels["Tumblr"] = {
type = "related-to",
wikidata = 384060,
description = "=the microblogging and social networking service {{w|Tumblr}}",
parents = {"social media", "World Wide Web"},
}
labels["utopian and dystopian fiction"] = {
type = "related-to",
parents = {"speculative fiction"},
}
labels["vampires"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore", "death", "horror", "blood"},
}
labels["vampire lifestyle"] = {
type = "related-to",
description = "={{w|vampire lifestyle|the vampire lifestyle}} (i.e., a subculture which roleplays the stereotypical habits of vampires)",
parents = {"subcultures", "vampires"},
}
labels["Virtual YouTuber"] = {
type = "related-to",
wikidata = 55155641,
description = "=[[virtual YouTuber]]s ([[VTuber]]s)",
parents = {"YouTube", "Entertainment"},
}
labels["web design"] = {
type = "related-to",
parents = {"design", "World Wide Web"},
}
labels["werewolves"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore", "shapeshifters", "horror"},
}
labels["worldbuilding"] = {
type = "related-to",
parents = {"narratology", "speculative fiction"},
}
labels["Xena: Warrior Princess"] = {
type = "related-to",
wikidata = 38497,
displaytitle = "''Xena: Warrior Princess''",
description = "=the television series ''{{w|Xena: Warrior Princess}}'' (1995–2001)",
parents = {"American fiction", "fantasy", "television"},
}
labels["YouTube"] = {
type = "related-to",
wikidata = 866,
description = "=the video-sharing website {{w|YouTube}}",
parents = {"social media", "World Wide Web", "Google"},
}
labels["YouTube Poop"] = {
type = "related-to",
wikidata = 16927904,
parents = {"YouTube", "Internet memes"},
}
labels["zombies"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore", "death", "horror"},
}
return labels
s8j4esgk89qb5keh8ioyd43cphnuma6
88444
88443
2026-07-27T00:21:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Culture]]
88443
Scribunto
text/plain
local labels = {}
labels["culture"] = {
type = "related-to",
parents = {"society"},
}
labels["A Christmas Carol"] = {
type = "related-to",
wikidata = 62879,
displaytitle = "''A Christmas Carol''",
description = "{{{langname}}} terms that are used in the context of the tale ''{{w|A Christmas Carol}}'', by {{w|Charles Dickens}}, such as the names of its characters or author.",
parents = {"British fiction", "Charles Dickens"},
}
labels["A Song of Ice and Fire"] = {
type = "related-to",
wikidata = 45875,
displaytitle = "''A Song of Ice and Fire''",
description = "{{{langname}}} terms used in context of the ''{{w|Song of Ice and Fire}}'' novel series and its television adaptation ''{{w|Game of Thrones}}''.",
parents = {"American fiction", "fantasy", "literature"},
}
labels["acting"] = {
type = "related-to",
parents = {"art"},
}
labels["alternate history"] = {
type = "related-to",
parents = {"speculative fiction", "history"},
}
labels["American fiction"] = {
type = "related-to",
description = "=works of American fiction",
parents = {"fiction", "United States"},
}
labels["animation"] = {
type = "related-to",
parents = {"mass media"},
}
labels["Arabic fiction"] = {
type = "related-to",
description = "=works of [[fiction]] of [[Arabic]] origin",
parents = {"fiction"},
}
labels["Arabian deities"] = {
type = "name",
parents = {"gods", "Arabian mythology"},
}
labels["Arabian mythology"] = {
type = "related-to",
parents = {"mythology"},
}
labels["Armenian mythology"] = {
type = "related-to",
parents = {"mythology", "Armenia"},
}
labels["art"] = {
type = "related-to",
parents = {"culture"},
}
labels["Arthurian mythology"] = {
type = "related-to",
parents = {"mythology", "United Kingdom"},
}
labels["artistic works"] = {
type = "name,type",
parents = {"art"},
}
labels["astrobiology"] = {
type = "related-to",
parents = {"astronomy", "biology", "geology"},
}
labels["astrology"] = {
type = "related-to",
parents = {"divination", "pseudoscience", "obsolete scientific theories"},
}
labels["Asturian mythology"] = {
type = "related-to",
parents = {"mythology", "Asturias, Spain"},
}
labels["Avatar: The Last Airbender"] = {
type = "related-to",
wikidata = 11572,
displaytitle = "''Avatar: The Last Airbender''",
description = "{{{langname}}} terms derived from and/or related to the animated television series ''{{w|Avatar: The Last Airbender}}'' and its spin-off ''{{w|The Legend of Korra}}''.",
parents = {"American fiction", "animation"},
}
labels["Australian Aboriginal mythology"] = {
type = "related-to",
parents = {"mythology", "Australia"},
}
labels["ballet"] = {
type = "related-to",
parents = {"dance"},
}
labels["Barbie"] = {
type = "related-to",
wikidata = 167447,
description = "=the {{w|Barbie}} fashion doll produced by Mattel",
parents = {"toys"},
}
labels["Batman"] = {
type = "related-to",
wikidata = 2695156,
description = "=the fictional [[superhero]] [[Batman]]",
parents = {"DC Comics", "fictional characters"},
}
labels["bibliography"] = {
type = "related-to",
parents = {"books"},
}
labels["Bilibili"] = {
type = "related-to",
wikidata = 3077586,
description = "=the video-sharing website {{w|bilibili}}",
parents = {"social media", "World Wide Web"},
}
labels["blogging"] = {
type = "related-to",
parents = {"social media"},
}
labels["Bluesky"] = {
type = "related-to",
wikidata = 78194383,
description = "=the microblogging and social networking service {{w|Bluesky}}",
parents = {"social media", "World Wide Web"},
}
labels["body art"] = {
type = "related-to",
parents = {"art", "fashion"},
}
labels["Bollywood"] = {
type = "related-to",
wikidata = 93196,
parents = {"film", "India"},
}
labels["books"] = {
type = "related-to",
parents = {"mass media", "literature"},
}
labels["books of the Poetic Edda"] = {
type = "name",
displaytitle = "books of the ''Poetic Edda''",
description = "=[[book]]s of the ''[[Poetic Edda]]''",
parents = {"Norse mythology"},
}
labels["Brazilian folklore"] = {
type = "related-to",
parents = {"folklore", "Brazil"},
}
labels["British fiction"] = {
type = "related-to",
description = "=works of [[fiction]] of [[British]] origin",
parents = {"fiction", "United Kingdom"},
}
labels["Buffy the Vampire Slayer"] = {
type = "related-to",
wikidata = 183513,
displaytitle = "''Buffy the Vampire Slayer''",
description = "=the television series ''{{w|Buffy the Vampire Slayer}}'' (1997–2003)",
parents = {"American fiction", "television", "vampires"},
}
labels["Canadian fiction"] = {
type = "related-to",
description = "=works of [[fiction]] of [[Canada|Canadian]] origin",
parents = {"fiction", "Canada"},
}
labels["calligraphy"] = {
type = "related-to",
parents = {"art", "writing"},
}
labels["cartomancy"] = {
type = "related-to",
parents = {"divination"},
}
labels["castells"] = {
type = "related-to",
description = "=[[castell]]s, the Catalan tradition of human tower building",
additional = "See {{w|castells}}.",
parents = {"culture", "sports"},
}
labels["celestial inhabitants"] = {
type = "type",
description = "=inhabitants of known [[celestial body|celestial bodies]]",
parents = {"fictional characters", "science fiction", "demonyms"},
}
labels["Celtic mythology"] = {
type = "related-to",
parents = {"mythology", "Ireland", "Wales"},
}
labels["characters from folklore"] = {
type = "related-to",
parents = {"fictional characters", "folklore"},
}
labels["cheerleading"] = {
type = "related-to",
parents = {"dance", "gymnastics", "sports"},
}
labels["Church of England"] = {
type = "related-to",
description = "default with the",
parents = {"Anglicanism", "England"},
}
labels["Chinese fiction"] = {
type = "related-to",
description = "=works of [[fiction]], including [[anime]]s, [[manhua]]s, [[novel]]s, [[series]] and [[video game]]s, whose origin is of [[China]]",
parents = {"fiction", "China"},
}
labels["Chinese mythology"] = {
type = "related-to",
parents = {"mythology", "China"},
}
labels["cinematography"] = {
type = "related-to",
parents = {"film"},
}
labels["circus"] = {
type = "related-to",
description = "default no singularize",
parents = {"entertainment", "theater"},
}
labels["comedy"] = {
type = "related-to",
parents = {"drama"},
}
labels["comics"] = {
type = "related-to",
description = "default no singularize",
parents = {"literature"},
}
-- Confucianism: see [[Module:category tree/topic/Philosophy]]
labels["conlanging"] = {
type = "related-to",
description = "=[[conlanging]] (the making of [[constructed language]]s)",
parents = {"language", "culture"},
}
labels["conspiracy theories"] = {
type = "related-to,set",
description = "=[[conspiracy theory|conspiracy theories]] and theorists",
parents = {"culture"},
}
labels["constellations in the zodiac"] = {
type = "name",
description = "=the ring of [[constellations]] that line the [[ecliptic]], the apparent path of the [[Sun]] across the [[celestial sphere]] over the course of a year",
parents = {"constellations", "astrology"},
}
labels["cosmetics"] = {
type = "related-to",
parents = {"toiletries", "fashion"},
}
labels["cosplay"] = {
type = "related-to",
parents = {"fandom"},
}
labels["dance"] = {
type = "related-to",
parents = {"art", "recreation"},
}
labels["dances"] = {
type = "type",
parents = {"dance"},
}
labels["DC Comics"] = {
type = "related-to",
wikidata = 2924461,
description = "={{w|DC Comics}}",
parents = {"American fiction", "comics"},
}
labels["demoscene"] = {
type = "related-to",
parents = {"culture", "computing"},
}
labels["design"] = {
type = "related-to",
parents = {"art"},
}
labels["dictionaries"] = {
type = "type,name",
parents = {"reference works", "lexicography"},
}
labels["Disney"] = {
type = "related-to",
wikidata = 7414,
description = "=the properties of {{w|The Walt Disney Company}}",
additional = "This includes properties acquired jointly with or from other companies.",
parents = {"American fiction", "comics", "film", "television"},
}
labels["divination"] = {
type = "type",
parents = {"occult"},
}
labels["Doctor Who"] = {
type = "related-to",
wikidata = 34316,
displaytitle = "''Doctor Who''",
description = "=the ''{{w|Doctor Who}}'' franchise",
parents = {"British fiction", "science fiction", "television"},
}
labels["Dracula"] = {
type = "related-to",
wikidata = 41542,
displaytitle = "''Dracula''",
description = "=the 1897 gothic horror novel ''{{w|Dracula}}'' by {{w|Bram Stoker}}, and its cultural derivations.",
parents = {"fantasy", "literature", "vampires"},
}
labels["dragons"] = {
type = "related-to,type",
parents = {"mythological creatures"},
}
labels["drama"] = {
type = "related-to",
parents = {"theater"},
}
labels["Egyptian deities"] = {
type = "name",
parents = {"gods", "Egyptian mythology"},
}
labels["Egyptian mythology"] = {
type = "related-to",
parents = {"mythology", "Ancient Egypt"},
}
labels["entertainment"] = {
type = "related-to",
parents = {"culture"},
}
labels["erotic literature"] = {
type = "related-to",
parents = {"fiction", "literary genres", "sex"},
}
labels["Etruscan mythology"] = {
type = "related-to",
parents = {"mythology", "Etruria"},
}
labels["European folklore"] = {
type = "related-to",
parents = {"folklore", "Europe"},
}
labels["fairy tale"] = {
type = "related-to",
description = "=[[fairy tale]]s",
parents = {"fiction"},
}
labels["fairy tale characters"] = {
type = "name",
description = "=[[fairy tale]] [[character]]s",
parents = {"fictional characters", "fairy tale"},
}
labels["fairy tales"] = {
type = "name",
parents = {"fairy tale"},
}
labels["fan fiction"] = {
type = "related-to",
parents = {"fiction", "fandom", "literature"},
}
labels["fandom"] = {
type = "related-to",
description = "{{{langname}}} terms arising from [[fandom]] culture.",
parents = {"culture"},
}
labels["fantasy"] = {
type = "related-to",
description = "=the [[genre]] of [[fantasy]]",
parents = {"fiction", "speculative fiction"},
}
labels["fashion"] = {
type = "related-to",
parents = {"culture", "clothing"},
}
labels["faster-than-light travel"] = {
type = "related-to",
parents = {"travel", "science fiction", "astrophysics", "relativity"},
}
labels["Fediverse"] = {
type = "related-to",
wikidata = 30325419,
description = "=the decentralised social networking services collectively known as the {{w|Fediverse}}",
parents = {"social media", "World Wide Web"},
}
labels["fiction"] = {
type = "related-to",
description = "=specific works of [[fiction]]",
parents = {"artistic works"},
}
labels["fictional abilities"] = {
type = "related-to,type",
description = "=fictional [[ability|abilities]] and [[superpower]]s",
parents = {"fiction", "speculative fiction"},
}
labels["fictional characters"] = {
type = "name,type",
parents = {"fiction"},
}
labels["fictional locations"] = {
type = "name,type",
parents = {"fiction"},
}
labels["fictional planets"] = {
type = "name",
parents = {"fictional locations"},
}
labels["fictional universes"] = {
type = "name,type",
parents = {"fictional locations"},
}
labels["film"] = {
type = "related-to",
parents = {"mass media", "entertainment"},
}
labels["F/F ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between two female characters.",
parents = {"LGBTQ", "ships (fandom) by relationship type"},
}
labels["film genres"] = {
type = "type,related-to",
parents = {"film", "genres"},
}
labels["film industries"] = {
type = "name",
parents = {"film"},
}
labels["Finnic mythology"] = {
type = "related-to",
description = "=the [[mythology]] of the [[Finnic]] peoples",
additional = "This includes (but is not limited to) [[Finnish]] and [[Estonian]] mythology.",
parents = {"mythology", "Finland", "Estonia"},
}
labels["flamenco"] = {
type = "related-to",
parents = {"dance"},
}
labels["folklore"] = {
type = "related-to",
parents = {"culture"},
}
labels["furry fandom"] = {
type = "related-to",
parents = {"fandom", "subcultures"},
}
labels["Germanic deities"] = {
type = "name",
parents = {"gods", "Germanic mythology"},
}
labels["Germanic mythology"] = {
type = "name",
description = "=the [[mythology]] of the [[Germanic]] peoples",
parents = {"mythology"},
}
labels["genres"] = {
type = "type,related-to",
description = "=[[genre]]s and genre classifications",
parents = {"entertainment"},
wpcat = true,
}
labels["ghosts"] = {
type = "related-to",
parents = {"afterlife", "supernatural", "characters from folklore", "death", "fantasy", "horror", "mythological creatures", "occult"},
}
labels["Glee (TV series)"] = {
type = "related-to",
wikidata = 152178,
displaytitle = "''Glee'' (TV series)",
description = "=the television series ''[[w:Glee (TV series)|Glee]]'' (2009–2015)",
parents = {"American fiction", "television"},
}
labels["graphic design"] = {
type = "related-to",
parents = {"design"},
}
labels["Greek deities"] = {
type = "name",
parents = {"gods", "Greek mythology"},
}
labels["Greek mythology"] = {
type = "related-to",
description = "=the [[mythology]] of [[Ancient Greece]]",
parents = {"mythology", "Ancient Greece"},
}
labels["Gulliver's Travels"] = {
type = "related-to",
wikidata = 181488,
displaytitle = "''Gulliver's Travels''",
description = "=''[[w:Gulliver's Travels|Gulliver’s Travels]]''",
parents = {"literature"},
}
labels["Harry Potter"] = {
type = "related-to",
wikidata = 8337,
displaytitle = "''Harry Potter''",
description = "{{{langname}}} terms used in context of the ''{{w|Harry Potter}}'' franchise.",
parents = {"British fiction", "fantasy", "literature", "fictional characters"},
}
labels["Hawaiian mythology"] = {
type = "related-to",
parents = {"mythology", "Hawaii, USA"},
}
labels["F/M ships"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between female and male characters.",
parents = {"ships (fandom) by relationship type"},
}
labels["Hindu deities"] = {
type = "name",
parents = {"gods", "Hindu mythology"},
}
labels["Hindu mythology"] = {
type = "related-to",
parents = {"mythology", "Hinduism"},
}
labels["Homestuck"] = {
type = "related-to",
displaytitle ="''Homestuck''",
wikidata = 2618713,
description = "=the ''{{w|Homestuck}}'' multimedia fiction series",
parents = {"American fiction", "comics"},
}
labels["Hopi culture"] = {
type = "related-to",
parents = {"culture", "United States"},
}
labels["horror"] = {
type = "related-to",
description = "=the [[horror]] [[genre]]",
parents = {"literature", "speculative fiction"},
}
labels["humanities"] = {
type = "related-to",
description = "default no singularize",
parents = {"culture"},
commonscat = true;
}
labels["incestuous ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} involving fictional incestuous relationships.",
parents = {"incest", "ships (fandom) by relationship type"},
}
labels["idol fandom"] = {
type = "related-to",
parents = {"fandom"},
}
labels["Instagram"] = {
type = "related-to",
wikidata = 209330,
description = "=the photo sharing and social networking service [[Instagram]]",
parents = {"photography", "social media", "World Wide Web"},
}
labels["Iranian mythology"] = {
type = "related-to",
parents = {"mythology", "Iran"},
}
labels["Irish mythology"] = {
type = "related-to",
parents = {"Celtic mythology", "Ireland"},
}
labels["James Bond"] = {
type = "related-to",
wikidata = 844,
displaytitle = "''James Bond''",
description = "=the ''[[James Bond]]'' franchise",
parents = {"British fiction", "film"},
}
labels["Japanese deities"] = {
type = "name",
parents = {"gods", "Japanese mythology"},
}
labels["Japanese fiction"] = {
type = "related-to",
description = "=works of [[fiction]], including [[anime]]s, [[manga]]s, [[novel]]s, [[series]] and [[video game]]s, whose origin is of [[Japan]]",
parents = {"fiction", "Japan"},
}
labels["Japanese mythology"] = {
type = "related-to",
parents = {"mythology", "Japan"},
}
labels["job titles in Romance of the Three Kingdoms"] = {
type = "type",
displaytitle = "job titles in ''Romance of the Three Kingdoms''",
description = "=job titles in ''{{w|Romance of the Three Kingdoms}}''",
parents = {"Romance of the Three Kingdoms", "titles"},
}
labels["journalism"] = {
type = "related-to",
parents = {"writing"},
}
labels["Kachinas"] = {
type = "name",
parents = {"Hopi culture"},
}
labels["Komi mythology"] = {
type = "related-to",
parents = {"mythology", "Komi, Russia"},
}
labels["Korean fiction"] = {
type = "related-to",
description = "=works of [[fiction]], including [[anime]]s, [[manhwa]]s, [[novel]]s, [[series]] and [[video game]]s, whose origin is of [[Korea]]",
parents = {"fiction", "Korea"},
}
labels["Korean mythology"] = {
type = "related-to",
parents = {"mythology", "Korea"},
}
labels["literary genres"] = {
type = "type",
description = "{{{langname}}} terms for [[literary]] [[genre]]s.",
parents = {"literature", "fiction", "genres"},
}
labels["literature"] = {
type = "related-to",
parents = {"culture", "entertainment", "writing"},
}
labels["Lost (TV series)"] = {
type = "related-to",
wikidata = 23567,
displaytitle = "''Lost'' (TV series)",
description = "=the television series ''{{w|Lost (2004 TV series)|Lost}}'' (2004–2010)",
parents = {"American fiction", "science fiction", "television"},
}
labels["Lovecraftian horror"] = {
type = "related-to",
wikidata = 2448865,
description = "=the [[literature|literary]] works of {{w|H. P. Lovecraft}}",
parents = {"horror", "literature", "fiction", "supernatural"},
}
labels["magic"] = {
type = "related-to",
parents = {"supernatural"},
}
labels["magic words"] = {
type = "set",
wikidata = 1135882,
description = "{{{langname}}} magic words; terms that serve the purpose of effectively or apparently triggering a [[magical]] or [[illusionist]] event.",
parents = {"plot devices", "fiction"},
}
labels["manga genres"] = {
type = "type",
description = "{{{langname}}} terms for [[manga]] [[genre]]s.",
parents = {"literary genres"},
}
labels["marriage"] = {
type = "related-to",
parents = {"culture", "family"},
}
labels["Marvel Comics"] = {
type = "related-to",
wikidata = 173496,
description = "={{w|Marvel Comics}}",
parents = {"American fiction", "comics"},
}
labels["mass media"] = {
type = "related-to",
parents = {"media", "culture"},
}
labels["Meitei deities"] = {
type = "name",
parents = {"gods", "Meitei mythology"},
}
labels["Meitei mythology"] = {
type = "related-to",
parents = {"mythology", "Manipur, India"},
}
labels["merpeople"] = {
type = "related-to",
parents = {"mythological creatures"},
}
labels["Mesopotamian deities"] = {
type = "name",
parents = {"gods", "Mesopotamian mythology"},
}
labels["Mesopotamian mythology"] = {
type = "related-to",
description = "=the [[mythology]] of ancient [[Mesopotamia]]",
parents = {"mythology", "Ancient Near East"},
}
labels["M/M ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between two male characters.",
parents = {"LGBTQ", "ships (fandom) by relationship type"},
}
labels["modern art"] = {
type = "related-to",
parents = {"art"},
}
labels["Mongolian tribes"] = {
type = "name",
description = "{{{langname}}} names for Mongolian tribes.",
parents = {"ethnonyms", "Mongolia"},
}
labels["moustaches"] = {
type = "type",
parents = {"face", "fashion", "hair"},
}
labels["My Hero Academia"] = {
type = "related-to",
wikidata = 18047903,
displaytitle ="''My Hero Academia''",
description = "=the ''{{w|My Hero Academia}}'' series",
parents = {"Japanese fiction", "animation", "comics"},
}
labels["My Little Pony"] = {
type = "related-to",
wikidata = 1071312,
displaytitle = "''My Little Pony''",
description = "=the ''{{w|My Little Pony}}'' franchise (which includes toys and animated series) and its fandom",
parents = {"American fiction", "animation", "toys"},
}
labels["mythological creatures"] = {
type = "type",
parents = {"mythology", "fantasy"},
}
labels["mythological figures"] = {
type = "name",
parents = {"mythology"},
}
labels["mythological locations"] = {
type = "name",
parents = {"mythology"},
}
labels["mythological plants"] = {
type = "type,name",
parents = {"mythology", "plants"},
}
labels["mythology"] = {
type = "related-to",
parents = {"culture"},
}
labels["narratology"] = {
type = "related-to",
parents = {"literature", "drama"},
}
labels["Navajo mythology"] = {
type = "related-to",
parents = {"mythology"},
}
labels["newspapers"] = {
type = "name",
parents = {"periodicals"},
}
labels["Niconico"] = {
type = "related-to",
wikidata = 697233,
description = "=the video-sharing website {{w|Niconico}}",
parents = {"social media", "World Wide Web"},
}
labels["Norse deities"] = {
type = "name",
parents = {"gods", "Germanic deities", "Norse mythology"},
}
labels["Norse mythology"] = {
type = "related-to",
parents = {"mythology", "Germanic mythology"},
}
labels["occult"] = {
type = "related-to",
description = "default with the",
parents = {"supernatural", "paranormal"},
}
labels["omegaverse"] = {
type = "related-to",
wikidata = 96397374,
description = "=the [[omegaverse]] genre",
parents = {"erotic literature", "fan fiction", "speculative fiction"},
}
labels["Omori"] = {
type = "related-to",
wikidata = 105618699,
displaytitle ="''Omori''",
description = "=the ''{{w|Omori (video game)|Omori}}'' series",
parents = {"American fiction", "video games"},
}
labels["Once Upon a Time"] = {
type = "related-to",
wikidata = 23673,
displaytitle = "''Once Upon a Time''",
description = "=the television series ''{{w|Once Upon a Time (TV series)|Once Upon a Time}}'' (2011–2018)",
parents = {"American fiction", "Disney", "television"},
}
labels["otherkin"] = {
type = "related-to",
description = "=the [[otherkin]] subculture",
parents = {"subcultures", "mysticism"},
}
labels["painting"] = {
type = "related-to",
parents = {"art"},
}
labels["palmistry"] = {
type = "related-to",
parents = {"divination"},
}
labels["parties"] = {
type = "type,related-to",
parents = {"entertainment", "culture"},
}
labels["people in Romance of the Three Kingdoms"] = {
type = "name",
displaytitle = "people in ''Romance of the Three Kingdoms''",
description = "=people in ''{{w|Romance of the Three Kingdoms}}''",
parents = {"Romance of the Three Kingdoms"},
}
labels["perfumes"] = {
type = "type,set",
parents = {"fashion", "scents", "perfumery"},
}
labels["periodicals"] = {
type = "type,related-to",
parents = {"mass media", "literature"},
}
labels["personifications"] = {
type = "name",
parents = {"narratology"},
}
labels["places in Romance of the Three Kingdoms"] = {
type = "name",
displaytitle = "places in ''Romance of the Three Kingdoms''",
description = "=places in ''{{w|Romance of the Three Kingdoms}}''",
parents = {"Romance of the Three Kingdoms", "China"},
}
labels["plot devices"] = {
type = "type",
parents = {"narratology", "fiction"},
}
labels["poetry"] = {
type = "related-to",
parents = {"literature", "art"},
}
labels["polyamorous ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} between three or more characters.",
parents = {"ships (fandom) by relationship type"},
}
labels["Private Eye"] = {
type = "related-to",
displaytitle = "''Private Eye''",
description = "=the ''{{w|Private Eye}}'' franchise",
parents = {"British fiction"},
}
labels["Reddit"] = {
type = "related-to",
wikidata = 2195701,
description = "=the social news aggregation and discussion website {{w|Reddit}}",
parents = {"social media", "World Wide Web"},
}
labels["reference works"] = {
type = "type",
parents = {"books"},
}
labels["Roman deities"] = {
type = "name",
parents = {"gods", "Roman mythology"},
}
labels["Roman mythology"] = {
type = "related-to",
parents = {"mythology", "Ancient Rome"},
}
labels["romance fiction"] = {
type = "related-to",
parents = {"literary genres", "love"},
}
labels["Romance of the Three Kingdoms"] = {
type = "related-to",
wikidata = 70806,
displaytitle = "''Romance of the Three Kingdoms''",
description = "=''{{w|Romance of the Three Kingdoms}}''",
parents = {"fiction", "literature", "China"},
}
labels["RPF ships (fandom)"] = {
type = "name",
description = "{{{langname}}} names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} involving real people in a fictional relationship.",
additional = "For actual relationships between real people, see [[:Category:Couple nicknames]].",
parents = {"ships (fandom) by relationship type"},
}
labels["science fiction"] = {
type = "related-to",
parents = {"speculative fiction", "fiction"},
}
labels["SCP Foundation"] = {
type = "related-to",
wikidata = 17439649,
description = "English terms related to the SCP Wiki collaborative writing website and its setting of the {{w|SCP Foundation}}.",
parents = {"fantasy", "fiction", "horror", "science fiction", "supernatural"},
}
labels["sculpture"] = {
type = "related-to",
parents = {"art"},
}
labels["Shahnameh"] = {
type = "related-to",
wikidata = 8279,
displaytitle = "''Shahnameh''",
description = "=''Shahnameh''",
parents = {"fiction", "poetry", "literature", "Persia"},
}
labels["Shahnameh characters"] = {
type = "name",
description = "=characters in the [[Shahnameh]]",
parents = {"Shahnameh"},
}
labels["shapeshifters"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore"},
}
labels["Sherlock Holmes"] = {
type = "related-to",
wikidata = 2316684,
description = "=the [[Sherlock Holmes]] stories by {{w|Arthur Conan Doyle}} and adaptations of them",
parents = {"British fiction", "literature"},
}
labels["Sherlock (TV series)"] = {
type = "related-to",
wikidata = 192837,
displaytitle = "''Sherlock'' (TV series)",
description = "=the television series ''[[w:Sherlock (TV series)|Sherlock]]'' (2010–2017)",
parents = {"Sherlock Holmes", "television"},
}
labels["shipping (fandom)"] = {
type = "related-to",
description = "={{l|en|ship|shipping|id=fandomverb}} (i.e., in [[fandom]], supporting a fictional romantic relationship between two characters)",
parents = {"fandom", "romance fiction"},
}
labels["ships (fandom)"] = {
type = "grouping",
description = "=names used in [[fandom]] for specific {{l|en|ship|ships|id=fandomnoun}} i.e., a fictional relationship between two fictional characters or real people)",
parents = {"shipping (fandom)"},
}
labels["ships (fandom) by relationship type"] = {
type = "grouping",
description = "={{l|en|ship|ship|id=fandomnoun}} names organized by the type of relationship (e.g, [[heterosexual]], [[homosexual]], etc.)",
parents = {"ships (fandom)"},
}
labels["shippers (fandom)"] = {
type = "type",
description = "=[[shipper]]s (i.e., people who support a romantic or sexual relationship between characters or real people)",
parents = {"shipping (fandom)"},
}
labels["Slavic deities"] = {
type = "name",
parents = {"gods", "Slavic mythology"},
}
labels["Slavic mythology"] = {
type = "related-to",
description = "=the [[mythology]] of the [[Slav]]s",
parents = {"mythology"},
}
labels["Smallville (TV series)"] = {
type = "related-to",
wikidata = 180228,
displaytitle = "''Smallville'' (TV series)",
description = "=the television series ''{{w|Smallville}}'' (2001–2011)",
parents = {"American fiction", "Superman", "television"},
}
labels["social media"] = {
type = "related-to",
wikidata = 202833,
parents = {"mass media", "Internet"},
}
labels["South Korean idol fandom"] = {
type = "related-to",
wikidata = 39086123,
description = "=[[South Korea|South Korean]] [[idol]] [[fandom]]",
parents = {"idol fandom", "South Korea"},
}
labels["South Park"] = {
type = "related-to",
wikidata = 16538,
displaytitle = "''South Park''",
description = "{{{langname}}} terms derived from and/or related to the animated television series ''{{w|South Park}}''.",
parents = {"American fiction", "animation"},
}
labels["Star Trek"] = {
type = "related-to",
wikidata = 1092,
displaytitle = "''Star Trek''",
description = "=the ''{{w|Star Trek}}'' franchise",
parents = {"American fiction", "film", "science fiction", "television"},
}
labels["Star Wars"] = {
type = "related-to",
wikidata = 462,
displaytitle = "''Star Wars''",
description = "=the ''{{w|Star Wars}}'' franchise",
parents = {"American fiction", "film", "science fiction", "Disney"},
}
labels["Steven Universe"] = {
type = "related-to",
wikidata = 7615342,
displaytitle = "''Steven Universe''",
description = "=the animated television series ''{{w|Steven Universe}}''",
parents = {"American fiction", "animation"},
}
labels["stock characters"] = {
type = "type",
wikidata = 636497,
parents = {"fictional characters"},
}
labels["speculative fiction"] = {
type = "related-to",
wikidata = 9326077,
parents = {"fiction", "genres"},
}
labels["spider fighting"] = {
type = "related-to",
wikidata = 7577058,
description = "={{w|spider fighting}}",
parents = {"spiders", "human activity"},
}
labels["subcultures"] = {
type = "related-to",
description = "=[[subculture]]s",
parents = {"culture"},
}
labels["superheroes"] = {
type = "name",
wikidata = 188784,
description = "=[[superhero]]es",
parents = {"fictional characters"},
}
labels["Superman"] = {
type = "related-to",
wikidata = 79015,
description = "=the fictional [[superhero]] [[Superman]]",
parents = {"DC Comics", "fictional characters"},
}
labels["supernatural"] = {
type = "related-to",
wikidata = 80837,
description = "default with the",
parents = {"folklore"},
}
labels["Supernatural (TV series)"] = {
type = "related-to",
wikidata = 130585,
displaytitle = "''Supernatural'' (TV series)",
description = "=the television series ''[[w:Supernatural (American TV series)|Supernatural]]'' (2005–2020)",
parents = {"American fiction", "television"},
}
labels["Tamil deities"] = {
type = "name",
additional = "See [[w:Dravidian folk religion|Dravidian religion]] or [[w:Religion in ancient Tamilakam|Tamil region]] for more.",
parents = {"gods", "Hindu deities", "Tamil mythology"},
}
labels["Tamil mythology"] = {
type = "name",
additional = "See [[w:Dravidian folk religion|Dravidian religion]] or [[w:Religion in ancient Tamilakam|Tamil region]] for more.",
parents = {"mythology", "Hindu mythology", "Tamil Nadu, India"},
}
labels["television"] = {
type = "related-to",
wikidata = 289,
parents = {"mass media", "broadcasting"},
}
labels["The Handmaid's Tale"] = {
type = "related-to",
wikidata = 25207350,
displaytitle = "''The Handmaid's Tale''",
description = "=the 1985 novel ''{{w|The Handmaid's Tale}}'' by {{w|Margaret Atwood}} and its [[w:The Handmaid's Tale (TV series)|television adaptation]] (2017–)",
parents = {"Canadian fiction", "utopian and dystopian fiction", "literature"},
}
labels["The Hunger Games"] = {
type = "related-to",
wikidata = 11679,
displaytitle = "''The Hunger Games''",
description = "=''{{w|The Hunger Games}}'' novel series by {{w|Suzanne Collins}} and its film adaptations",
parents = {"American fiction", "science fiction", "utopian and dystopian fiction", "literature"},
}
labels["The Matrix"] = {
type = "related-to",
wikidata = 83495,
displaytitle = "''The Matrix''",
description = "=''{{w|The Matrix}}''",
parents = {"American fiction", "science fiction", "utopian and dystopian fiction"},
}
labels["The Simpsons"] = {
type = "related-to",
wikidata = 886,
displaytitle = "''The Simpsons''",
description = "{{{langname}}} terms derived from and/or related to the animated television series ''{{w|The Simpsons}}''.",
parents = {"American fiction", "animation", "Disney"},
}
labels["The Walking Dead"] = {
type = "related-to",
wikidata = 232737,
displaytitle = "''The Walking Dead''",
description = "=the television series ''[[w:The Walking Dead (TV series)|The Walking Dead]]'' (2010–2022) and the comic series from which it was adapted",
parents = {"American fiction", "television", "utopian and dystopian fiction", "zombies"},
}
labels["The Wizard of Oz"] = {
type = "related-to",
wikidata = 130295,
displaytitle = "''The Wizard of Oz''",
description = "=the fantasy novel ''{{w|The Wonderful Wizard of Oz}}'', subsequent books or films derived from it, such as the ''[[w:The Wizard of Oz (1939 film)|1939 film]]''.",
parents = {"American fiction", "fantasy", "literature"},
}
labels["The X-Files"] = {
type = "related-to",
wikidata = 2744,
displaytitle = "''The X-Files''",
description = "=the ''{{w|The X-Files}}'' franchise",
parents = {"American fiction", "science fiction", "television"},
}
labels["theater"] = {
type = "related-to",
parents = {"art", "entertainment"},
}
labels["Thracian deities"] = {
type = "name",
parents = {"gods"},
}
labels["TikTok"] = {
type = "related-to",
wikidata = 48938223,
description = "=the video-sharing and social-networking service {{w|TikTok}}",
parents = {"social media", "World Wide Web"},
}
labels["Tupi mythology"] = {
type = "related-to",
parents = {"mythology", "Brazil"},
}
labels["Twilight (novel series)"] = {
type = "related-to",
wikidata = 44523,
displaytitle = "''Twilight'' (novel series)",
description = "=the ''[[w:Twilight (series)|Twilight]]'' franchise",
parents = {"American fiction", "fantasy", "literature", "vampires"},
}
labels["Twitter"] = {
type = "related-to",
wikidata = 918,
description = "=the social networking and microblogging service {{w|Twitter}}",
parents = {"social media", "World Wide Web"},
}
labels["Tumblr"] = {
type = "related-to",
wikidata = 384060,
description = "=the microblogging and social networking service {{w|Tumblr}}",
parents = {"social media", "World Wide Web"},
}
labels["utopian and dystopian fiction"] = {
type = "related-to",
parents = {"speculative fiction"},
}
labels["vampires"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore", "death", "horror", "blood"},
}
labels["vampire lifestyle"] = {
type = "related-to",
description = "={{w|vampire lifestyle|the vampire lifestyle}} (i.e., a subculture which roleplays the stereotypical habits of vampires)",
parents = {"subcultures", "vampires"},
}
labels["Virtual YouTuber"] = {
type = "related-to",
wikidata = 55155641,
description = "=[[virtual YouTuber]]s ([[VTuber]]s)",
parents = {"YouTube", "Entertainment"},
}
labels["web design"] = {
type = "related-to",
parents = {"design", "World Wide Web"},
}
labels["werewolves"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore", "shapeshifters", "horror"},
}
labels["worldbuilding"] = {
type = "related-to",
parents = {"narratology", "speculative fiction"},
}
labels["Xena: Warrior Princess"] = {
type = "related-to",
wikidata = 38497,
displaytitle = "''Xena: Warrior Princess''",
description = "=the television series ''{{w|Xena: Warrior Princess}}'' (1995–2001)",
parents = {"American fiction", "fantasy", "television"},
}
labels["YouTube"] = {
type = "related-to",
wikidata = 866,
description = "=the video-sharing website {{w|YouTube}}",
parents = {"social media", "World Wide Web", "Google"},
}
labels["YouTube Poop"] = {
type = "related-to",
wikidata = 16927904,
parents = {"YouTube", "Internet memes"},
}
labels["zombies"] = {
type = "related-to,type",
parents = {"mythological creatures", "characters from folklore", "death", "horror"},
}
return labels
s8j4esgk89qb5keh8ioyd43cphnuma6
Mòideal:category tree/topic/Religion
828
17752
88445
2026-07-23T19:36:46Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88445
Scribunto
text/plain
local labels = {}
labels["religion"] = {
type = "related-to",
parents = {"culture"},
}
labels["afterlife"] = {
type = "related-to",
description = "=the [[afterlife]] (existence after death)",
parents = {"religion", "mythology", "death"},
}
labels["dharma"] = {
type = "related-to",
parents = {"Hinduism", "Buddhism", "Sikhism", "Jainism"},
}
labels["divine epithets"] = {
type = "name",
description = "{{{langname}}} terms used as conventional [[epithet]]s for [[deity|deities]].",
parents = {"gods", "titles"},
}
labels["God"] = {
type = "related-to",
description = "=[[God]] as an entity or an idea",
parents = {"gods", "Judaism", "Christianity", "Islam"},
}
labels["gods"] = {
type = "name,type",
parents = {"religion"},
commonscat = true,
wpcat = true,
}
labels["hell"] = {
type = "related-to",
parents = {"afterlife", "horror", "torture"},
}
labels["places of worship"] = {
type = "type",
parents = {"religion", "buildings"},
}
labels["prayer"] = {
type = "related-to",
parents = {"religion"},
}
-- Buddhism
labels["Buddhism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Buddhas"] = {
type = "name",
parents = {"Buddhism"},
}
labels["Bodhisattvas"] = {
type = "name",
parents = {"Buddhism"},
}
labels["Buddhist deities"] = {
type = "name",
parents = {"gods", "Buddhism"},
}
--
-- Brazilian religion
labels["Afro-Brazilian religion"] = {
breadcrumb = "Afro-Brazilian",
type = "related-to",
parents = {"religion"},
}
labels["Candomblé"] = {
type = "related-to",
parents = {"Afro-Brazilian religion"},
}
labels["Quimbanda"] = {
type = "related-to",
parents = {"Afro-Brazilian religion"},
}
labels["Umbanda"] = {
type = "related-to",
parents = {"Afro-Brazilian religion"},
}
--
-- Christianity
labels["Christianity"] = {
type = "related-to",
parents = {"Abrahamism"},
}
labels["Church of the East"] = {
type = "related-to",
description = "default with the",
parents = {"Eastern Christianity"},
}
labels["Catholicism"] = {
type = "related-to",
parents = {"Christianity"},
}
labels["Eastern Christianity"] = {
breadcrumb = "Eastern",
type = "related-to",
parents = {"Christianity"},
}
labels["crosses"] = {
type = "type",
description = "=[[cross]]es",
parents = {"Christianity"},
}
labels["Eastern Catholicism"] = {
breadcrumb = "Eastern",
type = "related-to",
parents = {"Catholicism", "Eastern Christianity"},
}
labels["Roman Catholicism"] = {
breadcrumb = "Roman",
type = "related-to",
parents = {"Catholicism"},
}
labels["Canon law"] = {
type = "related-to",
parents = {"Roman Catholicism", "Law"},
}
labels["Protestantism"] = {
type = "related-to",
parents = {"Christianity"},
}
labels["Anglicanism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Calvinism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["evangelicalism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Lutheranism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Methodism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Quakerism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Orthodox Christianity"] = {
breadcrumb = "Orthodoxy",
type = "related-to",
parents = {"Eastern Christianity"},
}
labels["Coptic Orthodoxy"] = {
breadcrumb = "Coptic",
type = "related-to",
parents = {"Oriental Orthodoxy", "Egypt"},
}
labels["Eastern Orthodoxy"] = {
breadcrumb = "Eastern",
type = "related-to",
parents = {"Orthodox Christianity"},
}
labels["Greek Orthodoxy"] = {
breadcrumb = "Greek",
type = "related-to",
parents = {"Eastern Orthodoxy", "Greece"},
}
labels["Oriental Orthodoxy"] = {
breadcrumb = "Oriental",
type = "related-to",
parents = {"Orthodox Christianity"},
}
labels["Russian Orthodoxy"] = {
breadcrumb = "Russian",
type = "related-to",
parents = {"Eastern Orthodoxy", "Russia"},
}
labels["Syriac Orthodoxy"] = {
breadcrumb = "Syriac",
type = "related-to",
parents = {"Oriental Orthodoxy", "Egypt"},
}
labels["Mormonism"] = {
type = "related-to",
parents = {"Christianity"},
}
--
-- Hinduism
labels["Hinduism"] = {
type = "related-to",
parents = {"religion", "India"},
}
labels["Vaishnavism"] = {
type = "related-to",
parents = {"Hinduism"},
}
labels["Vedic religion"] = {
breadcrumb = "Vedic",
type = "related-to",
description = "=the {{w|historical Vedic religion}}",
parents = {"Hinduism"},
}
labels["Shaivism"] = {
type = "related-to",
parents = {"Hinduism"},
}
labels["Mahabharata"] = {
type = "related-to",
description = "=the [[Mahabharata]], a Hindu epic",
parents = {"Hinduism"},
}
labels["Ramayana"] = {
type = "related-to",
description = "default with the",
parents = {"Hinduism"},
}
--
-- Islam
labels["Islam"] = {
type = "related-to",
description = "=[[Islam]]ic religion or culture, or to [[Muslim]]s",
parents = {"Abrahamism"},
}
labels["Ahmadiyya"] = {
type = "related-to",
parents = {"Islam"},
}
labels["Shi'ism"] = {
type = "related-to",
parents = {"Islam"},
}
labels["Sufism"] = {
type = "related-to",
wikidata = 9603,
parents = {"Islam", "mysticism"},
}
labels["Sunnism"] = {
type = "related-to",
wikidata = 483654,
parents = {"Islam"},
}
labels["Islamic prophets"] = {
breadcrumb = "Prophets",
type = "set",
parents = {"Islam"},
}
labels["Qur'an"] = {
type = "related-to",
description = "default with the",
parents = {"Islam"},
}
--
-- Judaism
labels["Judaism"] = {
type = "related-to",
parents = {"Abrahamism"},
}
labels["Jewish law"] = {
type = "related-to",
parents = {"Judaism", "law"},
}
labels["Orthodox Judaism"] = {
breadcrumb = "Orthodox",
type = "related-to",
parents = {"Judaism"},
}
--
-- Paganism
labels["paganism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Đạo Mẫu"] = {
type = "related-to",
parents = {"paganism"},
}
labels["Germanic paganism"] = {
breadcrumb = "Germanic",
type = "related-to",
parents = {"paganism", "Germanic mythology"},
}
labels["Shamanism"] = {
type = "related-to",
parents = {"paganism"},
}
labels["Slavic paganism"] = {
breadcrumb = "Slavic",
type = "related-to",
parents = {"paganism", "Slavic mythology"},
}
labels["Wicca"] = {
type = "related-to",
parents = {"paganism"},
}
--
labels["atheism"] = {
type = "related-to",
parents = {"religion", "philosophy"},
}
labels["creationism"] = {
type = "related-to",
parents = {"Christianity", "Judaism", "Islam", "pseudoscience", "obsolete scientific theories"},
}
labels["Gnosticism"] = {
type = "related-to",
parents = {"Christianity", "Judaism", "mysticism"},
}
labels["Abrahamism"] = {
type = "related-to",
parents = {"religion"},
}
labels["voodoo"] = {
type = "related-to",
description = "=Louisiana Voodoo, Haitian Vodoun, or other forms of [[voodoo]] spirituality and belief",
parents = {"religion"},
}
labels["Manichaeism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Mithraism"] = {
type = "related-to",
parents = {"religion", "Ancient Rome"},
}
labels["monasticism"] = {
type = "related-to",
parents = {"religion"},
}
labels["mysticism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Odinani"] = {
type = "related-to",
description = "[[Odinani]], the [[Igbo]] religion",
parents = {"religion"},
}
labels["Yazidism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Yoruba religion"] = {
breadcrumb = "Yoruba",
type = "related-to",
description = "=the {{w|Yoruba religion}}",
parents = {"religion"},
wp = true,
wpcat = true,
commonscat = true,
}
labels["Zoroastrianism"] = {
type = "related-to",
parents = {"religion", "Ancient Near East"},
}
labels["Discordianism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Valentinianism"] = {
type = "related-to",
parents = {"Gnosticism"},
}
labels["Tengrism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Taoism"] = {
type = "related-to",
parents = {"religion", "China"},
}
labels["Scientology"] = {
type = "related-to",
parents = {"religion"},
}
labels["spiritualism"] = {
type = "related-to",
wikidata = 829348,
parents = {"occult", "religion"},
wpcat = true,
commonscat = true,
}
labels["Shinto"] = {
type = "related-to",
parents = {"religion", "Japan"},
}
labels["Sikhism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Baháʼí Faith"] = {
type = "related-to",
description = "=the {{w|Baháʼí Faith}}",
parents = {"religion", "Abrahamism"},
}
labels["Rastafari"] = {
type = "related-to",
parents = {"religion", "Abrahamism"},
}
labels["Raëlism"] = {
type = "related-to",
parents = {"religion", "Abrahamism"},
}
labels["Aum Shinrikyo"] = {
type = "related-to",
parents = {"religion"},
}
labels["Igala religion"] = {
breadcrumb = "Igala",
type = "related-to",
description = "=the {{w|Igala Kingdom|Igala religion}}",
parents = {"religion"},
}
labels["Jainism"] = {
type = "related-to",
parents = {"religion"},
}
-- Philippines
labels["Anitism"] = {
type = "related-to",
description = "=the {{w|Indigenous Philippine folk religions}}",
parents = {"religion", "Philippines"},
}
labels["Igorot beliefs"] = {
breadcrumb = "Igorot",
type = "related-to",
parents = {"Anitism"},
}
labels["Balangao beliefs"] = {
breadcrumb = "Balangao",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Bontoc beliefs"] = {
breadcrumb = "Bontoc",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Ibaloi beliefs"] = {
breadcrumb = "Ibaloi",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Ifugao beliefs"] = {
breadcrumb = "Ifugao",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Isnag beliefs"] = {
breadcrumb = "Isnag",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Itneg beliefs"] = {
breadcrumb = "Itneg",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Kalanguya beliefs"] = {
breadcrumb = "Kalanguya",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Kalinga beliefs"] = {
breadcrumb = "Kalinga",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Kankanaey beliefs"] = {
breadcrumb = "Kankanaey",
type = "related-to",
parents = {"Igorot beliefs"},
}
-- Books
labels["Bhagavata Purana"] = {
type = "related-to",
description = "default with the",
parents = {"Hinduism"},
}
labels["Bible"] = {
type = "related-to",
description = "default with the",
-- place under 'religion' first because it is a scripture of two religions
parents = {"religion", "Christianity", "Judaism"},
}
labels["books of the Bible"] = {
type = "name",
description = "=books of the [[Bible]]",
parents = {"Bible"},
}
labels["biblical characters"] = {
type = "name",
description = "=characters in the [[Bible]]",
parents = {"Bible"},
}
return labels
tbyj24hyptwcnaxi3m3vl4fgipvdui9
88446
88445
2026-07-27T00:21:45Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Religion]]
88445
Scribunto
text/plain
local labels = {}
labels["religion"] = {
type = "related-to",
parents = {"culture"},
}
labels["afterlife"] = {
type = "related-to",
description = "=the [[afterlife]] (existence after death)",
parents = {"religion", "mythology", "death"},
}
labels["dharma"] = {
type = "related-to",
parents = {"Hinduism", "Buddhism", "Sikhism", "Jainism"},
}
labels["divine epithets"] = {
type = "name",
description = "{{{langname}}} terms used as conventional [[epithet]]s for [[deity|deities]].",
parents = {"gods", "titles"},
}
labels["God"] = {
type = "related-to",
description = "=[[God]] as an entity or an idea",
parents = {"gods", "Judaism", "Christianity", "Islam"},
}
labels["gods"] = {
type = "name,type",
parents = {"religion"},
commonscat = true,
wpcat = true,
}
labels["hell"] = {
type = "related-to",
parents = {"afterlife", "horror", "torture"},
}
labels["places of worship"] = {
type = "type",
parents = {"religion", "buildings"},
}
labels["prayer"] = {
type = "related-to",
parents = {"religion"},
}
-- Buddhism
labels["Buddhism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Buddhas"] = {
type = "name",
parents = {"Buddhism"},
}
labels["Bodhisattvas"] = {
type = "name",
parents = {"Buddhism"},
}
labels["Buddhist deities"] = {
type = "name",
parents = {"gods", "Buddhism"},
}
--
-- Brazilian religion
labels["Afro-Brazilian religion"] = {
breadcrumb = "Afro-Brazilian",
type = "related-to",
parents = {"religion"},
}
labels["Candomblé"] = {
type = "related-to",
parents = {"Afro-Brazilian religion"},
}
labels["Quimbanda"] = {
type = "related-to",
parents = {"Afro-Brazilian religion"},
}
labels["Umbanda"] = {
type = "related-to",
parents = {"Afro-Brazilian religion"},
}
--
-- Christianity
labels["Christianity"] = {
type = "related-to",
parents = {"Abrahamism"},
}
labels["Church of the East"] = {
type = "related-to",
description = "default with the",
parents = {"Eastern Christianity"},
}
labels["Catholicism"] = {
type = "related-to",
parents = {"Christianity"},
}
labels["Eastern Christianity"] = {
breadcrumb = "Eastern",
type = "related-to",
parents = {"Christianity"},
}
labels["crosses"] = {
type = "type",
description = "=[[cross]]es",
parents = {"Christianity"},
}
labels["Eastern Catholicism"] = {
breadcrumb = "Eastern",
type = "related-to",
parents = {"Catholicism", "Eastern Christianity"},
}
labels["Roman Catholicism"] = {
breadcrumb = "Roman",
type = "related-to",
parents = {"Catholicism"},
}
labels["Canon law"] = {
type = "related-to",
parents = {"Roman Catholicism", "Law"},
}
labels["Protestantism"] = {
type = "related-to",
parents = {"Christianity"},
}
labels["Anglicanism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Calvinism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["evangelicalism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Lutheranism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Methodism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Quakerism"] = {
type = "related-to",
parents = {"Protestantism"},
}
labels["Orthodox Christianity"] = {
breadcrumb = "Orthodoxy",
type = "related-to",
parents = {"Eastern Christianity"},
}
labels["Coptic Orthodoxy"] = {
breadcrumb = "Coptic",
type = "related-to",
parents = {"Oriental Orthodoxy", "Egypt"},
}
labels["Eastern Orthodoxy"] = {
breadcrumb = "Eastern",
type = "related-to",
parents = {"Orthodox Christianity"},
}
labels["Greek Orthodoxy"] = {
breadcrumb = "Greek",
type = "related-to",
parents = {"Eastern Orthodoxy", "Greece"},
}
labels["Oriental Orthodoxy"] = {
breadcrumb = "Oriental",
type = "related-to",
parents = {"Orthodox Christianity"},
}
labels["Russian Orthodoxy"] = {
breadcrumb = "Russian",
type = "related-to",
parents = {"Eastern Orthodoxy", "Russia"},
}
labels["Syriac Orthodoxy"] = {
breadcrumb = "Syriac",
type = "related-to",
parents = {"Oriental Orthodoxy", "Egypt"},
}
labels["Mormonism"] = {
type = "related-to",
parents = {"Christianity"},
}
--
-- Hinduism
labels["Hinduism"] = {
type = "related-to",
parents = {"religion", "India"},
}
labels["Vaishnavism"] = {
type = "related-to",
parents = {"Hinduism"},
}
labels["Vedic religion"] = {
breadcrumb = "Vedic",
type = "related-to",
description = "=the {{w|historical Vedic religion}}",
parents = {"Hinduism"},
}
labels["Shaivism"] = {
type = "related-to",
parents = {"Hinduism"},
}
labels["Mahabharata"] = {
type = "related-to",
description = "=the [[Mahabharata]], a Hindu epic",
parents = {"Hinduism"},
}
labels["Ramayana"] = {
type = "related-to",
description = "default with the",
parents = {"Hinduism"},
}
--
-- Islam
labels["Islam"] = {
type = "related-to",
description = "=[[Islam]]ic religion or culture, or to [[Muslim]]s",
parents = {"Abrahamism"},
}
labels["Ahmadiyya"] = {
type = "related-to",
parents = {"Islam"},
}
labels["Shi'ism"] = {
type = "related-to",
parents = {"Islam"},
}
labels["Sufism"] = {
type = "related-to",
wikidata = 9603,
parents = {"Islam", "mysticism"},
}
labels["Sunnism"] = {
type = "related-to",
wikidata = 483654,
parents = {"Islam"},
}
labels["Islamic prophets"] = {
breadcrumb = "Prophets",
type = "set",
parents = {"Islam"},
}
labels["Qur'an"] = {
type = "related-to",
description = "default with the",
parents = {"Islam"},
}
--
-- Judaism
labels["Judaism"] = {
type = "related-to",
parents = {"Abrahamism"},
}
labels["Jewish law"] = {
type = "related-to",
parents = {"Judaism", "law"},
}
labels["Orthodox Judaism"] = {
breadcrumb = "Orthodox",
type = "related-to",
parents = {"Judaism"},
}
--
-- Paganism
labels["paganism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Đạo Mẫu"] = {
type = "related-to",
parents = {"paganism"},
}
labels["Germanic paganism"] = {
breadcrumb = "Germanic",
type = "related-to",
parents = {"paganism", "Germanic mythology"},
}
labels["Shamanism"] = {
type = "related-to",
parents = {"paganism"},
}
labels["Slavic paganism"] = {
breadcrumb = "Slavic",
type = "related-to",
parents = {"paganism", "Slavic mythology"},
}
labels["Wicca"] = {
type = "related-to",
parents = {"paganism"},
}
--
labels["atheism"] = {
type = "related-to",
parents = {"religion", "philosophy"},
}
labels["creationism"] = {
type = "related-to",
parents = {"Christianity", "Judaism", "Islam", "pseudoscience", "obsolete scientific theories"},
}
labels["Gnosticism"] = {
type = "related-to",
parents = {"Christianity", "Judaism", "mysticism"},
}
labels["Abrahamism"] = {
type = "related-to",
parents = {"religion"},
}
labels["voodoo"] = {
type = "related-to",
description = "=Louisiana Voodoo, Haitian Vodoun, or other forms of [[voodoo]] spirituality and belief",
parents = {"religion"},
}
labels["Manichaeism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Mithraism"] = {
type = "related-to",
parents = {"religion", "Ancient Rome"},
}
labels["monasticism"] = {
type = "related-to",
parents = {"religion"},
}
labels["mysticism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Odinani"] = {
type = "related-to",
description = "[[Odinani]], the [[Igbo]] religion",
parents = {"religion"},
}
labels["Yazidism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Yoruba religion"] = {
breadcrumb = "Yoruba",
type = "related-to",
description = "=the {{w|Yoruba religion}}",
parents = {"religion"},
wp = true,
wpcat = true,
commonscat = true,
}
labels["Zoroastrianism"] = {
type = "related-to",
parents = {"religion", "Ancient Near East"},
}
labels["Discordianism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Valentinianism"] = {
type = "related-to",
parents = {"Gnosticism"},
}
labels["Tengrism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Taoism"] = {
type = "related-to",
parents = {"religion", "China"},
}
labels["Scientology"] = {
type = "related-to",
parents = {"religion"},
}
labels["spiritualism"] = {
type = "related-to",
wikidata = 829348,
parents = {"occult", "religion"},
wpcat = true,
commonscat = true,
}
labels["Shinto"] = {
type = "related-to",
parents = {"religion", "Japan"},
}
labels["Sikhism"] = {
type = "related-to",
parents = {"religion"},
}
labels["Baháʼí Faith"] = {
type = "related-to",
description = "=the {{w|Baháʼí Faith}}",
parents = {"religion", "Abrahamism"},
}
labels["Rastafari"] = {
type = "related-to",
parents = {"religion", "Abrahamism"},
}
labels["Raëlism"] = {
type = "related-to",
parents = {"religion", "Abrahamism"},
}
labels["Aum Shinrikyo"] = {
type = "related-to",
parents = {"religion"},
}
labels["Igala religion"] = {
breadcrumb = "Igala",
type = "related-to",
description = "=the {{w|Igala Kingdom|Igala religion}}",
parents = {"religion"},
}
labels["Jainism"] = {
type = "related-to",
parents = {"religion"},
}
-- Philippines
labels["Anitism"] = {
type = "related-to",
description = "=the {{w|Indigenous Philippine folk religions}}",
parents = {"religion", "Philippines"},
}
labels["Igorot beliefs"] = {
breadcrumb = "Igorot",
type = "related-to",
parents = {"Anitism"},
}
labels["Balangao beliefs"] = {
breadcrumb = "Balangao",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Bontoc beliefs"] = {
breadcrumb = "Bontoc",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Ibaloi beliefs"] = {
breadcrumb = "Ibaloi",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Ifugao beliefs"] = {
breadcrumb = "Ifugao",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Isnag beliefs"] = {
breadcrumb = "Isnag",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Itneg beliefs"] = {
breadcrumb = "Itneg",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Kalanguya beliefs"] = {
breadcrumb = "Kalanguya",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Kalinga beliefs"] = {
breadcrumb = "Kalinga",
type = "related-to",
parents = {"Igorot beliefs"},
}
labels["Kankanaey beliefs"] = {
breadcrumb = "Kankanaey",
type = "related-to",
parents = {"Igorot beliefs"},
}
-- Books
labels["Bhagavata Purana"] = {
type = "related-to",
description = "default with the",
parents = {"Hinduism"},
}
labels["Bible"] = {
type = "related-to",
description = "default with the",
-- place under 'religion' first because it is a scripture of two religions
parents = {"religion", "Christianity", "Judaism"},
}
labels["books of the Bible"] = {
type = "name",
description = "=books of the [[Bible]]",
parents = {"Bible"},
}
labels["biblical characters"] = {
type = "name",
description = "=characters in the [[Bible]]",
parents = {"Bible"},
}
return labels
tbyj24hyptwcnaxi3m3vl4fgipvdui9
Mòideal:category tree/topic/Food and drink
828
17753
88447
2026-07-23T19:36:26Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88447
Scribunto
text/plain
local labels = {}
labels["food and drink"] = {
type = "related-to",
description = "=[[food]] and [[drink]]",
additional = "Entries about specific foods or beverages should go in an appropriate subcategory.",
parents = {"all topics"},
wpcat = true,
commonscat = true,
}
labels["alcohol production"] = {
type = "related-to",
parents = {"alcoholic beverages"},
}
labels["alcoholic beverages"] = {
type = "set",
parents = {"beverages", "recreational drugs"},
}
labels["animal foods"] = {
type = "set",
parents = {"food and drink"},
}
labels["apple cultivars"] = {
type = "name",
parents = {"fruits", "pome fruits"},
}
labels["baking"] = {
type = "related-to",
parents = {"cooking"},
}
labels["banana cultivars"] = {
type = "name",
parents = {"fruits", "Zingiberales order plants"},
}
labels["beer"] = {
type = "related-to",
parents = {"alcoholic beverages"},
}
labels["berries"] = {
type = "set",
parents = {"fruits"},
}
labels["beverages"] = {
type = "set",
parents = {"food and drink", "drinking", "liquids"},
}
labels["breads"] = {
type = "set",
parents = {"foods"},
}
labels["breakfast cereals"] = {
type = "set",
parents = {"foods"},
}
labels["brewing"] = {
type = "related-to",
parents = {"alcohol production"},
}
labels["cakes and pastries"] = {
type = "set",
description = "=[[cake]]s and [[pastry|pastries]]",
parents = {"foods", "desserts"},
}
labels["cheeses"] = {
type = "set",
parents = {"foods", "dairy products"},
}
labels["cherry cultivars"] = {
type = "name",
parents = {"Prunus genus plants", "fruits"},
}
labels["chocolate"] = {
type = "related-to",
parents = {"sweets"},
}
labels["cocktails"] = {
type = "set",
parents = {"alcoholic beverages"},
}
labels["coffee"] = {
type = "related-to",
parents = {"beverages"},
}
labels["condiments"] = {
type = "set",
parents = {"foods"},
}
labels["cooking"] = {
type = "related-to",
parents = {"food and drink"},
}
labels["cuts of meat"] = {
type = "set",
description = "=[[cut]]s of [[meat]]",
parents = {"meats"},
}
labels["dairy products"] = {
type = "set",
parents = {"food and drink"},
}
labels["date varieties"] = {
type = "name",
wp = {"List of date cultivars"},
parents = {"fruits", "palm trees"},
}
labels["desserts"] = {
type = "set",
parents = {"foods"},
}
labels["dim sum"] = {
type = "related-to",
parents = {"food and drink", "China"},
}
labels["diets"] = {
type = "set",
description = "=diets, including ones intended for weight loss and ones based on religious, cultural, or philosophical traditions and principles",
parents = {"food and drink"},
}
labels["distilled beverages"] = {
type = "set",
parents = {"alcoholic beverages"},
}
labels["cannabis edibles"] = {
type = "set",
description = "=[[cannabis]] [[edible]]s",
parents = {"marijuana", "food and drink"},
wp = true,
commonscat = true,
}
labels["fats and oils"] = {
type = "set",
description = "=[[fat]]s and [[oil]]s",
parents = {"foods"},
}
labels["foods"] = {
type = "set",
parents = {"food and drink", "eating"},
}
labels["fruits"] = {
type = "set",
parents = {"foods", "plants"},
}
labels["grains"] = {
type = "set",
parents = {"foods", "grasses"},
}
labels["grape cultivars"] = {
type = "name",
parents = {"grapevines", "wines"},
}
labels["honey"] = {
type = "related-to",
parents = {"beekeeping", "condiments"},
}
labels["ice cream"] = {
type = "related-to",
parents = {"foods"},
}
-- FIXME, rename to 'types of kimchi'
labels["kimchi"] = {
type = "type",
parents = {"foods", "Korea"},
}
labels["liqueurs"] = {
type = "set",
parents = {"alcoholic beverages"},
}
labels["maize (food)"] = {
type = "related-to",
description = "=[[maize]] (called [[corn]] in North America) as a [[food]]",
additional = "For terms related to maize as a crop, see [[:Category:Maize (crop)]] and for maize as a plant, see [[:Category:Maize (plant)]].",
parents = {"foods", "grains"},
}
labels["mate"] = {
type = "related-to",
parents = {"beverages"},
}
labels["meals"] = {
type = "set",
parents = {"foods"},
}
labels["meats"] = {
type = "set",
parents = {"foods"},
}
labels["milk"] = {
type = "related-to",
parents = {"beverages", "dairy products", "bodily fluids"},
}
labels["nuts"] = {
type = "type",
description = "=culinary [[nut]]s, including those that are not nuts in the botanical sense",
parents = {"foods", "plants"},
wpcat = "Edible nuts and seeds",
commonscat = true,
}
labels["pasta"] = {
type = "type",
parents = {"foods"},
}
labels["pear cultivars"] = {
type = "name",
parents = {"fruits", "pome fruits"},
}
labels["pies"] = {
type = "set",
description = "=[[pie]]s",
parents = {"foods", "desserts"},
}
labels["pizza"] = {
type = "related-to",
parents = {"foods"},
}
labels["plant milk"] = {
type = "set",
parents = {"milk", "vegetarianism"},
}
labels["potatoes"] = {
type = "type,related-to",
description = "=[[potato]]es",
parents = {"nightshades", "solanums", "root vegetables"},
}
labels["root vegetables"] = {
type = "set",
description = "=roots, both true roots such as [[carrot]]s, [[turnip]]es, and [[sweet potato]]es, and root-like non-roots, such as [[potato]]es, [[ginseng]], and [[arrowhead]]s",
parents = {"vegetables"},
}
labels["salads"] = {
type = "set",
parents = {"foods"},
}
labels["salad dressings"] = {
type = "set",
parents = {"sauces"},
}
labels["salted and pickled foods"] = {
type = "set",
description = "=[[salted]] or [[pickled]] foods",
parents = {"foods"},
}
labels["sandwiches"] = {
type = "type,name",
parents = {"foods"},
}
labels["sauces"] = {
type = "type",
parents = {"foods"},
}
labels["sausages"] = {
type = "type",
parents = {"meats"},
}
labels["seafood"] = {
type = "type",
parents = {"foods"},
}
labels["seasonings"] = {
type = "set",
parents = {"foods"},
}
labels["seeds"] = {
type = "set",
parents = {"foods", "plants", "agriculture"},
}
labels["snacks"] = {
type = "set",
parents = {"foods"},
}
labels["soups"] = {
type = "set",
parents = {"foods"},
}
labels["spices"] = {
type = "set",
parents = {"spices and herbs"},
}
labels["spices and herbs"] = {
type = "set",
parents = {"foods"},
}
labels["sushi"] = {
type = "type",
parents = {"foods", "Japan"},
}
labels["sweets"] = {
type = "set",
parents = {"foods"},
}
labels["tableware"] = {
type = "related-to",
description = "=any instruments used in the process of eating and drinking such as [[cutlery]] and [[container]]s (eg. plates, bowls or glasses)",
parents = {"food and drink"},
}
labels["tea"] = {
type = "set",
parents = {"beverages"},
}
labels["vegetables"] = {
type = "set",
description = "=[[vegetable]]s: the edible parts of plants that are not considered in a culinary sense to be [[fruit]]s, [[grain]]s, or [[spice]]s",
parents = {"foods", "plants"},
}
labels["wine"] = {
type = "related-to",
parents = {"alcoholic beverages"},
}
labels["wines"] = {
type = "set",
parents = {"wine"},
}
labels["wine bottles"] = {
type = "type",
parents = {"wine"},
}
return labels
pglo8w65de5zu75y4pexu23hffwfca3
88448
88447
2026-07-27T00:22:27Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Food_and_drink]]
88447
Scribunto
text/plain
local labels = {}
labels["food and drink"] = {
type = "related-to",
description = "=[[food]] and [[drink]]",
additional = "Entries about specific foods or beverages should go in an appropriate subcategory.",
parents = {"all topics"},
wpcat = true,
commonscat = true,
}
labels["alcohol production"] = {
type = "related-to",
parents = {"alcoholic beverages"},
}
labels["alcoholic beverages"] = {
type = "set",
parents = {"beverages", "recreational drugs"},
}
labels["animal foods"] = {
type = "set",
parents = {"food and drink"},
}
labels["apple cultivars"] = {
type = "name",
parents = {"fruits", "pome fruits"},
}
labels["baking"] = {
type = "related-to",
parents = {"cooking"},
}
labels["banana cultivars"] = {
type = "name",
parents = {"fruits", "Zingiberales order plants"},
}
labels["beer"] = {
type = "related-to",
parents = {"alcoholic beverages"},
}
labels["berries"] = {
type = "set",
parents = {"fruits"},
}
labels["beverages"] = {
type = "set",
parents = {"food and drink", "drinking", "liquids"},
}
labels["breads"] = {
type = "set",
parents = {"foods"},
}
labels["breakfast cereals"] = {
type = "set",
parents = {"foods"},
}
labels["brewing"] = {
type = "related-to",
parents = {"alcohol production"},
}
labels["cakes and pastries"] = {
type = "set",
description = "=[[cake]]s and [[pastry|pastries]]",
parents = {"foods", "desserts"},
}
labels["cheeses"] = {
type = "set",
parents = {"foods", "dairy products"},
}
labels["cherry cultivars"] = {
type = "name",
parents = {"Prunus genus plants", "fruits"},
}
labels["chocolate"] = {
type = "related-to",
parents = {"sweets"},
}
labels["cocktails"] = {
type = "set",
parents = {"alcoholic beverages"},
}
labels["coffee"] = {
type = "related-to",
parents = {"beverages"},
}
labels["condiments"] = {
type = "set",
parents = {"foods"},
}
labels["cooking"] = {
type = "related-to",
parents = {"food and drink"},
}
labels["cuts of meat"] = {
type = "set",
description = "=[[cut]]s of [[meat]]",
parents = {"meats"},
}
labels["dairy products"] = {
type = "set",
parents = {"food and drink"},
}
labels["date varieties"] = {
type = "name",
wp = {"List of date cultivars"},
parents = {"fruits", "palm trees"},
}
labels["desserts"] = {
type = "set",
parents = {"foods"},
}
labels["dim sum"] = {
type = "related-to",
parents = {"food and drink", "China"},
}
labels["diets"] = {
type = "set",
description = "=diets, including ones intended for weight loss and ones based on religious, cultural, or philosophical traditions and principles",
parents = {"food and drink"},
}
labels["distilled beverages"] = {
type = "set",
parents = {"alcoholic beverages"},
}
labels["cannabis edibles"] = {
type = "set",
description = "=[[cannabis]] [[edible]]s",
parents = {"marijuana", "food and drink"},
wp = true,
commonscat = true,
}
labels["fats and oils"] = {
type = "set",
description = "=[[fat]]s and [[oil]]s",
parents = {"foods"},
}
labels["foods"] = {
type = "set",
parents = {"food and drink", "eating"},
}
labels["fruits"] = {
type = "set",
parents = {"foods", "plants"},
}
labels["grains"] = {
type = "set",
parents = {"foods", "grasses"},
}
labels["grape cultivars"] = {
type = "name",
parents = {"grapevines", "wines"},
}
labels["honey"] = {
type = "related-to",
parents = {"beekeeping", "condiments"},
}
labels["ice cream"] = {
type = "related-to",
parents = {"foods"},
}
-- FIXME, rename to 'types of kimchi'
labels["kimchi"] = {
type = "type",
parents = {"foods", "Korea"},
}
labels["liqueurs"] = {
type = "set",
parents = {"alcoholic beverages"},
}
labels["maize (food)"] = {
type = "related-to",
description = "=[[maize]] (called [[corn]] in North America) as a [[food]]",
additional = "For terms related to maize as a crop, see [[:Category:Maize (crop)]] and for maize as a plant, see [[:Category:Maize (plant)]].",
parents = {"foods", "grains"},
}
labels["mate"] = {
type = "related-to",
parents = {"beverages"},
}
labels["meals"] = {
type = "set",
parents = {"foods"},
}
labels["meats"] = {
type = "set",
parents = {"foods"},
}
labels["milk"] = {
type = "related-to",
parents = {"beverages", "dairy products", "bodily fluids"},
}
labels["nuts"] = {
type = "type",
description = "=culinary [[nut]]s, including those that are not nuts in the botanical sense",
parents = {"foods", "plants"},
wpcat = "Edible nuts and seeds",
commonscat = true,
}
labels["pasta"] = {
type = "type",
parents = {"foods"},
}
labels["pear cultivars"] = {
type = "name",
parents = {"fruits", "pome fruits"},
}
labels["pies"] = {
type = "set",
description = "=[[pie]]s",
parents = {"foods", "desserts"},
}
labels["pizza"] = {
type = "related-to",
parents = {"foods"},
}
labels["plant milk"] = {
type = "set",
parents = {"milk", "vegetarianism"},
}
labels["potatoes"] = {
type = "type,related-to",
description = "=[[potato]]es",
parents = {"nightshades", "solanums", "root vegetables"},
}
labels["root vegetables"] = {
type = "set",
description = "=roots, both true roots such as [[carrot]]s, [[turnip]]es, and [[sweet potato]]es, and root-like non-roots, such as [[potato]]es, [[ginseng]], and [[arrowhead]]s",
parents = {"vegetables"},
}
labels["salads"] = {
type = "set",
parents = {"foods"},
}
labels["salad dressings"] = {
type = "set",
parents = {"sauces"},
}
labels["salted and pickled foods"] = {
type = "set",
description = "=[[salted]] or [[pickled]] foods",
parents = {"foods"},
}
labels["sandwiches"] = {
type = "type,name",
parents = {"foods"},
}
labels["sauces"] = {
type = "type",
parents = {"foods"},
}
labels["sausages"] = {
type = "type",
parents = {"meats"},
}
labels["seafood"] = {
type = "type",
parents = {"foods"},
}
labels["seasonings"] = {
type = "set",
parents = {"foods"},
}
labels["seeds"] = {
type = "set",
parents = {"foods", "plants", "agriculture"},
}
labels["snacks"] = {
type = "set",
parents = {"foods"},
}
labels["soups"] = {
type = "set",
parents = {"foods"},
}
labels["spices"] = {
type = "set",
parents = {"spices and herbs"},
}
labels["spices and herbs"] = {
type = "set",
parents = {"foods"},
}
labels["sushi"] = {
type = "type",
parents = {"foods", "Japan"},
}
labels["sweets"] = {
type = "set",
parents = {"foods"},
}
labels["tableware"] = {
type = "related-to",
description = "=any instruments used in the process of eating and drinking such as [[cutlery]] and [[container]]s (eg. plates, bowls or glasses)",
parents = {"food and drink"},
}
labels["tea"] = {
type = "set",
parents = {"beverages"},
}
labels["vegetables"] = {
type = "set",
description = "=[[vegetable]]s: the edible parts of plants that are not considered in a culinary sense to be [[fruit]]s, [[grain]]s, or [[spice]]s",
parents = {"foods", "plants"},
}
labels["wine"] = {
type = "related-to",
parents = {"alcoholic beverages"},
}
labels["wines"] = {
type = "set",
parents = {"wine"},
}
labels["wine bottles"] = {
type = "type",
parents = {"wine"},
}
return labels
pglo8w65de5zu75y4pexu23hffwfca3
Mòideal:category tree/topic/Games
828
17754
88449
2026-07-23T19:36:27Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88449
Scribunto
text/plain
local labels = {}
labels["games"] = {
type = "related-to",
parents = {"recreation"},
}
labels["gaming"] = {
type = "related-to",
description = "=[[gaming]] terminology",
parents = {"games"},
}
labels["role-playing games"] = {
type = "related-to",
description = "=[[role-playing game]] mechanics, whether tabletop or [[:Category:{{{langcode}}}:Video games|video game]]",
additional = "These games also employ many terms from [[:Category:{{{langcode}}}:Fantasy]].",
parents = {"games"},
}
-- ==Real-world games==
labels["children's games"] = {
type = "name",
description = "=[[children]]'s [[game]]s",
parents = {"games"},
}
labels["playground games"] = {
type = "related-to",
description = "=games commonly played by children in a playground setting",
parents = {"games"},
}
labels["hand games"] = {
type = "related-to",
parents = {"games"},
}
labels["rock paper scissors"] = {
type = "related-to",
parents = {"hand games"},
}
labels["darts"] = {
type = "related-to",
description = "default no singularize",
parents = {"games"},
}
labels["billiards"] = {
type = "related-to",
description = "default no singularize",
parents = {"games"},
}
labels["bingo"] = {
type = "related-to",
parents = {"games"},
}
labels["bowling"] = {
type = "related-to",
parents = {"games"},
}
labels["bowls (game)"] = {
type = "related-to",
parents = {"games"},
}
labels["gambling"] = {
type = "related-to",
parents = {"games"},
}
labels["pinball"] = {
type = "related-to",
parents = {"games"},
}
labels["Rubik's Cube"] = {
type = "related-to",
description = "default with the wikify",
parents = {"games", "toys"},
}
labels["snooker"] = {
type = "related-to",
parents = {"games"},
}
labels["quiz competitions"] = {
type = "related-to",
parents = {"games"},
}
labels["crosswording"] = {
type = "related-to",
parents = {"games", "hobbies"},
}
-- ==Card games==
labels["card games"] = {
type = "set,related-to",
parents = {"games"},
}
-- ===Collectible card games===
labels["collectible card games"] = {
type = "related-to",
description = "={{w|collectible card games}} (also known as ''trading card games''), such as ''Magic: The Gathering''",
parents = {"card games"},
}
labels["Magic: The Gathering"] = {
type = "related-to",
displaytitle = "''Magic: The Gathering''",
description = "=the trading card game ''{{w|Magic: The Gathering}}''",
parents = {"collectible card games"},
}
--
labels["cribbage"] = {
type = "related-to",
parents = {"card games"},
}
labels["bridge"] = {
type = "related-to",
description = "=the [[game]] of [[bridge]]",
parents = {"card games"},
}
labels["dou dizhu"] = {
type = "related-to",
description = "=''{{w|dou dizhu}}''",
parents = {"card games", "gambling"},
}
labels["Go-Stop"] = {
type = "related-to",
parents = {"card games", "gambling"},
}
labels["hanafuda"] = {
type = "related-to",
description = "=''{{w|hanafuda}}'', a kind of Japanese playing cards",
parents = {"card games"},
}
labels["karuta"] = {
type = "related-to",
description = "=the [[game]] of [[karuta]]",
parents = {"card games"},
}
labels["poker"] = {
type = "related-to",
parents = {"card games", "gambling"},
}
labels["stýrivolt"] = {
type = "related-to",
parents = {"card games"},
}
-- Tabletop games
labels["tabletop games"] = {
type = "set",
parents = {"games"},
}
labels["dice games"] = {
type = "related-to",
parents = {"tabletop games"},
}
labels["dominoes"] = {
type = "related-to",
description = "=the game of [[domino]]es",
parents = {"tabletop games"},
}
labels["mahjong"] = {
type = "related-to",
parents = {"tabletop games"},
}
labels["Dungeons & Dragons"] = {
type = "related-to",
displaytitle = "''Dungeons & Dragons''",
description = "=the tabletop game ''{{w|Dungeons & Dragons}}'' ",
parents = {"tabletop games", "fantasy", "role-playing games"},
}
-- Board Games
labels["board games"] = {
type = "set",
parents = {"tabletop games"},
}
-- ===Chess===
labels["chess"] = {
type = "related-to",
parents = {"board games"},
}
labels["chess openings"] = {
type = "set",
parents = {"chess"},
}
labels["checkmate patterns"] = {
type = "set",
parents = {"chess"},
}
labels["computer chess"] = {
type = "related-to",
parents = {"chess"},
}
labels["backgammon"] = {
type = "related-to",
parents = {"board games"},
}
labels["go"] = {
type = "related-to",
description = "=the board game {{l|en|go|id=game}}",
parents = {"board games"},
}
labels["Monopoly"] = {
type = "related-to",
displaytitle = "''Monopoly''",
description = "=the game ''[[w:Monopoly (game)|Monopoly]]''",
parents = {"board games"},
}
labels["Scrabble"] = {
type = "related-to",
displaytitle = "''Scrabble''",
description = "=the game ''[[Scrabble]]''",
parents = {"board games"},
}
labels["shogi"] = {
type = "related-to",
parents = {"board games"},
}
labels["tiddlywinks"] = {
type = "related-to",
description = "=the game of [[tiddlywinks]]",
parents = {"tabletop games"},
}
labels["Warhammer"] = {
type = "related-to",
displaytitle = "''Warhammer''",
description = "=the ''[[w:Warhammer#Warhammer media franchise|Warhammer]]'' media franchise",
parents = {"board games", "fantasy", "science fiction", "utopian and dystopian fiction"},
}
labels["xiangqi"] = {
type = "related-to",
parents = {"board games"},
}
-- ==Video Games==
labels["video games"] = {
type = "type,related-to",
description = "=[[video game]]s",
parents = {"mass media", "games", "software"},
}
labels["video game genres"] = {
type = "type",
description = "{{{langname}}} terms for [[genre]]s of [[video game]]s.",
parents = {"video games", "genres"},
}
labels["speedrunning"] = {
type = "related-to",
wikidata = 1500337,
parents = {"video games"},
}
labels["Baldur's Gate"] = {
type = "related-to",
displaytitle = "''Baldur's Gate''",
description = "=the ''{{w|Baldur's Gate}}'' video game franchise",
parents = {"video games", "Dungeons & Dragons", "fantasy"},
}
labels["Dragon Age"] = {
type = "related-to",
displaytitle = "''Dragon Age''",
description = "=the ''{{w|Dragon Age}}'' video game franchise",
parents = {"video games", "Canadian fiction", "fantasy"},
}
labels["FromSoftware"] = {
type = "related-to",
description = "=Japanese software developer {{w|FromSoftware}} and video games it has produced, including ''{{w|Dark Souls}}'', ''{{w|Bloodborne}}'', and ''{{w|Elden Ring}}''",
parents = {"Japanese fiction", "fantasy", "video games"},
}
labels["Mass Effect (franchise)"] = {
type = "related-to",
displaytitle = "''Mass Effect'' (franchise)",
description = "=the ''{{w|Mass Effect}}'' video game franchise",
parents = {"video games", "Canadian fiction", "science fiction"},
}
labels["Minecraft"] = {
type = "related-to",
displaytitle = "''Minecraft''",
description = "{{{langname}}} terms used in context of the ''{{w|Minecraft}}'' video game franchise.",
parents = {"video games", "Microsoft"},
}
labels["Roblox"] = {
type = "related-to",
description = "=the online game platform and game creation system [[Roblox]]",
parents = {"video games"},
}
labels["Tetris"] = {
type = "related-to",
displaytitle = "''Tetris''",
description = "=the video game ''[[Tetris]]''",
parents = {"video games"},
}
labels["The Sims"] = {
type = "related-to",
displaytitle = "''The Sims''",
description = "=the ''{{w|The Sims}}'' video game franchise",
parents = {"video games"},
}
return labels
gq7dwmvlp9rswf06ybnwsexgo7h3z1j
88450
88449
2026-07-27T00:22:38Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Games]]
88449
Scribunto
text/plain
local labels = {}
labels["games"] = {
type = "related-to",
parents = {"recreation"},
}
labels["gaming"] = {
type = "related-to",
description = "=[[gaming]] terminology",
parents = {"games"},
}
labels["role-playing games"] = {
type = "related-to",
description = "=[[role-playing game]] mechanics, whether tabletop or [[:Category:{{{langcode}}}:Video games|video game]]",
additional = "These games also employ many terms from [[:Category:{{{langcode}}}:Fantasy]].",
parents = {"games"},
}
-- ==Real-world games==
labels["children's games"] = {
type = "name",
description = "=[[children]]'s [[game]]s",
parents = {"games"},
}
labels["playground games"] = {
type = "related-to",
description = "=games commonly played by children in a playground setting",
parents = {"games"},
}
labels["hand games"] = {
type = "related-to",
parents = {"games"},
}
labels["rock paper scissors"] = {
type = "related-to",
parents = {"hand games"},
}
labels["darts"] = {
type = "related-to",
description = "default no singularize",
parents = {"games"},
}
labels["billiards"] = {
type = "related-to",
description = "default no singularize",
parents = {"games"},
}
labels["bingo"] = {
type = "related-to",
parents = {"games"},
}
labels["bowling"] = {
type = "related-to",
parents = {"games"},
}
labels["bowls (game)"] = {
type = "related-to",
parents = {"games"},
}
labels["gambling"] = {
type = "related-to",
parents = {"games"},
}
labels["pinball"] = {
type = "related-to",
parents = {"games"},
}
labels["Rubik's Cube"] = {
type = "related-to",
description = "default with the wikify",
parents = {"games", "toys"},
}
labels["snooker"] = {
type = "related-to",
parents = {"games"},
}
labels["quiz competitions"] = {
type = "related-to",
parents = {"games"},
}
labels["crosswording"] = {
type = "related-to",
parents = {"games", "hobbies"},
}
-- ==Card games==
labels["card games"] = {
type = "set,related-to",
parents = {"games"},
}
-- ===Collectible card games===
labels["collectible card games"] = {
type = "related-to",
description = "={{w|collectible card games}} (also known as ''trading card games''), such as ''Magic: The Gathering''",
parents = {"card games"},
}
labels["Magic: The Gathering"] = {
type = "related-to",
displaytitle = "''Magic: The Gathering''",
description = "=the trading card game ''{{w|Magic: The Gathering}}''",
parents = {"collectible card games"},
}
--
labels["cribbage"] = {
type = "related-to",
parents = {"card games"},
}
labels["bridge"] = {
type = "related-to",
description = "=the [[game]] of [[bridge]]",
parents = {"card games"},
}
labels["dou dizhu"] = {
type = "related-to",
description = "=''{{w|dou dizhu}}''",
parents = {"card games", "gambling"},
}
labels["Go-Stop"] = {
type = "related-to",
parents = {"card games", "gambling"},
}
labels["hanafuda"] = {
type = "related-to",
description = "=''{{w|hanafuda}}'', a kind of Japanese playing cards",
parents = {"card games"},
}
labels["karuta"] = {
type = "related-to",
description = "=the [[game]] of [[karuta]]",
parents = {"card games"},
}
labels["poker"] = {
type = "related-to",
parents = {"card games", "gambling"},
}
labels["stýrivolt"] = {
type = "related-to",
parents = {"card games"},
}
-- Tabletop games
labels["tabletop games"] = {
type = "set",
parents = {"games"},
}
labels["dice games"] = {
type = "related-to",
parents = {"tabletop games"},
}
labels["dominoes"] = {
type = "related-to",
description = "=the game of [[domino]]es",
parents = {"tabletop games"},
}
labels["mahjong"] = {
type = "related-to",
parents = {"tabletop games"},
}
labels["Dungeons & Dragons"] = {
type = "related-to",
displaytitle = "''Dungeons & Dragons''",
description = "=the tabletop game ''{{w|Dungeons & Dragons}}'' ",
parents = {"tabletop games", "fantasy", "role-playing games"},
}
-- Board Games
labels["board games"] = {
type = "set",
parents = {"tabletop games"},
}
-- ===Chess===
labels["chess"] = {
type = "related-to",
parents = {"board games"},
}
labels["chess openings"] = {
type = "set",
parents = {"chess"},
}
labels["checkmate patterns"] = {
type = "set",
parents = {"chess"},
}
labels["computer chess"] = {
type = "related-to",
parents = {"chess"},
}
labels["backgammon"] = {
type = "related-to",
parents = {"board games"},
}
labels["go"] = {
type = "related-to",
description = "=the board game {{l|en|go|id=game}}",
parents = {"board games"},
}
labels["Monopoly"] = {
type = "related-to",
displaytitle = "''Monopoly''",
description = "=the game ''[[w:Monopoly (game)|Monopoly]]''",
parents = {"board games"},
}
labels["Scrabble"] = {
type = "related-to",
displaytitle = "''Scrabble''",
description = "=the game ''[[Scrabble]]''",
parents = {"board games"},
}
labels["shogi"] = {
type = "related-to",
parents = {"board games"},
}
labels["tiddlywinks"] = {
type = "related-to",
description = "=the game of [[tiddlywinks]]",
parents = {"tabletop games"},
}
labels["Warhammer"] = {
type = "related-to",
displaytitle = "''Warhammer''",
description = "=the ''[[w:Warhammer#Warhammer media franchise|Warhammer]]'' media franchise",
parents = {"board games", "fantasy", "science fiction", "utopian and dystopian fiction"},
}
labels["xiangqi"] = {
type = "related-to",
parents = {"board games"},
}
-- ==Video Games==
labels["video games"] = {
type = "type,related-to",
description = "=[[video game]]s",
parents = {"mass media", "games", "software"},
}
labels["video game genres"] = {
type = "type",
description = "{{{langname}}} terms for [[genre]]s of [[video game]]s.",
parents = {"video games", "genres"},
}
labels["speedrunning"] = {
type = "related-to",
wikidata = 1500337,
parents = {"video games"},
}
labels["Baldur's Gate"] = {
type = "related-to",
displaytitle = "''Baldur's Gate''",
description = "=the ''{{w|Baldur's Gate}}'' video game franchise",
parents = {"video games", "Dungeons & Dragons", "fantasy"},
}
labels["Dragon Age"] = {
type = "related-to",
displaytitle = "''Dragon Age''",
description = "=the ''{{w|Dragon Age}}'' video game franchise",
parents = {"video games", "Canadian fiction", "fantasy"},
}
labels["FromSoftware"] = {
type = "related-to",
description = "=Japanese software developer {{w|FromSoftware}} and video games it has produced, including ''{{w|Dark Souls}}'', ''{{w|Bloodborne}}'', and ''{{w|Elden Ring}}''",
parents = {"Japanese fiction", "fantasy", "video games"},
}
labels["Mass Effect (franchise)"] = {
type = "related-to",
displaytitle = "''Mass Effect'' (franchise)",
description = "=the ''{{w|Mass Effect}}'' video game franchise",
parents = {"video games", "Canadian fiction", "science fiction"},
}
labels["Minecraft"] = {
type = "related-to",
displaytitle = "''Minecraft''",
description = "{{{langname}}} terms used in context of the ''{{w|Minecraft}}'' video game franchise.",
parents = {"video games", "Microsoft"},
}
labels["Roblox"] = {
type = "related-to",
description = "=the online game platform and game creation system [[Roblox]]",
parents = {"video games"},
}
labels["Tetris"] = {
type = "related-to",
displaytitle = "''Tetris''",
description = "=the video game ''[[Tetris]]''",
parents = {"video games"},
}
labels["The Sims"] = {
type = "related-to",
displaytitle = "''The Sims''",
description = "=the ''{{w|The Sims}}'' video game franchise",
parents = {"video games"},
}
return labels
gq7dwmvlp9rswf06ybnwsexgo7h3z1j
Mòideal:category tree/topic/History
828
17755
88451
2026-07-23T19:36:29Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88451
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
labels["history"] = {
type = "related-to",
parents = {"all topics"},
}
labels["Akkad"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["American Civil War"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "history of the United States", "slavery"},
}
labels["American Revolution"] = {
type = "related-to",
description = "default with the wikify",
parents = {"revolutions", "wars", "history of the United States"},
}
labels["Ancient Africa"] = {
type = "related-to",
description = "=[[ancient]] [[Africa]]",
parents = {"ancient history", "history of Africa"},
}
labels["Ancient Asia"] = {
type = "related-to",
description = "=[[ancient]] [[Asia]]",
parents = {"ancient history", "history of Asia"},
}
labels["Ancient Egypt"] = {
type = "related-to",
description = "=[[ancient]] [[Egypt]]",
parents = {"Ancient Africa", "Ancient Near East", "history of Egypt"},
}
labels["ancient history"] = {
type = "related-to",
parents = {"history"},
}
labels["Ancient Europe"] = {
type = "related-to",
description = "=[[ancient]] [[Europe]]",
parents = {"ancient history", "history of Europe"},
}
labels["Ancient Greece"] = {
type = "related-to",
parents = {"Ancient Near East", "Ancient Europe", "history of Greece"},
}
labels["Ancient Near East"] = {
type = "related-to",
description = "default with the",
parents = {"ancient history", "Ancient Asia"},
}
labels["Ancient Rome"] = {
type = "related-to",
parents = {"Ancient Europe", "Ancient Africa", "ancient history", "Ancient Near East", "history of Italy"},
}
labels["Assyria"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["atomic bombings of Hiroshima and Nagasaki"] = {
type = "related-to",
description = "default with the wikify",
parents = {"World War II", "nuclear warfare", "history of Japan", "history of the United States"},
}
labels["Babylonia"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["Chinese Civil War"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "history of China"},
}
labels["Chinese dynasties"] = {
type = "name",
description = "default wikify no singularize",
parents = {"dynasties", "history of China"},
}
labels["Chinese era names"] = {
type = "name",
description = "default wikify",
parents = {"historical periods", "history of China"},
}
labels["Cold War"] = {
type = "related-to",
description = "default with the",
parents = {"wars", "Soviet Union", "history of the United States", "history of Europe", "nuclear warfare"},
}
labels["Copernican Revolution"] = {
type = "related-to",
description = "default with the wikify",
parents = {"history of science", "historical events", "astronomy", "cosmology"},
}
labels["Cultural Revolution"] = {
type = "related-to",
description = "default with the",
parents = {"historical events", "history of China"},
}
labels["dynasties"] = {
type = "set",
parents = {"historical periods"},
}
labels["Etruria"] = {
type = "related-to",
parents = {"Ancient Europe", "history of Italy"},
}
labels["French Revolution"] = {
type = "related-to",
description = "default with the wikify",
parents = {"revolutions", "history of France", "monarchy"},
}
labels["genealogy"] = {
type = "related-to",
parents = {"history", "genetics"},
}
labels["heraldic charges"] = {
type = "set",
parents = {"heraldry"},
}
labels["heraldic tinctures"] = {
type = "set",
parents = {"heraldry", "colors"},
}
labels["heraldry"] = {
type = "related-to",
parents = {"history"},
}
labels["historical events"] = {
type = "name",
parents = {"history"},
}
labels["historical periods"] = {
type = "name",
parents = {{name = "history", sort = "periods"}, "timekeeping"},
}
labels["historiography"] = {
type = "related-to",
parents = {"history"},
}
for _, country_parent in ipairs {
{"Afghanistan", "history of Asia"},
{"Africa"},
{"Albania", "history of Europe"},
{"Algeria", "history of Africa"},
{"Armenia", {"history of Europe", "history of Asia"}},
{"Asia"},
{"Australia", "history of Oceania"},
{"Austria", "history of Europe"},
{"Bangladesh", "history of Asia"},
{"Belarus", "history of Europe"},
{"Belgium", "history of Europe"},
{"Bosnia and Herzegovina", "history of Europe"},
{"Bulgaria", "history of Europe"},
{"Canada", "history of North America"},
{"Chile", "history of South America"},
{"China", "history of Asia"},
{"Croatia", "history of Europe"},
{"Denmark", "history of Europe"},
{"Egypt", {"history of Africa", "history of Asia"}},
{"Estonia", "history of Europe"},
{"Europe"},
{"Finland", "history of Europe"},
{"France", "history of Europe"},
{"Germany", "history of Europe"},
{"Greece", {"history of Europe", "history of Asia"}},
{"Hong Kong", "history of China"},
{"Hungary", "history of Europe"},
{"India", "history of Asia"},
{"Indonesia", "history of Asia"},
{"Iran", "history of Asia"},
{"Ireland", "history of Europe"},
{"Israel", "history of Asia"},
{"Italy", "history of Europe"},
{"Japan", "history of Asia"},
{"Jordan", "history of Asia"},
{"Korea", "history of Asia"},
{"Latvia", "history of Europe"},
{"Liechtenstein", "history of Europe"},
{"Lithuania", "history of Europe"},
{"Luxembourg", "history of Europe"},
{"Malaysia", "history of Asia"},
{"Malta", "history of Europe"},
{"Monaco", "history of Europe"},
{"Mexico", "history of North America"},
{"New Zealand", "history of Oceania"},
{"Norway", "history of Europe"},
{"North America"},
{"North Macedonia", "history of Europe"},
{"Oceania"},
{"Poland", "history of Europe"},
{"Portugal", "history of Europe"},
{"Romania", "history of Europe"},
{"Russia", "history of Europe"},
{"San Marino", "history of Europe"},
{"Saudi Arabia", "history of Asia"},
{"Serbia", "history of Europe"},
{"Slovakia", "history of Europe"},
{"South America"},
{"Spain", "history of Europe"},
{"Sudan", "history of Africa"},
{"Suriname", "history of South America"},
{"Sweden", "history of Europe"},
{"Switzerland", "history of Europe"},
{"Taiwan", "history of Asia"},
{"Thailand", "history of Asia"},
{"the Czech Republic", "history of Europe", "Czech Republic"},
{"the Netherlands", "history of Europe", "Netherlands"},
{"the Philippines", "history of Asia", "Philippines"},
{"the United Kingdom", "history of Europe", "United Kingdom"},
{"the United States", nil, "United States"},
{"Tunisia", "history of Africa"},
{"Turkey", {"history of Asia", "history of Europe"}},
{"Ukraine", "history of Europe"},
{"Vietnam", "history of Asia"},
{"Yemen", "history of Asia"},
} do
local country, parent, country_parent_form = unpack(country_parent)
if not parent then
parent = {"history"}
elseif type(parent) ~= "table" then
parent = {parent}
end
table.insert(parent, country_parent_form or country)
labels["history of " .. country] = {
type = "related-to",
description = "default with the wikify no singularize",
parents = parent,
}
end
labels["history of science"] = {
type = "related-to",
description = "default with the wikify",
parents = {"history", "sciences"},
}
labels["Mughal Empire"] = {
type = "related-to",
description = "default with the",
parents = {"former polities", "history of India"},
}
labels["Napoleonic Wars"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "history of France"},
}
labels["nuclear warfare"] = {
type = "related-to",
parents = {"war", "weapons"},
}
labels["Ottoman Empire"] = {
type = "related-to",
description = "default with the",
parents = {"former polities", "history of Africa", "history of Asia", "history of Europe", "history of Turkey"}, -- removed: Near East
}
labels["Phoenicia"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["revolutions"] = {
type = "name",
parents = {"historical events", "conflict", "violence"},
}
labels["Second Sino-Japanese War"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "World War II", "history of China", "history of Japan"},
}
labels["Sumer"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["Trojan War"] = {
type = "related-to",
description = "default with the",
parents = {"wars", "history of Greece"},
}
labels["Vietnam War"] = {
type = "related-to",
description = "default with the",
parents = {"wars", "history of Vietnam"},
}
labels["Vietnamese dynasties"] = {
type = "name",
description = "default wikify no singularize",
parents = {"dynasties", "history of Vietnam"},
}
labels["war"] = {
type = "related-to",
parents = {"military", "conflict", "violence"},
}
labels["wars"] = {
type = "name",
parents = {"war", "historical events"},
}
labels["types of wars"] = {
type = "type",
topic = "wars",
description = "=[[war]]s",
parents = {"wars"},
}
labels["World War I"] = {
type = "related-to",
parents = {"wars", "history of Europe"},
}
labels["World War II"] = {
type = "related-to",
parents = {"wars", "history of Europe", "history of Asia", "history of Africa"},
}
return labels
dep5dfn6pzt4xcfddn3vb204ixx1z3x
88452
88451
2026-07-27T00:22:46Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/History]]
88451
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
labels["history"] = {
type = "related-to",
parents = {"all topics"},
}
labels["Akkad"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["American Civil War"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "history of the United States", "slavery"},
}
labels["American Revolution"] = {
type = "related-to",
description = "default with the wikify",
parents = {"revolutions", "wars", "history of the United States"},
}
labels["Ancient Africa"] = {
type = "related-to",
description = "=[[ancient]] [[Africa]]",
parents = {"ancient history", "history of Africa"},
}
labels["Ancient Asia"] = {
type = "related-to",
description = "=[[ancient]] [[Asia]]",
parents = {"ancient history", "history of Asia"},
}
labels["Ancient Egypt"] = {
type = "related-to",
description = "=[[ancient]] [[Egypt]]",
parents = {"Ancient Africa", "Ancient Near East", "history of Egypt"},
}
labels["ancient history"] = {
type = "related-to",
parents = {"history"},
}
labels["Ancient Europe"] = {
type = "related-to",
description = "=[[ancient]] [[Europe]]",
parents = {"ancient history", "history of Europe"},
}
labels["Ancient Greece"] = {
type = "related-to",
parents = {"Ancient Near East", "Ancient Europe", "history of Greece"},
}
labels["Ancient Near East"] = {
type = "related-to",
description = "default with the",
parents = {"ancient history", "Ancient Asia"},
}
labels["Ancient Rome"] = {
type = "related-to",
parents = {"Ancient Europe", "Ancient Africa", "ancient history", "Ancient Near East", "history of Italy"},
}
labels["Assyria"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["atomic bombings of Hiroshima and Nagasaki"] = {
type = "related-to",
description = "default with the wikify",
parents = {"World War II", "nuclear warfare", "history of Japan", "history of the United States"},
}
labels["Babylonia"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["Chinese Civil War"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "history of China"},
}
labels["Chinese dynasties"] = {
type = "name",
description = "default wikify no singularize",
parents = {"dynasties", "history of China"},
}
labels["Chinese era names"] = {
type = "name",
description = "default wikify",
parents = {"historical periods", "history of China"},
}
labels["Cold War"] = {
type = "related-to",
description = "default with the",
parents = {"wars", "Soviet Union", "history of the United States", "history of Europe", "nuclear warfare"},
}
labels["Copernican Revolution"] = {
type = "related-to",
description = "default with the wikify",
parents = {"history of science", "historical events", "astronomy", "cosmology"},
}
labels["Cultural Revolution"] = {
type = "related-to",
description = "default with the",
parents = {"historical events", "history of China"},
}
labels["dynasties"] = {
type = "set",
parents = {"historical periods"},
}
labels["Etruria"] = {
type = "related-to",
parents = {"Ancient Europe", "history of Italy"},
}
labels["French Revolution"] = {
type = "related-to",
description = "default with the wikify",
parents = {"revolutions", "history of France", "monarchy"},
}
labels["genealogy"] = {
type = "related-to",
parents = {"history", "genetics"},
}
labels["heraldic charges"] = {
type = "set",
parents = {"heraldry"},
}
labels["heraldic tinctures"] = {
type = "set",
parents = {"heraldry", "colors"},
}
labels["heraldry"] = {
type = "related-to",
parents = {"history"},
}
labels["historical events"] = {
type = "name",
parents = {"history"},
}
labels["historical periods"] = {
type = "name",
parents = {{name = "history", sort = "periods"}, "timekeeping"},
}
labels["historiography"] = {
type = "related-to",
parents = {"history"},
}
for _, country_parent in ipairs {
{"Afghanistan", "history of Asia"},
{"Africa"},
{"Albania", "history of Europe"},
{"Algeria", "history of Africa"},
{"Armenia", {"history of Europe", "history of Asia"}},
{"Asia"},
{"Australia", "history of Oceania"},
{"Austria", "history of Europe"},
{"Bangladesh", "history of Asia"},
{"Belarus", "history of Europe"},
{"Belgium", "history of Europe"},
{"Bosnia and Herzegovina", "history of Europe"},
{"Bulgaria", "history of Europe"},
{"Canada", "history of North America"},
{"Chile", "history of South America"},
{"China", "history of Asia"},
{"Croatia", "history of Europe"},
{"Denmark", "history of Europe"},
{"Egypt", {"history of Africa", "history of Asia"}},
{"Estonia", "history of Europe"},
{"Europe"},
{"Finland", "history of Europe"},
{"France", "history of Europe"},
{"Germany", "history of Europe"},
{"Greece", {"history of Europe", "history of Asia"}},
{"Hong Kong", "history of China"},
{"Hungary", "history of Europe"},
{"India", "history of Asia"},
{"Indonesia", "history of Asia"},
{"Iran", "history of Asia"},
{"Ireland", "history of Europe"},
{"Israel", "history of Asia"},
{"Italy", "history of Europe"},
{"Japan", "history of Asia"},
{"Jordan", "history of Asia"},
{"Korea", "history of Asia"},
{"Latvia", "history of Europe"},
{"Liechtenstein", "history of Europe"},
{"Lithuania", "history of Europe"},
{"Luxembourg", "history of Europe"},
{"Malaysia", "history of Asia"},
{"Malta", "history of Europe"},
{"Monaco", "history of Europe"},
{"Mexico", "history of North America"},
{"New Zealand", "history of Oceania"},
{"Norway", "history of Europe"},
{"North America"},
{"North Macedonia", "history of Europe"},
{"Oceania"},
{"Poland", "history of Europe"},
{"Portugal", "history of Europe"},
{"Romania", "history of Europe"},
{"Russia", "history of Europe"},
{"San Marino", "history of Europe"},
{"Saudi Arabia", "history of Asia"},
{"Serbia", "history of Europe"},
{"Slovakia", "history of Europe"},
{"South America"},
{"Spain", "history of Europe"},
{"Sudan", "history of Africa"},
{"Suriname", "history of South America"},
{"Sweden", "history of Europe"},
{"Switzerland", "history of Europe"},
{"Taiwan", "history of Asia"},
{"Thailand", "history of Asia"},
{"the Czech Republic", "history of Europe", "Czech Republic"},
{"the Netherlands", "history of Europe", "Netherlands"},
{"the Philippines", "history of Asia", "Philippines"},
{"the United Kingdom", "history of Europe", "United Kingdom"},
{"the United States", nil, "United States"},
{"Tunisia", "history of Africa"},
{"Turkey", {"history of Asia", "history of Europe"}},
{"Ukraine", "history of Europe"},
{"Vietnam", "history of Asia"},
{"Yemen", "history of Asia"},
} do
local country, parent, country_parent_form = unpack(country_parent)
if not parent then
parent = {"history"}
elseif type(parent) ~= "table" then
parent = {parent}
end
table.insert(parent, country_parent_form or country)
labels["history of " .. country] = {
type = "related-to",
description = "default with the wikify no singularize",
parents = parent,
}
end
labels["history of science"] = {
type = "related-to",
description = "default with the wikify",
parents = {"history", "sciences"},
}
labels["Mughal Empire"] = {
type = "related-to",
description = "default with the",
parents = {"former polities", "history of India"},
}
labels["Napoleonic Wars"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "history of France"},
}
labels["nuclear warfare"] = {
type = "related-to",
parents = {"war", "weapons"},
}
labels["Ottoman Empire"] = {
type = "related-to",
description = "default with the",
parents = {"former polities", "history of Africa", "history of Asia", "history of Europe", "history of Turkey"}, -- removed: Near East
}
labels["Phoenicia"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["revolutions"] = {
type = "name",
parents = {"historical events", "conflict", "violence"},
}
labels["Second Sino-Japanese War"] = {
type = "related-to",
description = "default with the wikify",
parents = {"wars", "World War II", "history of China", "history of Japan"},
}
labels["Sumer"] = {
type = "related-to",
parents = {"Ancient Near East"},
}
labels["Trojan War"] = {
type = "related-to",
description = "default with the",
parents = {"wars", "history of Greece"},
}
labels["Vietnam War"] = {
type = "related-to",
description = "default with the",
parents = {"wars", "history of Vietnam"},
}
labels["Vietnamese dynasties"] = {
type = "name",
description = "default wikify no singularize",
parents = {"dynasties", "history of Vietnam"},
}
labels["war"] = {
type = "related-to",
parents = {"military", "conflict", "violence"},
}
labels["wars"] = {
type = "name",
parents = {"war", "historical events"},
}
labels["types of wars"] = {
type = "type",
topic = "wars",
description = "=[[war]]s",
parents = {"wars"},
}
labels["World War I"] = {
type = "related-to",
parents = {"wars", "history of Europe"},
}
labels["World War II"] = {
type = "related-to",
parents = {"wars", "history of Europe", "history of Asia", "history of Africa"},
}
return labels
dep5dfn6pzt4xcfddn3vb204ixx1z3x
Mòideal:category tree/topic/Human
828
17756
88453
2026-07-23T19:36:30Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88453
Scribunto
text/plain
local labels = {}
labels["human"] = {
type = "related-to",
description = "=[[human being]]s",
parents = {"all topics"},
}
labels["3D printing"] = {
type = "related-to",
parents = {"manufacturing", "printing"},
}
labels["abuse"] = {
type = "related-to",
parents = {"violence"},
}
labels["alcoholism"] = {
type = "related-to",
parents = {"drinking"},
}
labels["amateur radio"] = {
type = "related-to",
parents = {"hobbies", "radio"},
}
labels["ASMR"] = {
type = "related-to",
description = "={{w|autonomous sensory meridian response}}",
parents = {"psychology", "sound", "talking"},
}
labels["autism"] = {
type = "related-to",
parents = {"neurodivergency"},
}
labels["beekeeping"] = {
type = "related-to",
parents = {"agriculture"},
}
labels["betting"] = {
type = "related-to",
parents = {"gambling"},
}
labels["birdwatching"] = {
type = "related-to",
description = "{{{langname}}} jargon used by [[birdwatcher]]s to describe [[bird]]s, normally for the purpose of abbreviation.",
parents = {"hobbies"},
}
labels["birthstones"] = {
type = "type",
parents = {"gems"},
}
labels["breastfeeding"] = {
type = "related-to",
parents = {"babies", "body", "female", "human behaviour"},
}
labels["bricks"] = {
type = "related-to",
parents = {"building materials"},
}
labels["building materials"] = {
type = "type",
parents = {"materials", "construction"},
}
labels["capital punishment"] = {
type = "related-to",
parents = {"criminal law", "death"},
}
labels["ceramics"] = {
type = "type,related-to",
description = "default no singularize",
parents = {"materials"},
}
labels["cheating"] = {
type = "related-to",
parents = {"deception"},
}
labels["clerical vestments"] = {
type = "set",
parents = {"clothing", "Christianity"},
}
labels["clothing"] = {
type = "related-to",
parents = {"human"},
}
labels["coats"] = {
type = "set",
parents = {"clothing"},
}
labels["conflict"] = {
type = "related-to",
parents = {"human behaviour", "society"},
}
labels["crossdressing"] = {
type = "related-to",
parents = {"clothing", "gender"},
}
labels["crowds"] = {
type = "related-to",
parents = {"people"},
}
labels["crying"] = {
type = "related-to",
parents = {"reflexes", "sadness", "vocalizations"},
}
labels["deception"] = {
type = "related-to",
parents = {"human behaviour", "ethics"},
}
labels["deltiology"] = {
type = "related-to",
parents = {"hobbies"},
}
labels["diapers"] = {
type = "related-to",
parents = {"clothing"},
}
labels["drinking"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["eating"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["eating disorders"] = {
type = "related-to",
parents = {"mental health", "eating"},
}
labels["eyewear"] = {
type = "related-to",
parents = {"clothing", "eye", "vision"},
}
labels["fabrics"] = {
type = "related-to",
parents = {"materials"},
}
labels["fibers"] = {
type = "related-to",
parents = {"materials"},
}
labels["fishing"] = {
type = "related-to",
parents = {"human activity"},
}
labels["footwear"] = {
type = "related-to",
parents = {"clothing"},
}
labels["friendship"] = {
type = "related-to",
parents = {"human behaviour", "virtue"},
}
labels["gems"] = {
type = "related-to",
parents = {"jewelry", "mineralogy"},
}
labels["giving"] = {
type = "related-to",
parents = {"virtue"},
}
labels["glass"] = {
type = "related-to",
parents = {"materials"},
}
labels["gums and resins"] = {
type = "related-to",
description = "=[[gum]]s and [[resin]]s",
parents = {"materials", "botany"},
}
labels["handwear"] = {
type = "set",
parents = {"clothing"},
}
labels["headwear"] = {
type = "set",
parents = {"clothing"},
}
labels["hides"] = {
type = "type",
description = "=the skins of animals, used as materials",
parents = {"materials", "leatherworking"},
}
labels["hobbies"] = {
type = "type",
parents = {"recreation"},
}
labels["hobbyists"] = {
type = "type",
parents = {"hobbies"},
}
labels["human activity"] = {
type = "related-to",
description = "=activities performed by [[human]]s",
parents = {"human behaviour"},
}
labels["human behaviour"] = {
type = "related-to",
description = "=behaviours and activities of [[human]]s",
parents = {"human"},
}
labels["human migration"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["hunting"] = {
type = "related-to",
parents = {"human activity"},
}
labels["jewelry"] = {
type = "related-to",
parents = {"clothing"},
}
labels["juggling"] = {
type = "related-to",
parents = {"games"},
}
labels["kilts"] = {
type = "related-to",
parents = {"clothing"},
}
labels["knowledge"] = {
type = "related-to",
parents = {"mind"},
}
labels["kite flying"] = {
type = "related-to",
description = "=flying [[kite]]s",
parents = {"hobbies"},
}
labels["laughter"] = {
type = "related-to",
parents = {"reflexes", "happiness"},
}
labels["lying"] = {
type = "related-to",
parents = {"deception", "truth"},
}
labels["machining"] = {
type = "related-to",
parents = {"manufacturing"},
}
labels["manias"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["manufacturing"] = {
type = "related-to",
parents = {"human activity"},
}
labels["massage"] = {
type = "related-to",
parents = {"recreation"},
}
labels["materials"] = {
type = "related-to",
parents = {"manufacturing"},
}
labels["multiplicity (psychology)"] = {
type = "related-to",
description = "=the psychological condition of [[w:Multiplicity (psychology)|multiplicity]]",
parents = {"psychology"},
}
labels["murder"] = {
type = "related-to",
parents = {"violence", "death", "crime"},
}
labels["natural materials"] = {
type = "related-to",
parents = {"materials", "nature"},
}
labels["neckwear"] = {
type = "related-to",
parents = {"clothing"},
}
labels["neurodivergency"] = {
type = "related-to",
parents = {"mental health", "psychology", "disability"},
}
labels["pants"] = {
type = "set",
description = "default no singularize",
parents = {"clothing"},
}
labels["paper"] = {
type = "related-to",
parents = {"materials"},
}
labels["paper sizes"] = {
type = "related-to",
parents = {"paper"},
}
labels["perfumery"] = {
type = "related-to",
parents = {"smell"},
}
labels["philately"] = {
type = "related-to",
description = "=[[stamp collecting]]",
parents = {"hobbies"},
}
labels["photography"] = {
type = "related-to",
parents = {"human activity", "media", "art"},
}
labels["plastic"] = {
type = "related-to",
description = "default no singularize",
parents = {"materials", "polymer"},
}
labels["polymer"] = {
type = "related-to",
description = "default no singularize",
parents = {"matter", "organic chemistry", "physical chemistry"},
}
labels["puppets"] = {
type = "related-to",
parents = {"toys"},
}
labels["recreation"] = {
type = "related-to",
description = "=activities other than the traditional arts and entertainment that people use for [[recreation]]",
parents = {"human activity", "culture"},
}
labels["reflexes"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["robes and cloaks"] = {
type = "set",
parents = {"clothing"},
}
labels["rocks"] = {
type = "related-to",
parents = {"natural materials", "geology"},
}
labels["scrapbooks"] = {
type = "related-to",
parents = {"hobbies", "books"},
}
labels["secrecy"] = {
type = "related-to",
parents = {"human behaviour", "ethics"},
}
labels["self-harm"] = {
type = "related-to",
parents = {"mental health", "injuries"},
}
labels["skating"] = {
type = "related-to",
parents = {"human activity", "winter sports"},
}
labels["skirts"] = {
type = "type",
parents = {"clothing"},
}
labels["smoking"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["spinning tops"] = {
type = "related-to",
parents = {"toys"},
}
labels["swimwear"] = {
type = "related-to",
parents = {"clothing", "swimming"},
}
labels["tapes"] = {
type = "related-to",
parents = {"materials"},
}
labels["textiles"] = {
type = "related-to",
parents = {"materials"},
}
labels["torture"] = {
type = "related-to",
parents = {"violence"},
}
labels["tourism"] = {
type = "related-to",
parents = {"travel"},
}
labels["toys"] = {
type = "related-to",
parents = {"recreation"},
}
labels["trading cards"] = {
type = "related-to",
parents = {"hobbies"},
}
labels["travel"] = {
type = "related-to",
parents = {"human activity", "transport"},
}
labels["truth"] = {
type = "related-to",
parents = {"knowledge"},
}
labels["two-up"] = {
type = "related-to",
parents = {"gambling"},
}
labels["underwear"] = {
type = "related-to",
parents = {"clothing"},
}
labels["vegetarianism"] = {
type = "related-to",
parents = {"diets", "human behaviour"},
}
labels["videography"] = {
type = "related-to",
parents = {"human activity", "media", "art"},
}
labels["violence"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["women"] = {
type = "related-to",
parents = {"female", "female people", "feminism"},
}
labels["weightlifting"] = {
type = "related-to",
parents = {"exercise", "sports"},
}
labels["winter activities"] = {
type = "related-to",
parents = {"human activity", "winter"},
}
labels["wisdom"] = {
type = "related-to",
parents = {"knowledge", "virtue"},
}
labels["witchcraft"] = {
type = "related-to",
parents = {"religion"},
}
labels["woods"] = {
type = "related-to",
parents = {"natural materials", "trees"},
}
labels["work"] = {
type = "related-to",
parents = {"human activity"},
}
labels["yoga"] = {
type = "related-to",
parents = {"exercise"},
}
labels["yoga poses"] = {
type = "set",
description = "=''[[asana]]s'' or [[Yoga]] [[pose]]s",
parents = {"yoga"},
}
return labels
5cezyh2crw7fcu1pn41vqqsjty0hc7z
88454
88453
2026-07-27T00:22:54Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Human]]
88453
Scribunto
text/plain
local labels = {}
labels["human"] = {
type = "related-to",
description = "=[[human being]]s",
parents = {"all topics"},
}
labels["3D printing"] = {
type = "related-to",
parents = {"manufacturing", "printing"},
}
labels["abuse"] = {
type = "related-to",
parents = {"violence"},
}
labels["alcoholism"] = {
type = "related-to",
parents = {"drinking"},
}
labels["amateur radio"] = {
type = "related-to",
parents = {"hobbies", "radio"},
}
labels["ASMR"] = {
type = "related-to",
description = "={{w|autonomous sensory meridian response}}",
parents = {"psychology", "sound", "talking"},
}
labels["autism"] = {
type = "related-to",
parents = {"neurodivergency"},
}
labels["beekeeping"] = {
type = "related-to",
parents = {"agriculture"},
}
labels["betting"] = {
type = "related-to",
parents = {"gambling"},
}
labels["birdwatching"] = {
type = "related-to",
description = "{{{langname}}} jargon used by [[birdwatcher]]s to describe [[bird]]s, normally for the purpose of abbreviation.",
parents = {"hobbies"},
}
labels["birthstones"] = {
type = "type",
parents = {"gems"},
}
labels["breastfeeding"] = {
type = "related-to",
parents = {"babies", "body", "female", "human behaviour"},
}
labels["bricks"] = {
type = "related-to",
parents = {"building materials"},
}
labels["building materials"] = {
type = "type",
parents = {"materials", "construction"},
}
labels["capital punishment"] = {
type = "related-to",
parents = {"criminal law", "death"},
}
labels["ceramics"] = {
type = "type,related-to",
description = "default no singularize",
parents = {"materials"},
}
labels["cheating"] = {
type = "related-to",
parents = {"deception"},
}
labels["clerical vestments"] = {
type = "set",
parents = {"clothing", "Christianity"},
}
labels["clothing"] = {
type = "related-to",
parents = {"human"},
}
labels["coats"] = {
type = "set",
parents = {"clothing"},
}
labels["conflict"] = {
type = "related-to",
parents = {"human behaviour", "society"},
}
labels["crossdressing"] = {
type = "related-to",
parents = {"clothing", "gender"},
}
labels["crowds"] = {
type = "related-to",
parents = {"people"},
}
labels["crying"] = {
type = "related-to",
parents = {"reflexes", "sadness", "vocalizations"},
}
labels["deception"] = {
type = "related-to",
parents = {"human behaviour", "ethics"},
}
labels["deltiology"] = {
type = "related-to",
parents = {"hobbies"},
}
labels["diapers"] = {
type = "related-to",
parents = {"clothing"},
}
labels["drinking"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["eating"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["eating disorders"] = {
type = "related-to",
parents = {"mental health", "eating"},
}
labels["eyewear"] = {
type = "related-to",
parents = {"clothing", "eye", "vision"},
}
labels["fabrics"] = {
type = "related-to",
parents = {"materials"},
}
labels["fibers"] = {
type = "related-to",
parents = {"materials"},
}
labels["fishing"] = {
type = "related-to",
parents = {"human activity"},
}
labels["footwear"] = {
type = "related-to",
parents = {"clothing"},
}
labels["friendship"] = {
type = "related-to",
parents = {"human behaviour", "virtue"},
}
labels["gems"] = {
type = "related-to",
parents = {"jewelry", "mineralogy"},
}
labels["giving"] = {
type = "related-to",
parents = {"virtue"},
}
labels["glass"] = {
type = "related-to",
parents = {"materials"},
}
labels["gums and resins"] = {
type = "related-to",
description = "=[[gum]]s and [[resin]]s",
parents = {"materials", "botany"},
}
labels["handwear"] = {
type = "set",
parents = {"clothing"},
}
labels["headwear"] = {
type = "set",
parents = {"clothing"},
}
labels["hides"] = {
type = "type",
description = "=the skins of animals, used as materials",
parents = {"materials", "leatherworking"},
}
labels["hobbies"] = {
type = "type",
parents = {"recreation"},
}
labels["hobbyists"] = {
type = "type",
parents = {"hobbies"},
}
labels["human activity"] = {
type = "related-to",
description = "=activities performed by [[human]]s",
parents = {"human behaviour"},
}
labels["human behaviour"] = {
type = "related-to",
description = "=behaviours and activities of [[human]]s",
parents = {"human"},
}
labels["human migration"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["hunting"] = {
type = "related-to",
parents = {"human activity"},
}
labels["jewelry"] = {
type = "related-to",
parents = {"clothing"},
}
labels["juggling"] = {
type = "related-to",
parents = {"games"},
}
labels["kilts"] = {
type = "related-to",
parents = {"clothing"},
}
labels["knowledge"] = {
type = "related-to",
parents = {"mind"},
}
labels["kite flying"] = {
type = "related-to",
description = "=flying [[kite]]s",
parents = {"hobbies"},
}
labels["laughter"] = {
type = "related-to",
parents = {"reflexes", "happiness"},
}
labels["lying"] = {
type = "related-to",
parents = {"deception", "truth"},
}
labels["machining"] = {
type = "related-to",
parents = {"manufacturing"},
}
labels["manias"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["manufacturing"] = {
type = "related-to",
parents = {"human activity"},
}
labels["massage"] = {
type = "related-to",
parents = {"recreation"},
}
labels["materials"] = {
type = "related-to",
parents = {"manufacturing"},
}
labels["multiplicity (psychology)"] = {
type = "related-to",
description = "=the psychological condition of [[w:Multiplicity (psychology)|multiplicity]]",
parents = {"psychology"},
}
labels["murder"] = {
type = "related-to",
parents = {"violence", "death", "crime"},
}
labels["natural materials"] = {
type = "related-to",
parents = {"materials", "nature"},
}
labels["neckwear"] = {
type = "related-to",
parents = {"clothing"},
}
labels["neurodivergency"] = {
type = "related-to",
parents = {"mental health", "psychology", "disability"},
}
labels["pants"] = {
type = "set",
description = "default no singularize",
parents = {"clothing"},
}
labels["paper"] = {
type = "related-to",
parents = {"materials"},
}
labels["paper sizes"] = {
type = "related-to",
parents = {"paper"},
}
labels["perfumery"] = {
type = "related-to",
parents = {"smell"},
}
labels["philately"] = {
type = "related-to",
description = "=[[stamp collecting]]",
parents = {"hobbies"},
}
labels["photography"] = {
type = "related-to",
parents = {"human activity", "media", "art"},
}
labels["plastic"] = {
type = "related-to",
description = "default no singularize",
parents = {"materials", "polymer"},
}
labels["polymer"] = {
type = "related-to",
description = "default no singularize",
parents = {"matter", "organic chemistry", "physical chemistry"},
}
labels["puppets"] = {
type = "related-to",
parents = {"toys"},
}
labels["recreation"] = {
type = "related-to",
description = "=activities other than the traditional arts and entertainment that people use for [[recreation]]",
parents = {"human activity", "culture"},
}
labels["reflexes"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["robes and cloaks"] = {
type = "set",
parents = {"clothing"},
}
labels["rocks"] = {
type = "related-to",
parents = {"natural materials", "geology"},
}
labels["scrapbooks"] = {
type = "related-to",
parents = {"hobbies", "books"},
}
labels["secrecy"] = {
type = "related-to",
parents = {"human behaviour", "ethics"},
}
labels["self-harm"] = {
type = "related-to",
parents = {"mental health", "injuries"},
}
labels["skating"] = {
type = "related-to",
parents = {"human activity", "winter sports"},
}
labels["skirts"] = {
type = "type",
parents = {"clothing"},
}
labels["smoking"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["spinning tops"] = {
type = "related-to",
parents = {"toys"},
}
labels["swimwear"] = {
type = "related-to",
parents = {"clothing", "swimming"},
}
labels["tapes"] = {
type = "related-to",
parents = {"materials"},
}
labels["textiles"] = {
type = "related-to",
parents = {"materials"},
}
labels["torture"] = {
type = "related-to",
parents = {"violence"},
}
labels["tourism"] = {
type = "related-to",
parents = {"travel"},
}
labels["toys"] = {
type = "related-to",
parents = {"recreation"},
}
labels["trading cards"] = {
type = "related-to",
parents = {"hobbies"},
}
labels["travel"] = {
type = "related-to",
parents = {"human activity", "transport"},
}
labels["truth"] = {
type = "related-to",
parents = {"knowledge"},
}
labels["two-up"] = {
type = "related-to",
parents = {"gambling"},
}
labels["underwear"] = {
type = "related-to",
parents = {"clothing"},
}
labels["vegetarianism"] = {
type = "related-to",
parents = {"diets", "human behaviour"},
}
labels["videography"] = {
type = "related-to",
parents = {"human activity", "media", "art"},
}
labels["violence"] = {
type = "related-to",
parents = {"human behaviour"},
}
labels["women"] = {
type = "related-to",
parents = {"female", "female people", "feminism"},
}
labels["weightlifting"] = {
type = "related-to",
parents = {"exercise", "sports"},
}
labels["winter activities"] = {
type = "related-to",
parents = {"human activity", "winter"},
}
labels["wisdom"] = {
type = "related-to",
parents = {"knowledge", "virtue"},
}
labels["witchcraft"] = {
type = "related-to",
parents = {"religion"},
}
labels["woods"] = {
type = "related-to",
parents = {"natural materials", "trees"},
}
labels["work"] = {
type = "related-to",
parents = {"human activity"},
}
labels["yoga"] = {
type = "related-to",
parents = {"exercise"},
}
labels["yoga poses"] = {
type = "set",
description = "=''[[asana]]s'' or [[Yoga]] [[pose]]s",
parents = {"yoga"},
}
return labels
5cezyh2crw7fcu1pn41vqqsjty0hc7z
Mòideal:category tree/topic/People
828
17757
88455
2026-07-23T19:36:39Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88455
Scribunto
text/plain
local labels = {}
labels["people"] = {
type = "related-to",
parents = {"human"},
}
labels["female people"] = {
type = "set",
description = "=[[female]] people, i.e. [[woman|women]] and [[girl]]s",
parents = {"people", "female"},
}
labels["male people"] = {
type = "set",
description = "=[[male]] people, i.e. [[man|men]] and [[boy]]s",
parents = {"people", "male"},
}
labels["craftsmen"] = {
type = "set",
description = "=[[craftsman|craftsmen]] or [[artisan]]s",
parents = {"occupations", "crafts"},
}
labels["criminals"] = {
type = "type",
parents = {"people", "crime"},
}
labels["Celtic tribes"] = {
type = "name",
parents = {"tribes", "Ancient Europe"},
}
labels["Adolf Hitler"] = {
type = "related-to",
description = "=related to {{w|Adolf Hitler}}, leader of [[Nazi Germany]] from 1933 to 1945",
parents = {"individuals", "Nazism"},
}
labels["agricultural occupations"] = {
type = "set",
parents = {"occupations", "agriculture"},
}
labels["American demonyms"] = {
type = "set",
description = "=American [[demonym]]s, i.e., [[demonym]]s related to places in [[America]]",
parents = {"demonyms", "America"},
}
labels["archaeological cultures"] = {
type = "name",
parents = {"people", "archaeology"},
}
labels["Armenian demonyms"] = {
type = "set",
description = "=Armenian [[demonym]]s, i.e., [[demonym]]s related to places in [[Armenia]], as well as Armenian diaspora communities abroad",
parents = {"demonyms", "Armenia"},
}
labels["Australian demonyms"] = {
type = "set",
description = "=Australian [[demonym]]s, i.e., [[demonym]]s related to places in [[Australia]]",
parents = {"demonyms", "Australia"},
}
labels["artists"] = {
type = "set",
parents = {"occupations", "art"},
}
labels["athletes"] = {
type = "related-to",
description = "=[[athlete]]s or [[sportsperson|sportspeople]]",
parents = {"occupations", "sports"},
}
labels["authors"] = {
type = "type",
parents = {"people", "literature"},
}
labels["Barack Obama"] = {
type = "related-to",
description = "={{w|Barack Obama}}, [[president]] of the [[United States]] from 2009 until 2017",
parents = {"individuals", "US politics"},
}
labels["babies"] = {
type = "related-to",
parents = {"children"},
}
labels["baby boomers"] = {
type = "related-to",
parents = {"generations"},
}
labels["Belarusian demonyms"] = {
type = "set",
description = "=Belarusian [[demonym]]s, i.e., [[demonym]]s related to places in [[Belarus]]",
parents = {"demonyms", "Belarus"},
}
labels["Benedict Cumberbatch"] = {
type = "related-to",
description = "=English actor {{w|Benedict Cumberbatch}}",
parents = {"individuals"},
}
labels["Bernie Sanders"] = {
type = "related-to",
description = "=American politician {{w|Bernie Sanders}}",
parents = {"individuals", "US politics"},
}
labels["Bill and Hillary Clinton"] = {
type = "related-to",
description = "=[[w:Bill Clinton|Bill Clinton]], [[president]] of the [[United States]] from 1993 until 2001, or {{w|Hillary Clinton}}, Democratic presidential candidate in 2016",
parents = {"individuals", "US politics"},
}
labels["British demonyms"] = {
type = "set",
description = "=British [[demonym]]s, i.e., [[demonym]]s related to places in the [[British Isles]]",
parents = {"demonyms", "British Isles"},
}
labels["Charles Dickens"] = {
type = "related-to",
description = "=the British author Charles Dickens or his works",
parents = {"authors", "British fiction", "individuals", "literature"},
}
labels["Rudyard Kipling"] = {
type = "related-to",
description = "={{w|Rudyard Kipling}}, English [[novelist]] and short story writer",
parents = {"individuals", "authors"},
}
labels["children"] = {
type = "related-to",
description = "=[[child]]ren",
parents = {"youth"},
}
labels["female children"] = {
type = "set",
parents = {"children", "female people"},
}
labels["male children"] = {
type = "set",
parents = {"children", "male people"},
}
labels["demonyms"] = {
type = "set",
description = "{{{langname}}} [[demonym]]s, names for an inhabitant of a specific place.",
parents = {"people", "names"},
}
labels["Elon Musk"] = {
type = "related-to",
description = "=South African-born tech entrepreneur {{w|Elon Musk}}",
parents = {"individuals"},
}
labels["Theodore Roosevelt"] = {
type = "related-to",
description = "={{w|Theodore Roosevelt}}, 27th [[president]] of the [[United States]]",
parents = {"individuals", "US politics"},
}
labels["Donald Trump"] = {
type = "related-to",
description = "={{w|Donald Trump}}, businessman and [[president]] of the [[United States]] from 2017 to 2021, and since 2025",
parents = {"individuals", "US politics"},
}
labels["Joe Biden"] = {
type = "related-to",
description = "={{w|Joe Biden}}, [[president]] of the [[United States]] from 2021 to 2025",
parents = {"individuals", "US politics"},
}
labels["Kamala Harris"] = {
type = "related-to",
description = "={{w|Kamala Harris}}, politician of the [[United States]]",
parents = {"individuals", "US politics"},
}
labels["ethnicity"] = {
type = "related-to",
parents = {"people"},
}
labels["ethnonyms"] = {
type = "set",
description = "=[[ethnonym]]s, names for ethnic groups",
parents = {"people", "names", "ethnicity"},
}
labels["family"] = {
type = "related-to",
parents = {"people"},
}
labels["family members"] = {
type = "set",
description = "=members of the [[family]], i.e. [[relative]]s, [[in-law]]s, [[stepfamily]] and so on",
parents = {"family"},
}
labels["female family members"] = {
type = "set",
description = "=[[female]] members of the [[family]], i. e. [[relative]]s, [[in-law]]s, [[stepfamily]] and so on",
parents = {"family members", "female people"},
}
labels["male family members"] = {
type = "set",
description = "=[[male]] members of the [[family]], i. e. [[relative]]s, [[in-law]]s, [[stepfamily]] and so on",
parents = {"family members", "male people"},
}
labels["fans (people)"] = {
type = "set",
description = "=[[fan]]s of specific things, such as books, television series, movies, musical artists, etc",
parents = {"people", "fandom"},
}
labels["George W. Bush"] = {
type = "related-to",
description = "={{w|George W. Bush}}, [[president]] of the [[United States]] from 2001 to 2009",
parents = {"individuals", "US politics"},
}
labels["generations"] = {
type = "name",
description = "=[[demographic]] [[generation]]s (e.g. the [[Silent Generation]], [[baby boomer]]s, [[Generation X]])",
parents = {"age", "collectives", "demography", "people", "sociology"},
}
labels["Germanic tribes"] = {
type = "name",
parents = {"tribes", "Ancient Europe"},
}
labels["Greek demonyms"] = {
type = "set",
description = "=Greek [[demonym]]s, i.e., [[demonym]]s related to places in [[Greece]]",
parents = {"demonyms", "Greece"},
}
labels["heads of state"] = {
type = "type",
description = "=[[head of state|heads of state]]",
parents = {"positions of authority", "government"},
}
labels["healthcare occupations"] = {
type = "set",
parents = {"occupations", "healthcare"},
}
labels["Herbert Hoover"] = {
type = "related-to",
description = "={{w|Herbert Hoover}}, [[president]] of the [[United States]] from 1929 to 1933, during the start of the [[Great Depression]]",
parents = {"individuals", "US politics"},
}
labels["occupations in hospitality"] = {
type = "set",
parents = {"occupations", "hospitality"},
}
labels["individuals"] = {
type = "name",
parents = {"people"},
}
labels["Isaac Newton"] = {
type = "related-to",
description = "={{w|Isaac Newton}}, [[physicist]] and [[mathematician]] who [[develop]]ed [[classical mechanics]] and (with {{w|Gottfried Wilhelm Leibnitz}}) [[calculus]]",
parents = {"scientists", "individuals", "Copernican Revolution"},
}
labels["J. R. R. Tolkien"] = {
type = "related-to",
description = "=author {{w|J. R. R. Tolkien}} and his works",
parents = {"authors", "British fiction", "fantasy", "individuals", "literature"},
}
labels["Latvian demonyms"] = {
type = "set",
description = "=Latvian [[demonym]]s, i.e., [[demonym]]s related to places in [[Latvia]]",
parents = {"demonyms", "Latvia"},
}
labels["leaders"] = {
type = "related-to",
parents = {"people"},
}
labels["legal occupations"] = {
type = "set",
description = "=[[occupation]]s performed by virtue of [[legal]] [[education]]",
parents = {"occupations", "law"},
}
labels["Lewis Carroll"] = {
type = "related-to",
description = "{{{langname}}} terms and phrases coined by {{w|Lewis Carroll}}, or otherwise derived from his works.",
parents = {"authors", "British fiction", "fantasy", "individuals", "literature"},
}
labels["Margaret Thatcher"] = {
type = "related-to",
description = "={{w|Margaret Thatcher}}, [[prime minister]] of the [[United Kingdom]] from 1979 to 1990",
parents = {"individuals", "UK politics"},
}
labels["military ranks"] = {
type = "set",
description = "=[[rank]]s of the [[military]]",
parents = {"positions of authority", "military", "titles"},
}
labels["nationalities"] = {
type = "set",
parents = {"demonyms", "people"},
}
labels["millennials"] = {
type = "related-to",
parents = {"generations"},
}
labels["Mohandas Karamchand Gandhi"] = {
type = "related-to",
description = "={{w|Mahatma Gandhi|Mohandas Karamchand Gandhi}}, political leader of the Indian independence movement",
parents = {"individuals"},
}
labels["Native Americans"] = {
type = "related-to",
parents = {"Canada", "United States"},
}
labels["Native American tribes"] = {
type = "name",
description = "=[[Native American]] [[tribe]]s",
parents = {"Native Americans", "tribes"},
}
labels["nautical occupations"] = {
type = "set",
description = "=[[occupation]]s performed on ships on sea, thus not comprising [[dockworker]]s",
parents = {"occupations", "nautical"},
}
labels["nobility"] = {
type = "related-to",
parents = {"people", "high society"},
}
labels["occupations"] = {
type = "set",
description = "=[[occupation]]s, in the sense of \"a job\"",
parents = {"people", "work"},
}
labels["parents"] = {
type = "set",
description = "{{{langname}}} terms for immediate biological parents, or other people who take on a parenting role.",
parents = {"family members"},
}
labels["siblings"] = {
type = "set",
description = "{{{langname}}} terms for siblings.",
parents = {"family members"},
}
labels["philosophers"] = {
type = "set",
parents = {"occupations", "philosophy"},
}
labels["poets"] = {
type = "type",
parents = {"authors", "poetry"},
}
labels["scholars"] = {
type = "set",
parents = {"occupations"},
}
labels["positions of authority"] = {
type = "set",
parents = {"occupations", "leaders"},
}
labels["religious occupations"] = {
type = "set",
parents = {"occupations", "religion"},
}
labels["Richard Nixon"] = {
type = "related-to",
description = "={{w|Richard Nixon}}, [[president]] of the [[United States]] from 1969 to 1974",
parents = {"individuals", "US politics"},
}
labels["Ronald Reagan"] = {
type = "related-to",
description = "={{w|Ronald Reagan}}, [[president]] of the [[United States]] from 1981 to 1989",
parents = {"individuals", "US politics"},
}
labels["salespeople"] = {
type = "set",
parents = {"occupations", "sales"},
}
labels["scientists"] = {
type = "set",
parents = {"occupations", "sciences"},
}
labels["servants"] = {
type = "set",
parents = {"occupations"},
}
labels["slaves"] = {
type = "type",
parents = {"servants", "slavery"},
}
labels["The Beatles"] = {
type = "related-to",
description = "={{w|The Beatles}}, an English rock band",
breadcrumb_and_first_sort_key = "Beatles, The",
parents = {"individuals", "musicians"},
}
labels["titles"] = {
type = "related-to",
parents = {"people"},
}
labels["tribes"] = {
type = "related-to",
parents = {"demonyms", "people"},
}
labels["Vladimir Putin"] = {
type = "related-to",
description = "={{w|Vladimir Putin}}, president of [[Russia]]",
parents = {"individuals", "Russian politics"},
}
labels["Volodymyr Zelenskyy"] = {
type = "related-to",
description = "={{w|Volodymyr Zelenskyy}}, president of [[Ukraine]]",
parents = {"individuals", "Ukrainian politics"},
}
labels["William Shakespeare"] = {
type = "related-to",
description = "=the British author William Shakespeare or his works",
parents = {"authors", "individuals"},
}
labels["youth"] = {
type = "related-to",
parents = {"people", "age"},
}
return labels
tdyzbnymwx59vxnp7eron5deqfrhpi0
88456
88455
2026-07-27T00:23:03Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/People]]
88455
Scribunto
text/plain
local labels = {}
labels["people"] = {
type = "related-to",
parents = {"human"},
}
labels["female people"] = {
type = "set",
description = "=[[female]] people, i.e. [[woman|women]] and [[girl]]s",
parents = {"people", "female"},
}
labels["male people"] = {
type = "set",
description = "=[[male]] people, i.e. [[man|men]] and [[boy]]s",
parents = {"people", "male"},
}
labels["craftsmen"] = {
type = "set",
description = "=[[craftsman|craftsmen]] or [[artisan]]s",
parents = {"occupations", "crafts"},
}
labels["criminals"] = {
type = "type",
parents = {"people", "crime"},
}
labels["Celtic tribes"] = {
type = "name",
parents = {"tribes", "Ancient Europe"},
}
labels["Adolf Hitler"] = {
type = "related-to",
description = "=related to {{w|Adolf Hitler}}, leader of [[Nazi Germany]] from 1933 to 1945",
parents = {"individuals", "Nazism"},
}
labels["agricultural occupations"] = {
type = "set",
parents = {"occupations", "agriculture"},
}
labels["American demonyms"] = {
type = "set",
description = "=American [[demonym]]s, i.e., [[demonym]]s related to places in [[America]]",
parents = {"demonyms", "America"},
}
labels["archaeological cultures"] = {
type = "name",
parents = {"people", "archaeology"},
}
labels["Armenian demonyms"] = {
type = "set",
description = "=Armenian [[demonym]]s, i.e., [[demonym]]s related to places in [[Armenia]], as well as Armenian diaspora communities abroad",
parents = {"demonyms", "Armenia"},
}
labels["Australian demonyms"] = {
type = "set",
description = "=Australian [[demonym]]s, i.e., [[demonym]]s related to places in [[Australia]]",
parents = {"demonyms", "Australia"},
}
labels["artists"] = {
type = "set",
parents = {"occupations", "art"},
}
labels["athletes"] = {
type = "related-to",
description = "=[[athlete]]s or [[sportsperson|sportspeople]]",
parents = {"occupations", "sports"},
}
labels["authors"] = {
type = "type",
parents = {"people", "literature"},
}
labels["Barack Obama"] = {
type = "related-to",
description = "={{w|Barack Obama}}, [[president]] of the [[United States]] from 2009 until 2017",
parents = {"individuals", "US politics"},
}
labels["babies"] = {
type = "related-to",
parents = {"children"},
}
labels["baby boomers"] = {
type = "related-to",
parents = {"generations"},
}
labels["Belarusian demonyms"] = {
type = "set",
description = "=Belarusian [[demonym]]s, i.e., [[demonym]]s related to places in [[Belarus]]",
parents = {"demonyms", "Belarus"},
}
labels["Benedict Cumberbatch"] = {
type = "related-to",
description = "=English actor {{w|Benedict Cumberbatch}}",
parents = {"individuals"},
}
labels["Bernie Sanders"] = {
type = "related-to",
description = "=American politician {{w|Bernie Sanders}}",
parents = {"individuals", "US politics"},
}
labels["Bill and Hillary Clinton"] = {
type = "related-to",
description = "=[[w:Bill Clinton|Bill Clinton]], [[president]] of the [[United States]] from 1993 until 2001, or {{w|Hillary Clinton}}, Democratic presidential candidate in 2016",
parents = {"individuals", "US politics"},
}
labels["British demonyms"] = {
type = "set",
description = "=British [[demonym]]s, i.e., [[demonym]]s related to places in the [[British Isles]]",
parents = {"demonyms", "British Isles"},
}
labels["Charles Dickens"] = {
type = "related-to",
description = "=the British author Charles Dickens or his works",
parents = {"authors", "British fiction", "individuals", "literature"},
}
labels["Rudyard Kipling"] = {
type = "related-to",
description = "={{w|Rudyard Kipling}}, English [[novelist]] and short story writer",
parents = {"individuals", "authors"},
}
labels["children"] = {
type = "related-to",
description = "=[[child]]ren",
parents = {"youth"},
}
labels["female children"] = {
type = "set",
parents = {"children", "female people"},
}
labels["male children"] = {
type = "set",
parents = {"children", "male people"},
}
labels["demonyms"] = {
type = "set",
description = "{{{langname}}} [[demonym]]s, names for an inhabitant of a specific place.",
parents = {"people", "names"},
}
labels["Elon Musk"] = {
type = "related-to",
description = "=South African-born tech entrepreneur {{w|Elon Musk}}",
parents = {"individuals"},
}
labels["Theodore Roosevelt"] = {
type = "related-to",
description = "={{w|Theodore Roosevelt}}, 27th [[president]] of the [[United States]]",
parents = {"individuals", "US politics"},
}
labels["Donald Trump"] = {
type = "related-to",
description = "={{w|Donald Trump}}, businessman and [[president]] of the [[United States]] from 2017 to 2021, and since 2025",
parents = {"individuals", "US politics"},
}
labels["Joe Biden"] = {
type = "related-to",
description = "={{w|Joe Biden}}, [[president]] of the [[United States]] from 2021 to 2025",
parents = {"individuals", "US politics"},
}
labels["Kamala Harris"] = {
type = "related-to",
description = "={{w|Kamala Harris}}, politician of the [[United States]]",
parents = {"individuals", "US politics"},
}
labels["ethnicity"] = {
type = "related-to",
parents = {"people"},
}
labels["ethnonyms"] = {
type = "set",
description = "=[[ethnonym]]s, names for ethnic groups",
parents = {"people", "names", "ethnicity"},
}
labels["family"] = {
type = "related-to",
parents = {"people"},
}
labels["family members"] = {
type = "set",
description = "=members of the [[family]], i.e. [[relative]]s, [[in-law]]s, [[stepfamily]] and so on",
parents = {"family"},
}
labels["female family members"] = {
type = "set",
description = "=[[female]] members of the [[family]], i. e. [[relative]]s, [[in-law]]s, [[stepfamily]] and so on",
parents = {"family members", "female people"},
}
labels["male family members"] = {
type = "set",
description = "=[[male]] members of the [[family]], i. e. [[relative]]s, [[in-law]]s, [[stepfamily]] and so on",
parents = {"family members", "male people"},
}
labels["fans (people)"] = {
type = "set",
description = "=[[fan]]s of specific things, such as books, television series, movies, musical artists, etc",
parents = {"people", "fandom"},
}
labels["George W. Bush"] = {
type = "related-to",
description = "={{w|George W. Bush}}, [[president]] of the [[United States]] from 2001 to 2009",
parents = {"individuals", "US politics"},
}
labels["generations"] = {
type = "name",
description = "=[[demographic]] [[generation]]s (e.g. the [[Silent Generation]], [[baby boomer]]s, [[Generation X]])",
parents = {"age", "collectives", "demography", "people", "sociology"},
}
labels["Germanic tribes"] = {
type = "name",
parents = {"tribes", "Ancient Europe"},
}
labels["Greek demonyms"] = {
type = "set",
description = "=Greek [[demonym]]s, i.e., [[demonym]]s related to places in [[Greece]]",
parents = {"demonyms", "Greece"},
}
labels["heads of state"] = {
type = "type",
description = "=[[head of state|heads of state]]",
parents = {"positions of authority", "government"},
}
labels["healthcare occupations"] = {
type = "set",
parents = {"occupations", "healthcare"},
}
labels["Herbert Hoover"] = {
type = "related-to",
description = "={{w|Herbert Hoover}}, [[president]] of the [[United States]] from 1929 to 1933, during the start of the [[Great Depression]]",
parents = {"individuals", "US politics"},
}
labels["occupations in hospitality"] = {
type = "set",
parents = {"occupations", "hospitality"},
}
labels["individuals"] = {
type = "name",
parents = {"people"},
}
labels["Isaac Newton"] = {
type = "related-to",
description = "={{w|Isaac Newton}}, [[physicist]] and [[mathematician]] who [[develop]]ed [[classical mechanics]] and (with {{w|Gottfried Wilhelm Leibnitz}}) [[calculus]]",
parents = {"scientists", "individuals", "Copernican Revolution"},
}
labels["J. R. R. Tolkien"] = {
type = "related-to",
description = "=author {{w|J. R. R. Tolkien}} and his works",
parents = {"authors", "British fiction", "fantasy", "individuals", "literature"},
}
labels["Latvian demonyms"] = {
type = "set",
description = "=Latvian [[demonym]]s, i.e., [[demonym]]s related to places in [[Latvia]]",
parents = {"demonyms", "Latvia"},
}
labels["leaders"] = {
type = "related-to",
parents = {"people"},
}
labels["legal occupations"] = {
type = "set",
description = "=[[occupation]]s performed by virtue of [[legal]] [[education]]",
parents = {"occupations", "law"},
}
labels["Lewis Carroll"] = {
type = "related-to",
description = "{{{langname}}} terms and phrases coined by {{w|Lewis Carroll}}, or otherwise derived from his works.",
parents = {"authors", "British fiction", "fantasy", "individuals", "literature"},
}
labels["Margaret Thatcher"] = {
type = "related-to",
description = "={{w|Margaret Thatcher}}, [[prime minister]] of the [[United Kingdom]] from 1979 to 1990",
parents = {"individuals", "UK politics"},
}
labels["military ranks"] = {
type = "set",
description = "=[[rank]]s of the [[military]]",
parents = {"positions of authority", "military", "titles"},
}
labels["nationalities"] = {
type = "set",
parents = {"demonyms", "people"},
}
labels["millennials"] = {
type = "related-to",
parents = {"generations"},
}
labels["Mohandas Karamchand Gandhi"] = {
type = "related-to",
description = "={{w|Mahatma Gandhi|Mohandas Karamchand Gandhi}}, political leader of the Indian independence movement",
parents = {"individuals"},
}
labels["Native Americans"] = {
type = "related-to",
parents = {"Canada", "United States"},
}
labels["Native American tribes"] = {
type = "name",
description = "=[[Native American]] [[tribe]]s",
parents = {"Native Americans", "tribes"},
}
labels["nautical occupations"] = {
type = "set",
description = "=[[occupation]]s performed on ships on sea, thus not comprising [[dockworker]]s",
parents = {"occupations", "nautical"},
}
labels["nobility"] = {
type = "related-to",
parents = {"people", "high society"},
}
labels["occupations"] = {
type = "set",
description = "=[[occupation]]s, in the sense of \"a job\"",
parents = {"people", "work"},
}
labels["parents"] = {
type = "set",
description = "{{{langname}}} terms for immediate biological parents, or other people who take on a parenting role.",
parents = {"family members"},
}
labels["siblings"] = {
type = "set",
description = "{{{langname}}} terms for siblings.",
parents = {"family members"},
}
labels["philosophers"] = {
type = "set",
parents = {"occupations", "philosophy"},
}
labels["poets"] = {
type = "type",
parents = {"authors", "poetry"},
}
labels["scholars"] = {
type = "set",
parents = {"occupations"},
}
labels["positions of authority"] = {
type = "set",
parents = {"occupations", "leaders"},
}
labels["religious occupations"] = {
type = "set",
parents = {"occupations", "religion"},
}
labels["Richard Nixon"] = {
type = "related-to",
description = "={{w|Richard Nixon}}, [[president]] of the [[United States]] from 1969 to 1974",
parents = {"individuals", "US politics"},
}
labels["Ronald Reagan"] = {
type = "related-to",
description = "={{w|Ronald Reagan}}, [[president]] of the [[United States]] from 1981 to 1989",
parents = {"individuals", "US politics"},
}
labels["salespeople"] = {
type = "set",
parents = {"occupations", "sales"},
}
labels["scientists"] = {
type = "set",
parents = {"occupations", "sciences"},
}
labels["servants"] = {
type = "set",
parents = {"occupations"},
}
labels["slaves"] = {
type = "type",
parents = {"servants", "slavery"},
}
labels["The Beatles"] = {
type = "related-to",
description = "={{w|The Beatles}}, an English rock band",
breadcrumb_and_first_sort_key = "Beatles, The",
parents = {"individuals", "musicians"},
}
labels["titles"] = {
type = "related-to",
parents = {"people"},
}
labels["tribes"] = {
type = "related-to",
parents = {"demonyms", "people"},
}
labels["Vladimir Putin"] = {
type = "related-to",
description = "={{w|Vladimir Putin}}, president of [[Russia]]",
parents = {"individuals", "Russian politics"},
}
labels["Volodymyr Zelenskyy"] = {
type = "related-to",
description = "={{w|Volodymyr Zelenskyy}}, president of [[Ukraine]]",
parents = {"individuals", "Ukrainian politics"},
}
labels["William Shakespeare"] = {
type = "related-to",
description = "=the British author William Shakespeare or his works",
parents = {"authors", "individuals"},
}
labels["youth"] = {
type = "related-to",
parents = {"people", "age"},
}
return labels
tdyzbnymwx59vxnp7eron5deqfrhpi0
Mòideal:category tree/topic/Lifeforms
828
17758
88457
2026-07-23T19:36:32Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88457
Scribunto
text/plain
local labels = {}
labels["lifeforms"] = {
type = "set",
description = "=forms of [[life]]",
parents = {"all topics", "life"},
}
labels["algae"] = {
type = "set",
description = "=[[alga|algae]]",
parents = {"lifeforms"},
}
labels["alveolates"] = {
type = "set",
description = "=[[unicellular]] [[eukaryote]]s in the [[superphylum]] [[Alveolata]]",
parents = {"lifeforms"},
}
labels["bacteria"] = {
type = "set",
description = "=[[bacterium|bacteria]]",
parents = {"lifeforms"},
}
labels["blue-green algae"] = {
type = "set",
description = "=[[photosynthetic]] [[bacteria]], also known as [[cyanobacteria]], which were formerly classified as [[algae]]",
parents = {"bacteria", "algae"},
}
labels["brown algae"] = {
type = "set",
description = "=[[badderlocks]], [[gulfweed]], [[kelp]], [[wakame]], and other algae in the [[class]] [[Phaeophyceae]]",
parents = {"algae"},
}
labels["castrated animals"] = {
type = "set",
parents = {"livestock", "male animals", "castration"},
}
labels["euagarics"] = {
type = "set",
description = "=[[amanita]]s, [[armillaria]]s, [[bird's nest fungus]], [[blewit]]s, [[button mushroom]]s, [[cortinar]]s, [[enoki]], [[field mushroom]]s, [[inkcap]]s, [[matsutake]], [[nameko]], [[oyster mushroom]]s, [[psilocybe]]s, [[puffball]]s, [[shiitake]], [[shimeji]], [[straw mushroom]]s, [[sulfur tuft]]s, [[waxy cap]]s and other [[gill]]ed [[mushroom]]s in the [[order]] [[Agaricales]]",
parents = {"mushrooms"},
}
labels["foraminifera"] = {
type = "set",
description = "=single-celled [[organism]]s in the [[phylum]] or [[subphylum]] [[Foraminifera]]",
parents = {"lifeforms"},
}
labels["fungi"] = {
type = "set",
parents = {"lifeforms"},
}
labels["green algae"] = {
type = "set",
description = "=algae in the [[division]]s [[Charophyta]] and [[Chlorophyta]]",
parents = {"algae"},
}
labels["larvae"] = {
type = "set",
parents = {"insects", "baby animals"},
}
labels["lichens"] = {
type = "set",
description = "=[[lichen]]s, composite organisms consisting of fungi and algae living together symbiotically",
parents = {"lifeforms", "algae", "fungi"},
}
labels["livestock"] = {
type = "related-to",
parents = {"animals", "agriculture"},
}
labels["mushrooms"] = {
type = "set",
parents = {"fungi"},
wpcat = true,
commonscat = true,
}
labels["oomycetes"] = {
type = "set",
description = "=[[fungus]]-like organisms in the class [[Oomycota]]",
parents = {"lifeforms"},
}
labels["parasites"] = {
type = "set",
parents = {"lifeforms"},
}
labels["Pezizales order fungi"] = {
type = "set",
description = "=[[brain mushroom]]s, [[elfin saddle]]s, [[common brown cup]]s, [[false morel]]s, [[hare's ear]]s, [[lorchel]]s, [[morel]]s, [[truffle]]s, [[turban-top]]s, and other [[ascomycete]] [[fungi]] in the [[order]] [[Pezizales]]",
parents = {"fungi", "mushrooms"},
}
labels["poultry"] = {
type = "related-to",
parents = {"birds", "livestock"},
}
labels["protists"] = {
type = "set",
parents = {"lifeforms"},
}
labels["red algae"] = {
type = "set",
description = "=[[dulse]], [[laver]], [[Irish moss]], and other algae in the [[division]] [[Rhodophyta]]",
parents = {"algae"},
}
labels["viroids"] = {
type = "set",
parents = {"lifeforms"},
}
labels["viruses"] = {
type = "set",
parents = {"lifeforms"},
}
labels["yeasts"] = {
type = "set",
parents = {"fungi"},
}
return labels
opdxumfcw9bu51woaokcawrw4ftgzor
88458
88457
2026-07-27T00:23:12Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Lifeforms]]
88457
Scribunto
text/plain
local labels = {}
labels["lifeforms"] = {
type = "set",
description = "=forms of [[life]]",
parents = {"all topics", "life"},
}
labels["algae"] = {
type = "set",
description = "=[[alga|algae]]",
parents = {"lifeforms"},
}
labels["alveolates"] = {
type = "set",
description = "=[[unicellular]] [[eukaryote]]s in the [[superphylum]] [[Alveolata]]",
parents = {"lifeforms"},
}
labels["bacteria"] = {
type = "set",
description = "=[[bacterium|bacteria]]",
parents = {"lifeforms"},
}
labels["blue-green algae"] = {
type = "set",
description = "=[[photosynthetic]] [[bacteria]], also known as [[cyanobacteria]], which were formerly classified as [[algae]]",
parents = {"bacteria", "algae"},
}
labels["brown algae"] = {
type = "set",
description = "=[[badderlocks]], [[gulfweed]], [[kelp]], [[wakame]], and other algae in the [[class]] [[Phaeophyceae]]",
parents = {"algae"},
}
labels["castrated animals"] = {
type = "set",
parents = {"livestock", "male animals", "castration"},
}
labels["euagarics"] = {
type = "set",
description = "=[[amanita]]s, [[armillaria]]s, [[bird's nest fungus]], [[blewit]]s, [[button mushroom]]s, [[cortinar]]s, [[enoki]], [[field mushroom]]s, [[inkcap]]s, [[matsutake]], [[nameko]], [[oyster mushroom]]s, [[psilocybe]]s, [[puffball]]s, [[shiitake]], [[shimeji]], [[straw mushroom]]s, [[sulfur tuft]]s, [[waxy cap]]s and other [[gill]]ed [[mushroom]]s in the [[order]] [[Agaricales]]",
parents = {"mushrooms"},
}
labels["foraminifera"] = {
type = "set",
description = "=single-celled [[organism]]s in the [[phylum]] or [[subphylum]] [[Foraminifera]]",
parents = {"lifeforms"},
}
labels["fungi"] = {
type = "set",
parents = {"lifeforms"},
}
labels["green algae"] = {
type = "set",
description = "=algae in the [[division]]s [[Charophyta]] and [[Chlorophyta]]",
parents = {"algae"},
}
labels["larvae"] = {
type = "set",
parents = {"insects", "baby animals"},
}
labels["lichens"] = {
type = "set",
description = "=[[lichen]]s, composite organisms consisting of fungi and algae living together symbiotically",
parents = {"lifeforms", "algae", "fungi"},
}
labels["livestock"] = {
type = "related-to",
parents = {"animals", "agriculture"},
}
labels["mushrooms"] = {
type = "set",
parents = {"fungi"},
wpcat = true,
commonscat = true,
}
labels["oomycetes"] = {
type = "set",
description = "=[[fungus]]-like organisms in the class [[Oomycota]]",
parents = {"lifeforms"},
}
labels["parasites"] = {
type = "set",
parents = {"lifeforms"},
}
labels["Pezizales order fungi"] = {
type = "set",
description = "=[[brain mushroom]]s, [[elfin saddle]]s, [[common brown cup]]s, [[false morel]]s, [[hare's ear]]s, [[lorchel]]s, [[morel]]s, [[truffle]]s, [[turban-top]]s, and other [[ascomycete]] [[fungi]] in the [[order]] [[Pezizales]]",
parents = {"fungi", "mushrooms"},
}
labels["poultry"] = {
type = "related-to",
parents = {"birds", "livestock"},
}
labels["protists"] = {
type = "set",
parents = {"lifeforms"},
}
labels["red algae"] = {
type = "set",
description = "=[[dulse]], [[laver]], [[Irish moss]], and other algae in the [[division]] [[Rhodophyta]]",
parents = {"algae"},
}
labels["viroids"] = {
type = "set",
parents = {"lifeforms"},
}
labels["viruses"] = {
type = "set",
parents = {"lifeforms"},
}
labels["yeasts"] = {
type = "set",
parents = {"fungi"},
}
return labels
opdxumfcw9bu51woaokcawrw4ftgzor
Mòideal:category tree/topic/Animals
828
17759
88459
2026-07-23T19:35:53Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88459
Scribunto
text/plain
local labels = {}
labels["animals"] = {
type = "set",
parents = {"lifeforms"},
commonscat = "Animalia",
wpcat = true,
}
labels["acanthuroid fish"] = {
type = "set",
description = "=[[surgeonfish]], [[light-horseman]], [[louvar]]s, [[scat]]s, [[rabbitfish]], [[Moorish idol]]s and other fish in the [[perciform]] [[suborder]] [[Acanthuroidei]]",
parents = {"fish"},
}
labels["accentors"] = {
type = "set",
description = "=birds in the [[family]] [[Prunellidae]]",
parents = {"perching birds"},
}
labels["accipiters"] = {
type = "set",
description = "=[[besra]]s, [[Cooper's hawk]]s, [[goshawk]]s, [[sharp-shinned hawk]]s, [[shikra]]s, [[sparrowhawk]]s, and other [[hawk]]s in the [[genus]] ''[[Accipiter]]''",
parents = {"birds of prey"},
}
labels["Acipenseriform fish"] = {
type = "set",
description = "=[[paddlefish]], [[sturgeon]]s and other fish in the [[order]] [[Acipenseriformes]]",
parents = {"fish"},
}
labels["adephagan beetles"] = {
type = "set",
description = "=[[diving beetle]]s, [[ground beetle]]s (including [[bombardier beetle]]s and [[tiger beetle]]s), [[whirligig beetle]]s and other [[beetle]]s in the [[suborder]] [[Adephaga]]",
parents = {"beetles"},
}
labels["African insectivores"] = {
type = "set",
description = "=[[aardvark]]s, [[elephant shrew]]s, [[golden mole]]s, [[otter shrew]]s, [[tenrec]]s, and other [[mammal]]s in the [[clade]] [[Afroinsectiphilia]]",
parents = {"mammals"},
}
labels["agamid lizards"] = {
type = "set",
description = "=[[agama]]s, [[bearded dragon]]s, [[flying dragon]]s, [[frilled lizard]]s, [[moloch]]s, [[spiny-tailed lizard]]s, [[stellion]]s and other [[lizard]]s in the [[family]] [[Agamidae]]",
parents = {"lizards"},
}
labels["alcelaphine antelopes"] = {
type = "set",
description = "=[[blesbuck]]s, [[bontebok]]s, [[bubal]]s, [[gnu]]s or [[wildebeest]], [[hartebeest]]s, [[hirola]], [[sassaby]]s, [[topi]]s, [[tetel]]s, and other [[antelopes]] in the [[subfamily]] [[Alcelaphinae]]",
parents = {"antelopes"},
}
labels["ammonites"] = {
type = "set",
description = "=[[extinct]] [[cephalopod]]s in the [[subclass]] [[Ammonoidea]]",
parents = {"cephalopods"},
}
labels["amphibians"] = {
type = "set",
parents = {"vertebrates"},
commonscat = "Amphibia",
wpcat = true,
}
labels["amphipods"] = {
type = "set",
description = "=[[beach flea]]s, [[lawn shrimp]], [[scud]]s, [[side swimmer]]s, [[skeleton shrimp]], [[whale louse|whale lice]], and other [[crustacean]]s in the [[order]] [[Amphipoda]]",
parents = {"crustaceans"},
}
labels["anatids"] = {
type = "set",
description = "=[[anatid]]s: ([[duck]]s, [[goose|geese]] and [[swan]]s)",
parents = {"freshwater birds"},
}
labels["annelids"] = {
type = "set",
description = "=[[earthworm]]s, [[leech]]es, [[ragworm]]s and many other [[segment]]ed [[worm]]s in the [[phylum]] [[Annelida]]",
parents = {"worms"},
}
labels["anglerfish"] = {
type = "set",
description = "=fish in the [[order]] [[Lophiiformes]]",
parents = {"fish"},
}
labels["anguimorph lizards"] = {
type = "set",
description = "=[[alligator lizard]]s, [[beaded lizard]]s, [[blindworm]]s, [[crocodile monitor]]s, [[galliwasp]]s, [[Gila monster]]s, [[glass lizard]]s, [[goanna]]s, [[Komodo dragon]]s, [[legless lizard]]s, [[nile monitor]]s, [[perentie]]s, [[sheltopusik]]s, [[water monitor]]s, and other [[lizards]] in the [[suborder]] [[Anguimorpha]]",
parents = {"lizards"},
}
labels["anomurans"] = {
type = "set",
description = "=crablike [[crustacean]]s in the [[decapod]] [[infraorder]] [[Anomura]], which are closely related to the true [[crab]]s in the infraorder [[Brachyura]]",
parents = {"crustaceans", "decapods"},
}
labels["anteaters and sloths"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Pilosa]]",
parents = {"mammals"},
}
labels["antelopes"] = {
type = "set",
parents = {"even-toed ungulates"},
}
labels["antilopine antelopes"] = {
type = "set",
description = "=[[blackbuck]]s, [[chinkara]]s, [[dibatag]]s, [[dik-dik]]s, [[gazelle]]s, [[gerenuk]]s, [[grysbok]]s, [[klipspringer]]s, [[oribi]]s, [[royal antelope]]s, [[saiga]]s, [[springbok]]s, [[steenbok]]s, [[zeren]], and other [[antelope]]s in the [[bovid]] [[subfamily]] [[Antilopinae]]",
parents = {"antelopes"},
}
labels["ants"] = {
type = "set",
parents = {"hymenopterans"},
}
labels["antshrikes"] = {
type = "set",
parents = {"suboscines", "perching birds"},
}
labels["anurans"] = {
type = "set",
description = "=[[amphibian]]s in the [[order]] [[Anura]], which are short-bodied and without tails, having long hind legs adapted for leaping that are typically folded at rest. Anurans are mostly known as [[frog]]s or [[toad]]s",
parents = {"amphibians"},
}
labels["aphids"] = {
type = "set",
description = "=[[insect]]s in the [[superfamily]] [[Aphidoidea]]",
parents = {"hemipterans"},
}
labels["apodiforms"] = {
type = "set",
description = "=[[hummingbird]]s, [[needletail]]s, [[spinetail]]s, [[swift]]s, [[swiftlet]]s, [[treeswift]]s, and other [[bird]]s in the [[order]] [[Apodiformes]]",
parents = {"birds"},
}
labels["arachnids"] = {
type = "set",
parents = {"arthropods"},
}
labels["araneoid spiders"] = {
type = "set",
description = "=[[bird dropping spider]]s, [[cobweb spiders]] (including [[black widow]]s and [[redback]]s), [[orbweaver]]s (including [[cross spider]]s and [[writing spider]]s), [[long-jawed spider]]s, [[money spider]]s, [[nesticid]]s, [[pimoid]], [[pirate spider]]s, [[tetragnathid]]s and other [[spider]]s in the [[superfamily]] [[Araneoidea]]",
parents = {"spiders"},
}
labels["argentiniform fish"] = {
type = "set",
description = "=[[argentine]]s, [[barreleye]]s, [[blacksmelt]]s, [[smoothtongue]]s and other fish in the [[order]] [[Argentiniformes]]",
parents = {"fish"},
}
labels["armadillos"] = {
type = "set",
parents = {"mammals"},
}
labels["arthropods"] = {
type = "set",
parents = {"animals"},
commonscat = "Arthropoda",
wpcat = true,
}
labels["aschizan flies"] = {
type = "set",
description = "=[[fly|flies]] in the [[dipteran]] [[section]] [[Aschiza]]",
parents = {"dipterans"},
}
labels["asilomorph flies"] = {
type = "set",
description = "=[[bee fly|bee flies]], [[dance fly|dance flies]], [[Mydas fly|Mydas flies]], [[robber fly|robber flies]], [[stiletto fly|stiletto flies]], [[window fly|window flies]] and other [[fly|flies]] in the [[dipteran]] [[infraorder]] [[Asilomorpha]]",
parents = {"dipterans"},
}
labels["assassin bugs"] = {
type = "set",
description = "=[[ambush bug]]s, [[assassin bug]]s, [[corsair]]s, [[feather-legged bug]]s, [[kissing bug]]s or [[conenose bug]]s, [[masked hunter]]s, [[wheel bug]]s, and other [[true bug]]s in the [[family]] [[Reduviidae]]",
parents = {"true bugs"},
}
labels["astacideans"] = {
type = "set",
description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Astacidea]], including the original [[species]] known as [[crayfish]] and [[lobster]]s, and their relatives",
parents = {"crustaceans", "decapods"},
}
labels["atheriniform fish"] = {
type = "set",
description = "=[[blue-eye]]s, [[hardyhead]]s, [[grunion]], [[jacksmelt]], [[rainbowfish]], [[silverside]]s, [[zona]], and other fish in the [[order]] [[Atheriniformes]]",
parents = {"fish"},
}
labels["auks"] = {
type = "set",
description = "=[[auk]]s, [[guillemot]]s, [[murre]]s, [[puffin]]s, [[razorbill]]s, and other [[seabird]]s in the family [[Alcidae]]",
parents = {"seabirds"},
}
labels["aulopiform fish"] = {
type = "set",
description = "=[[daggertooth]]s, [[lancetfish]], [[sergeant baker]]s, [[greeneye]]s, [[telescopefish]], [[lizardfish]] and other fish in the [[order]] [[Aulopiformes]]",
parents = {"fish"},
}
labels["Australasian robins"] = {
type = "set",
description = "=birds in the [[passerine]] [[family]] [[Petroicidae]], which are not closely related to the [[European robin]] (an [[Old World flycatcher]] in the family [[Muscicapidae]]), or the [[American robin]] (a [[thrush]] in the family [[Turdidae]])",
parents = {"perching birds"},
}
labels["baby animals"] = {
type = "set",
parents = {"animals"},
}
labels["bandicoots and bilbies"] = {
type = "set",
description = "=[[peramelid]]s, [[bandicoot]]s, [[marl]]s, [[quenda]]s, [[chaeropodid]]s, [[pig-footed bandicoot]]s, [[thylacomyid]]s, [[bilby|bilbies]], [[dalgite]]s, [[rabbit-eared bandicoot]]s, [[philander]]s, [[pinkie]]s, and other [[marsupial]]s in the [[order]] [[Peramelemorphia]]",
parents = {"marsupials"},
}
labels["barklice"] = {
type = "set",
description = "=non-[[parasitic]] [[insect]]s in the [[order]] [[Psocodea]]",
parents = {"insects"},
}
labels["barnacles"] = {
type = "set",
description = "=[[crustacean]]s in the [[infraclass]] [[Cirripedia]], including the parasitic [[rhizocephalan]]s",
parents = {"crustaceans"},
}
labels["bats"] = {
type = "set",
parents = {"mammals"},
}
labels["bees"] = {
type = "set",
parents = {"hymenopterans", "beekeeping"},
}
labels["beetles"] = {
type = "set",
parents = {"insects"},
}
labels["beloniform fish"] = {
type = "set",
description = "=[[ballyhoo]], [[flying fish]], [[garfish]], [[halfbeak]]s, [[houndfish]], [[mackerel pike]]s, [[medaka]]s, [[needlefish]], [[ricefish]], [[saury|sauries]], [[silver gar]], and other fish in the [[order]] [[Beloniformes]]",
parents = {"fish"},
}
labels["bibionomorphs"] = {
type = "set",
description = "=[[March fly|March flies]], [[cecidomyiid]] [[gall midge]]s, [[keroplatid]] [[fungus gnat]]s, [[mycetophilid]]s, [[sciarid]]s and other [[fly|flies]], [[gnat]]s and [[midge]]s in the [[dipteran]] [[infraorder]] [[Bibionomorpha]]",
parents = {"dipterans"},
}
labels["birds"] = {
type = "set",
parents = {"vertebrates"},
commonscat = "Aves",
wpcat = true,
}
labels["birds of prey"] = {
type = "set",
description = "=birds that live by [[predatory]] hunting, and from [[carrion]]",
parents = {"birds"},
}
labels["bivalves"] = {
type = "set",
description = "=[[clam]]s, [[cockle]]s, [[mussel]]s, [[oyster]]s, [[scallop]]s and other [[mollusk]]s in the [[class]] [[Bivalvia]]",
parents = {"mollusks"},
}
labels["blennies"] = {
type = "set",
description = "=[[blenny|blennies]], [[chaenopsid]]s, [[clinid]]s, [[dactyloscopid]]s, [[klipfish]], [[labrisomid]]s, [[triplefin]]s, [[weedfish]] and other fish in the [[perciform]] [[suborder]] [[Blennioidei]]",
parents = {"fish"},
}
labels["boas"] = {
type = "set",
description = "=[[snake]]s in the family [[Boidae]]",
parents = {"snakes"},
}
labels["bostrichiform beetles"] = {
type = "set",
description = "=[[carpet beetle]]s, [[deathwatch beetle]]s, [[drugstore beetle]]s, [[museum beetle]]s, [[powder-post beetle]]s, and other [[anobiid]]s/[[ptinid]]s, [[bostrichid]]s, [[dermestid]]s, [[derodontid]]s, [[jacobsoniid]]s and [[nosodendrid]]s in the [[coleopteran]] [[infraorder]] [[Bostrichiformia]]",
parents = {"beetles"},
}
labels["bovines"] = {
type = "set",
parents = {"even-toed ungulates"},
}
labels["brachiopods"] = {
type = "set",
description = "=[[animal]]s in the [[phylum]] [[Brachiopoda]]. <u>Note</u>: not to be confused with [[branchiopod]]s, which are [[crustacean]]s",
parents = {"animals"},
}
labels["branchiopods"] = {
type = "set",
description = "=[[[brine shrimp]], [[clam shrimp]], [[fairy shrimp]], [[tadpole shrimp]], [[water flea]]s, and other [[crustacean]]s in the [[class]] [[Branchiopoda]]. <u>Note</u>: not to be confused with [[brachiopod]]s, which are a separate [[phylum]]",
parents = {"crustaceans"},
}
labels["bryozoans"] = {
type = "set",
description = "=[[animal]]s in the [[phylum]] [[Bryozoa]], also known as [[Ectoprocta]]",
parents = {"animals"},
}
labels["bulbuls"] = {
type = "set",
description = "=[[bulbul]]s, [[greenbul]]s, [[brownbul]]s, [[leaflove]]s, [[bristlebill]]s, and other birds in the [[passerine]] [[family]] [[Pycnonotidae]]",
parents = {"perching birds"},
}
labels["buteos"] = {
type = "set",
description = "=[[hawk]]s in the [[genus]] ''[[Buteo]]'', known as [[buzzard]]s in Europe",
parents = {"birds of prey"},
}
labels["butterflies"] = {
type = "set",
parents = {"insects"},
}
labels["caddis flies"] = {
type = "set",
description = "=insects in the order [[Trichoptera]], which are closely related to the [[butterfly|butterflies]] and [[moth]]s but with hairs on their wings instead of scales, and which have [[aquatic]] [[larvae]] that live in cases that they build around themselves",
parents = {"insects"},
}
labels["caecilians"] = {
type = "set",
description = "=[[amphibian]]s in the [[order]] [[Gymnophiona]], which are legless and resemble [[earthworm]]s or [[snake]]s",
parents = {"amphibians"},
}
labels["camelids"] = {
type = "set",
description = "=[[camelid]]s ([[camel]]s, [[llama]]s, [[alpaca]]s, etc.)",
parents = {"mammals", "even-toed ungulates"},
}
labels["canids"] = {
type = "set",
parents = {"carnivores"},
}
labels["caprines"] = {
type = "set",
description = "=[[sheep]], [[goat]]s, [[goat antelope]]s, [[chamois]], [[muskox]]en, [[bharal]], [[goral]], [[ibex]], [[mouflon]], [[serow]], [[tahr]], [[tur]], [[takin]] and other animals in the [[bovid]] [[subfamily]] [[Caprinae]], formerly known as the [[family]] Capridae",
parents = {"even-toed ungulates"},
}
labels["caprimulgiforms"] = {
type = "set",
description = "=[[caprimulgiform]]s: birds in the taxonomic order [[Caprimulgiformes]]- the [[nightjar]]s, [[oilbird]]s, [[frogmouth]]s, [[potoo]]s, etc",
parents = {"birds"},
}
labels["carcharhiniform sharks"] = {
type = "set",
description = "=[[bull shark]]s, [[catshark]]s, [[gummy shark]]s, [[hammerhead]]s, [[leopard shark]]s, [[morgay]]s, [[requiem shark]]s, [[tiger shark]]s, [[tope]]s, [[whaler]]s, [[whitetip]]s and other sharks in the [[order]] [[Carcharhiniformes]]",
parents = {"sharks"},
}
labels["cardinalids"] = {
type = "set",
description = "=[[cardinal]]s, [[dickcissel]]s, [[indigo bunting]]s, [[pyrrhuloxia]]s, [[rose-breasted grosbeak]]s, [[scarlet tanager]]s, and other birds in the [[family]] [[Cardinalidae]]",
parents = {"perching birds"},
}
labels["caridean shrimp"] = {
type = "set",
description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Caridea]], mostly known as [[shrimp]] or [[prawn]]s",
parents = {"crustaceans", "decapods"},
}
labels["carnivores"] = {
type = "set",
description = "=[[bear]]s, [[cat]]s, [[civet]]s, [[dog]]s, [[fossa]]s, [[hyaena]]s, [[mongoose]]s, [[panda]]s, [[raccoon]]s, [[seal]]s, [[skunk]]s, [[weasel]]s and various other [[mammal]]s in the [[order]] [[Carnivora]]",
parents = {"mammals"},
}
labels["carps"] = {
type = "set",
description = "=fish in the [[subfamily]] [[Cyprininae]], the [[carps]] and [[goldfish]]",
parents = {"cyprinids"},
}
labels["catfish"] = {
type = "set",
parents = {"fish", "otocephalan fish"},
}
labels["cats"] = {
type = "set",
description = "=[[cat]]s in the sense of members of the genus ''[[Felis]]''",
parents = {"felids"},
commonscat = "Felis silvestris catus",
wpcat = true,
}
labels["cattle"] = {
type = "set",
parents = {"bovines", "livestock"},
}
labels["caviomorphs"] = {
type = "set",
description = "=[[agouti]]s, [[capybara]]s, [[chinchilla]]s, [[guinea pig]]s, [[New World porcupine]]s, [[nutria]]s, [[tuco-tuco]]s and other [[rodent]]s in the parvorder [[Caviomorpha]]",
parents = {"rodents"},
}
labels["cephalopods"] = {
type = "set",
parents = {"mollusks"},
}
labels["cercopithecin monkeys"] = {
type = "set",
description = "=[[blue monkey]]s, [[Diana monkey]]s, [[guenon]]s, [[lesula]]s, [[malbrouck]]s, [[patas monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[Old World monkey]]s in the [[cercopithecine]] [[tribe]] [[Cercopithecini]]",
parents = {"Old World monkeys"},
}
labels["certhioid birds"] = {
type = "set",
description = "=birds in the [[passerine]] [[superfamily]] [[Certhioidea]], the [[treecreeper]]s, [[nuthatch]]es, [[gnatcatcher]]s and [[wren]]s",
parents = {"perching birds"},
}
labels["cervids"] = {
type = "set",
parents = {"even-toed ungulates"},
}
labels["cetaceans"] = {
type = "set",
description = "=[[cetacean]]s ([[dolphin]]s, [[whale]]s and [[porpoise]]s)",
parents = {"even-toed ungulates"},
}
labels["chalcidoid wasps"] = {
type = "set",
description = "=[[chalcidid]]s, [[encyrtid]]s, [[fig wasp]]s, [[jointworm]]s, [[mymarid]] [[fairyfly|fairyflies]], [[perilampid]]s, [[torymid]]s, [[trichogramma]]s, and other [[wasp]]s in the [[superfamily]] [[Chalcidoidea]]",
parents = {"hymenopterans"},
}
labels["characins"] = {
type = "set",
description = "=fish in the order [[Characiformes]]",
parents = {"fish", "otocephalan fish"},
}
labels["chickens"] = {
type = "set",
parents = {"poultry", "fowls"},
}
labels["chimaeras (fish)"] = {
type = "set",
description = "=[[cartilaginous]] fish in the [[Chimaeriformes]], the only surviving [[order]] of the [[subclass]] [[Holocephali]], and separate from the [[shark]]s, [[ray]]s, [[skate]]s and [[sawfish]] of the subclass [[Elasmobranchii]]",
parents = {"fish"},
}
labels["chordates"] = {
type = "set",
description = "=animals in the [[phylum]] [[Chordata]]",
parents = {"animals"},
}
labels["chrysomeloid beetles"] = {
type = "set",
description = "=[[cerambycid]]s or [[longhorn beetle]]s such as [[apple borer]]s, [[huhu beetle]]s, [[locust borer]]s and [[thunderbolt beetle]]s, as well as [[chrysomelid]]s or [[leaf beetle]]s such as [[asparagus beetle]]s, [[bean weevil]]s, [[Colorado beetle]]s, [[cucumber beetle]]s, [[flea beetle]]s, [[potato beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Chrysomeloidea]]",
parents = {"beetles"},
}
labels["cicadas"] = {
type = "set",
description = "=[[insect]]s in the [[superfamily]] [[Cicadoidea]]",
parents = {"hemipterans"},
}
labels["cichlids"] = {
type = "set",
description = "=fish in the family [[Cichlidae]]",
parents = {"labroid fish"},
}
labels["clinids"] = {
type = "set",
description = "=fish in the family [[Clinidae]]",
parents = {"fish"},
}
labels["cnidarians"] = {
type = "set",
description = "=[[coral]]s, [[gorgonian]]s, [[hydra]]s, [[myxozoan]]s, [[Portuguese man-of-war]], [[sea anemone]]s, [[sea fir]]s, [[sea wasp]]s, and other animals in the in the [[phylum]] [[Cnidaria]]",
parents = {"animals"},
}
labels["cockatoos"] = {
type = "set",
description = "=[[crested]] [[parrot]]s in the [[family]] [[Cacatuidae]]",
parents = {"parrots"},
}
labels["cockroaches"] = {
type = "set",
parents = {"insects"},
}
labels["colobine monkeys"] = {
type = "set",
description = "=[[colobus]]es, [[douc]]s, [[langur]]s, [[guereza]]s, [[hanuman]]s,[[leaf monkey]]s, [[lutung]]s, [[proboscis monkey]]s, and other [[Old World monkey]]s in the [[subfamily]] [[Colobinae]]",
parents = {"Old World monkeys"},
}
labels["colubrid snakes"] = {
type = "set",
description = "=[[snake]]s in the family [[Colubridae]]",
parents = {"snakes"},
}
labels["colugos"] = {
type = "set",
description = "=the [[primate]]-like [[gliding]] [[mammal]]s in the [[order]] [[Dermoptera]], also known as [[flying lemur]]s",
parents = {"mammals"},
}
labels["columbids"] = {
type = "set",
description = "=[[columbid]]s, i.e. [[pigeon]]s and [[dove]]s",
parents = {"birds"},
}
labels["copepods"] = {
type = "set",
description = "=[[crustacean]]s in the [[subclass]] [[Copepoda]]",
parents = {"crustaceans"},
}
labels["coraciiforms"] = {
type = "set",
description = "=[[bee-eater]]s, [[ground rollers]], [[kingfisher]]s, [[motmot]]s, [[roller]]s, [[tody|todies]] and other birds in the taxonomic order [[Coraciiformes]]",
parents = {"birds"},
}
labels["corvids"] = {
type = "set",
parents = {"perching birds", "corvoid birds"},
}
labels["corvoid birds"] = {
type = "set",
description = "=[[apostlebird]]s, [[bird of paradise|birds of paradise]], [[crow]]s, [[drongo]]s, [[fantail]]s, [[grinder]]s, [[jackdaw]]s, [[jay]]s, [[magpie]]s, [[magpie-lark]]s, [[manucode]]s, [[monarchid]]s, [[nutcracker]]s, [[piwakawaka]]s, [[raven]]s, [[restless flycatcher]]s, [[riflebird]]s, [[shrike]]s, [[standard-wing]]s, and other birds in the [[superfamily]] [[Corvoidea]]",
parents = {"perching birds"},
}
labels["cotingas"] = {
type = "set",
description = "=birds in the [[suboscine]] [[family]] [[Cotingidae]]",
parents = {"suboscines"},
}
labels["crabs"] = {
type = "set",
description = "=[[crab]]s, [[decapod]] [[crustacean]]s in the [[infraorder]] [[Brachyura]]",
parents = {"crustaceans", "decapods"},
}
labels["cranes (birds)"] = {
type = "set",
description = "=[[crane]]s",
parents = {"gruiforms"},
}
labels["cricetids"] = {
type = "set",
description = "=[[cotton rat]]s, [[deer mouse|deer mice]], [[hamster]]s, [[harvest mouse|harvest mice]], [[lemming]]s, [[vole]]s, [[woodrat]]s, and other [[rodent]]s in the [[family]] [[Cricetidae]]",
parents = {"rodents"},
}
labels["crickets and grasshoppers"] = {
type = "set",
description = "=[[cricket]]s, [[grasshopper]]s, [[katydid]]s, [[weta]]s and other [[insect]]s in the order [[Orthoptera]]",
parents = {"insects"},
}
labels["croakers"] = {
type = "set",
description = "=[[croaker]]s, [[drum]]s, [[weakfish]]s and other fish in the family [[Sciaenidae]]",
parents = {"percoid fish"},
}
labels["crocodilians"] = {
type = "set",
description = "=[[crocodile]]s, [[alligator]]s, [[caymans]], and other [[reptile]]s in the order [[Crocodilia]]",
parents = {"reptiles"},
}
labels["crustaceans"] = {
type = "set",
parents = {"arthropods"},
}
labels["cuckoos"] = {
type = "set",
description = "=[[cuckoo]]s and other birds in the [[family]] [[Cuculidae]]",
parents = {"otidimorph birds"},
}
labels["cuckooshrikes and minivets"] = {
type = "set",
description = "=birds in the [[family]] [[Campephagidae]]",
parents = {"perching birds"},
}
labels["cucujoid beetles"] = {
type = "set",
description = "=[[flower beetle]]s, [[fungus beetle]]s, [[grain beetle]]s, [[lady beetle]]s, [[lizard beetle]]s, [[Mexican bean beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Cucujoidea]]",
parents = {"beetles"},
}
labels["ctenophores"] = {
type = "set",
description = "=animals in the [[phylum]] [[Ctenophora]], the [[comb jelly|comb jellies]]",
parents = {"animals"},
}
labels["culicomorphs"] = {
type = "set",
description = "=[[biting midge]]s, [[blackfly|blackflies]], [[blood worm]]s, [[glassworm]]s, [[meniscus midge]]s, [[mosquito]]s, [[no-see-um]]s, [[non-biting midge]]s, [[phantom midge]]s and other [[insect]]s in the [[dipteran]] [[infraorder]] [[Culicomorpha]]",
parents = {"dipterans"},
}
labels["cyprinids"] = {
type = "set",
description = "=[[carp]], [[minnow]]s, [[chub]]s and other fish in the [[family]] [[Cyprinidae]]. In some classifications, this group is known as the [[superfamily]] [[Cyprinoidea]] or [[suborder]] [[Cyprinoidei]], with the [[cyprinid]] [[subfamily|subfamilies]] considered to be families",
parents = {"fish", "otocephalan fish"},
}
labels["dabbling ducks"] = {
type = "set",
description = "=[[gadwall]]s [[garganey]]s, [[mallard]]s, [[mottled duck]]s, [[pintail]]s, [[shoveler]]s, [[teal]]s, [[wigeon]]s and other ducks in either the [[anatid]] [[tribe]] [[Anatini]] or [[subfamily]] [[Anatinae]], depending on the classification",
parents = {"ducks"},
}
labels["damselflies"] = {
type = "set",
description = "=[[bluestreak]]s, [[bluetail]]s, [[demoiselle]]s, [[flatwing]]s, [[redtail]]s, [[riverdamsel]]s, [[rubyspot]]s, [[spreadwing]]s, [[threadtail]]s, [[whitetip]]s, and other insects in the [[odonate]] [[suborder]] [[Zygoptera]]",
parents = {"dragonflies and damselflies"},
}
labels["danaine butterflies"] = {
type = "set",
description = "=[[clearwing]]s, [[crow]]s, [[milkweed]]s, [[monarch]]s, [[paper kite butterfly|paper kite butterflies]], [[tiger]]s, [[wanderer]]s and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Danainae]]",
parents = {"nymphalid butterflies"},
}
labels["dasyuromorphs"] = {
type = "set",
description = "=[[thylacine]]s, [[numbat]]s, [[dasyure]]s, [[antechinus]]es, [[dibbler]]s, [[dunnart]]s, [[mulgara]]s. [[phascogale]]s, [[planigale]]s, [[quoll]]s, [[Tasmanian devil]]s, and other [[marsupial]]s in the [[order]] [[Dasyuromorphia]]",
parents = {"marsupials"},
}
labels["decapods"] = {
type = "set",
description = "=[[crabs]], [[crayfish]], [[lobster]]s, [[prawn]]s, ([[caridean]]) [[shrimp]], and many other [[crustacean]]s in the [[order]] [[Decapoda]]",
parents = {"crustaceans"},
}
labels["delphinids"] = {
type = "set",
description = "=(oceanic) [[dolphin]]s, [[grampus]]es, [[killer whale]]s/[[orca]]s, [[pilot whale]]s, and other [[cetacean]]s in the [[family]] [[Delphinidae]]",
additional = "Note: [[river dolphin]]s and [[porpoise]]s are in other families.",
parents = {"cetaceans"},
}
labels["designer dogs"] = {
type = "set",
parents = {"dogs"},
commonscat = true,
wpcat = true,
}
labels["dinosaurs"] = {
type = "set",
parents = {"reptiles"},
}
labels["dionychan spiders"] = {
type = "set",
description = "=[[crab spider]]s, [[flattie]]s, [[ground spider]]s, [[huntsman spider]]s, [[jumping spider]], [[scorpion spider]]s, and other [[spiders]] in the [[entelegyne]] [[clade]] [[Dionycha]]",
parents = {"spiders"},
}
labels["dipterans"] = {
type = "set",
description = "=[[fly|flies]], [[gnat]]s, [[midge]]s, [[mosquito]]s and other [[insect]]s in the order [[Diptera]]",
parents = {"insects"},
}
labels["dogs"] = {
type = "set",
parents = {"canids"},
commonscat = true,
wpcat = true,
}
labels["domestic cats"] = {
type = "set",
parents = {"cats"},
}
labels["dragonflies and damselflies"] = {
type = "set",
description = "=insects in the order [[Odonata]]",
parents = {"insects"},
}
labels["ducks"] = {
type = "set",
parents = {"anatids", "poultry"},
}
labels["dugongs and manatees"] = {
type = "set",
description = "=[[mammal]]s in the order [[Sirenia]]",
parents = {"mammals"},
}
labels["eagles"] = {
type = "set",
parents = {"birds of prey"},
}
labels["earthworms"] = {
type = "set",
description = "=worms in the [[annelid]] [[suborder]] [[Lumbricina]]",
parents = {"annelids"},
}
labels["earwigs"] = {
type = "set",
description = "=insects in the order [[Dermaptera]]",
parents = {"insects"},
}
labels["echinoderms"] = {
type = "set",
parents = {"animals"},
commonscat = "Echinodermata",
wpcat = true,
}
labels["eels"] = {
type = "set",
description = "=[[eel]]s, elongated, snakelike fish in the order [[Anguilliformes]]",
parents = {"elopomorph fish"},
}
labels["elapid snakes"] = {
type = "set",
description = "=[[cobra]]s, [[coral snake]]s, [[krait]]s, [[mamba]]s, [[sea snake]]s, and other [[venomous]] snakes in the family [[Elapidae]]",
parents = {"snakes"},
}
labels["elateroid beetles"] = {
type = "set",
description = "=[[click beetle]]s/[[elaterid]]s, [[fire beetle]]s, [[firefly|fireflies]]/[[lampyrid]]s, [[glowworm]]s, [[net-winged beetle]]s/[[lycid]]s, [[railroad worm]]s/[[phengodid]]s, [[soldier beetle]]s/[[cantharid]]s, [[throscid]]s, [[wireworm]]s and other [[beetle]]s in the [[superfamily]] [[Elateroidea]]",
parents = {"beetles"},
}
labels["elephants"] = {
type = "set",
parents = {"mammals"},
commonscat = "Elephantidae",
wpcat = true,
}
labels["elopomorph fish"] = {
type = "set",
description = "=[[bonefish]], [[eel]]s, [[gulper eel]]s, [[halosaur]]s, [[ladyfish]], [[tarpon]] and other fish in the [[superorder]] [[Elopomorpha]]",
parents = {"fish"},
}
labels["emberizids"] = {
type = "set",
description = "=[[bunting]]s, [[yellowhammer]]s and related birds in the [[passerine]] family [[Emberizidae]]",
additional = "<u>Note</u>: for New World species that were formerly classified in this family, see [[:Category:{{{langcode}}}:New World sparrows]].",
parents = {"perching birds"},
}
labels["emydid turtles"] = {
type = "set",
description = "=(North American) [[box turtle]]s, [[chicken turtle]]s, [[cooter]]s, [[ellachick]]s, [[pond turtle]]s, [[slider]]s, [[terrapin]]s, and other [[turtle]]s in the [[family]] [[Emydidae]]",
parents = {"turtles"},
}
labels["equids"] = {
type = "set",
parents = {"odd-toed ungulates"},
}
labels["erinaceids"] = {
type = "set",
description = "=[[erinaceid]]s – hedgehogs and relatives",
parents = {"mammals"},
}
labels["euplerids"] = {
type = "set",
description = "=[[euplerid]]s — mongoose-like mammals found in Madagascar",
parents = {"carnivores"},
}
labels["even-toed ungulates"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Artiodactyla]]",
parents = {"mammals"},
}
labels["falconids"] = {
type = "set",
description = "=[[caracara]]s, [[falcon]]s, [[hobby|hobbies]], [[kestrel]]s, [[lanner]]s, [[merlin]]s, [[saker]]s, and other birds in the [[family]] [[Falconidae]]",
parents = {"birds of prey"},
}
labels["felids"] = {
type = "set",
parents = {"carnivores"},
}
labels["female animals"] = {
type = "set",
parents = {"animals", "female"},
}
labels["fish"] = {
type = "set",
parents = {"vertebrates"},
commonscat = true,
wpcat = true,
}
labels["flamingos"] = {
type = "set",
parents = {"freshwater birds"},
}
labels["flatfish"] = {
type = "set",
description = "=[[sole]]s, [[flounder]]s, [[halibut]]s and other fish in the order [[Pleuronectiformes]]",
parents = {"fish"},
}
labels["flatworms"] = {
type = "set",
description = "=[[fluke]]s, [[monogenean]]s, [[planarian]]s, [[polyclad]]s, [[tapeworm]]s, and other animals in the [[phylum]] [[Platyhelminthes]]",
additional = "For terms related to the study of [[parasitic]] [[worm#Noun|worms]], see [[:Category:Helminthology]] and its subcategories.",
parents = {"worms"},
}
labels["fleas"] = {
type = "set",
parents = {"insects"},
}
labels["fowls"] = {
type = "set",
description = "=[[fowl]]s: land birds in the [[order]] [[Galliformes]]",
parents = {"birds"},
}
labels["foxes"] = {
type = "set",
parents = {"canids"},
}
labels["freshwater birds"] = {
type = "set",
description = "=birds that live mainly in [[freshwater]] areas, including [[estuaries]]",
parents = {"birds"},
}
labels["freshwater whitefish"] = {
type = "set",
description = "=[[cisco]]s, [[houting]]s, [[inconnu]]s, [[lavaret]]s, [[marena]]s, [[omul]]s, [[Otsego bass]], [[peled]]s, [[pollan]]s, [[roundfish]], [[tullibee]]s, [[vendace]]s, [[whitefish]] and other fish in the [[salmonid]] [[subfamily]] [[Coregoninae]]",
parents = {"salmonids"},
}
labels["frogs"] = {
type = "set",
parents = {"anurans"},
}
labels["gadiforms"] = {
type = "set",
description = "=[[cod]], [[haddock]], [[hake]] and other fish in the [[order]] [[Gadiformes]]",
parents = {"fish"},
}
labels["gasterosteiform fish"] = {
type = "set",
description = "=[[stickleback]]s, [[hypoptychid]] [[sand eel]]s, [[tubesnout]]s and other fish in the [[order]] [[Gasterosteiformes]]",
additional = "Note: See [[:Category:Syngnathiform fish]] for a group formerly included within this order.",
parents = {"fish"},
}
labels["gastropods"] = {
type = "set",
parents = {"mollusks"},
}
labels["geckos"] = {
type = "set",
description = "=[[lizard]]s in the [[infraorder]] [[Gekkota]], except for the [[legless lizards]] or [[pygopod]]s",
parents = {"lizards"},
}
labels["geese"] = {
type = "set",
parents = {"anatids", "poultry"},
}
labels["gelechioid moths"] = {
type = "set",
description = "=[[acorn moth]]s, [[autostichid]]s,[[blastobasid]]s, [[casebearer]]s/[[coleophorid]]s, [[cosmet moth]]s/[[cosmopterigid]]s, [[depressariid]]s, [[gelechiid]]s/[[twirler moth]]s, [[lecithocerid]]s,[[oecophorid]]s/[[concealer]]s, [[palmerworm]]s, [[parsnip moth]]s, [[potato moth]]s, [[scythridid]]s/[[flower moth]]s, [[xyloryctid]]s, and other [[micromoth]]s in the [[superfamily]] [[Gelechioidea]]",
parents = {"moths"},
}
labels["geometrid moths"] = {
type = "set",
description = "=[[carpet]]s, [[engrailed]]s, [[heath]]s, [[pug]]s, [[peppered moth]]s, [[streak]]s, [[wave]]s and other [[moth]]s in the [[family]] [[Geometridae]], most of which have [[caterpillar]]s known as [[inchworm]]s, [[looper]]s, [[measuring worm]]s or [[spanworm]]s",
parents = {"moths"},
}
labels["goats"] = {
type = "set",
parents = {"caprines", "livestock"},
}
labels["gobies"] = {
type = "set",
description = "=[[goby|gobies]], [[dartfish]], [[mudskipper]]s, [[sea gudgeon]]s, [[sleeper]]s, [[wormfish]], and other [[fish]] in the [[perciform]] [[suborder]] [[Gobioidei]]",
parents = {"fish"},
}
labels["gossamer-winged butterflies"] = {
type = "set",
description = "=[[blue]]s, [[copper]]s, [[elfin]]s, [[harvester]]s, [[hairstreak]]s, [[sunbeam]]s and other [[butterfly|butterflies]] in the [[family]] [[Lycaenidae]]",
parents = {"butterflies"},
}
labels["grebes"] = {
type = "set",
parents = {"freshwater birds"},
}
labels["grouse"] = {
type = "set",
description = "=[[blackcock]]s, [[capercaillie]]s, [[grouse]], [[moorcock]]s, [[prairie chicken]]s, [[ptarmigan]]s, [[sagehen]]s, and other birds in the [[phasianid]] [[subfamily]] [[Tetraoninae]]",
parents = {"fowls"},
}
labels["gruiforms"] = {
type = "set",
description = "=[[coot]]s, [[crake]]s, [[crane]]s, [[finfoot]]s, [[flufftail]]s, [[gallinule]]s, [[limpkin]]s, [[rail]]s, [[sungrebe]]s, [[trumpeter]]s, and other birds in the [[order]] [[Gruiformes]]",
parents = {"freshwater birds"},
}
labels["gulls"] = {
type = "set",
description = "=[[gull]]s, [[seabird]]s in the [[family]] [[Laridae]]",
parents = {"seabirds"},
}
labels["gun dogs"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["hares"] = {
type = "set",
parents = {"lagomorphs"},
}
labels["hemipterans"] = {
type = "set",
description = "=[[aphid]]s, [[leafhopper]]s, [[scale insect]]s, [[true bug]]s, [[whitefly|whiteflies]], and other [[insect]]s in the order [[Hemiptera]]",
parents = {"insects"},
}
labels["herding dogs"] = {
type = "set",
parents = {"pastoral dogs"},
}
labels["herons"] = {
type = "set",
description = "=[[heron]]s, [[bittern]]s and [[egret]]s",
parents = {"freshwater birds"},
}
labels["herpestids"] = {
type = "set",
description = "=[[herpestid]]s- mongooses, meerkats, and relatives",
parents = {"carnivores"},
}
labels["herrings"] = {
type = "set",
description = "=[[herring]]s, [[shad]]s, [[sardine]]s and other fish in the family [[Clupeidae]]",
parents = {"fish", "otocephalan fish"},
}
labels["holostean fish"] = {
type = "set",
description = "=[[gar]]s and [[bowfin]]s, primitive fish in the [[infraclass]] [[Holostei]]",
parents = {"fish"},
}
labels["hominids"] = {
type = "set",
parents = {"primates"},
}
labels["honeyeaters"] = {
type = "set",
description = "=Australian [[chat]]s, [[bellbird]]s, [[friarbird]]s, [[gibberbird]]s, [[honeyeater]]s, [[miner]]s, [[spinebill]]s, [[wattlebird]]s, and other birds in the [[family]] [[Meliphagidae]]",
parents = {"meliphagoid birds"},
}
labels["hoopoes and hornbills"] = {
type = "set",
description = "=[[hoopoe]]s, [[woodhoopoe]]s (including [[scimitarbill]]s), [[hornbill]]s, [[ground hornbill]]s, and other birds in the taxonomic order [[Bucerotiformes]]",
parents = {"birds"},
}
labels["horseflies"] = {
type = "set",
description = "=[[blind-fly|blind-flies]], [[breezefly|breezeflies]], [[cleg]]s, [[deerfly|deerflies]], [[forest fly|forest flies]], [[gadfly|gadflies]], [[horsefly|horseflies]], [[oxfly|oxflies]], [[zimb]]s, and other biting flies in the [[family]] [[Tabanidae]]",
parents = {"dipterans"},
}
labels["horse breeds"] = {
type = "set",
parents = {"horses"},
commonscat = true,
wpcat = true,
}
labels["horses"] = {
type = "set",
parents = {"equids", "livestock"},
}
labels["hummingbirds"] = {
type = "set",
parents = {"apodiforms"},
}
labels["hunting dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["hyaenids"] = {
type = "set",
parents = {"carnivores"},
}
labels["hydrozoans"] = {
type = "set",
description = "=[[bluebottle]]s, [[calycophoran]]s, [[filiferan]]s, [[hydra]]s, [[hydractinian]]s, [[leptothecate]]s, [[narcomedusa]]s, [[pandeid]]s, [[physonect]]s, [[plumularian]]s, [[Portuguese man-of-war]]s, [[siphonophore]]s, [[stylaster]]s, [[sea fir]]s, [[sea ginger]], [[trachylid]]s, [[trachymedusa]]s, amd other animals in the [[cnidarian]] [[class]] [[Hydrozoa]]",
parents = {"cnidarians"},
}
labels["hymenopterans"] = {
type = "set",
description = "=[[ant]]s, [[bee]]s, [[ichneumon wasp]]s, [[sawfly|sawflies]], [[wasp]]s and other [[insect]]s in the order [[Hymenoptera]]",
parents = {"insects"},
}
labels["hyraxes"] = {
type = "set",
parents = {"mammals"},
}
labels["ibises and spoonbills"] = {
type = "set",
description = "=[[ibis]]es and [[spoonbill]]s",
parents = {"freshwater birds"},
}
labels["ichthyosauromorphs"] = {
type = "set",
description = "=[[ichthyosaurs]] and related groups of [[extinct]] [[aquatic]] [[reptile]]s in the [[clade]] [[Ichthyosauromorpha]]",
parents = {"reptiles"},
}
labels["icterids"] = {
type = "set",
description = "=birds in the [[New World]] [[passerine]] family [[Icteridae]]",
parents = {"perching birds"},
}
labels["iguanoid lizards"] = {
type = "set",
description = "=[[anole]]s, [[basilisk]]s, [[collared lizard]]s, [[chuckwalla]]s, [[fence lizard]]s, [[fringe-toed lizard]]s, [[horned lizard]]s, [[iguana]]s, [[leopard lizard]]s, [[side-blotched lizard]]s, [[zebra-tailed lizard]]s and other [[lizard]]s formerly included in the [[family]] [[Iguanidae]], and now mostly treated as comprising either the [[infraorder]] [[Pleurodonta]] or the [[superfamily]] [[Iguanoidea]]",
parents = {"lizards"},
}
labels["insects"] = {
type = "set",
parents = {"arthropods"},
}
labels["isopods"] = {
type = "set",
description = "=[[gribble]]s, [[pillbug]]s, [[salve bug]]s, [[slater]]s, [[sea slater]]s, [[sowbug]]s, [[woodlouse|woodlice]], and other [[crustacean]]s in the [[order]] [[Isopoda]]",
parents = {"crustaceans"},
}
labels["jackfish"] = {
type = "set",
description = "=[[jack]]s, [[pompano]]s, [[jack mackerel]]s, [[scad]]s and other fish in the family [[Carangidae]]",
parents = {"percoid fish"},
}
labels["jawless fish"] = {
type = "set",
description = "=[[lamprey]]s and [[hagfish]]: primitive eel-like fishes that have no jaws",
parents = {"fish"},
}
labels["kingfishers"] = {
type = "set",
parents = {"coraciiforms"},
}
labels["kites (birds)"] = {
type = "set",
description = "=[[hawk]]s in the [[accipitrid]] [[subfamily|subfamilies]] [[Milvinae]] and [[Elaninae]], as well as some in the subfamily [[Perninae]]",
parents = {"birds of prey"},
}
labels["kyphosid fish"] = {
type = "set",
description = "=[[blackfish]], [[drummer]]s, [[footballer]]s, [[greenfish]], [[halfmoon]]s, [[luderick]]s, [[mado]]s, [[moonlighter]]s, [[nibbler]]s, [[opaleye]]s, [[sea chub]]s, [[stripey]]s, [[sweep]]s and other fish in the [[percoid]] [[family]] [[Kyphosidae]]",
parents = {"percoid fish"},
}
labels["labroid fish"] = {
type = "set",
description = "=[[anemonefish]], [[cale]]s, [[cichlid]]s, [[clownfish]], [[damselfish]], [[parrotfish]], [[surfperch]], [[wrasse]]s, and other fish in the [[perciform]] [[suborder]] [[Labroidei]]",
parents = {"fish"},
}
labels["labyrinth fish"] = {
type = "set",
description = "=[[climbing perch]], [[gourami]]s, [[paradisefish]], [[Siamese fighting fish]] and other fish in the [[suborder]] [[Anabantoidei]]",
parents = {"fish"},
}
labels["lacertoid lizards"] = {
type = "set",
description = "=[[amphisbaena]]s, [[caiman lizard]]s, [[green lizard]]s, [[ocellated lizard]]s, [[racerunner]]s, [[rock lizard]]s, [[tegu]]s, [[teiid]]s, [[thunderworm]]s, [[viviparous lizard]]s, [[wall lizard]]s, [[whiptail]]s, and other [[lizard]]s in the [[superfamily]] [[Lacertoidea]]",
parents = {"lizards"},
}
labels["lagomorphs"] = {
type = "set",
parents = {"mammals"},
}
labels["lamniform sharks"] = {
type = "set",
description = "=[[basking shark]]s, [[goblin shark]]s, [[great white shark]]s, [[mako shark]]s, [[megamouth shark]]s, [[porbeagle]]s, [[sand shark]]s, [[thresher shark]]s, and other [[shark]]s in the [[order]] [[Lamniformes]]",
parents = {"sharks"},
}
labels["lampriform fish"] = {
type = "set",
description = "=[[crestfish]], [[oarfish]], [[opah]]s, [[ribbonfish]], [[velifer]]s and other fish in the [[order]] [[Lampridiformes]] (not to be confused with the unrelated [[lamprey]]s)",
parents = {"fish"},
}
labels["larks"] = {
type = "set",
parents = {"perching birds"},
}
labels["laughingthrushes"] = {
type = "set",
description = "=birds in the [[family]] [[Leiothrichidae]]",
parents = {"perching birds"},
}
labels["leaf warblers"] = {
type = "set",
description = "=birds in the family [[Phylloscopidae]]",
parents = {"warblers"},
}
labels["lesser apes"] = {
type = "set",
description = "=[[gibbon]]s (including [[hoolock]]s, [[lar gibbon]]s [[wow-wow]]s, etc.) and [[siamang]]s, comprising the [[family]] [[Hylobatidae]], which is closely related to the [[hominid]]s",
parents = {"primates"},
}
labels["leuciscine fish"] = {
type = "set",
description = "=[[bream]]s, [[chub]]s, [[dace]]s, [[ide]]s, many [[minnow]]s, [[nase]]s, [[roach]]es, [[shiner]]s, [[ziege]]s, and other fish in the [[cyprinid]] [[subfamily]] [[Leuciscinae]], sometimes treated as the [[family]] [[Leuciscidae]], or as the [[tribe]] [[Leuciscini]] within the [[subfamily]] [[Cyprininae]]",
parents = {"cyprinids"},
}
labels["libellulid dragonflies"] = {
type = "set",
description = "=[[amberwing]]s, [[basker]]s, [[darter]]s, [[dropwing]]s, [[duskhawk]]s, [[flutterer]]s, [[glider]]s, [[meadowhawk]]s, [[pennant]]s, [[percher]]s, [[skimmer]]s, [[slimwing]]s, [[swampdragon]]s, [[twister]]s, and other [[dragonfly|dragonflies]] in the [[family]] [[Libellulidae]]",
parents = {"dragonflies and damselflies"},
}
labels["lice"] = {
type = "set",
description = "=[[parasitic]] insects in the [[order]] [[Psocodea]]",
parents = {"insects"},
}
labels["limenitidine butterflies"] = {
type = "set",
description = "=[[admiral]]s, [[clipper]]s, [[count]]s, [[duke]]s, [[purple]]s, [[sister]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Limenitidinae]]",
parents = {"nymphalid butterflies"},
}
labels["littorinimorphs"] = {
type = "set",
description = "=[[boat shell]]s, [[carrier shell]]s, [[conch]]s, [[cowry|cowries]], [[flamingo tongue]]s, [[helmet shell]]s, [[moon snail]]s, [[pebblesnail]]s, [[trumpet shell]]s, [[velutinid]]s, [[winkle]]s, [[worm-shell]]s, and other [[gastropod]]s in the [[order]] [[Littorinimorpha]]",
parents = {"gastropods"},
}
labels["livestock guardian dogs"] = {
type = "set",
parents = {"pastoral dogs"},
}
labels["lizards"] = {
type = "set",
parents = {"reptiles"},
}
labels["loaches"] = {
type = "set",
description = "=fish in the [[cypriniform]] [[superfamily]] [[Cobitoidea]]",
parents = {"fish", "otocephalan fish"},
}
labels["lobe-finned fishes"] = {
type = "set",
description = "=[[coelacanth]]s, [[lungfish]] and other fishes in the [[subclass]] [[Sarcopterygii]] of the [[bony fish]]es",
additional = "<u>Please note</u>: although the [[tetrapod]]s (including all [[reptile]]s, [[amphibian]]s, [[bird]]s and [[mammal]]s) are descended from within this group, they are excluded from this category by not being fish.",
parents = {"fish"},
}
labels["loons"] = {
type = "set",
description = "=[[loon]]s, birds known as [[diver]]s outside the US",
parents = {"freshwater birds"},
}
labels["macaques"] = {
type = "set",
description = "=[[Barbary ape]]s, [[bonnet monkey]]s, [[crab-eating macaque]]s, [[Japanese macaque]]s, [[moor macaque]]s, [[pigtail macaque]]s, [[rhesus monkey]]s, [[toque]]s, and other [[Old World monkey]]s in the [[genus]] ''[[Macaca]]''",
parents = {"Old World monkeys"},
}
labels["macropods"] = {
type = "set",
description = "=[[bettong]]s, [[kangaroo]]s, [[pademelon]]s, [[potoroo]]s, [[quokka]]s, [[wallaby]]s, and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Macropodiformes]]",
parents = {"marsupials"},
}
labels["malaconotoid birds"] = {
type = "set",
description = "=[[Australian magpie]]s, [[bushshrike]]s, [[butcherbird]]s, [[boubou]]s, [[brubru]]s, [[currawong]]s, [[gonolek]]s, [[squeaker]]s, [[vanga]]s, and other birds in the [[passerine]] [[superfamily]] [[Malaconotoidea]]",
parents = {"perching birds"},
}
labels["male animals"] = {
type = "set",
parents = {"animals", "male"},
}
labels["mammals"] = {
type = "set",
parents = {"vertebrates"},
}
labels["mantids"] = {
type = "set",
description = "=insects in the [[order]] [[Mantodea]], often known as [[praying mantis]]es",
parents = {"insects"},
}
labels["marsupials"] = {
type = "set",
parents = {"mammals"},
}
labels["mayflies"] = {
type = "set",
description = "=insects in the [[order]] [[Ephemeroptera]]",
parents = {"insects"},
}
labels["megalopterans"] = {
type = "set",
description = "=[[alderfly|alderflies]], [[dobsonfly|dobsonflies]], [[fishfly|fishflies]] and other insects in the [[order]] [[Megaloptera]]",
parents = {"insects"},
}
labels["meliphagoid birds"] = {
type = "set",
description = "=[[blue wren]]s, [[bristlebird]]s, [[emu-wren]]s, [[fairywren]]s, [[gerygone]]s, [[grasswren]]s, [[honeyeater]]s, [[pardalote]]s, [[pilotbird]]s, [[redthroat]]s, [[scrubwren]]s, [[thornbill]]s, [[weebill]]s, [[whiteface]]s, and other birds in the [[passerine]] [[superfamily]] [[Meliphagoidea]]",
parents = {"perching birds"},
}
labels["mephitids"] = {
type = "set",
description = "=[[mephitid]]s: skunks and stink badgers",
parents = {"carnivores"},
}
labels["mergansers"] = {
type = "set",
description = "=[[diving]] [[duck]]s in the [[genus]] ''[[Mergus]]'' and a few similar species",
parents = {"ducks"},
}
labels["mimids"] = {
type = "set",
description = "=[[catbird]]s, [[mockingbird]]s, [[thrasher]]s and other birds in the [[passerine]] family [[Mimidae]]",
parents = {"perching birds"},
}
labels["mites and ticks"] = {
type = "set",
description = "=[[arachnid]]s in the [[subclass]] [[Acari]]",
parents = {"arachnids"},
}
labels["mollusks"] = {
type = "set",
parents = {"animals"},
commonscat = "Mollusca",
wpcat = "Molluscs",
}
labels["monkeys"] = {
type = "set",
parents = {"primates"},
}
labels["monotremes"] = {
type = "set",
parents = {"mammals"},
}
labels["mosquitoes"] = {
type = "set",
description = "=[[insect]]s in the [[dipteran]] [[family]] [[Culicidae]]",
parents = {"culicomorphs"},
}
labels["moths"] = {
type = "set",
parents = {"insects"},
}
labels["murids"] = {
type = "set",
description = "=a number of [[rats]], [[mice]], and other [[rodent]]s in the [[Old World]] [[family]] [[Muridae]]",
parents = {"rodents"},
}
labels["muscicapids"] = {
type = "set",
description = "=birds in the [[passerine]] family [[Muscicapidae]]",
parents = {"perching birds"},
}
labels["muscoid flies"] = {
type = "set",
description = "=[[anthomyiid]]s such as [[root fly|root flies]], [[cabbage fly|cabbage flies]] and [[onion fly|onion flies]]; [[fanniid]]s; [[muscid]]s such as [[housefly|houseflies]], [[face fly|face flies]] and [[stable fly|stable flies]]; [[scathophagid]]s such as [[dungfly|dungflies]]; and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Muscoidea]]",
parents = {"dipterans"},
}
labels["mustelids"] = {
type = "set",
parents = {"carnivores"},
}
labels["mygalomorph spiders"] = {
type = "set",
description = "=[[baboon spider]]s, [[barking spider]]s, [[bird spider]]s, [[purseweb spider]]s, [[tarantula]]s, [[trapdoor spider]]s, and other [[spider]]s in the [[infraorder]] [[Mygalomorphae]]",
parents = {"spiders"},
}
labels["myriapods"] = {
type = "set",
description = "=[[centipede]]s, [[millipede]]s, [[pauropod]]s, [[symphylan]]s, and other [[arthropod]]s in the [[subphylum]] [[Myriapoda]]",
parents = {"arthropods"},
}
labels["myrmicine ants"] = {
type = "set",
description = "=[[ant]]s in the [[subfamily]] [[Myrmicinae]]",
parents = {"ants"},
}
labels["nematodes"] = {
type = "set",
description = "=[[filaria]], [[gapeworm]]s, [[lungworm]]s, [[pinworm]]s, [[threadworm]]s, [[wheatworm]]s, [[whipworm]]s and other [[worm]]s in the [[phylum]] [[Nematoda]]",
parents = {"worms"},
}
labels["neogastropods"] = {
type = "set",
description = "=[[admiral shell]]s, [[cone snail]]s, [[harp shell]]s, [[murex]]es, [[olive]]s, [[rhombus]]es, [[spindle]]s, [[tulip shell]]s, [[turnip shell]]s, [[volute]]s, [[whelk]]s, [[winkle]]s and other [[gastropod]]s in the [[clade]] [[Neogastropoda]] (treated as an [[order]] in some classifications)",
parents = {"gastropods"},
}
labels["New World monkeys"] = {
type = "set",
description = "=[[capuchin]]s, [[howler monkey]]s, [[marmoset]]s, [[night monkey]]s, [[saki]]s, [[spider monkey]]s, [[squirrel monkey]]s, [[tamarin]]s, [[titi]]s, [[uakari]]s, [[woolly monkey]]s, and other [[monkey]]s in the [[parvorder]] [[Platyrrhini]]",
parents = {"monkeys"},
}
labels["New World quails"] = {
type = "set",
description = "=birds in the [[family]] [[Odontophoridae]], most of which live in the [[New World]] and are known as [[quail]]s, but the family also includes the African [[genus]] ''[[Ptilopachus]]'' and some [[species]] are known as partridges",
parents = {"fowls"},
}
labels["New World sparrows"] = {
type = "set",
description = "=[[sparrow]]- and [[finch]]-like birds in the [[passerine]] [[family]] [[Passerellidae]], until recently considered part of the family [[Emberizidae]]",
parents = {"perching birds"},
}
labels["New World warblers"] = {
type = "set",
description = "=birds in the family [[Parulidae]]",
parents = {"warblers"},
}
labels["neuropterans"] = {
type = "set",
description = "=[[antlion]]s, [[lacewing]]s, [[mantisfly|mantisflies]], [[owlfly|owlflies]] and other insects in the [[order]] [[Neuroptera]]",
parents = {"insects"},
}
labels["newts"] = {
type = "set",
description = "=[[terrestrial]] [[salamander]]s in the [[subfamily]] [[Pleurodelinae]]",
parents = {"salamanders"},
}
labels["noctuoid moths"] = {
type = "set",
description = "=[[armyworm]]s, [[cinnabar]]s, [[corn earworm]]s, [[cutworm]]s, [[gypsy moth]]s, [[owlet moth]]s, [[processionary|processionaries]], [[tiger moth]]s, [[underwing]]s, [[wainscot]]s, [[wooly bear]]s, and many other [[moth]]s (and [[caterpillar]]s) in the [[superfamily]] [[Noctuoidea]]",
parents = {"moths"},
}
labels["nudibranchs"] = {
type = "set",
description = "=[[sea slug]]s in the [[gastropod]] [[order]] [[Nudibranchia]]",
parents = {"gastropods"},
}
labels["nymphalid butterflies"] = {
type = "set",
description = "=[[admiral]]s, [[brown]]s, [[buckeye]]s, [[checkerspot]]s, [[emperor]]s, [[fritillary|fritillaries]], [[leafwing]]s, [[longwing]]s, [[monarch]]s, [[morpho]]s, [[painted lady|painted ladies]], [[ringlet]]s, [[satyr]]s, [[sister]]s, [[snout]]s, [[tortoiseshell]]s, and other butterflies in the [[family]] [[Nymphalidae]]",
parents = {"butterflies"},
}
labels["octopuses"] = {
type = "set",
parents = {"cephalopods"},
}
labels["odd-toed ungulates"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Perissodactyla]], including the [[equid]]s, [[tapir]]s and [[rhinoceros]]es",
parents = {"mammals"},
}
labels["oestroid flies"] = {
type = "set",
description = "=[[blowfly|blowflies]], [[bluebottle]]s, [[botfly|botflies]], [[flesh fly|flesh fles]], [[greenbottle]]s, [[mango fly|mango flies]], [[screwworm]]s, [[tachinid]]s, [[torsalo]]s, [[tumbu fly|tumbu flies]], [[warble fly|warble flies]], and other flies in the [[superfamily]] [[Oestroidea]]",
parents = {"dipterans"},
}
labels["Old World monkeys"] = {
type = "set",
description = "=[[baboon]]s, [[colobus]], [[douc]]s, [[gelada]]s, [[green monkey]]s, [[grivet]]s, [[langur]]s, [[malbrouck]]s, [[mandrill]]s, [[mangabey]]s, [[patas monkey]]s, [[proboscis monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[monkeys]] in the [[family]] [[Cercopithecidae]], the only [[members]] of the [[parvorder]] [[Catarrhini]] aside from the greater/lesser apes and humans",
parents = {"monkeys"},
}
labels["Old World orioles"] = {
type = "set",
description = "=[[perching bird]]s in the [[family]] [[Oriolidae]], which are not closely related to the New World orioles in the family [[Icteridae]]",
parents = {"perching birds"},
}
labels["ornithopods"] = {
type = "set",
description = "=[[camptosaurid]]s, [[hadrosaur]]s, [[iguanodontid]]s, [[lambeosaurid]]s, [[rhabdodontid]]s, [[saurolophid]]s, [[thescelosaurid]]s, [[trachodontid]]s, and other [[dinosaur]]s in the [[ornithischian]] [[clade]] [[Ornithopoda]]",
parents = {"dinosaurs"},
}
labels["osteoglossomorph fish"] = {
type = "set",
description = "=[[aba]]s, [[arapaima]]s, [[arowana]]s, [[butterfly fish]], [[elephantfish]], [[featherback]]s, [[mooneye]]s and other fish in the [[superorder]] [[Osteoglossomorpha]]",
parents = {"fish"},
}
labels["otariid seals"] = {
type = "set",
description = "=[[mammal]]s in the [[family]] [[Otariidae]], including the [[fur seal]]s and [[sea lion]]s",
parents = {"pinnipeds"},
}
labels["otidimorph birds"] = {
type = "set",
description = "=[[bustard]]s in the [[family]] [[Otididae]] and [[order]] [[Otidiformes]]; [[turaco]]s or [[lourie]]s, [[go-away bird]]s, [[plantain-eater]]s, etc., in the [[family]] [[Musophagidae]] and [[order]] [[Musophagiformes]]; and [[cuckoo]]s in the [[family]] [[Cuculidae]] and [[order]] [[Cuculiformes]]; all in the [[clade]] [[Otidimorphae]]",
parents = {"birds"},
}
labels["otocephalan fish"] = {
type = "set",
description = "=[[anchovy|anchovies]], [[beaked salmon]], [[carp]], [[catfish]], [[characin]]s, [[electric eel]]s, [[ghost knifefish]], [[herring]]s, [[loach]]es, [[milkfish]], [[minnow]]s, [[mousefish]], [[slickhead]]s, [[sucker]]s, [[tubeshoulder]]s, and other fish in the [[clade]] [[Otocephala]]",
parents = {"fish"},
}
labels["ovenbirds"] = {
type = "set",
description = "=birds in the [[suboscine]] family [[Furnariidae]], including the former family Dendrocolaptidae (now the [[subfamily]] [[Dendrocolaptinae]])",
parents = {"suboscines"},
}
labels["owls"] = {
type = "set",
parents = {"birds of prey"},
}
labels["pangolins"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Pholidota]]",
parents = {"mammals"},
}
labels["panthers"] = {
type = "set",
description = "=[[panther]]s in the sense of members of the genus ''[[Panthera]]''",
parents = {"felids"},
}
labels["parrots"] = {
type = "set",
parents = {"birds"},
}
labels["pastoral dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["penguins"] = {
type = "set",
parents = {"birds"},
}
labels["pentatomoid bugs"] = {
type = "set",
description = "=[[acanthosomatid]]s, [[burrowing bug]]s, [[jewel bug]]s, [[shield bug]]s, [[stinkbug]]s, [[thyreocorid]]s, and other [[true bug]]s in the [[superfamily]] [[Pentatomoidea]]",
parents = {"true bugs"},
}
labels["perch and darters"] = {
type = "set",
description = "=fish in the family [[Percidae]]",
parents = {"percoid fish"},
}
labels["perching birds"] = {
type = "set",
description = "=[[passerine]]s or perching birds: members of the order [[Passeriformes]]",
parents = {"birds"},
}
labels["percoid fish"] = {
type = "set",
description = "=[[archerfish]], [[bass]], [[bigeye]]s, [[bluefish]], [[butterflyfish]], [[cardinalfish]], [[cobia]], [[croaker]]s, [[flagtail]]s, [[goatfish]], [[grouper]]s, [[grunt]]s, [[horse mackerel]], [[jack]]s, [[jawfish]], [[leaffish]], [[mahi-mahi]], [[mojarra]], [[perch]], [[pomfret]]s, [[pompano]], [[ponyfish]], [[porgy|porgies]], [[remora]]s, [[roosterfish]], [[sea bass]], [[sea bream]], [[snapper]], [[sunfish]], [[sweeper]]s, [[threadfin]], [[tilefish]], [[wreckfish]], and other [[perciform]] fish in the [[superfamily]] [[Percoidea]]",
parents = {"fish"},
}
labels["phiomorphs"] = {
type = "set",
description = "=[[blesmol]]s, [[sand mole]]s, [[mole rat]]s, [[dassie rat]]s or [[rock rat]]s, [[Old World porcupine]]s, [[cane rat]]s or [[grasscutter]]s and other [[rodent]]s in the parvorder [[Phiomorpha]], which is the Old World counterpart of the [[caviomorph]]s",
parents = {"rodents"},
}
labels["phocid seals"] = {
type = "set",
description = "=[[mammal]]s in the [[family]] [[Phocidae]], including the [[earless seal]]s (also known as [[true seal]]s)",
parents = {"pinnipeds"},
}
labels["piciforms"] = {
type = "set",
description = "=[[woodpecker]]s, [[aracari]]s, [[coppersmith]]s, [[honeyguide]]s, [[jacamar]]s, [[nunlet]]s, [[puffbird]]s, [[toucan]]s, and other birds in the [[order]] [[Piciformes]]",
parents = {"birds"},
}
labels["pierid butterflies"] = {
type = "set",
description = "=[[brimstone]]s, [[orange tip]]s, [[sulfur]]s, [[white]]s and other [[butterfly|butterflies]] in the [[family]] [[Pieridae]]",
parents = {"butterflies"},
}
labels["pigs"] = {
type = "set",
parents = {"even-toed ungulates", "livestock"},
commonscat = "Suidae",
wpcat = true,
}
labels["pikes (fish)"] = {
type = "set",
description = "=fish in the family [[Esocidae]]",
parents = {"fish"},
}
labels["pinnipeds"] = {
type = "set",
parents = {"carnivores"},
}
labels["pipits and wagtails"] = {
type = "set",
description = "=birds in the [[passerine]] family [[Motacillidae]]",
parents = {"perching birds"},
}
labels["placoderms"] = {
type = "set",
description = "=[[extinct]] armored fish of the [[class]] [[Placodermi]] from the [[Silurian]] and [[Devonian]] [[geologic]] [[period]]s",
parents = {"fish"},
}
labels["plovers and lapwings"] = {
type = "set",
description = "=birds in the [[charadriiform]] [[family]] [[Charadriidae]]",
parents = {"shorebirds"},
}
labels["pomfrets"] = {
type = "set",
description = "=fish in the family [[Bramidae]]",
parents = {"percoid fish"},
}
labels["primates"] = {
type = "set",
parents = {"mammals"},
commonscat = true,
wpcat = true,
}
labels["procyonids"] = {
type = "set",
description = "=[[procyonid]]s: ([[raccoon]]s, [[coati]]s, [[kinkajou]]s, [[olingo]]s, [[ringtail]]s and [[cacomistle]]s)",
parents = {"carnivores"},
}
labels["prosimians"] = {
type = "set",
parents = {"primates"},
}
labels["pterosaurs"] = {
type = "set",
parents = {"reptiles"},
}
labels["pyraloid moths"] = {
type = "set",
description = "=[[bee moth]]s, [[flour moth]]s, [[leaf crumpler]]s, [[magpie moth]]s, [[melonworm]]s, [[mint moth]]s, [[orangeworm]]s, [[pantry moth]]s, [[pickleworm]]s, [[snout moth]]s, [[veneer moth]]s, [[wax moth]]s and other [[crambid]] and [[pyralid]] [[moths]] in the [[superfamily]] [[Pyraloidea]]",
parents = {"moths"},
}
labels["rabbits"] = {
type = "set",
parents = {"lagomorphs"},
}
labels["rallids"] = {
type = "set",
description = "=[[rallid]]s: [[rail]]s and other birds in the family [[Rallidae]]",
parents = {"gruiforms"},
}
labels["ratites"] = {
type = "set",
description = "=[[ratite]]s: birds in the superorder [[Palaeognathae]], including large flightless birds such as [[ostrich]]es, and [[emu]]s, as well as the smaller [[kiwi]]s and [[flighted]] [[tinamous]]",
parents = {"birds"},
}
labels["rays and skates"] = {
type = "set",
description = "=[[fish]] in the superorder [[Batoidea]]",
parents = {"fish"},
}
labels["reindeers"] = {
type = "set",
parents = {"cervids"},
}
labels["reptiles"] = {
type = "set",
parents = {"vertebrates"},
commonscat = "Reptilia",
wpcat = true,
}
labels["retrievers"] = {
type = "set",
parents = {"gun dogs"},
}
labels["rhinoceroses"] = {
type = "set",
description = "=[[rhinoceros]]es, [[mammal]]s in the [[perissodactylic]] [[family]] [[Rhinocerotidae]]",
parents = {"odd-toed ungulates"},
}
labels["rodents"] = {
type = "set",
parents = {"mammals"},
}
labels["salamanders"] = {
type = "set",
description = "=[[amphiuma]]s, [[axolotl]]s, [[hellbender]]s, [[mud puppy|mud puppies]], [[olm]]s, [[newt]]s, [[salamander]]s, [[siren]]s, and other [[amphibian]]s in the [[order]] [[Caudata]]",
parents = {"amphibians"},
}
labels["salmonids"] = {
type = "set",
description = "=[[salmon]]s, [[trout]], and other fish in the family [[Salmonidae]]",
parents = {"fish"},
}
labels["saturniid moths"] = {
type = "set",
description = "=[[Atlas moth]]s, [[cecropia]]s, [[hickory horned devil]]s, [[io moth]]s, [[luna moth]]s, [[polyphemus moth]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Saturniidae]]",
parents = {"moths"},
}
labels["satyrine butterflies"] = {
type = "set",
description = "=[[brown]]s, [[forester]]s, [[grayling]]s, [[heath]]s, [[palmfly|palmflies]], [[ringlet]]s, [[satyr]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Satyrinae]]",
parents = {"nymphalid butterflies"},
}
labels["sauropods"] = {
type = "set",
description = "=[[apatosaur]]s, [[brachiosaur]]s, [[brontosaur]]s, [[camarasaur]]s, [[cetiosaur]]s, [[diplodocus]]es, [[saltasaurid]]s, [[titanosaurian]]s, [[turiasaur]]s, [[vulcanodontid]]s, and other [[dinosaurs]] in the [[saurischian]] [[infraorder]] [[Sauropoda]]",
parents = {"dinosaurs"},
}
labels["sauropterygians"] = {
type = "set",
description = "=[[elasmosaur]]s, [[placodont]]s, [[plesiosaur]]s, and other extinct aquatic [[reptile]]s in the [[superorder]] [[Sauropterygia]]",
parents = {"reptiles"},
}
labels["sawflies and wood wasps"] = {
type = "set",
description = "=[[horntail]]s, [[pigeon tremex]], [[rose slug]]s, [[sawfly|sawflies]], [[wood wasp]]s, and other primitive [[hymenopteran]]s in the [[suborder]] [[Symphyta]]",
parents = {"hymenopterans"},
}
labels["scale insects"] = {
type = "set",
description = "=[[insect]]s in the [[superfamily]] [[Coccoidea]]",
parents = {"hemipterans"},
}
labels["scarabaeoids"] = {
type = "set",
description = "=[[cockchafer]]s, [[dor]]s, [[dung beetle]]s, [[June beetle]]s, [[rain beetle]]s, [[rose chafer]]s, [[scarab]]s, [[stag beetle]]s, and other beetles in the [[superfamily]] [[Scarabaeoidea]]",
parents = {"beetles"},
}
labels["scenthounds"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["scincomorph lizards"] = {
type = "set",
description = "=[[blue-tongue lizard]]s, [[night lizard]]s, [[sandfish]], [[skink]]s, [[sungazer]]s, and other [[lizard]]s in the [[infraorder]] [[Scincomorpha]]",
parents = {"lizards"},
}
labels["scolopacids"] = {
type = "set",
description = "=[[curlew]]s, [[dunlin]]s, [[godwit]]s, [[knot]]s, [[redshank]]s, [[ruff]]s, [[sandpiper]]s, [[snipe]]s, [[stint]]s, [[turnstone]]s, [[tattler]]s, [[whimbrel]]s, [[woodcock]]s, [[yellowleg]]s, and other birds in the [[charadriiform]] [[family]] [[Scolopacidae]]",
parents = {"shorebirds"},
}
labels["scombroids"] = {
type = "set",
description = "=[[mackerel]]s, [[tuna]]s, [[barracuda]]s, [[swordfish]], and other fish in the suborder [[Scombroidei]]",
parents = {"fish"},
}
labels["scorpaeniform fish"] = {
type = "set",
description = "=[[bullhead]]s, [[cabezon]], [[golomyanka]], [[greenling]]s, [[gurnard]]s, [[Irish lord]], [[lionfish]], [[lumpsucker]]s, [[pigfish]], [[poacher]]s, [[sablefish]], [[scorpionfish]], [[sculpin]]s, [[sea raven]]s, [[sea toad]]s, [[skilfish]], [[snailfish]], [[stonefish]], [[wingfish]], and other fish in the [[order]] [[Scorpaeniformes]]",
parents = {"fish"},
}
labels["scorpions"] = {
type = "set",
description = "=true [[scorpion]]s: [[arachnid]]s in the [[order]] [[Scorpiones]]",
parents = {"arachnids"},
}
labels["screamers"] = {
type = "set",
description = "=[[screamer]]s: birds in the family [[Anhimidae]], related to [[duck]]s and [[geese]]",
parents = {"birds"},
}
labels["seabirds"] = {
type = "set",
parents = {"birds"},
}
labels["sea anemones"] = {
type = "set",
description = "=[[cnidarian]]s in the [[order]] [[Actiniaria]]",
parents = {"cnidarians"},
}
labels["sea cucumbers"] = {
type = "set",
description = "=[[echinoderm]]s in the [[class]] [[Holothuroidea]]",
parents = {"echinoderms"},
}
labels["sea urchins"] = {
type = "set",
description = "=[[echinoderm]]s in the [[class]] [[Echinoidea]], including the [[sand dollar]]s",
parents = {"echinoderms"},
}
labels["sea turtles"] = {
type = "set",
description = "=[[flatback]]s, [[green turtle]]s, [[hawksbill]]s, [[leatherback]]s, [[loggerhead]]s, [[ridley]]s, and other [[turtle]]s in the [[superfamily]] [[Chelonioidea]]",
parents = {"turtles"},
}
labels["sebastids"] = {
type = "set",
description = "=fish in the family [[Sebastidae]]",
parents = {"scorpaeniform fish"},
}
labels["serranids"] = {
type = "set",
description = "=[[sea bass]], [[grouper]]s, [[rockcod]]s, [[comber]]s and other fish in the family [[Serranidae]]",
parents = {"percoid fish"},
}
labels["sharks"] = {
type = "set",
parents = {"fish"},
}
labels["sheep"] = {
type = "set",
parents = {"caprines", "livestock"},
}
labels["shorebirds"] = {
type = "set",
parents = {"birds"},
}
labels["shrikes"] = {
type = "set",
parents = {"perching birds", "corvoid birds"},
}
labels["sighthounds"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["skippers"] = {
type = "set",
description = "=insects in the family [[Hesperiidae]]",
parents = {"butterflies"},
}
labels["smelts"] = {
type = "set",
description = "=fish in the [[order]] [[Osmeriformes]]",
parents = {"fish"},
}
labels["snails"] = {
type = "set",
parents = {"gastropods"},
}
labels["snakes"] = {
type = "set",
parents = {"reptiles"},
}
labels["snappers"] = {
type = "set",
description = "=fish in the [[family]] [[Lutjanidae]]",
parents = {"percoid fish"},
}
labels["soft corals"] = {
type = "set",
description = "=[[calcaxonian]]s, [[dead man's fingers]], [[fan coral]]s, [[gorgonian]]s, [[holaxonian]]s, [[scleraxonian]]s, [[sea feather]]s, [[sea willow]]s, [[stoloniferan]]s, [[whip coral]]s, and other marine animals in the [[cnidarian]] order [[Alcyonacea]]",
parents = {"cnidarians"},
}
labels["soricomorphs"] = {
type = "set",
description = "=[[shrew]]s, [[mole]]s, [[solenodon]]s, and other [[mammal]]s in the [[order]] [[Soricomorpha]]",
parents = {"mammals"},
}
labels["South American canids"] = {
type = "set",
description = "=fox-like [[canid]]s in the [[subtribe]] [[Cerdocyonina]], which are more closely related to the [[dog]]s and [[wolf|wolves]] than to the true [[fox]]es. Also known as [[zorro]]s",
parents = {"canids"},
}
labels["spaniels"] = {
type = "set",
parents = {"gun dogs"},
}
labels["sparids"] = {
type = "set",
description = "=[[sea breams]], [[porgie]]s, [[scup]]s and other fish in the family [[Sparidae]]",
parents = {"percoid fish"},
}
labels["sphinx moths"] = {
type = "set",
description = "=[[hawkmoth]]s, [[hornworm]]s, [[hummingbird moth]]s, [[sphinx moth]]s,[[tomato worm]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Sphingidae]]",
parents = {"moths"},
}
labels["spiders"] = {
type = "set",
parents = {"arachnids"},
}
labels["sponges"] = {
type = "set",
description = "=[[aquatic]] [[animal]]s in the [[phylum]] [[Porifera]]",
parents = {"animals"},
}
labels["squid"] = {
type = "set",
parents = {"cephalopods"},
}
labels["squirrels"] = {
type = "set",
description = "=[[squirrel]]s, [[chipmunk]]s, [[marmot]]s, [[prairie dog]]s, [[woodchuck]]s and other [[rodent]]s in the family [[Sciuridae]]",
parents = {"rodents"},
}
labels["staphylinoid beetles"] = {
type = "set",
description = "=[[beetle]]s in the [[superfamily]] [[Staphylinoidea]]",
parents = {"beetles"},
}
labels["starlings"] = {
type = "set",
description = "=[[starling]]s, [[mynah]]s, and other birds in the [[passerine]] family [[Sturnidae]]",
parents = {"perching birds"},
}
labels["stick insects"] = {
type = "set",
description = "=[[insect]]s (including the [[leaf insect]]s) in the [[order]] known as either [[Phasmida]] or [[Phasmatodea]], which are noted for their extreme adaptations in form and color to look like parts of the plants they feed on",
parents = {"insects"},
}
labels["stoneflies"] = {
type = "set",
description = "=[[freshwater]] [[aquatic]] [[insect]]s in the [[order]] [[Plecoptera]]",
parents = {"insects"},
}
labels["stony corals"] = {
type = "set",
description = "=marine animals in the [[cnidarian]] order [[Scleractinia]]",
parents = {"cnidarians"},
}
labels["storks"] = {
type = "set",
parents = {"freshwater birds"},
}
labels["stromateoid fish"] = {
type = "set",
description = "=[[barrelfish]], [[blue eye cod]], [[dollarfish]], [[driftfish]], [[lafayette]], [[medusafish]], [[rudderfish]], [[squaretail]], [[warehou]], and other fish in the [[perciform]] [[suborder]] [[Stromateoidei]]",
parents = {"fish"},
}
labels["sturgeons"] = {
type = "set",
description = "=fish in the family [[Acipenseridae]]",
parents = {"fish"},
}
labels["suboscines"] = {
type = "set",
description = "=[[antpitta]]s, [[antshrike]]s, [[antthrush]]es, [[asity|asities]], [[broadbill]]s, [[cotinga]]s, [[crescentchest]]s, [[gnateater]]s, [[manakin]]s, [[ovenbird]]s, [[pitta]]s, [[sharpbill]]s, [[spadebill]]s, [[tapaculo]]s, [[tityra]]s, [[tyrant flycatcher]]s, [[woodcreeper]]s, and other birds in the [[passerine]] [[suborder]] [[Tyranni]]",
parents = {"perching birds"},
}
labels["suckers (fish)"] = {
type = "set",
description = "=[[buffalo fish]], [[cuiui]], [[jumprock]]s, [[quillback]], [[redhorse]], [[sucker]]s, and other freshwater fish in the family [[Catostomidae]]",
parents = {"fish", "otocephalan fish"},
}
labels["suliform birds"] = {
type = "set",
description = "=[[anhinga]]s, [[booby|boobies]], [[cormorant]]s, [[frigatebird]]s, [[gannet]]s, and other [[seabirds]] in the [[order]] [[Suliformes]]",
parents = {"seabirds"},
}
labels["sunfish"] = {
type = "set",
description = "=freshwater fish in the family [[Centrarchidae]]",
parents = {"percoid fish"},
}
labels["swallows"] = {
type = "set",
parents = {"perching birds"},
}
labels["swallowtails"] = {
type = "set",
description = "=[[apollo]]s, [[batwing]]s, [[birdwing]]s, [[clubtail]]s, [[festoon]]s, [[flying handkerchief]]s, [[Helen]]s, [[jay]]s, [[mime]]s, [[parnassian]]s, [[rose]]s, [[swallowtail]]s, [[swordtail]]s, [[triangle]]s, [[turnus]]es, [[windmill]]s, [[zebra]]s, and other [[butterfly|butterflies]] in the [[family]] [[Papilionidae]], notable for (mostly) having tail-like extensions on their [[hindwing]]s",
parents = {"butterflies"},
}
labels["swans"] = {
type = "set",
parents = {"anatids"},
}
labels["syngnathiform fish"] = {
type = "set",
description = "=[[bellowsfish]], [[cornetfish]], [[pipefish]], [[razorfish]], [[sea dragon]]s, [[sea horse]]s, [[snipefish]], [[trumpetfish]], and other fish in the [[order]] [[Syngnathiformes]]",
parents = {"fish"},
}
labels["tanagers"] = {
type = "set",
description = "=[[bananaquit]]s, [[conebill]]s, [[dacnis]]es, [[Darwin's finch]]es, [[grassquit]]s, [[ground finch]]es, [[honeycreeper]]s, [[pardusco]]s, [[tanager]]s, and other [[passerine]] birds in the family [[Thraupidae]]",
parents = {"perching birds"},
}
labels["temnospondyls"] = {
type = "set",
description = "=[[extinct]] early [[amphibian]]s in the [[order]] [[Temnospondyli]]",
parents = {"amphibians"},
}
labels["tenebrionoid beetles"] = {
type = "set",
description = "=[[aderid]]s, [[anthicid]]s, [[blister beetle]]s, [[borid]]s, [[ciid]]s, [[flour beetle]]s, [[darkling beetle]]s, [[mealworm]]s, [[melandryid]]s, [[mordellid]]s, [[mycetophagid]]s, [[oedemerid]]s, [[pinacate beetle]]s, [[pyrochroid]]s, [[pythid]]s, [[ripiphorid]]s, [[salpingid]]s, [[toktokkie]]s, [[ulodid]]s, [[wharf borer]]s, [[zopherid]]s and other [[beetle]]s in the [[superfamily]] [[Tenebrionoidea]]",
parents = {"beetles"},
}
labels["tephritoid flies"] = {
type = "set",
description = "=[[cheese fly|cheese flies]], [[tephritid]] [[fruit fly|fruit flies]], [[picture-winged fly|picture-winged flies]] and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Tephritoidea]]",
parents = {"dipterans"},
}
labels["termites"] = {
type = "set",
description = "=[[termite]]s, [[insect]]s in the former [[order]] [[Isoptera]], which is now considered a [[suborder]] or other group within the [[cockroach]]es in the order [[Blattodea]]",
parents = {"insects", "cockroaches"},
}
labels["terns"] = {
type = "set",
description = "=[[tern]]s, [[seabirds]] in the [[family]] [[Sternidae]]",
parents = {"seabirds"},
}
labels["tetraodontiforms"] = {
type = "set",
description = "=[[pufferfish]], [[triggerfish]], [[boxfish]], [[ocean sunfish]] and other fish in the order [[Tetraodontiformes]]",
parents = {"fish"},
}
labels["terriers"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["theropods"] = {
type = "set",
description = "=[[dinosaur]]s in the [[clade]] [[Theropoda]]",
parents = {"dinosaurs"},
}
labels["thrushes"] = {
type = "set",
parents = {"perching birds"},
}
labels["ticks"] = {
type = "set",
description = "=[[bloodsucking]] [[arachnids]] in the [[order]] [[Ixodida]] (also known as [[Metastigmata]])",
parents = {"mites and ticks"},
}
labels["tinamous"] = {
type = "set",
parents = {"ratites"},
}
labels["tits"] = {
type = "set",
description = "=[[tit]]s, birds known as [[chickadee]]s in the US",
parents = {"perching birds"},
}
labels["toads"] = {
type = "set",
parents = {"anurans"},
}
labels["toothcarps"] = {
type = "set",
description = "=[[four-eyed fish]], [[guppy|guppies]], [[killifish]], [[molly|mollies]], [[mummichog]]s, [[platy|platies]], [[swordtail]]s, [[topminnow]]s and other fish in the [[order]] [[Cyprinodontiformes]]",
parents = {"fish"},
}
labels["tortoises"] = {
type = "set",
description = "=[[terrestrial]] [[turtle]]s in the [[family]] [[Testudinidae]]",
parents = {"turtles"},
}
labels["tortricid moths"] = {
type = "set",
description = "=[[moth]]s (and [[caterpillar]]s) in the [[family]] [[Tortricidae]]",
parents = {"moths"},
}
labels["trachinoid fish"] = {
type = "set",
description = "=[[black swallower]]s, [[blue cod]], [[duckbill]]s, [[gaper]]s, [[sand eel]]s, [[torrentfish]], [[weeverfish]] and other fish in the [[perciform]] [[suborder]] [[Trachinoidei]]",
parents = {"fish"},
}
labels["toy dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["trilobites"] = {
type = "set",
parents = {"arthropods"},
}
labels["true bugs"] = {
type = "set",
description = "=[[insect]]s in the [[hemipteran]] suborder [[Heteroptera]]",
parents = {"hemipterans"},
}
labels["true finches"] = {
type = "set",
description = "=[[finch]]es in the [[passerine]] family [[Fringillidae]]",
parents = {"perching birds"},
}
labels["true jellyfish"] = {
type = "set",
description = "=[[cnidarian]]s in the [[class]] [[Scyphozoa]]",
parents = {"cnidarians"},
}
labels["true sparrows"] = {
type = "set",
description = "=[[passerine]] birds in the family [[Passeridae]] (for other birds called sparrows, see the [[emberizid]]s)",
parents = {"perching birds"},
}
labels["tubenose birds"] = {
type = "set",
description = "=[[albatross]]es, [[fulmar]]s, [[petrel]]s, [[prion]]s, [[shearwater]]s, and other [[seabird]]s in the [[order]] [[Procellariiformes]]",
parents = {"seabirds"},
}
labels["tunicates"] = {
type = "set",
parents = {"animals"},
}
labels["turtles"] = {
type = "set",
parents = {"reptiles"},
}
labels["tyrant flycatchers"] = {
type = "set",
description = "=[[passerine]] birds in the family [[Tyrannidae]]",
parents = {"suboscines"},
}
labels["ursids"] = {
type = "set",
description = "=[[ursid]]s ([[bear]]s)",
parents = {"carnivores"},
}
labels["Venerida order mollusks"] = {
type = "set",
description = "=[[basket clam]]s, [[bean clam]]s, [[boring clam]]s, [[cockle]]s, [[duck clam]]s, [[giant clam]]s, [[hard clam]]s, [[lentil shell]]s, [[pipi]]s, [[pooquaw]]s, [[quahog]]s, [[surf clam]]s, [[trough-shell]]s, [[ugari]]s, [[Venus clam]]s, [[zebra mussel]]s, and other [[bivalve]]s in the [[order]] [[Venerida]]",
parents = {"bivalves"},
}
labels["vertebrates"] = {
type = "set",
parents = {"chordates"},
wpcat = true,
commonscat = "Vertebrata",
}
labels["vespids"] = {
type = "set",
description = "=[[hornet]]s, [[paper wasp]]s, [[pollen wasp]]s, [[potter wasp]]s, [[yellow jacket]]s, and other [[wasp]]s in the [[family]] [[Vespidae]]",
parents = {"hymenopterans"},
}
labels["vetigastropods"] = {
type = "set",
description = "=[[abalone]]s or [[ear shell]]s, [[duck's-bill limpet]]s, [[keyhole limpet]]s, [[rosary shell]]s, [[slit-shell]]s, [[topshell]]s, [[turban shell]]s, and other [[gastropod]]s in the [[clade]] [[Vetigastropoda]] (treated in some classifications as an [[order]], in others as [[subclass]])",
parents = {"gastropods"},
}
labels["vipers"] = {
type = "set",
description = "=[[adder]]s, [[asp]]s, [[rattlesnake]]s, [[viper]]s, [[water moccasin]]s and other [[venomous]] snakes in the [[Viperidae]]",
parents = {"snakes"},
}
labels["viverrids"] = {
type = "set",
description = "=[[viverrid]]s ([[civet]]s, [[genet]]s and relatives)",
parents = {"carnivores"},
}
labels["vombatiforms"] = {
type = "set",
description = "=[[diprotodontid]]s, [[diprotodon]]s, [[phascolarctid]]s, [[koala]]s, [[vombatid]]s, [[wombat]]s, [[phascolome]]s, [[ilariid]]s, [[maradid]]s, [[palorchestid]]s, [[thylacoleonid]]s, [[marsupial lion]]s , [[wynyardiid]]s and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Vombatiformes]]",
parents = {"marsupials"},
}
labels["vultures"] = {
type = "set",
description = "=[[vulture]]s (both Old World and New World)",
parents = {"birds of prey"},
}
labels["warblers"] = {
type = "set",
description = "=[[warbler]]s, various small [[passerine]] songbirds, especially of the families Sylviidae (Old World warblers) and Parulidae (New World warblers)",
parents = {"perching birds"},
}
labels["warren hounds"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["water dogs"] = {
type = "set",
parents = {"retrievers"},
}
labels["weaver finches"] = {
type = "set",
description = "=[[finch]]es in the family [[Estrildidae]]",
parents = {"perching birds"},
}
labels["weaverbirds"] = {
type = "set",
description = "=[[baya]]s, [[bishop]]s, [[fody|fodies]], [[malimbe]]s, [[quelea]]s, [[sakabula]]s, [[taha]]s, [[weaver]]s, and other birds in the [[family]] [[Ploceidae]]",
parents = {"perching birds"},
}
labels["weevils"] = {
type = "set",
description = "=[[bill-beetle]]s, [[curculio]]s, [[grugru worm]]s, [[snout beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Curculionoidea]]",
parents = {"beetles"},
}
labels["whales"] = {
type = "set",
parents = {"cetaceans"},
}
labels["wolves"] = {
type = "set",
description = "=[[wolves]]",
parents = {"canids"},
}
labels["woodpeckers"] = {
type = "set",
description = "=[[flicker]]s, [[sapsucker]]s, [[wryneck]]s, and other birds in the [[family]] [[Picidae]]",
parents = {"piciforms"},
}
labels["working dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["worms"] = {
type = "set",
parents = {"animals"},
}
labels["wrasses"] = {
type = "set",
description = "=fish in the family [[Labridae]]",
parents = {"labroid fish"},
}
labels["wrens"] = {
type = "set",
parents = {"certhioid birds"},
}
labels["zoarcoid fish"] = {
type = "set",
description = "=[[butterfish]], [[eelpout]]s, [[guffer]]s, [[gunnel]]s, [[lumper]]s, [[prickleback]]s, [[prowfish]], [[wolf eel]]s and other fish in the [[perciform]] [[suborder]] [[Zoarcoidei]]",
parents = {"fish"},
}
labels["zygaenoid moths"] = {
type = "set",
description = "=[[burnet moth]]s, [[forester]]s, [[hag moth]]s, [[limacodid]]s, [[megalopygid]]s, [[monkey slug]]s, [[puss moth]]s, [[saddleback caterpillar]]s, [[zygaenid]]s, and other [[moth]]s in the [[superfamily]] [[Zygaenoidea]]",
parents = {"moths"},
}
labels["plesiosaurs"] = {
type = "set",
description = "=[[plesiosaur]]s (order †[[Plesiosauria]])",
parents = {"sauropterygians"},
}
labels["tarantulas"] = {
type = "set",
description = "=[[tarantula]]s (family [[Theraphosidae]])",
parents = {"mygalomorph spiders"},
}
return labels
ewf83liqesxqs8674krrqrtg39pwym3
88460
88459
2026-07-27T00:27:43Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Animals]]
88459
Scribunto
text/plain
local labels = {}
labels["animals"] = {
type = "set",
parents = {"lifeforms"},
commonscat = "Animalia",
wpcat = true,
}
labels["acanthuroid fish"] = {
type = "set",
description = "=[[surgeonfish]], [[light-horseman]], [[louvar]]s, [[scat]]s, [[rabbitfish]], [[Moorish idol]]s and other fish in the [[perciform]] [[suborder]] [[Acanthuroidei]]",
parents = {"fish"},
}
labels["accentors"] = {
type = "set",
description = "=birds in the [[family]] [[Prunellidae]]",
parents = {"perching birds"},
}
labels["accipiters"] = {
type = "set",
description = "=[[besra]]s, [[Cooper's hawk]]s, [[goshawk]]s, [[sharp-shinned hawk]]s, [[shikra]]s, [[sparrowhawk]]s, and other [[hawk]]s in the [[genus]] ''[[Accipiter]]''",
parents = {"birds of prey"},
}
labels["Acipenseriform fish"] = {
type = "set",
description = "=[[paddlefish]], [[sturgeon]]s and other fish in the [[order]] [[Acipenseriformes]]",
parents = {"fish"},
}
labels["adephagan beetles"] = {
type = "set",
description = "=[[diving beetle]]s, [[ground beetle]]s (including [[bombardier beetle]]s and [[tiger beetle]]s), [[whirligig beetle]]s and other [[beetle]]s in the [[suborder]] [[Adephaga]]",
parents = {"beetles"},
}
labels["African insectivores"] = {
type = "set",
description = "=[[aardvark]]s, [[elephant shrew]]s, [[golden mole]]s, [[otter shrew]]s, [[tenrec]]s, and other [[mammal]]s in the [[clade]] [[Afroinsectiphilia]]",
parents = {"mammals"},
}
labels["agamid lizards"] = {
type = "set",
description = "=[[agama]]s, [[bearded dragon]]s, [[flying dragon]]s, [[frilled lizard]]s, [[moloch]]s, [[spiny-tailed lizard]]s, [[stellion]]s and other [[lizard]]s in the [[family]] [[Agamidae]]",
parents = {"lizards"},
}
labels["alcelaphine antelopes"] = {
type = "set",
description = "=[[blesbuck]]s, [[bontebok]]s, [[bubal]]s, [[gnu]]s or [[wildebeest]], [[hartebeest]]s, [[hirola]], [[sassaby]]s, [[topi]]s, [[tetel]]s, and other [[antelopes]] in the [[subfamily]] [[Alcelaphinae]]",
parents = {"antelopes"},
}
labels["ammonites"] = {
type = "set",
description = "=[[extinct]] [[cephalopod]]s in the [[subclass]] [[Ammonoidea]]",
parents = {"cephalopods"},
}
labels["amphibians"] = {
type = "set",
parents = {"vertebrates"},
commonscat = "Amphibia",
wpcat = true,
}
labels["amphipods"] = {
type = "set",
description = "=[[beach flea]]s, [[lawn shrimp]], [[scud]]s, [[side swimmer]]s, [[skeleton shrimp]], [[whale louse|whale lice]], and other [[crustacean]]s in the [[order]] [[Amphipoda]]",
parents = {"crustaceans"},
}
labels["anatids"] = {
type = "set",
description = "=[[anatid]]s: ([[duck]]s, [[goose|geese]] and [[swan]]s)",
parents = {"freshwater birds"},
}
labels["annelids"] = {
type = "set",
description = "=[[earthworm]]s, [[leech]]es, [[ragworm]]s and many other [[segment]]ed [[worm]]s in the [[phylum]] [[Annelida]]",
parents = {"worms"},
}
labels["anglerfish"] = {
type = "set",
description = "=fish in the [[order]] [[Lophiiformes]]",
parents = {"fish"},
}
labels["anguimorph lizards"] = {
type = "set",
description = "=[[alligator lizard]]s, [[beaded lizard]]s, [[blindworm]]s, [[crocodile monitor]]s, [[galliwasp]]s, [[Gila monster]]s, [[glass lizard]]s, [[goanna]]s, [[Komodo dragon]]s, [[legless lizard]]s, [[nile monitor]]s, [[perentie]]s, [[sheltopusik]]s, [[water monitor]]s, and other [[lizards]] in the [[suborder]] [[Anguimorpha]]",
parents = {"lizards"},
}
labels["anomurans"] = {
type = "set",
description = "=crablike [[crustacean]]s in the [[decapod]] [[infraorder]] [[Anomura]], which are closely related to the true [[crab]]s in the infraorder [[Brachyura]]",
parents = {"crustaceans", "decapods"},
}
labels["anteaters and sloths"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Pilosa]]",
parents = {"mammals"},
}
labels["antelopes"] = {
type = "set",
parents = {"even-toed ungulates"},
}
labels["antilopine antelopes"] = {
type = "set",
description = "=[[blackbuck]]s, [[chinkara]]s, [[dibatag]]s, [[dik-dik]]s, [[gazelle]]s, [[gerenuk]]s, [[grysbok]]s, [[klipspringer]]s, [[oribi]]s, [[royal antelope]]s, [[saiga]]s, [[springbok]]s, [[steenbok]]s, [[zeren]], and other [[antelope]]s in the [[bovid]] [[subfamily]] [[Antilopinae]]",
parents = {"antelopes"},
}
labels["ants"] = {
type = "set",
parents = {"hymenopterans"},
}
labels["antshrikes"] = {
type = "set",
parents = {"suboscines", "perching birds"},
}
labels["anurans"] = {
type = "set",
description = "=[[amphibian]]s in the [[order]] [[Anura]], which are short-bodied and without tails, having long hind legs adapted for leaping that are typically folded at rest. Anurans are mostly known as [[frog]]s or [[toad]]s",
parents = {"amphibians"},
}
labels["aphids"] = {
type = "set",
description = "=[[insect]]s in the [[superfamily]] [[Aphidoidea]]",
parents = {"hemipterans"},
}
labels["apodiforms"] = {
type = "set",
description = "=[[hummingbird]]s, [[needletail]]s, [[spinetail]]s, [[swift]]s, [[swiftlet]]s, [[treeswift]]s, and other [[bird]]s in the [[order]] [[Apodiformes]]",
parents = {"birds"},
}
labels["arachnids"] = {
type = "set",
parents = {"arthropods"},
}
labels["araneoid spiders"] = {
type = "set",
description = "=[[bird dropping spider]]s, [[cobweb spiders]] (including [[black widow]]s and [[redback]]s), [[orbweaver]]s (including [[cross spider]]s and [[writing spider]]s), [[long-jawed spider]]s, [[money spider]]s, [[nesticid]]s, [[pimoid]], [[pirate spider]]s, [[tetragnathid]]s and other [[spider]]s in the [[superfamily]] [[Araneoidea]]",
parents = {"spiders"},
}
labels["argentiniform fish"] = {
type = "set",
description = "=[[argentine]]s, [[barreleye]]s, [[blacksmelt]]s, [[smoothtongue]]s and other fish in the [[order]] [[Argentiniformes]]",
parents = {"fish"},
}
labels["armadillos"] = {
type = "set",
parents = {"mammals"},
}
labels["arthropods"] = {
type = "set",
parents = {"animals"},
commonscat = "Arthropoda",
wpcat = true,
}
labels["aschizan flies"] = {
type = "set",
description = "=[[fly|flies]] in the [[dipteran]] [[section]] [[Aschiza]]",
parents = {"dipterans"},
}
labels["asilomorph flies"] = {
type = "set",
description = "=[[bee fly|bee flies]], [[dance fly|dance flies]], [[Mydas fly|Mydas flies]], [[robber fly|robber flies]], [[stiletto fly|stiletto flies]], [[window fly|window flies]] and other [[fly|flies]] in the [[dipteran]] [[infraorder]] [[Asilomorpha]]",
parents = {"dipterans"},
}
labels["assassin bugs"] = {
type = "set",
description = "=[[ambush bug]]s, [[assassin bug]]s, [[corsair]]s, [[feather-legged bug]]s, [[kissing bug]]s or [[conenose bug]]s, [[masked hunter]]s, [[wheel bug]]s, and other [[true bug]]s in the [[family]] [[Reduviidae]]",
parents = {"true bugs"},
}
labels["astacideans"] = {
type = "set",
description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Astacidea]], including the original [[species]] known as [[crayfish]] and [[lobster]]s, and their relatives",
parents = {"crustaceans", "decapods"},
}
labels["atheriniform fish"] = {
type = "set",
description = "=[[blue-eye]]s, [[hardyhead]]s, [[grunion]], [[jacksmelt]], [[rainbowfish]], [[silverside]]s, [[zona]], and other fish in the [[order]] [[Atheriniformes]]",
parents = {"fish"},
}
labels["auks"] = {
type = "set",
description = "=[[auk]]s, [[guillemot]]s, [[murre]]s, [[puffin]]s, [[razorbill]]s, and other [[seabird]]s in the family [[Alcidae]]",
parents = {"seabirds"},
}
labels["aulopiform fish"] = {
type = "set",
description = "=[[daggertooth]]s, [[lancetfish]], [[sergeant baker]]s, [[greeneye]]s, [[telescopefish]], [[lizardfish]] and other fish in the [[order]] [[Aulopiformes]]",
parents = {"fish"},
}
labels["Australasian robins"] = {
type = "set",
description = "=birds in the [[passerine]] [[family]] [[Petroicidae]], which are not closely related to the [[European robin]] (an [[Old World flycatcher]] in the family [[Muscicapidae]]), or the [[American robin]] (a [[thrush]] in the family [[Turdidae]])",
parents = {"perching birds"},
}
labels["baby animals"] = {
type = "set",
parents = {"animals"},
}
labels["bandicoots and bilbies"] = {
type = "set",
description = "=[[peramelid]]s, [[bandicoot]]s, [[marl]]s, [[quenda]]s, [[chaeropodid]]s, [[pig-footed bandicoot]]s, [[thylacomyid]]s, [[bilby|bilbies]], [[dalgite]]s, [[rabbit-eared bandicoot]]s, [[philander]]s, [[pinkie]]s, and other [[marsupial]]s in the [[order]] [[Peramelemorphia]]",
parents = {"marsupials"},
}
labels["barklice"] = {
type = "set",
description = "=non-[[parasitic]] [[insect]]s in the [[order]] [[Psocodea]]",
parents = {"insects"},
}
labels["barnacles"] = {
type = "set",
description = "=[[crustacean]]s in the [[infraclass]] [[Cirripedia]], including the parasitic [[rhizocephalan]]s",
parents = {"crustaceans"},
}
labels["bats"] = {
type = "set",
parents = {"mammals"},
}
labels["bees"] = {
type = "set",
parents = {"hymenopterans", "beekeeping"},
}
labels["beetles"] = {
type = "set",
parents = {"insects"},
}
labels["beloniform fish"] = {
type = "set",
description = "=[[ballyhoo]], [[flying fish]], [[garfish]], [[halfbeak]]s, [[houndfish]], [[mackerel pike]]s, [[medaka]]s, [[needlefish]], [[ricefish]], [[saury|sauries]], [[silver gar]], and other fish in the [[order]] [[Beloniformes]]",
parents = {"fish"},
}
labels["bibionomorphs"] = {
type = "set",
description = "=[[March fly|March flies]], [[cecidomyiid]] [[gall midge]]s, [[keroplatid]] [[fungus gnat]]s, [[mycetophilid]]s, [[sciarid]]s and other [[fly|flies]], [[gnat]]s and [[midge]]s in the [[dipteran]] [[infraorder]] [[Bibionomorpha]]",
parents = {"dipterans"},
}
labels["birds"] = {
type = "set",
parents = {"vertebrates"},
commonscat = "Aves",
wpcat = true,
}
labels["birds of prey"] = {
type = "set",
description = "=birds that live by [[predatory]] hunting, and from [[carrion]]",
parents = {"birds"},
}
labels["bivalves"] = {
type = "set",
description = "=[[clam]]s, [[cockle]]s, [[mussel]]s, [[oyster]]s, [[scallop]]s and other [[mollusk]]s in the [[class]] [[Bivalvia]]",
parents = {"mollusks"},
}
labels["blennies"] = {
type = "set",
description = "=[[blenny|blennies]], [[chaenopsid]]s, [[clinid]]s, [[dactyloscopid]]s, [[klipfish]], [[labrisomid]]s, [[triplefin]]s, [[weedfish]] and other fish in the [[perciform]] [[suborder]] [[Blennioidei]]",
parents = {"fish"},
}
labels["boas"] = {
type = "set",
description = "=[[snake]]s in the family [[Boidae]]",
parents = {"snakes"},
}
labels["bostrichiform beetles"] = {
type = "set",
description = "=[[carpet beetle]]s, [[deathwatch beetle]]s, [[drugstore beetle]]s, [[museum beetle]]s, [[powder-post beetle]]s, and other [[anobiid]]s/[[ptinid]]s, [[bostrichid]]s, [[dermestid]]s, [[derodontid]]s, [[jacobsoniid]]s and [[nosodendrid]]s in the [[coleopteran]] [[infraorder]] [[Bostrichiformia]]",
parents = {"beetles"},
}
labels["bovines"] = {
type = "set",
parents = {"even-toed ungulates"},
}
labels["brachiopods"] = {
type = "set",
description = "=[[animal]]s in the [[phylum]] [[Brachiopoda]]. <u>Note</u>: not to be confused with [[branchiopod]]s, which are [[crustacean]]s",
parents = {"animals"},
}
labels["branchiopods"] = {
type = "set",
description = "=[[[brine shrimp]], [[clam shrimp]], [[fairy shrimp]], [[tadpole shrimp]], [[water flea]]s, and other [[crustacean]]s in the [[class]] [[Branchiopoda]]. <u>Note</u>: not to be confused with [[brachiopod]]s, which are a separate [[phylum]]",
parents = {"crustaceans"},
}
labels["bryozoans"] = {
type = "set",
description = "=[[animal]]s in the [[phylum]] [[Bryozoa]], also known as [[Ectoprocta]]",
parents = {"animals"},
}
labels["bulbuls"] = {
type = "set",
description = "=[[bulbul]]s, [[greenbul]]s, [[brownbul]]s, [[leaflove]]s, [[bristlebill]]s, and other birds in the [[passerine]] [[family]] [[Pycnonotidae]]",
parents = {"perching birds"},
}
labels["buteos"] = {
type = "set",
description = "=[[hawk]]s in the [[genus]] ''[[Buteo]]'', known as [[buzzard]]s in Europe",
parents = {"birds of prey"},
}
labels["butterflies"] = {
type = "set",
parents = {"insects"},
}
labels["caddis flies"] = {
type = "set",
description = "=insects in the order [[Trichoptera]], which are closely related to the [[butterfly|butterflies]] and [[moth]]s but with hairs on their wings instead of scales, and which have [[aquatic]] [[larvae]] that live in cases that they build around themselves",
parents = {"insects"},
}
labels["caecilians"] = {
type = "set",
description = "=[[amphibian]]s in the [[order]] [[Gymnophiona]], which are legless and resemble [[earthworm]]s or [[snake]]s",
parents = {"amphibians"},
}
labels["camelids"] = {
type = "set",
description = "=[[camelid]]s ([[camel]]s, [[llama]]s, [[alpaca]]s, etc.)",
parents = {"mammals", "even-toed ungulates"},
}
labels["canids"] = {
type = "set",
parents = {"carnivores"},
}
labels["caprines"] = {
type = "set",
description = "=[[sheep]], [[goat]]s, [[goat antelope]]s, [[chamois]], [[muskox]]en, [[bharal]], [[goral]], [[ibex]], [[mouflon]], [[serow]], [[tahr]], [[tur]], [[takin]] and other animals in the [[bovid]] [[subfamily]] [[Caprinae]], formerly known as the [[family]] Capridae",
parents = {"even-toed ungulates"},
}
labels["caprimulgiforms"] = {
type = "set",
description = "=[[caprimulgiform]]s: birds in the taxonomic order [[Caprimulgiformes]]- the [[nightjar]]s, [[oilbird]]s, [[frogmouth]]s, [[potoo]]s, etc",
parents = {"birds"},
}
labels["carcharhiniform sharks"] = {
type = "set",
description = "=[[bull shark]]s, [[catshark]]s, [[gummy shark]]s, [[hammerhead]]s, [[leopard shark]]s, [[morgay]]s, [[requiem shark]]s, [[tiger shark]]s, [[tope]]s, [[whaler]]s, [[whitetip]]s and other sharks in the [[order]] [[Carcharhiniformes]]",
parents = {"sharks"},
}
labels["cardinalids"] = {
type = "set",
description = "=[[cardinal]]s, [[dickcissel]]s, [[indigo bunting]]s, [[pyrrhuloxia]]s, [[rose-breasted grosbeak]]s, [[scarlet tanager]]s, and other birds in the [[family]] [[Cardinalidae]]",
parents = {"perching birds"},
}
labels["caridean shrimp"] = {
type = "set",
description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Caridea]], mostly known as [[shrimp]] or [[prawn]]s",
parents = {"crustaceans", "decapods"},
}
labels["carnivores"] = {
type = "set",
description = "=[[bear]]s, [[cat]]s, [[civet]]s, [[dog]]s, [[fossa]]s, [[hyaena]]s, [[mongoose]]s, [[panda]]s, [[raccoon]]s, [[seal]]s, [[skunk]]s, [[weasel]]s and various other [[mammal]]s in the [[order]] [[Carnivora]]",
parents = {"mammals"},
}
labels["carps"] = {
type = "set",
description = "=fish in the [[subfamily]] [[Cyprininae]], the [[carps]] and [[goldfish]]",
parents = {"cyprinids"},
}
labels["catfish"] = {
type = "set",
parents = {"fish", "otocephalan fish"},
}
labels["cats"] = {
type = "set",
description = "=[[cat]]s in the sense of members of the genus ''[[Felis]]''",
parents = {"felids"},
commonscat = "Felis silvestris catus",
wpcat = true,
}
labels["cattle"] = {
type = "set",
parents = {"bovines", "livestock"},
}
labels["caviomorphs"] = {
type = "set",
description = "=[[agouti]]s, [[capybara]]s, [[chinchilla]]s, [[guinea pig]]s, [[New World porcupine]]s, [[nutria]]s, [[tuco-tuco]]s and other [[rodent]]s in the parvorder [[Caviomorpha]]",
parents = {"rodents"},
}
labels["cephalopods"] = {
type = "set",
parents = {"mollusks"},
}
labels["cercopithecin monkeys"] = {
type = "set",
description = "=[[blue monkey]]s, [[Diana monkey]]s, [[guenon]]s, [[lesula]]s, [[malbrouck]]s, [[patas monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[Old World monkey]]s in the [[cercopithecine]] [[tribe]] [[Cercopithecini]]",
parents = {"Old World monkeys"},
}
labels["certhioid birds"] = {
type = "set",
description = "=birds in the [[passerine]] [[superfamily]] [[Certhioidea]], the [[treecreeper]]s, [[nuthatch]]es, [[gnatcatcher]]s and [[wren]]s",
parents = {"perching birds"},
}
labels["cervids"] = {
type = "set",
parents = {"even-toed ungulates"},
}
labels["cetaceans"] = {
type = "set",
description = "=[[cetacean]]s ([[dolphin]]s, [[whale]]s and [[porpoise]]s)",
parents = {"even-toed ungulates"},
}
labels["chalcidoid wasps"] = {
type = "set",
description = "=[[chalcidid]]s, [[encyrtid]]s, [[fig wasp]]s, [[jointworm]]s, [[mymarid]] [[fairyfly|fairyflies]], [[perilampid]]s, [[torymid]]s, [[trichogramma]]s, and other [[wasp]]s in the [[superfamily]] [[Chalcidoidea]]",
parents = {"hymenopterans"},
}
labels["characins"] = {
type = "set",
description = "=fish in the order [[Characiformes]]",
parents = {"fish", "otocephalan fish"},
}
labels["chickens"] = {
type = "set",
parents = {"poultry", "fowls"},
}
labels["chimaeras (fish)"] = {
type = "set",
description = "=[[cartilaginous]] fish in the [[Chimaeriformes]], the only surviving [[order]] of the [[subclass]] [[Holocephali]], and separate from the [[shark]]s, [[ray]]s, [[skate]]s and [[sawfish]] of the subclass [[Elasmobranchii]]",
parents = {"fish"},
}
labels["chordates"] = {
type = "set",
description = "=animals in the [[phylum]] [[Chordata]]",
parents = {"animals"},
}
labels["chrysomeloid beetles"] = {
type = "set",
description = "=[[cerambycid]]s or [[longhorn beetle]]s such as [[apple borer]]s, [[huhu beetle]]s, [[locust borer]]s and [[thunderbolt beetle]]s, as well as [[chrysomelid]]s or [[leaf beetle]]s such as [[asparagus beetle]]s, [[bean weevil]]s, [[Colorado beetle]]s, [[cucumber beetle]]s, [[flea beetle]]s, [[potato beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Chrysomeloidea]]",
parents = {"beetles"},
}
labels["cicadas"] = {
type = "set",
description = "=[[insect]]s in the [[superfamily]] [[Cicadoidea]]",
parents = {"hemipterans"},
}
labels["cichlids"] = {
type = "set",
description = "=fish in the family [[Cichlidae]]",
parents = {"labroid fish"},
}
labels["clinids"] = {
type = "set",
description = "=fish in the family [[Clinidae]]",
parents = {"fish"},
}
labels["cnidarians"] = {
type = "set",
description = "=[[coral]]s, [[gorgonian]]s, [[hydra]]s, [[myxozoan]]s, [[Portuguese man-of-war]], [[sea anemone]]s, [[sea fir]]s, [[sea wasp]]s, and other animals in the in the [[phylum]] [[Cnidaria]]",
parents = {"animals"},
}
labels["cockatoos"] = {
type = "set",
description = "=[[crested]] [[parrot]]s in the [[family]] [[Cacatuidae]]",
parents = {"parrots"},
}
labels["cockroaches"] = {
type = "set",
parents = {"insects"},
}
labels["colobine monkeys"] = {
type = "set",
description = "=[[colobus]]es, [[douc]]s, [[langur]]s, [[guereza]]s, [[hanuman]]s,[[leaf monkey]]s, [[lutung]]s, [[proboscis monkey]]s, and other [[Old World monkey]]s in the [[subfamily]] [[Colobinae]]",
parents = {"Old World monkeys"},
}
labels["colubrid snakes"] = {
type = "set",
description = "=[[snake]]s in the family [[Colubridae]]",
parents = {"snakes"},
}
labels["colugos"] = {
type = "set",
description = "=the [[primate]]-like [[gliding]] [[mammal]]s in the [[order]] [[Dermoptera]], also known as [[flying lemur]]s",
parents = {"mammals"},
}
labels["columbids"] = {
type = "set",
description = "=[[columbid]]s, i.e. [[pigeon]]s and [[dove]]s",
parents = {"birds"},
}
labels["copepods"] = {
type = "set",
description = "=[[crustacean]]s in the [[subclass]] [[Copepoda]]",
parents = {"crustaceans"},
}
labels["coraciiforms"] = {
type = "set",
description = "=[[bee-eater]]s, [[ground rollers]], [[kingfisher]]s, [[motmot]]s, [[roller]]s, [[tody|todies]] and other birds in the taxonomic order [[Coraciiformes]]",
parents = {"birds"},
}
labels["corvids"] = {
type = "set",
parents = {"perching birds", "corvoid birds"},
}
labels["corvoid birds"] = {
type = "set",
description = "=[[apostlebird]]s, [[bird of paradise|birds of paradise]], [[crow]]s, [[drongo]]s, [[fantail]]s, [[grinder]]s, [[jackdaw]]s, [[jay]]s, [[magpie]]s, [[magpie-lark]]s, [[manucode]]s, [[monarchid]]s, [[nutcracker]]s, [[piwakawaka]]s, [[raven]]s, [[restless flycatcher]]s, [[riflebird]]s, [[shrike]]s, [[standard-wing]]s, and other birds in the [[superfamily]] [[Corvoidea]]",
parents = {"perching birds"},
}
labels["cotingas"] = {
type = "set",
description = "=birds in the [[suboscine]] [[family]] [[Cotingidae]]",
parents = {"suboscines"},
}
labels["crabs"] = {
type = "set",
description = "=[[crab]]s, [[decapod]] [[crustacean]]s in the [[infraorder]] [[Brachyura]]",
parents = {"crustaceans", "decapods"},
}
labels["cranes (birds)"] = {
type = "set",
description = "=[[crane]]s",
parents = {"gruiforms"},
}
labels["cricetids"] = {
type = "set",
description = "=[[cotton rat]]s, [[deer mouse|deer mice]], [[hamster]]s, [[harvest mouse|harvest mice]], [[lemming]]s, [[vole]]s, [[woodrat]]s, and other [[rodent]]s in the [[family]] [[Cricetidae]]",
parents = {"rodents"},
}
labels["crickets and grasshoppers"] = {
type = "set",
description = "=[[cricket]]s, [[grasshopper]]s, [[katydid]]s, [[weta]]s and other [[insect]]s in the order [[Orthoptera]]",
parents = {"insects"},
}
labels["croakers"] = {
type = "set",
description = "=[[croaker]]s, [[drum]]s, [[weakfish]]s and other fish in the family [[Sciaenidae]]",
parents = {"percoid fish"},
}
labels["crocodilians"] = {
type = "set",
description = "=[[crocodile]]s, [[alligator]]s, [[caymans]], and other [[reptile]]s in the order [[Crocodilia]]",
parents = {"reptiles"},
}
labels["crustaceans"] = {
type = "set",
parents = {"arthropods"},
}
labels["cuckoos"] = {
type = "set",
description = "=[[cuckoo]]s and other birds in the [[family]] [[Cuculidae]]",
parents = {"otidimorph birds"},
}
labels["cuckooshrikes and minivets"] = {
type = "set",
description = "=birds in the [[family]] [[Campephagidae]]",
parents = {"perching birds"},
}
labels["cucujoid beetles"] = {
type = "set",
description = "=[[flower beetle]]s, [[fungus beetle]]s, [[grain beetle]]s, [[lady beetle]]s, [[lizard beetle]]s, [[Mexican bean beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Cucujoidea]]",
parents = {"beetles"},
}
labels["ctenophores"] = {
type = "set",
description = "=animals in the [[phylum]] [[Ctenophora]], the [[comb jelly|comb jellies]]",
parents = {"animals"},
}
labels["culicomorphs"] = {
type = "set",
description = "=[[biting midge]]s, [[blackfly|blackflies]], [[blood worm]]s, [[glassworm]]s, [[meniscus midge]]s, [[mosquito]]s, [[no-see-um]]s, [[non-biting midge]]s, [[phantom midge]]s and other [[insect]]s in the [[dipteran]] [[infraorder]] [[Culicomorpha]]",
parents = {"dipterans"},
}
labels["cyprinids"] = {
type = "set",
description = "=[[carp]], [[minnow]]s, [[chub]]s and other fish in the [[family]] [[Cyprinidae]]. In some classifications, this group is known as the [[superfamily]] [[Cyprinoidea]] or [[suborder]] [[Cyprinoidei]], with the [[cyprinid]] [[subfamily|subfamilies]] considered to be families",
parents = {"fish", "otocephalan fish"},
}
labels["dabbling ducks"] = {
type = "set",
description = "=[[gadwall]]s [[garganey]]s, [[mallard]]s, [[mottled duck]]s, [[pintail]]s, [[shoveler]]s, [[teal]]s, [[wigeon]]s and other ducks in either the [[anatid]] [[tribe]] [[Anatini]] or [[subfamily]] [[Anatinae]], depending on the classification",
parents = {"ducks"},
}
labels["damselflies"] = {
type = "set",
description = "=[[bluestreak]]s, [[bluetail]]s, [[demoiselle]]s, [[flatwing]]s, [[redtail]]s, [[riverdamsel]]s, [[rubyspot]]s, [[spreadwing]]s, [[threadtail]]s, [[whitetip]]s, and other insects in the [[odonate]] [[suborder]] [[Zygoptera]]",
parents = {"dragonflies and damselflies"},
}
labels["danaine butterflies"] = {
type = "set",
description = "=[[clearwing]]s, [[crow]]s, [[milkweed]]s, [[monarch]]s, [[paper kite butterfly|paper kite butterflies]], [[tiger]]s, [[wanderer]]s and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Danainae]]",
parents = {"nymphalid butterflies"},
}
labels["dasyuromorphs"] = {
type = "set",
description = "=[[thylacine]]s, [[numbat]]s, [[dasyure]]s, [[antechinus]]es, [[dibbler]]s, [[dunnart]]s, [[mulgara]]s. [[phascogale]]s, [[planigale]]s, [[quoll]]s, [[Tasmanian devil]]s, and other [[marsupial]]s in the [[order]] [[Dasyuromorphia]]",
parents = {"marsupials"},
}
labels["decapods"] = {
type = "set",
description = "=[[crabs]], [[crayfish]], [[lobster]]s, [[prawn]]s, ([[caridean]]) [[shrimp]], and many other [[crustacean]]s in the [[order]] [[Decapoda]]",
parents = {"crustaceans"},
}
labels["delphinids"] = {
type = "set",
description = "=(oceanic) [[dolphin]]s, [[grampus]]es, [[killer whale]]s/[[orca]]s, [[pilot whale]]s, and other [[cetacean]]s in the [[family]] [[Delphinidae]]",
additional = "Note: [[river dolphin]]s and [[porpoise]]s are in other families.",
parents = {"cetaceans"},
}
labels["designer dogs"] = {
type = "set",
parents = {"dogs"},
commonscat = true,
wpcat = true,
}
labels["dinosaurs"] = {
type = "set",
parents = {"reptiles"},
}
labels["dionychan spiders"] = {
type = "set",
description = "=[[crab spider]]s, [[flattie]]s, [[ground spider]]s, [[huntsman spider]]s, [[jumping spider]], [[scorpion spider]]s, and other [[spiders]] in the [[entelegyne]] [[clade]] [[Dionycha]]",
parents = {"spiders"},
}
labels["dipterans"] = {
type = "set",
description = "=[[fly|flies]], [[gnat]]s, [[midge]]s, [[mosquito]]s and other [[insect]]s in the order [[Diptera]]",
parents = {"insects"},
}
labels["dogs"] = {
type = "set",
parents = {"canids"},
commonscat = true,
wpcat = true,
}
labels["domestic cats"] = {
type = "set",
parents = {"cats"},
}
labels["dragonflies and damselflies"] = {
type = "set",
description = "=insects in the order [[Odonata]]",
parents = {"insects"},
}
labels["ducks"] = {
type = "set",
parents = {"anatids", "poultry"},
}
labels["dugongs and manatees"] = {
type = "set",
description = "=[[mammal]]s in the order [[Sirenia]]",
parents = {"mammals"},
}
labels["eagles"] = {
type = "set",
parents = {"birds of prey"},
}
labels["earthworms"] = {
type = "set",
description = "=worms in the [[annelid]] [[suborder]] [[Lumbricina]]",
parents = {"annelids"},
}
labels["earwigs"] = {
type = "set",
description = "=insects in the order [[Dermaptera]]",
parents = {"insects"},
}
labels["echinoderms"] = {
type = "set",
parents = {"animals"},
commonscat = "Echinodermata",
wpcat = true,
}
labels["eels"] = {
type = "set",
description = "=[[eel]]s, elongated, snakelike fish in the order [[Anguilliformes]]",
parents = {"elopomorph fish"},
}
labels["elapid snakes"] = {
type = "set",
description = "=[[cobra]]s, [[coral snake]]s, [[krait]]s, [[mamba]]s, [[sea snake]]s, and other [[venomous]] snakes in the family [[Elapidae]]",
parents = {"snakes"},
}
labels["elateroid beetles"] = {
type = "set",
description = "=[[click beetle]]s/[[elaterid]]s, [[fire beetle]]s, [[firefly|fireflies]]/[[lampyrid]]s, [[glowworm]]s, [[net-winged beetle]]s/[[lycid]]s, [[railroad worm]]s/[[phengodid]]s, [[soldier beetle]]s/[[cantharid]]s, [[throscid]]s, [[wireworm]]s and other [[beetle]]s in the [[superfamily]] [[Elateroidea]]",
parents = {"beetles"},
}
labels["elephants"] = {
type = "set",
parents = {"mammals"},
commonscat = "Elephantidae",
wpcat = true,
}
labels["elopomorph fish"] = {
type = "set",
description = "=[[bonefish]], [[eel]]s, [[gulper eel]]s, [[halosaur]]s, [[ladyfish]], [[tarpon]] and other fish in the [[superorder]] [[Elopomorpha]]",
parents = {"fish"},
}
labels["emberizids"] = {
type = "set",
description = "=[[bunting]]s, [[yellowhammer]]s and related birds in the [[passerine]] family [[Emberizidae]]",
additional = "<u>Note</u>: for New World species that were formerly classified in this family, see [[:Category:{{{langcode}}}:New World sparrows]].",
parents = {"perching birds"},
}
labels["emydid turtles"] = {
type = "set",
description = "=(North American) [[box turtle]]s, [[chicken turtle]]s, [[cooter]]s, [[ellachick]]s, [[pond turtle]]s, [[slider]]s, [[terrapin]]s, and other [[turtle]]s in the [[family]] [[Emydidae]]",
parents = {"turtles"},
}
labels["equids"] = {
type = "set",
parents = {"odd-toed ungulates"},
}
labels["erinaceids"] = {
type = "set",
description = "=[[erinaceid]]s – hedgehogs and relatives",
parents = {"mammals"},
}
labels["euplerids"] = {
type = "set",
description = "=[[euplerid]]s — mongoose-like mammals found in Madagascar",
parents = {"carnivores"},
}
labels["even-toed ungulates"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Artiodactyla]]",
parents = {"mammals"},
}
labels["falconids"] = {
type = "set",
description = "=[[caracara]]s, [[falcon]]s, [[hobby|hobbies]], [[kestrel]]s, [[lanner]]s, [[merlin]]s, [[saker]]s, and other birds in the [[family]] [[Falconidae]]",
parents = {"birds of prey"},
}
labels["felids"] = {
type = "set",
parents = {"carnivores"},
}
labels["female animals"] = {
type = "set",
parents = {"animals", "female"},
}
labels["fish"] = {
type = "set",
parents = {"vertebrates"},
commonscat = true,
wpcat = true,
}
labels["flamingos"] = {
type = "set",
parents = {"freshwater birds"},
}
labels["flatfish"] = {
type = "set",
description = "=[[sole]]s, [[flounder]]s, [[halibut]]s and other fish in the order [[Pleuronectiformes]]",
parents = {"fish"},
}
labels["flatworms"] = {
type = "set",
description = "=[[fluke]]s, [[monogenean]]s, [[planarian]]s, [[polyclad]]s, [[tapeworm]]s, and other animals in the [[phylum]] [[Platyhelminthes]]",
additional = "For terms related to the study of [[parasitic]] [[worm#Noun|worms]], see [[:Category:Helminthology]] and its subcategories.",
parents = {"worms"},
}
labels["fleas"] = {
type = "set",
parents = {"insects"},
}
labels["fowls"] = {
type = "set",
description = "=[[fowl]]s: land birds in the [[order]] [[Galliformes]]",
parents = {"birds"},
}
labels["foxes"] = {
type = "set",
parents = {"canids"},
}
labels["freshwater birds"] = {
type = "set",
description = "=birds that live mainly in [[freshwater]] areas, including [[estuaries]]",
parents = {"birds"},
}
labels["freshwater whitefish"] = {
type = "set",
description = "=[[cisco]]s, [[houting]]s, [[inconnu]]s, [[lavaret]]s, [[marena]]s, [[omul]]s, [[Otsego bass]], [[peled]]s, [[pollan]]s, [[roundfish]], [[tullibee]]s, [[vendace]]s, [[whitefish]] and other fish in the [[salmonid]] [[subfamily]] [[Coregoninae]]",
parents = {"salmonids"},
}
labels["frogs"] = {
type = "set",
parents = {"anurans"},
}
labels["gadiforms"] = {
type = "set",
description = "=[[cod]], [[haddock]], [[hake]] and other fish in the [[order]] [[Gadiformes]]",
parents = {"fish"},
}
labels["gasterosteiform fish"] = {
type = "set",
description = "=[[stickleback]]s, [[hypoptychid]] [[sand eel]]s, [[tubesnout]]s and other fish in the [[order]] [[Gasterosteiformes]]",
additional = "Note: See [[:Category:Syngnathiform fish]] for a group formerly included within this order.",
parents = {"fish"},
}
labels["gastropods"] = {
type = "set",
parents = {"mollusks"},
}
labels["geckos"] = {
type = "set",
description = "=[[lizard]]s in the [[infraorder]] [[Gekkota]], except for the [[legless lizards]] or [[pygopod]]s",
parents = {"lizards"},
}
labels["geese"] = {
type = "set",
parents = {"anatids", "poultry"},
}
labels["gelechioid moths"] = {
type = "set",
description = "=[[acorn moth]]s, [[autostichid]]s,[[blastobasid]]s, [[casebearer]]s/[[coleophorid]]s, [[cosmet moth]]s/[[cosmopterigid]]s, [[depressariid]]s, [[gelechiid]]s/[[twirler moth]]s, [[lecithocerid]]s,[[oecophorid]]s/[[concealer]]s, [[palmerworm]]s, [[parsnip moth]]s, [[potato moth]]s, [[scythridid]]s/[[flower moth]]s, [[xyloryctid]]s, and other [[micromoth]]s in the [[superfamily]] [[Gelechioidea]]",
parents = {"moths"},
}
labels["geometrid moths"] = {
type = "set",
description = "=[[carpet]]s, [[engrailed]]s, [[heath]]s, [[pug]]s, [[peppered moth]]s, [[streak]]s, [[wave]]s and other [[moth]]s in the [[family]] [[Geometridae]], most of which have [[caterpillar]]s known as [[inchworm]]s, [[looper]]s, [[measuring worm]]s or [[spanworm]]s",
parents = {"moths"},
}
labels["goats"] = {
type = "set",
parents = {"caprines", "livestock"},
}
labels["gobies"] = {
type = "set",
description = "=[[goby|gobies]], [[dartfish]], [[mudskipper]]s, [[sea gudgeon]]s, [[sleeper]]s, [[wormfish]], and other [[fish]] in the [[perciform]] [[suborder]] [[Gobioidei]]",
parents = {"fish"},
}
labels["gossamer-winged butterflies"] = {
type = "set",
description = "=[[blue]]s, [[copper]]s, [[elfin]]s, [[harvester]]s, [[hairstreak]]s, [[sunbeam]]s and other [[butterfly|butterflies]] in the [[family]] [[Lycaenidae]]",
parents = {"butterflies"},
}
labels["grebes"] = {
type = "set",
parents = {"freshwater birds"},
}
labels["grouse"] = {
type = "set",
description = "=[[blackcock]]s, [[capercaillie]]s, [[grouse]], [[moorcock]]s, [[prairie chicken]]s, [[ptarmigan]]s, [[sagehen]]s, and other birds in the [[phasianid]] [[subfamily]] [[Tetraoninae]]",
parents = {"fowls"},
}
labels["gruiforms"] = {
type = "set",
description = "=[[coot]]s, [[crake]]s, [[crane]]s, [[finfoot]]s, [[flufftail]]s, [[gallinule]]s, [[limpkin]]s, [[rail]]s, [[sungrebe]]s, [[trumpeter]]s, and other birds in the [[order]] [[Gruiformes]]",
parents = {"freshwater birds"},
}
labels["gulls"] = {
type = "set",
description = "=[[gull]]s, [[seabird]]s in the [[family]] [[Laridae]]",
parents = {"seabirds"},
}
labels["gun dogs"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["hares"] = {
type = "set",
parents = {"lagomorphs"},
}
labels["hemipterans"] = {
type = "set",
description = "=[[aphid]]s, [[leafhopper]]s, [[scale insect]]s, [[true bug]]s, [[whitefly|whiteflies]], and other [[insect]]s in the order [[Hemiptera]]",
parents = {"insects"},
}
labels["herding dogs"] = {
type = "set",
parents = {"pastoral dogs"},
}
labels["herons"] = {
type = "set",
description = "=[[heron]]s, [[bittern]]s and [[egret]]s",
parents = {"freshwater birds"},
}
labels["herpestids"] = {
type = "set",
description = "=[[herpestid]]s- mongooses, meerkats, and relatives",
parents = {"carnivores"},
}
labels["herrings"] = {
type = "set",
description = "=[[herring]]s, [[shad]]s, [[sardine]]s and other fish in the family [[Clupeidae]]",
parents = {"fish", "otocephalan fish"},
}
labels["holostean fish"] = {
type = "set",
description = "=[[gar]]s and [[bowfin]]s, primitive fish in the [[infraclass]] [[Holostei]]",
parents = {"fish"},
}
labels["hominids"] = {
type = "set",
parents = {"primates"},
}
labels["honeyeaters"] = {
type = "set",
description = "=Australian [[chat]]s, [[bellbird]]s, [[friarbird]]s, [[gibberbird]]s, [[honeyeater]]s, [[miner]]s, [[spinebill]]s, [[wattlebird]]s, and other birds in the [[family]] [[Meliphagidae]]",
parents = {"meliphagoid birds"},
}
labels["hoopoes and hornbills"] = {
type = "set",
description = "=[[hoopoe]]s, [[woodhoopoe]]s (including [[scimitarbill]]s), [[hornbill]]s, [[ground hornbill]]s, and other birds in the taxonomic order [[Bucerotiformes]]",
parents = {"birds"},
}
labels["horseflies"] = {
type = "set",
description = "=[[blind-fly|blind-flies]], [[breezefly|breezeflies]], [[cleg]]s, [[deerfly|deerflies]], [[forest fly|forest flies]], [[gadfly|gadflies]], [[horsefly|horseflies]], [[oxfly|oxflies]], [[zimb]]s, and other biting flies in the [[family]] [[Tabanidae]]",
parents = {"dipterans"},
}
labels["horse breeds"] = {
type = "set",
parents = {"horses"},
commonscat = true,
wpcat = true,
}
labels["horses"] = {
type = "set",
parents = {"equids", "livestock"},
}
labels["hummingbirds"] = {
type = "set",
parents = {"apodiforms"},
}
labels["hunting dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["hyaenids"] = {
type = "set",
parents = {"carnivores"},
}
labels["hydrozoans"] = {
type = "set",
description = "=[[bluebottle]]s, [[calycophoran]]s, [[filiferan]]s, [[hydra]]s, [[hydractinian]]s, [[leptothecate]]s, [[narcomedusa]]s, [[pandeid]]s, [[physonect]]s, [[plumularian]]s, [[Portuguese man-of-war]]s, [[siphonophore]]s, [[stylaster]]s, [[sea fir]]s, [[sea ginger]], [[trachylid]]s, [[trachymedusa]]s, amd other animals in the [[cnidarian]] [[class]] [[Hydrozoa]]",
parents = {"cnidarians"},
}
labels["hymenopterans"] = {
type = "set",
description = "=[[ant]]s, [[bee]]s, [[ichneumon wasp]]s, [[sawfly|sawflies]], [[wasp]]s and other [[insect]]s in the order [[Hymenoptera]]",
parents = {"insects"},
}
labels["hyraxes"] = {
type = "set",
parents = {"mammals"},
}
labels["ibises and spoonbills"] = {
type = "set",
description = "=[[ibis]]es and [[spoonbill]]s",
parents = {"freshwater birds"},
}
labels["ichthyosauromorphs"] = {
type = "set",
description = "=[[ichthyosaurs]] and related groups of [[extinct]] [[aquatic]] [[reptile]]s in the [[clade]] [[Ichthyosauromorpha]]",
parents = {"reptiles"},
}
labels["icterids"] = {
type = "set",
description = "=birds in the [[New World]] [[passerine]] family [[Icteridae]]",
parents = {"perching birds"},
}
labels["iguanoid lizards"] = {
type = "set",
description = "=[[anole]]s, [[basilisk]]s, [[collared lizard]]s, [[chuckwalla]]s, [[fence lizard]]s, [[fringe-toed lizard]]s, [[horned lizard]]s, [[iguana]]s, [[leopard lizard]]s, [[side-blotched lizard]]s, [[zebra-tailed lizard]]s and other [[lizard]]s formerly included in the [[family]] [[Iguanidae]], and now mostly treated as comprising either the [[infraorder]] [[Pleurodonta]] or the [[superfamily]] [[Iguanoidea]]",
parents = {"lizards"},
}
labels["insects"] = {
type = "set",
parents = {"arthropods"},
}
labels["isopods"] = {
type = "set",
description = "=[[gribble]]s, [[pillbug]]s, [[salve bug]]s, [[slater]]s, [[sea slater]]s, [[sowbug]]s, [[woodlouse|woodlice]], and other [[crustacean]]s in the [[order]] [[Isopoda]]",
parents = {"crustaceans"},
}
labels["jackfish"] = {
type = "set",
description = "=[[jack]]s, [[pompano]]s, [[jack mackerel]]s, [[scad]]s and other fish in the family [[Carangidae]]",
parents = {"percoid fish"},
}
labels["jawless fish"] = {
type = "set",
description = "=[[lamprey]]s and [[hagfish]]: primitive eel-like fishes that have no jaws",
parents = {"fish"},
}
labels["kingfishers"] = {
type = "set",
parents = {"coraciiforms"},
}
labels["kites (birds)"] = {
type = "set",
description = "=[[hawk]]s in the [[accipitrid]] [[subfamily|subfamilies]] [[Milvinae]] and [[Elaninae]], as well as some in the subfamily [[Perninae]]",
parents = {"birds of prey"},
}
labels["kyphosid fish"] = {
type = "set",
description = "=[[blackfish]], [[drummer]]s, [[footballer]]s, [[greenfish]], [[halfmoon]]s, [[luderick]]s, [[mado]]s, [[moonlighter]]s, [[nibbler]]s, [[opaleye]]s, [[sea chub]]s, [[stripey]]s, [[sweep]]s and other fish in the [[percoid]] [[family]] [[Kyphosidae]]",
parents = {"percoid fish"},
}
labels["labroid fish"] = {
type = "set",
description = "=[[anemonefish]], [[cale]]s, [[cichlid]]s, [[clownfish]], [[damselfish]], [[parrotfish]], [[surfperch]], [[wrasse]]s, and other fish in the [[perciform]] [[suborder]] [[Labroidei]]",
parents = {"fish"},
}
labels["labyrinth fish"] = {
type = "set",
description = "=[[climbing perch]], [[gourami]]s, [[paradisefish]], [[Siamese fighting fish]] and other fish in the [[suborder]] [[Anabantoidei]]",
parents = {"fish"},
}
labels["lacertoid lizards"] = {
type = "set",
description = "=[[amphisbaena]]s, [[caiman lizard]]s, [[green lizard]]s, [[ocellated lizard]]s, [[racerunner]]s, [[rock lizard]]s, [[tegu]]s, [[teiid]]s, [[thunderworm]]s, [[viviparous lizard]]s, [[wall lizard]]s, [[whiptail]]s, and other [[lizard]]s in the [[superfamily]] [[Lacertoidea]]",
parents = {"lizards"},
}
labels["lagomorphs"] = {
type = "set",
parents = {"mammals"},
}
labels["lamniform sharks"] = {
type = "set",
description = "=[[basking shark]]s, [[goblin shark]]s, [[great white shark]]s, [[mako shark]]s, [[megamouth shark]]s, [[porbeagle]]s, [[sand shark]]s, [[thresher shark]]s, and other [[shark]]s in the [[order]] [[Lamniformes]]",
parents = {"sharks"},
}
labels["lampriform fish"] = {
type = "set",
description = "=[[crestfish]], [[oarfish]], [[opah]]s, [[ribbonfish]], [[velifer]]s and other fish in the [[order]] [[Lampridiformes]] (not to be confused with the unrelated [[lamprey]]s)",
parents = {"fish"},
}
labels["larks"] = {
type = "set",
parents = {"perching birds"},
}
labels["laughingthrushes"] = {
type = "set",
description = "=birds in the [[family]] [[Leiothrichidae]]",
parents = {"perching birds"},
}
labels["leaf warblers"] = {
type = "set",
description = "=birds in the family [[Phylloscopidae]]",
parents = {"warblers"},
}
labels["lesser apes"] = {
type = "set",
description = "=[[gibbon]]s (including [[hoolock]]s, [[lar gibbon]]s [[wow-wow]]s, etc.) and [[siamang]]s, comprising the [[family]] [[Hylobatidae]], which is closely related to the [[hominid]]s",
parents = {"primates"},
}
labels["leuciscine fish"] = {
type = "set",
description = "=[[bream]]s, [[chub]]s, [[dace]]s, [[ide]]s, many [[minnow]]s, [[nase]]s, [[roach]]es, [[shiner]]s, [[ziege]]s, and other fish in the [[cyprinid]] [[subfamily]] [[Leuciscinae]], sometimes treated as the [[family]] [[Leuciscidae]], or as the [[tribe]] [[Leuciscini]] within the [[subfamily]] [[Cyprininae]]",
parents = {"cyprinids"},
}
labels["libellulid dragonflies"] = {
type = "set",
description = "=[[amberwing]]s, [[basker]]s, [[darter]]s, [[dropwing]]s, [[duskhawk]]s, [[flutterer]]s, [[glider]]s, [[meadowhawk]]s, [[pennant]]s, [[percher]]s, [[skimmer]]s, [[slimwing]]s, [[swampdragon]]s, [[twister]]s, and other [[dragonfly|dragonflies]] in the [[family]] [[Libellulidae]]",
parents = {"dragonflies and damselflies"},
}
labels["lice"] = {
type = "set",
description = "=[[parasitic]] insects in the [[order]] [[Psocodea]]",
parents = {"insects"},
}
labels["limenitidine butterflies"] = {
type = "set",
description = "=[[admiral]]s, [[clipper]]s, [[count]]s, [[duke]]s, [[purple]]s, [[sister]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Limenitidinae]]",
parents = {"nymphalid butterflies"},
}
labels["littorinimorphs"] = {
type = "set",
description = "=[[boat shell]]s, [[carrier shell]]s, [[conch]]s, [[cowry|cowries]], [[flamingo tongue]]s, [[helmet shell]]s, [[moon snail]]s, [[pebblesnail]]s, [[trumpet shell]]s, [[velutinid]]s, [[winkle]]s, [[worm-shell]]s, and other [[gastropod]]s in the [[order]] [[Littorinimorpha]]",
parents = {"gastropods"},
}
labels["livestock guardian dogs"] = {
type = "set",
parents = {"pastoral dogs"},
}
labels["lizards"] = {
type = "set",
parents = {"reptiles"},
}
labels["loaches"] = {
type = "set",
description = "=fish in the [[cypriniform]] [[superfamily]] [[Cobitoidea]]",
parents = {"fish", "otocephalan fish"},
}
labels["lobe-finned fishes"] = {
type = "set",
description = "=[[coelacanth]]s, [[lungfish]] and other fishes in the [[subclass]] [[Sarcopterygii]] of the [[bony fish]]es",
additional = "<u>Please note</u>: although the [[tetrapod]]s (including all [[reptile]]s, [[amphibian]]s, [[bird]]s and [[mammal]]s) are descended from within this group, they are excluded from this category by not being fish.",
parents = {"fish"},
}
labels["loons"] = {
type = "set",
description = "=[[loon]]s, birds known as [[diver]]s outside the US",
parents = {"freshwater birds"},
}
labels["macaques"] = {
type = "set",
description = "=[[Barbary ape]]s, [[bonnet monkey]]s, [[crab-eating macaque]]s, [[Japanese macaque]]s, [[moor macaque]]s, [[pigtail macaque]]s, [[rhesus monkey]]s, [[toque]]s, and other [[Old World monkey]]s in the [[genus]] ''[[Macaca]]''",
parents = {"Old World monkeys"},
}
labels["macropods"] = {
type = "set",
description = "=[[bettong]]s, [[kangaroo]]s, [[pademelon]]s, [[potoroo]]s, [[quokka]]s, [[wallaby]]s, and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Macropodiformes]]",
parents = {"marsupials"},
}
labels["malaconotoid birds"] = {
type = "set",
description = "=[[Australian magpie]]s, [[bushshrike]]s, [[butcherbird]]s, [[boubou]]s, [[brubru]]s, [[currawong]]s, [[gonolek]]s, [[squeaker]]s, [[vanga]]s, and other birds in the [[passerine]] [[superfamily]] [[Malaconotoidea]]",
parents = {"perching birds"},
}
labels["male animals"] = {
type = "set",
parents = {"animals", "male"},
}
labels["mammals"] = {
type = "set",
parents = {"vertebrates"},
}
labels["mantids"] = {
type = "set",
description = "=insects in the [[order]] [[Mantodea]], often known as [[praying mantis]]es",
parents = {"insects"},
}
labels["marsupials"] = {
type = "set",
parents = {"mammals"},
}
labels["mayflies"] = {
type = "set",
description = "=insects in the [[order]] [[Ephemeroptera]]",
parents = {"insects"},
}
labels["megalopterans"] = {
type = "set",
description = "=[[alderfly|alderflies]], [[dobsonfly|dobsonflies]], [[fishfly|fishflies]] and other insects in the [[order]] [[Megaloptera]]",
parents = {"insects"},
}
labels["meliphagoid birds"] = {
type = "set",
description = "=[[blue wren]]s, [[bristlebird]]s, [[emu-wren]]s, [[fairywren]]s, [[gerygone]]s, [[grasswren]]s, [[honeyeater]]s, [[pardalote]]s, [[pilotbird]]s, [[redthroat]]s, [[scrubwren]]s, [[thornbill]]s, [[weebill]]s, [[whiteface]]s, and other birds in the [[passerine]] [[superfamily]] [[Meliphagoidea]]",
parents = {"perching birds"},
}
labels["mephitids"] = {
type = "set",
description = "=[[mephitid]]s: skunks and stink badgers",
parents = {"carnivores"},
}
labels["mergansers"] = {
type = "set",
description = "=[[diving]] [[duck]]s in the [[genus]] ''[[Mergus]]'' and a few similar species",
parents = {"ducks"},
}
labels["mimids"] = {
type = "set",
description = "=[[catbird]]s, [[mockingbird]]s, [[thrasher]]s and other birds in the [[passerine]] family [[Mimidae]]",
parents = {"perching birds"},
}
labels["mites and ticks"] = {
type = "set",
description = "=[[arachnid]]s in the [[subclass]] [[Acari]]",
parents = {"arachnids"},
}
labels["mollusks"] = {
type = "set",
parents = {"animals"},
commonscat = "Mollusca",
wpcat = "Molluscs",
}
labels["monkeys"] = {
type = "set",
parents = {"primates"},
}
labels["monotremes"] = {
type = "set",
parents = {"mammals"},
}
labels["mosquitoes"] = {
type = "set",
description = "=[[insect]]s in the [[dipteran]] [[family]] [[Culicidae]]",
parents = {"culicomorphs"},
}
labels["moths"] = {
type = "set",
parents = {"insects"},
}
labels["murids"] = {
type = "set",
description = "=a number of [[rats]], [[mice]], and other [[rodent]]s in the [[Old World]] [[family]] [[Muridae]]",
parents = {"rodents"},
}
labels["muscicapids"] = {
type = "set",
description = "=birds in the [[passerine]] family [[Muscicapidae]]",
parents = {"perching birds"},
}
labels["muscoid flies"] = {
type = "set",
description = "=[[anthomyiid]]s such as [[root fly|root flies]], [[cabbage fly|cabbage flies]] and [[onion fly|onion flies]]; [[fanniid]]s; [[muscid]]s such as [[housefly|houseflies]], [[face fly|face flies]] and [[stable fly|stable flies]]; [[scathophagid]]s such as [[dungfly|dungflies]]; and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Muscoidea]]",
parents = {"dipterans"},
}
labels["mustelids"] = {
type = "set",
parents = {"carnivores"},
}
labels["mygalomorph spiders"] = {
type = "set",
description = "=[[baboon spider]]s, [[barking spider]]s, [[bird spider]]s, [[purseweb spider]]s, [[tarantula]]s, [[trapdoor spider]]s, and other [[spider]]s in the [[infraorder]] [[Mygalomorphae]]",
parents = {"spiders"},
}
labels["myriapods"] = {
type = "set",
description = "=[[centipede]]s, [[millipede]]s, [[pauropod]]s, [[symphylan]]s, and other [[arthropod]]s in the [[subphylum]] [[Myriapoda]]",
parents = {"arthropods"},
}
labels["myrmicine ants"] = {
type = "set",
description = "=[[ant]]s in the [[subfamily]] [[Myrmicinae]]",
parents = {"ants"},
}
labels["nematodes"] = {
type = "set",
description = "=[[filaria]], [[gapeworm]]s, [[lungworm]]s, [[pinworm]]s, [[threadworm]]s, [[wheatworm]]s, [[whipworm]]s and other [[worm]]s in the [[phylum]] [[Nematoda]]",
parents = {"worms"},
}
labels["neogastropods"] = {
type = "set",
description = "=[[admiral shell]]s, [[cone snail]]s, [[harp shell]]s, [[murex]]es, [[olive]]s, [[rhombus]]es, [[spindle]]s, [[tulip shell]]s, [[turnip shell]]s, [[volute]]s, [[whelk]]s, [[winkle]]s and other [[gastropod]]s in the [[clade]] [[Neogastropoda]] (treated as an [[order]] in some classifications)",
parents = {"gastropods"},
}
labels["New World monkeys"] = {
type = "set",
description = "=[[capuchin]]s, [[howler monkey]]s, [[marmoset]]s, [[night monkey]]s, [[saki]]s, [[spider monkey]]s, [[squirrel monkey]]s, [[tamarin]]s, [[titi]]s, [[uakari]]s, [[woolly monkey]]s, and other [[monkey]]s in the [[parvorder]] [[Platyrrhini]]",
parents = {"monkeys"},
}
labels["New World quails"] = {
type = "set",
description = "=birds in the [[family]] [[Odontophoridae]], most of which live in the [[New World]] and are known as [[quail]]s, but the family also includes the African [[genus]] ''[[Ptilopachus]]'' and some [[species]] are known as partridges",
parents = {"fowls"},
}
labels["New World sparrows"] = {
type = "set",
description = "=[[sparrow]]- and [[finch]]-like birds in the [[passerine]] [[family]] [[Passerellidae]], until recently considered part of the family [[Emberizidae]]",
parents = {"perching birds"},
}
labels["New World warblers"] = {
type = "set",
description = "=birds in the family [[Parulidae]]",
parents = {"warblers"},
}
labels["neuropterans"] = {
type = "set",
description = "=[[antlion]]s, [[lacewing]]s, [[mantisfly|mantisflies]], [[owlfly|owlflies]] and other insects in the [[order]] [[Neuroptera]]",
parents = {"insects"},
}
labels["newts"] = {
type = "set",
description = "=[[terrestrial]] [[salamander]]s in the [[subfamily]] [[Pleurodelinae]]",
parents = {"salamanders"},
}
labels["noctuoid moths"] = {
type = "set",
description = "=[[armyworm]]s, [[cinnabar]]s, [[corn earworm]]s, [[cutworm]]s, [[gypsy moth]]s, [[owlet moth]]s, [[processionary|processionaries]], [[tiger moth]]s, [[underwing]]s, [[wainscot]]s, [[wooly bear]]s, and many other [[moth]]s (and [[caterpillar]]s) in the [[superfamily]] [[Noctuoidea]]",
parents = {"moths"},
}
labels["nudibranchs"] = {
type = "set",
description = "=[[sea slug]]s in the [[gastropod]] [[order]] [[Nudibranchia]]",
parents = {"gastropods"},
}
labels["nymphalid butterflies"] = {
type = "set",
description = "=[[admiral]]s, [[brown]]s, [[buckeye]]s, [[checkerspot]]s, [[emperor]]s, [[fritillary|fritillaries]], [[leafwing]]s, [[longwing]]s, [[monarch]]s, [[morpho]]s, [[painted lady|painted ladies]], [[ringlet]]s, [[satyr]]s, [[sister]]s, [[snout]]s, [[tortoiseshell]]s, and other butterflies in the [[family]] [[Nymphalidae]]",
parents = {"butterflies"},
}
labels["octopuses"] = {
type = "set",
parents = {"cephalopods"},
}
labels["odd-toed ungulates"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Perissodactyla]], including the [[equid]]s, [[tapir]]s and [[rhinoceros]]es",
parents = {"mammals"},
}
labels["oestroid flies"] = {
type = "set",
description = "=[[blowfly|blowflies]], [[bluebottle]]s, [[botfly|botflies]], [[flesh fly|flesh fles]], [[greenbottle]]s, [[mango fly|mango flies]], [[screwworm]]s, [[tachinid]]s, [[torsalo]]s, [[tumbu fly|tumbu flies]], [[warble fly|warble flies]], and other flies in the [[superfamily]] [[Oestroidea]]",
parents = {"dipterans"},
}
labels["Old World monkeys"] = {
type = "set",
description = "=[[baboon]]s, [[colobus]], [[douc]]s, [[gelada]]s, [[green monkey]]s, [[grivet]]s, [[langur]]s, [[malbrouck]]s, [[mandrill]]s, [[mangabey]]s, [[patas monkey]]s, [[proboscis monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[monkeys]] in the [[family]] [[Cercopithecidae]], the only [[members]] of the [[parvorder]] [[Catarrhini]] aside from the greater/lesser apes and humans",
parents = {"monkeys"},
}
labels["Old World orioles"] = {
type = "set",
description = "=[[perching bird]]s in the [[family]] [[Oriolidae]], which are not closely related to the New World orioles in the family [[Icteridae]]",
parents = {"perching birds"},
}
labels["ornithopods"] = {
type = "set",
description = "=[[camptosaurid]]s, [[hadrosaur]]s, [[iguanodontid]]s, [[lambeosaurid]]s, [[rhabdodontid]]s, [[saurolophid]]s, [[thescelosaurid]]s, [[trachodontid]]s, and other [[dinosaur]]s in the [[ornithischian]] [[clade]] [[Ornithopoda]]",
parents = {"dinosaurs"},
}
labels["osteoglossomorph fish"] = {
type = "set",
description = "=[[aba]]s, [[arapaima]]s, [[arowana]]s, [[butterfly fish]], [[elephantfish]], [[featherback]]s, [[mooneye]]s and other fish in the [[superorder]] [[Osteoglossomorpha]]",
parents = {"fish"},
}
labels["otariid seals"] = {
type = "set",
description = "=[[mammal]]s in the [[family]] [[Otariidae]], including the [[fur seal]]s and [[sea lion]]s",
parents = {"pinnipeds"},
}
labels["otidimorph birds"] = {
type = "set",
description = "=[[bustard]]s in the [[family]] [[Otididae]] and [[order]] [[Otidiformes]]; [[turaco]]s or [[lourie]]s, [[go-away bird]]s, [[plantain-eater]]s, etc., in the [[family]] [[Musophagidae]] and [[order]] [[Musophagiformes]]; and [[cuckoo]]s in the [[family]] [[Cuculidae]] and [[order]] [[Cuculiformes]]; all in the [[clade]] [[Otidimorphae]]",
parents = {"birds"},
}
labels["otocephalan fish"] = {
type = "set",
description = "=[[anchovy|anchovies]], [[beaked salmon]], [[carp]], [[catfish]], [[characin]]s, [[electric eel]]s, [[ghost knifefish]], [[herring]]s, [[loach]]es, [[milkfish]], [[minnow]]s, [[mousefish]], [[slickhead]]s, [[sucker]]s, [[tubeshoulder]]s, and other fish in the [[clade]] [[Otocephala]]",
parents = {"fish"},
}
labels["ovenbirds"] = {
type = "set",
description = "=birds in the [[suboscine]] family [[Furnariidae]], including the former family Dendrocolaptidae (now the [[subfamily]] [[Dendrocolaptinae]])",
parents = {"suboscines"},
}
labels["owls"] = {
type = "set",
parents = {"birds of prey"},
}
labels["pangolins"] = {
type = "set",
description = "=[[mammal]]s in the [[order]] [[Pholidota]]",
parents = {"mammals"},
}
labels["panthers"] = {
type = "set",
description = "=[[panther]]s in the sense of members of the genus ''[[Panthera]]''",
parents = {"felids"},
}
labels["parrots"] = {
type = "set",
parents = {"birds"},
}
labels["pastoral dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["penguins"] = {
type = "set",
parents = {"birds"},
}
labels["pentatomoid bugs"] = {
type = "set",
description = "=[[acanthosomatid]]s, [[burrowing bug]]s, [[jewel bug]]s, [[shield bug]]s, [[stinkbug]]s, [[thyreocorid]]s, and other [[true bug]]s in the [[superfamily]] [[Pentatomoidea]]",
parents = {"true bugs"},
}
labels["perch and darters"] = {
type = "set",
description = "=fish in the family [[Percidae]]",
parents = {"percoid fish"},
}
labels["perching birds"] = {
type = "set",
description = "=[[passerine]]s or perching birds: members of the order [[Passeriformes]]",
parents = {"birds"},
}
labels["percoid fish"] = {
type = "set",
description = "=[[archerfish]], [[bass]], [[bigeye]]s, [[bluefish]], [[butterflyfish]], [[cardinalfish]], [[cobia]], [[croaker]]s, [[flagtail]]s, [[goatfish]], [[grouper]]s, [[grunt]]s, [[horse mackerel]], [[jack]]s, [[jawfish]], [[leaffish]], [[mahi-mahi]], [[mojarra]], [[perch]], [[pomfret]]s, [[pompano]], [[ponyfish]], [[porgy|porgies]], [[remora]]s, [[roosterfish]], [[sea bass]], [[sea bream]], [[snapper]], [[sunfish]], [[sweeper]]s, [[threadfin]], [[tilefish]], [[wreckfish]], and other [[perciform]] fish in the [[superfamily]] [[Percoidea]]",
parents = {"fish"},
}
labels["phiomorphs"] = {
type = "set",
description = "=[[blesmol]]s, [[sand mole]]s, [[mole rat]]s, [[dassie rat]]s or [[rock rat]]s, [[Old World porcupine]]s, [[cane rat]]s or [[grasscutter]]s and other [[rodent]]s in the parvorder [[Phiomorpha]], which is the Old World counterpart of the [[caviomorph]]s",
parents = {"rodents"},
}
labels["phocid seals"] = {
type = "set",
description = "=[[mammal]]s in the [[family]] [[Phocidae]], including the [[earless seal]]s (also known as [[true seal]]s)",
parents = {"pinnipeds"},
}
labels["piciforms"] = {
type = "set",
description = "=[[woodpecker]]s, [[aracari]]s, [[coppersmith]]s, [[honeyguide]]s, [[jacamar]]s, [[nunlet]]s, [[puffbird]]s, [[toucan]]s, and other birds in the [[order]] [[Piciformes]]",
parents = {"birds"},
}
labels["pierid butterflies"] = {
type = "set",
description = "=[[brimstone]]s, [[orange tip]]s, [[sulfur]]s, [[white]]s and other [[butterfly|butterflies]] in the [[family]] [[Pieridae]]",
parents = {"butterflies"},
}
labels["pigs"] = {
type = "set",
parents = {"even-toed ungulates", "livestock"},
commonscat = "Suidae",
wpcat = true,
}
labels["pikes (fish)"] = {
type = "set",
description = "=fish in the family [[Esocidae]]",
parents = {"fish"},
}
labels["pinnipeds"] = {
type = "set",
parents = {"carnivores"},
}
labels["pipits and wagtails"] = {
type = "set",
description = "=birds in the [[passerine]] family [[Motacillidae]]",
parents = {"perching birds"},
}
labels["placoderms"] = {
type = "set",
description = "=[[extinct]] armored fish of the [[class]] [[Placodermi]] from the [[Silurian]] and [[Devonian]] [[geologic]] [[period]]s",
parents = {"fish"},
}
labels["plovers and lapwings"] = {
type = "set",
description = "=birds in the [[charadriiform]] [[family]] [[Charadriidae]]",
parents = {"shorebirds"},
}
labels["pomfrets"] = {
type = "set",
description = "=fish in the family [[Bramidae]]",
parents = {"percoid fish"},
}
labels["primates"] = {
type = "set",
parents = {"mammals"},
commonscat = true,
wpcat = true,
}
labels["procyonids"] = {
type = "set",
description = "=[[procyonid]]s: ([[raccoon]]s, [[coati]]s, [[kinkajou]]s, [[olingo]]s, [[ringtail]]s and [[cacomistle]]s)",
parents = {"carnivores"},
}
labels["prosimians"] = {
type = "set",
parents = {"primates"},
}
labels["pterosaurs"] = {
type = "set",
parents = {"reptiles"},
}
labels["pyraloid moths"] = {
type = "set",
description = "=[[bee moth]]s, [[flour moth]]s, [[leaf crumpler]]s, [[magpie moth]]s, [[melonworm]]s, [[mint moth]]s, [[orangeworm]]s, [[pantry moth]]s, [[pickleworm]]s, [[snout moth]]s, [[veneer moth]]s, [[wax moth]]s and other [[crambid]] and [[pyralid]] [[moths]] in the [[superfamily]] [[Pyraloidea]]",
parents = {"moths"},
}
labels["rabbits"] = {
type = "set",
parents = {"lagomorphs"},
}
labels["rallids"] = {
type = "set",
description = "=[[rallid]]s: [[rail]]s and other birds in the family [[Rallidae]]",
parents = {"gruiforms"},
}
labels["ratites"] = {
type = "set",
description = "=[[ratite]]s: birds in the superorder [[Palaeognathae]], including large flightless birds such as [[ostrich]]es, and [[emu]]s, as well as the smaller [[kiwi]]s and [[flighted]] [[tinamous]]",
parents = {"birds"},
}
labels["rays and skates"] = {
type = "set",
description = "=[[fish]] in the superorder [[Batoidea]]",
parents = {"fish"},
}
labels["reindeers"] = {
type = "set",
parents = {"cervids"},
}
labels["reptiles"] = {
type = "set",
parents = {"vertebrates"},
commonscat = "Reptilia",
wpcat = true,
}
labels["retrievers"] = {
type = "set",
parents = {"gun dogs"},
}
labels["rhinoceroses"] = {
type = "set",
description = "=[[rhinoceros]]es, [[mammal]]s in the [[perissodactylic]] [[family]] [[Rhinocerotidae]]",
parents = {"odd-toed ungulates"},
}
labels["rodents"] = {
type = "set",
parents = {"mammals"},
}
labels["salamanders"] = {
type = "set",
description = "=[[amphiuma]]s, [[axolotl]]s, [[hellbender]]s, [[mud puppy|mud puppies]], [[olm]]s, [[newt]]s, [[salamander]]s, [[siren]]s, and other [[amphibian]]s in the [[order]] [[Caudata]]",
parents = {"amphibians"},
}
labels["salmonids"] = {
type = "set",
description = "=[[salmon]]s, [[trout]], and other fish in the family [[Salmonidae]]",
parents = {"fish"},
}
labels["saturniid moths"] = {
type = "set",
description = "=[[Atlas moth]]s, [[cecropia]]s, [[hickory horned devil]]s, [[io moth]]s, [[luna moth]]s, [[polyphemus moth]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Saturniidae]]",
parents = {"moths"},
}
labels["satyrine butterflies"] = {
type = "set",
description = "=[[brown]]s, [[forester]]s, [[grayling]]s, [[heath]]s, [[palmfly|palmflies]], [[ringlet]]s, [[satyr]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Satyrinae]]",
parents = {"nymphalid butterflies"},
}
labels["sauropods"] = {
type = "set",
description = "=[[apatosaur]]s, [[brachiosaur]]s, [[brontosaur]]s, [[camarasaur]]s, [[cetiosaur]]s, [[diplodocus]]es, [[saltasaurid]]s, [[titanosaurian]]s, [[turiasaur]]s, [[vulcanodontid]]s, and other [[dinosaurs]] in the [[saurischian]] [[infraorder]] [[Sauropoda]]",
parents = {"dinosaurs"},
}
labels["sauropterygians"] = {
type = "set",
description = "=[[elasmosaur]]s, [[placodont]]s, [[plesiosaur]]s, and other extinct aquatic [[reptile]]s in the [[superorder]] [[Sauropterygia]]",
parents = {"reptiles"},
}
labels["sawflies and wood wasps"] = {
type = "set",
description = "=[[horntail]]s, [[pigeon tremex]], [[rose slug]]s, [[sawfly|sawflies]], [[wood wasp]]s, and other primitive [[hymenopteran]]s in the [[suborder]] [[Symphyta]]",
parents = {"hymenopterans"},
}
labels["scale insects"] = {
type = "set",
description = "=[[insect]]s in the [[superfamily]] [[Coccoidea]]",
parents = {"hemipterans"},
}
labels["scarabaeoids"] = {
type = "set",
description = "=[[cockchafer]]s, [[dor]]s, [[dung beetle]]s, [[June beetle]]s, [[rain beetle]]s, [[rose chafer]]s, [[scarab]]s, [[stag beetle]]s, and other beetles in the [[superfamily]] [[Scarabaeoidea]]",
parents = {"beetles"},
}
labels["scenthounds"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["scincomorph lizards"] = {
type = "set",
description = "=[[blue-tongue lizard]]s, [[night lizard]]s, [[sandfish]], [[skink]]s, [[sungazer]]s, and other [[lizard]]s in the [[infraorder]] [[Scincomorpha]]",
parents = {"lizards"},
}
labels["scolopacids"] = {
type = "set",
description = "=[[curlew]]s, [[dunlin]]s, [[godwit]]s, [[knot]]s, [[redshank]]s, [[ruff]]s, [[sandpiper]]s, [[snipe]]s, [[stint]]s, [[turnstone]]s, [[tattler]]s, [[whimbrel]]s, [[woodcock]]s, [[yellowleg]]s, and other birds in the [[charadriiform]] [[family]] [[Scolopacidae]]",
parents = {"shorebirds"},
}
labels["scombroids"] = {
type = "set",
description = "=[[mackerel]]s, [[tuna]]s, [[barracuda]]s, [[swordfish]], and other fish in the suborder [[Scombroidei]]",
parents = {"fish"},
}
labels["scorpaeniform fish"] = {
type = "set",
description = "=[[bullhead]]s, [[cabezon]], [[golomyanka]], [[greenling]]s, [[gurnard]]s, [[Irish lord]], [[lionfish]], [[lumpsucker]]s, [[pigfish]], [[poacher]]s, [[sablefish]], [[scorpionfish]], [[sculpin]]s, [[sea raven]]s, [[sea toad]]s, [[skilfish]], [[snailfish]], [[stonefish]], [[wingfish]], and other fish in the [[order]] [[Scorpaeniformes]]",
parents = {"fish"},
}
labels["scorpions"] = {
type = "set",
description = "=true [[scorpion]]s: [[arachnid]]s in the [[order]] [[Scorpiones]]",
parents = {"arachnids"},
}
labels["screamers"] = {
type = "set",
description = "=[[screamer]]s: birds in the family [[Anhimidae]], related to [[duck]]s and [[geese]]",
parents = {"birds"},
}
labels["seabirds"] = {
type = "set",
parents = {"birds"},
}
labels["sea anemones"] = {
type = "set",
description = "=[[cnidarian]]s in the [[order]] [[Actiniaria]]",
parents = {"cnidarians"},
}
labels["sea cucumbers"] = {
type = "set",
description = "=[[echinoderm]]s in the [[class]] [[Holothuroidea]]",
parents = {"echinoderms"},
}
labels["sea urchins"] = {
type = "set",
description = "=[[echinoderm]]s in the [[class]] [[Echinoidea]], including the [[sand dollar]]s",
parents = {"echinoderms"},
}
labels["sea turtles"] = {
type = "set",
description = "=[[flatback]]s, [[green turtle]]s, [[hawksbill]]s, [[leatherback]]s, [[loggerhead]]s, [[ridley]]s, and other [[turtle]]s in the [[superfamily]] [[Chelonioidea]]",
parents = {"turtles"},
}
labels["sebastids"] = {
type = "set",
description = "=fish in the family [[Sebastidae]]",
parents = {"scorpaeniform fish"},
}
labels["serranids"] = {
type = "set",
description = "=[[sea bass]], [[grouper]]s, [[rockcod]]s, [[comber]]s and other fish in the family [[Serranidae]]",
parents = {"percoid fish"},
}
labels["sharks"] = {
type = "set",
parents = {"fish"},
}
labels["sheep"] = {
type = "set",
parents = {"caprines", "livestock"},
}
labels["shorebirds"] = {
type = "set",
parents = {"birds"},
}
labels["shrikes"] = {
type = "set",
parents = {"perching birds", "corvoid birds"},
}
labels["sighthounds"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["skippers"] = {
type = "set",
description = "=insects in the family [[Hesperiidae]]",
parents = {"butterflies"},
}
labels["smelts"] = {
type = "set",
description = "=fish in the [[order]] [[Osmeriformes]]",
parents = {"fish"},
}
labels["snails"] = {
type = "set",
parents = {"gastropods"},
}
labels["snakes"] = {
type = "set",
parents = {"reptiles"},
}
labels["snappers"] = {
type = "set",
description = "=fish in the [[family]] [[Lutjanidae]]",
parents = {"percoid fish"},
}
labels["soft corals"] = {
type = "set",
description = "=[[calcaxonian]]s, [[dead man's fingers]], [[fan coral]]s, [[gorgonian]]s, [[holaxonian]]s, [[scleraxonian]]s, [[sea feather]]s, [[sea willow]]s, [[stoloniferan]]s, [[whip coral]]s, and other marine animals in the [[cnidarian]] order [[Alcyonacea]]",
parents = {"cnidarians"},
}
labels["soricomorphs"] = {
type = "set",
description = "=[[shrew]]s, [[mole]]s, [[solenodon]]s, and other [[mammal]]s in the [[order]] [[Soricomorpha]]",
parents = {"mammals"},
}
labels["South American canids"] = {
type = "set",
description = "=fox-like [[canid]]s in the [[subtribe]] [[Cerdocyonina]], which are more closely related to the [[dog]]s and [[wolf|wolves]] than to the true [[fox]]es. Also known as [[zorro]]s",
parents = {"canids"},
}
labels["spaniels"] = {
type = "set",
parents = {"gun dogs"},
}
labels["sparids"] = {
type = "set",
description = "=[[sea breams]], [[porgie]]s, [[scup]]s and other fish in the family [[Sparidae]]",
parents = {"percoid fish"},
}
labels["sphinx moths"] = {
type = "set",
description = "=[[hawkmoth]]s, [[hornworm]]s, [[hummingbird moth]]s, [[sphinx moth]]s,[[tomato worm]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Sphingidae]]",
parents = {"moths"},
}
labels["spiders"] = {
type = "set",
parents = {"arachnids"},
}
labels["sponges"] = {
type = "set",
description = "=[[aquatic]] [[animal]]s in the [[phylum]] [[Porifera]]",
parents = {"animals"},
}
labels["squid"] = {
type = "set",
parents = {"cephalopods"},
}
labels["squirrels"] = {
type = "set",
description = "=[[squirrel]]s, [[chipmunk]]s, [[marmot]]s, [[prairie dog]]s, [[woodchuck]]s and other [[rodent]]s in the family [[Sciuridae]]",
parents = {"rodents"},
}
labels["staphylinoid beetles"] = {
type = "set",
description = "=[[beetle]]s in the [[superfamily]] [[Staphylinoidea]]",
parents = {"beetles"},
}
labels["starlings"] = {
type = "set",
description = "=[[starling]]s, [[mynah]]s, and other birds in the [[passerine]] family [[Sturnidae]]",
parents = {"perching birds"},
}
labels["stick insects"] = {
type = "set",
description = "=[[insect]]s (including the [[leaf insect]]s) in the [[order]] known as either [[Phasmida]] or [[Phasmatodea]], which are noted for their extreme adaptations in form and color to look like parts of the plants they feed on",
parents = {"insects"},
}
labels["stoneflies"] = {
type = "set",
description = "=[[freshwater]] [[aquatic]] [[insect]]s in the [[order]] [[Plecoptera]]",
parents = {"insects"},
}
labels["stony corals"] = {
type = "set",
description = "=marine animals in the [[cnidarian]] order [[Scleractinia]]",
parents = {"cnidarians"},
}
labels["storks"] = {
type = "set",
parents = {"freshwater birds"},
}
labels["stromateoid fish"] = {
type = "set",
description = "=[[barrelfish]], [[blue eye cod]], [[dollarfish]], [[driftfish]], [[lafayette]], [[medusafish]], [[rudderfish]], [[squaretail]], [[warehou]], and other fish in the [[perciform]] [[suborder]] [[Stromateoidei]]",
parents = {"fish"},
}
labels["sturgeons"] = {
type = "set",
description = "=fish in the family [[Acipenseridae]]",
parents = {"fish"},
}
labels["suboscines"] = {
type = "set",
description = "=[[antpitta]]s, [[antshrike]]s, [[antthrush]]es, [[asity|asities]], [[broadbill]]s, [[cotinga]]s, [[crescentchest]]s, [[gnateater]]s, [[manakin]]s, [[ovenbird]]s, [[pitta]]s, [[sharpbill]]s, [[spadebill]]s, [[tapaculo]]s, [[tityra]]s, [[tyrant flycatcher]]s, [[woodcreeper]]s, and other birds in the [[passerine]] [[suborder]] [[Tyranni]]",
parents = {"perching birds"},
}
labels["suckers (fish)"] = {
type = "set",
description = "=[[buffalo fish]], [[cuiui]], [[jumprock]]s, [[quillback]], [[redhorse]], [[sucker]]s, and other freshwater fish in the family [[Catostomidae]]",
parents = {"fish", "otocephalan fish"},
}
labels["suliform birds"] = {
type = "set",
description = "=[[anhinga]]s, [[booby|boobies]], [[cormorant]]s, [[frigatebird]]s, [[gannet]]s, and other [[seabirds]] in the [[order]] [[Suliformes]]",
parents = {"seabirds"},
}
labels["sunfish"] = {
type = "set",
description = "=freshwater fish in the family [[Centrarchidae]]",
parents = {"percoid fish"},
}
labels["swallows"] = {
type = "set",
parents = {"perching birds"},
}
labels["swallowtails"] = {
type = "set",
description = "=[[apollo]]s, [[batwing]]s, [[birdwing]]s, [[clubtail]]s, [[festoon]]s, [[flying handkerchief]]s, [[Helen]]s, [[jay]]s, [[mime]]s, [[parnassian]]s, [[rose]]s, [[swallowtail]]s, [[swordtail]]s, [[triangle]]s, [[turnus]]es, [[windmill]]s, [[zebra]]s, and other [[butterfly|butterflies]] in the [[family]] [[Papilionidae]], notable for (mostly) having tail-like extensions on their [[hindwing]]s",
parents = {"butterflies"},
}
labels["swans"] = {
type = "set",
parents = {"anatids"},
}
labels["syngnathiform fish"] = {
type = "set",
description = "=[[bellowsfish]], [[cornetfish]], [[pipefish]], [[razorfish]], [[sea dragon]]s, [[sea horse]]s, [[snipefish]], [[trumpetfish]], and other fish in the [[order]] [[Syngnathiformes]]",
parents = {"fish"},
}
labels["tanagers"] = {
type = "set",
description = "=[[bananaquit]]s, [[conebill]]s, [[dacnis]]es, [[Darwin's finch]]es, [[grassquit]]s, [[ground finch]]es, [[honeycreeper]]s, [[pardusco]]s, [[tanager]]s, and other [[passerine]] birds in the family [[Thraupidae]]",
parents = {"perching birds"},
}
labels["temnospondyls"] = {
type = "set",
description = "=[[extinct]] early [[amphibian]]s in the [[order]] [[Temnospondyli]]",
parents = {"amphibians"},
}
labels["tenebrionoid beetles"] = {
type = "set",
description = "=[[aderid]]s, [[anthicid]]s, [[blister beetle]]s, [[borid]]s, [[ciid]]s, [[flour beetle]]s, [[darkling beetle]]s, [[mealworm]]s, [[melandryid]]s, [[mordellid]]s, [[mycetophagid]]s, [[oedemerid]]s, [[pinacate beetle]]s, [[pyrochroid]]s, [[pythid]]s, [[ripiphorid]]s, [[salpingid]]s, [[toktokkie]]s, [[ulodid]]s, [[wharf borer]]s, [[zopherid]]s and other [[beetle]]s in the [[superfamily]] [[Tenebrionoidea]]",
parents = {"beetles"},
}
labels["tephritoid flies"] = {
type = "set",
description = "=[[cheese fly|cheese flies]], [[tephritid]] [[fruit fly|fruit flies]], [[picture-winged fly|picture-winged flies]] and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Tephritoidea]]",
parents = {"dipterans"},
}
labels["termites"] = {
type = "set",
description = "=[[termite]]s, [[insect]]s in the former [[order]] [[Isoptera]], which is now considered a [[suborder]] or other group within the [[cockroach]]es in the order [[Blattodea]]",
parents = {"insects", "cockroaches"},
}
labels["terns"] = {
type = "set",
description = "=[[tern]]s, [[seabirds]] in the [[family]] [[Sternidae]]",
parents = {"seabirds"},
}
labels["tetraodontiforms"] = {
type = "set",
description = "=[[pufferfish]], [[triggerfish]], [[boxfish]], [[ocean sunfish]] and other fish in the order [[Tetraodontiformes]]",
parents = {"fish"},
}
labels["terriers"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["theropods"] = {
type = "set",
description = "=[[dinosaur]]s in the [[clade]] [[Theropoda]]",
parents = {"dinosaurs"},
}
labels["thrushes"] = {
type = "set",
parents = {"perching birds"},
}
labels["ticks"] = {
type = "set",
description = "=[[bloodsucking]] [[arachnids]] in the [[order]] [[Ixodida]] (also known as [[Metastigmata]])",
parents = {"mites and ticks"},
}
labels["tinamous"] = {
type = "set",
parents = {"ratites"},
}
labels["tits"] = {
type = "set",
description = "=[[tit]]s, birds known as [[chickadee]]s in the US",
parents = {"perching birds"},
}
labels["toads"] = {
type = "set",
parents = {"anurans"},
}
labels["toothcarps"] = {
type = "set",
description = "=[[four-eyed fish]], [[guppy|guppies]], [[killifish]], [[molly|mollies]], [[mummichog]]s, [[platy|platies]], [[swordtail]]s, [[topminnow]]s and other fish in the [[order]] [[Cyprinodontiformes]]",
parents = {"fish"},
}
labels["tortoises"] = {
type = "set",
description = "=[[terrestrial]] [[turtle]]s in the [[family]] [[Testudinidae]]",
parents = {"turtles"},
}
labels["tortricid moths"] = {
type = "set",
description = "=[[moth]]s (and [[caterpillar]]s) in the [[family]] [[Tortricidae]]",
parents = {"moths"},
}
labels["trachinoid fish"] = {
type = "set",
description = "=[[black swallower]]s, [[blue cod]], [[duckbill]]s, [[gaper]]s, [[sand eel]]s, [[torrentfish]], [[weeverfish]] and other fish in the [[perciform]] [[suborder]] [[Trachinoidei]]",
parents = {"fish"},
}
labels["toy dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["trilobites"] = {
type = "set",
parents = {"arthropods"},
}
labels["true bugs"] = {
type = "set",
description = "=[[insect]]s in the [[hemipteran]] suborder [[Heteroptera]]",
parents = {"hemipterans"},
}
labels["true finches"] = {
type = "set",
description = "=[[finch]]es in the [[passerine]] family [[Fringillidae]]",
parents = {"perching birds"},
}
labels["true jellyfish"] = {
type = "set",
description = "=[[cnidarian]]s in the [[class]] [[Scyphozoa]]",
parents = {"cnidarians"},
}
labels["true sparrows"] = {
type = "set",
description = "=[[passerine]] birds in the family [[Passeridae]] (for other birds called sparrows, see the [[emberizid]]s)",
parents = {"perching birds"},
}
labels["tubenose birds"] = {
type = "set",
description = "=[[albatross]]es, [[fulmar]]s, [[petrel]]s, [[prion]]s, [[shearwater]]s, and other [[seabird]]s in the [[order]] [[Procellariiformes]]",
parents = {"seabirds"},
}
labels["tunicates"] = {
type = "set",
parents = {"animals"},
}
labels["turtles"] = {
type = "set",
parents = {"reptiles"},
}
labels["tyrant flycatchers"] = {
type = "set",
description = "=[[passerine]] birds in the family [[Tyrannidae]]",
parents = {"suboscines"},
}
labels["ursids"] = {
type = "set",
description = "=[[ursid]]s ([[bear]]s)",
parents = {"carnivores"},
}
labels["Venerida order mollusks"] = {
type = "set",
description = "=[[basket clam]]s, [[bean clam]]s, [[boring clam]]s, [[cockle]]s, [[duck clam]]s, [[giant clam]]s, [[hard clam]]s, [[lentil shell]]s, [[pipi]]s, [[pooquaw]]s, [[quahog]]s, [[surf clam]]s, [[trough-shell]]s, [[ugari]]s, [[Venus clam]]s, [[zebra mussel]]s, and other [[bivalve]]s in the [[order]] [[Venerida]]",
parents = {"bivalves"},
}
labels["vertebrates"] = {
type = "set",
parents = {"chordates"},
wpcat = true,
commonscat = "Vertebrata",
}
labels["vespids"] = {
type = "set",
description = "=[[hornet]]s, [[paper wasp]]s, [[pollen wasp]]s, [[potter wasp]]s, [[yellow jacket]]s, and other [[wasp]]s in the [[family]] [[Vespidae]]",
parents = {"hymenopterans"},
}
labels["vetigastropods"] = {
type = "set",
description = "=[[abalone]]s or [[ear shell]]s, [[duck's-bill limpet]]s, [[keyhole limpet]]s, [[rosary shell]]s, [[slit-shell]]s, [[topshell]]s, [[turban shell]]s, and other [[gastropod]]s in the [[clade]] [[Vetigastropoda]] (treated in some classifications as an [[order]], in others as [[subclass]])",
parents = {"gastropods"},
}
labels["vipers"] = {
type = "set",
description = "=[[adder]]s, [[asp]]s, [[rattlesnake]]s, [[viper]]s, [[water moccasin]]s and other [[venomous]] snakes in the [[Viperidae]]",
parents = {"snakes"},
}
labels["viverrids"] = {
type = "set",
description = "=[[viverrid]]s ([[civet]]s, [[genet]]s and relatives)",
parents = {"carnivores"},
}
labels["vombatiforms"] = {
type = "set",
description = "=[[diprotodontid]]s, [[diprotodon]]s, [[phascolarctid]]s, [[koala]]s, [[vombatid]]s, [[wombat]]s, [[phascolome]]s, [[ilariid]]s, [[maradid]]s, [[palorchestid]]s, [[thylacoleonid]]s, [[marsupial lion]]s , [[wynyardiid]]s and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Vombatiformes]]",
parents = {"marsupials"},
}
labels["vultures"] = {
type = "set",
description = "=[[vulture]]s (both Old World and New World)",
parents = {"birds of prey"},
}
labels["warblers"] = {
type = "set",
description = "=[[warbler]]s, various small [[passerine]] songbirds, especially of the families Sylviidae (Old World warblers) and Parulidae (New World warblers)",
parents = {"perching birds"},
}
labels["warren hounds"] = {
type = "set",
parents = {"hunting dogs"},
}
labels["water dogs"] = {
type = "set",
parents = {"retrievers"},
}
labels["weaver finches"] = {
type = "set",
description = "=[[finch]]es in the family [[Estrildidae]]",
parents = {"perching birds"},
}
labels["weaverbirds"] = {
type = "set",
description = "=[[baya]]s, [[bishop]]s, [[fody|fodies]], [[malimbe]]s, [[quelea]]s, [[sakabula]]s, [[taha]]s, [[weaver]]s, and other birds in the [[family]] [[Ploceidae]]",
parents = {"perching birds"},
}
labels["weevils"] = {
type = "set",
description = "=[[bill-beetle]]s, [[curculio]]s, [[grugru worm]]s, [[snout beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Curculionoidea]]",
parents = {"beetles"},
}
labels["whales"] = {
type = "set",
parents = {"cetaceans"},
}
labels["wolves"] = {
type = "set",
description = "=[[wolves]]",
parents = {"canids"},
}
labels["woodpeckers"] = {
type = "set",
description = "=[[flicker]]s, [[sapsucker]]s, [[wryneck]]s, and other birds in the [[family]] [[Picidae]]",
parents = {"piciforms"},
}
labels["working dogs"] = {
type = "set",
parents = {"dogs"},
}
labels["worms"] = {
type = "set",
parents = {"animals"},
}
labels["wrasses"] = {
type = "set",
description = "=fish in the family [[Labridae]]",
parents = {"labroid fish"},
}
labels["wrens"] = {
type = "set",
parents = {"certhioid birds"},
}
labels["zoarcoid fish"] = {
type = "set",
description = "=[[butterfish]], [[eelpout]]s, [[guffer]]s, [[gunnel]]s, [[lumper]]s, [[prickleback]]s, [[prowfish]], [[wolf eel]]s and other fish in the [[perciform]] [[suborder]] [[Zoarcoidei]]",
parents = {"fish"},
}
labels["zygaenoid moths"] = {
type = "set",
description = "=[[burnet moth]]s, [[forester]]s, [[hag moth]]s, [[limacodid]]s, [[megalopygid]]s, [[monkey slug]]s, [[puss moth]]s, [[saddleback caterpillar]]s, [[zygaenid]]s, and other [[moth]]s in the [[superfamily]] [[Zygaenoidea]]",
parents = {"moths"},
}
labels["plesiosaurs"] = {
type = "set",
description = "=[[plesiosaur]]s (order †[[Plesiosauria]])",
parents = {"sauropterygians"},
}
labels["tarantulas"] = {
type = "set",
description = "=[[tarantula]]s (family [[Theraphosidae]])",
parents = {"mygalomorph spiders"},
}
return labels
ewf83liqesxqs8674krrqrtg39pwym3
Mòideal:category tree/topic/Plants
828
17760
88461
2026-07-23T19:36:44Z
en>WingerBot
0
explicit 'description = "default"' unnecessary; remove it (manually assisted)
88461
Scribunto
text/plain
local labels = {}
labels["plants"] = {
type = "type",
parents = {"lifeforms"},
wpcat = true,
commonscat = "Plantae",
}
labels["acacias"] = {
type = "set",
description = "=plants of the [[genus]] ''[[Acacia]]'' in its former sense, including what are now related genera such as ''[[Acaciella]]'', ''[[Senegalia]]'' and ''[[Vachellia]]'' – the [[tribe]] [[Acacieae]] in some classifications",
parents = {"mimosa subfamily plants"},
}
labels["acanthus family plants"] = {
type = "set",
description = "=[[acanthus]]es, [[aphelandra]]s, [[clock vine]], [[Malabar nut]], [[water willow]], and other plants in the [[family]] [[Acanthaceae]]",
parents = {"Lamiales order plants"},
}
labels["agavoideae subfamily plants"] = {
type = "set",
description = "=[[agave]]s, [[camas]]es, [[soap plant]]s, [[tuberose]]s, [[rush lily|rush lilies]], [[yucca]]s, and other plants in the [[subfamily]] [[Agavoideae]] of the [[family]] [[Asparagaceae]]",
parents = {"asparagus family plants", "succulents"},
}
labels["Aizoaceae family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Aizoaceae]], most of which are [[succulent]]s",
parents = {"Caryophyllales order plants", "succulents"},
}
labels["ajugoideae subfamily plants"] = {
type = "set",
description = "=[[bluecurls]], [[bugle]], [[cat thyme]], [[germander]], [[pagoda flower]], [[wood sage]], and other plants in the [[subfamily]] [[Ajugoideae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants"},
}
labels["Alismatales order plants"] = {
type = "set",
description = "=[[anacharis]], [[arrowgrass]]es, [[arrowhead]]s, [[arum]]s, [[burhead]]s, [[eelgrass]]es, [[flowering rush]], [[frogbit]], [[hydrilla]], [[Neptune grass]], [[philodendron]], [[pondweed]]s, [[seagrass]]es, [[taro]], [[velvetleaf]]s, [[water nymph]]s, [[water plantain]]s, [[waterpoppy]], and other plants in the [[order]] [[Alismatales]]",
parents = {"water plants"},
}
labels["alliums"] = {
type = "set",
description = "=[[chive]]s, [[garlic]], [[leek]]s, [[onion]]s, [[scallion]]s, [[shallot]]s, and other plants in the [[genus]] ''[[Allium]]''",
parents = {"amaryllis family plants", "root vegetables", "spices and herbs"},
}
labels["amaranth subfamily plants"] = {
type = "set",
description = "=[[achyranthe]], [[amaranth]], [[celosia]], [[goldenrod tree]], [[love-lies-bleeding]], [[marog]], [[prince's plume]], [[tampala]], [[waterhemp]], and other plants in the [[subfamily]] [[Amaranthoideae]] of the [[family]] [[Amaranthaceae]]",
parents = {"amaranths and goosefoots"},
}
labels["amaranths and goosefoots"] = {
type = "set",
description = "=[[amaranth]]s, [[beet]]s, [[blite]]s, [[glasswort]]s, [[lamb's quarters]], [[saltbush]]es, [[spinach]] and other plants in the [[family]] [[Amaranthaceae]], including the former family [[Chenopodiaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["amaryllis family plants"] = {
type = "set",
description = "=[[amaryllis]]es, [[daffodil]]s, [[garlic]], [[lily of the Nile]], [[rain lily|rain lilies]], [[snowdrops]], [[spider lily|spider lilies]] and other plants in the [[family]] [[Amaryllidaceae]], including the former family [[Alliaceae]]",
parents = {"Asparagales order plants", "flowers"},
}
labels["Anemoneae tribe plants"] = {
type = "set",
description = "=[[anemone]]s or [[windflower]]s, [[clematis]]es ([[old man's beard]], [[traveller's joy]], [[virgin's bower]], etc.), [[hepatica]]s or [[liverwort]]s, [[pasque flower]]s and other plants in the [[tribe]] [[Anemoneae]] of the [[family]] [[Ranunculaceae]]",
parents = {"buttercup family plants"},
}
labels["Anthemideae tribe plants"] = {
type = "set",
description = "=[[camomile]]s, [[chrysanthemum]]s, [[dogfennel]], [[feverfew]], [[lavender cotton]], [[oxeye daisy]], [[marguerite]]s, [[pellitory of Spain]], [[pineapple weed]], [[pyrethrum]], [[sagebrush]]es, [[sneezeweed]], [[sweet maudlin]], [[tansy]], [[wormwood]]s, [[yarrow]]s, and other plants in the [[tribe]] [[Anthemideae]] of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["Andropogoneae tribe grasses"] = {
type = "set",
description = "=[[bluestem]], [[broomsedge]], [[centipede grass]], [[cogon]], [[gama grass]], [[Job's tears]], [[Johnson grass]], [[lemongrass]], [[maize]], [[plume grass]], [[rosha grass]], [[sorghum]], [[sudangrass]], [[sugar cane]], [[susuki grass]], [[vetiver]], and other grasses in the tribe [[Andropogoneae]]",
parents = {"grasses"},
}
labels["Apiales order plants"] = {
type = "set",
description = "=[[anise]], [[apple-berry]], [[aralia]]s, [[carrot]]s, [[celery]], [[cumin]], [[ginseng]], [[hemlock]], [[ivy]], [[parsley]], [[pennywort]]s, [[pittosporum]]s, [[samphire]], [[sea holly]], [[sweet bursaria]], and other plants in the [[order]] [[Apiales]]",
parents = {"plants", "shrubs", "spices and herbs"},
}
labels["Apieae tribe plants"] = {
type = "set",
description = "=[[bishop's-weed]], [[celery]], [[dill]], [[fennel]], [[parsley]] and other plants in the [[tribe]] [[Apieae]] of the celery [[family]], [[Apiaceae]]",
parents = {"celery family plants"},
}
labels["aralia family plants"] = {
type = "set",
description = "=[[aralia]]s, [[ginseng]], [[eleuthero]], [[ivy]], [[umbrella tree]], [[parasol tree]], and other plants in the [[family]] [[Araliaceae]]",
parents = {"plants"},
}
labels["araucarians"] = {
type = "set",
description = "=primitive [[conifer]]s in the [[genus|genera]] ''[[Agathis]]'', ''[[Araucaria]]'' and ''[[Wollemia]]'' in the family [[Araucariaceae]]",
parents = {"conifers"},
}
labels["artemisias"] = {
type = "set",
description = "=[[mugwort]]s, [[sagebrush]]es, [[southernwood]], [[tarragon]], [[wormwood]], and other plants in the [[genus]] ''[[Artemisia]]''",
parents = {"Anthemideae tribe plants", "herbs"},
}
labels["arum family plants"] = {
type = "set",
description = "=[[arum]]s, [[duckweed]]s, [[Jack-in-the-pulpit]], [[philodendron]]s, [[skunk cabbage]], [[taro]], and other plants in the family [[Araceae]]",
parents = {"Alismatales order plants"},
}
labels["Asparagales order plants"] = {
type = "set",
description = "=[[agave]]s. [[allium]]s, [[aloe]]s, [[amaryllis]]es, [[asparagus]], [[crocus]]es, [[day lily|day lilies]], [[iris]]es, [[orchid]]s and other plants in the [[order]] [[Asparagales]]",
parents = {"plants"},
}
labels["asparagus family plants"] = {
type = "set",
description = "=[[agave]]s, [[asparagus]], [[bluebell]]s, [[butcher's broom]], [[dracaena]]s, [[hosta]]s, [[hyacinth]]s, [[lily of the valley]], [[Solomon's seal]]s, [[ti]], [[tuberose]], and other plants in the [[family]] [[Asparagaceae]], including those formerly in families such as the [[Agavaceae]], [[Hyacinthaceae]] and [[Ruscaceae]]",
parents = {"Asparagales order plants", "succulents", "flowers"},
}
labels["Asterales order plants"] = {
type = "set",
description = "=[[artichoke]]s, [[aster]]s, [[buckbean]]s, [[chamomile]], [[bellflower]]s, [[daisy|daisies]], [[dandelion]]s, [[lobelia]]s, [[sunflower]]s, [[thistle]]s, [[wormwood]]s and many other plants in the [[order]] [[Asterales]]",
parents = {"plants"},
}
labels["Astereae tribe plants"] = {
type = "set",
description = "=[[aster]]s, [[daisy|daisies]], [[fleabane]]s, [[goldenrod]]s, [[grindelia]]s, [[horseweed]]s, [[Michaelmas daisy]], [[muskwood]], [[rabbitbrush]]es, [[sharewort]], [[stabwort]], and other plants in the [[tribe]] [[Astereae]] of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["bamboos"] = {
type = "set",
description = "=grasses in the [[subfamily]] [[Bambusoideae]]",
parents = {"grasses"},
}
labels["barberry family plants"] = {
type = "set",
description = "=[[barberry|barberrie]]s, [[blue cohosh]], [[mayapple]], [[Oregon grape]]s, [[twinleaf]], and other plants in the [[family]] [[Berberidaceae]]",
parents = {"Ranunculales order plants", "shrubs"},
}
labels["beech family plants"] = {
type = "set",
description = "=[[beech]]es, [[chestnut]]s, [[oak]]s, and other plants in the family [[Fagaceae]]",
parents = {"Fagales order plants"},
}
labels["bignonia family plants"] = {
type = "set",
description = "=[[bignonia]]s, [[Cape honeysuckle]], [[catalpa]]s, [[jacaranda]]s, [[sausage tree]], [[trumpet vine]] and other plants in the family [[Bignoniaceae]]",
parents = {"Lamiales order plants", "shrubs", "flowers"},
}
labels["birch family plants"] = {
type = "set",
description = "=[[birch]]es, [[alder]]s, [[hazel]]s, [[hornbeam]]s and other plants in the family [[Betulaceae]]",
parents = {"Fagales order plants"},
}
labels["blueberry tribe plants"] = {
type = "set",
description = "=[[bilberry|bilberries]], [[blueberry|blueberries]], [[buckberry|buckberries]], [[cranberry|cranberries]], [[huckleberry|huckleberries]], [[lingonberry|lingonberries]], [[ohelo]], [[whortleberry|whortleberries]] and other plants in the [[heather]] [[family]] [[tribe]] [[Vaccinieae]]",
parents = {"heather family plants", "fruits"},
}
labels["borage family plants"] = {
type = "set",
description = "=[[alkanet]], [[borage]], [[comfrey]], [[fiddleneck]]s, [[forget-me-not]]s, [[heliotrope]]s, [[honeywort]]s, [[hound's tongue]], [[lungwort]], [[scorpionweed]], [[sebesten]], and other plants in the family [[Boraginaceae]]",
parents = {"plants"},
}
labels["brambles"] = {
type = "set",
description = "=[[blackberry|blackberries]], [[cloudberry|cloudberries]], [[dewberry|dewberries]], [[raspberry|raspberries]], [[thimbleberry|thimbleberries]], and other plants in the [[genus]] ''[[Rubus]]''",
parents = {"rose family plants", "berries"},
}
labels["Brassicales order plants"] = {
type = "set",
description = "=[[beachwort]], [[bladderpod]], [[cabbage]]s, [[caper]]s, [[cress]]es, [[meadowfoam]]s, [[mustard]]s, [[nasturtium]]s, [[papaya]]s, [[radish]]es, [[wallflower]]s, [[weld]] and other plants in the [[order]] [[Brassicales]]",
parents = {"plants"},
}
labels["brassicas"] = {
type = "set",
description = "=[[cabbage]]s, [[mustard]]s, and other plants in the genus ''[[Brassica]]''",
parents = {"crucifers"},
}
labels["bromeliads"] = {
type = "set",
description = "=[[pineapple]]s, and other plants in the family [[Bromeliaceae]]",
parents = {"commelinids"},
}
labels["broomrape family plants"] = {
type = "set",
description = "=[[broomrape]]s or [[broom rape]]s, [[beechdrops]], [[cow-wheat]], [[eyebright]]s, [[Indian paintbrush]]es, [[lousewort]]s, [[rattle]]s, [[witchweed]]s, and other plants in the family [[Orobanchaceae]]",
parents = {"Lamiales order plants"},
}
labels["buckthorn family plants"] = {
type = "set",
description = "=[[buckthorn]], [[ceanothus]]es, [[chewstick]], [[jujube]], and other plants in the [[family]] [[Rhamnaceae]]",
parents = {"Rosales order plants", "shrubs", "trees"},
}
labels["buckwheat family plants"] = {
type = "set",
description = "=[[buckwheat]], [[coral vine]], [[dock]], [[knotweed]], [[rhubarb]], [[sea grape]], [[smartweed]], [[sorrel]] and other plants in the [[family]] [[Polygonaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["buttercup family plants"] = {
type = "set",
description = "=plants in the family [[Ranunculaceae]]",
parents = {"Ranunculales order plants"},
}
labels["Buxales order plants"] = {
type = "set",
description = "=plants in the [[order]] [[Buxales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["cacti"] = {
type = "set",
parents = {"Caryophyllales order plants", "succulents"},
}
labels["caesalpinia subfamily plants"] = {
type = "set",
description = "=[[brazilwood]], [[carob]], [[honey locust]]s, [[Kentucky coffeetree]], [[logwood]], [[paloverde]]s, [[poinciana]]s, [[redbud]]s, [[senna]]s, [[tamarind]]s, and other plants in the [[subfamily]] [[Caesalpinioideae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["caltrop family plants"] = {
type = "set",
description = "=[[bean-caper]], [[caltrop]], [[creosote bush]], [[lignum vitae]], and other plants in the [[family]] [[Zygophyllaceae]]",
parents = {"plants", "shrubs", "trees"},
}
labels["Cardamineae tribe plants"] = {
type = "set",
description = "=[[bittercress]], [[dame's rocket]], [[horseradish]], [[lady's smock]], [[toothwort]], [[watercress]], [[wintercress]], and other plants in the [[brassicaceous]] [[tribe]] [[Cardamineae]]",
parents = {"crucifers"},
}
labels["carnation family plants"] = {
type = "set",
description = "=[[baby's breath]], [[campion]]s, [[carnation]]s, [[chickweed]], [[knawel]]s, [[sandwort]]s, [[pink]]s, [[rupturewort]]s, [[soapwort]] and other plants in the [[family]] [[Caryophyllaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["carnivorous plants"] = {
type = "set",
description = "=[[bladderwort]]s, [[butterwort]]s, [[pitcher plant]]s, [[sundew]]s, [[Venus flytrap]]s, and other plants that trap and obtain nutrients from animals",
parents = {"plants"},
}
labels["Caryophyllales order plants"] = {
type = "set",
description = "=[[amaranth]]s, [[buckwheat]], [[cacti]], [[carnation]]s, [[dock]], [[four-o'clock]]s, [[glasswort]], [[goosefoot]]s, [[greasewood]], [[ice plant]]s, [[jojoba]], [[knotweed]]s, [[Malabar spinach]], [[miner's lettuce]], [[plumbago]]s, [[pokeweed]], [[ragged robin]], [[rhubarb]], [[statice]], [[purslane]], [[saltbush]]es, [[spinach]], [[thrift]], [[tamarisk]], [[Venus flytrap]], and other plants in the [[order]] [[Caryophyllales]]",
parents = {"plants"},
}
labels["celery family plants"] = {
type = "set",
description = "=[[ajwain]], [[anise]], [[arracacha]], [[asafoetida]], [[carrot]]s, [[celery]], [[chuchupate]], [[coriander]], [[cumin]], [[dill]], [[galbanum]], [[hemlock]], [[hogweed]], [[lovage]], [[masterwort]], [[parsley]], [[parsnip]]s, [[samphire]], [[sanicle]]s, [[sea holly]], [[yampah]] and other plants in the [[family]] [[Apiaceae]], also known as the [[Umbelliferae]]",
parents = {"Apiales order plants"},
}
labels["Chickpeas"] = {
type = "set",
description = "=[[chickpea]]s",
parents = {"legumes"},
}
labels["Cichorieae tribe plants"] = {
type = "set",
description = "=[[chicory|chicories]], [[dandelion]]s, [[endive]], [[hawkweed]]s, [[lettuce]]s, [[murnong]], [[nipplewort]], [[oxtongue]], [[salsify]], [[sow thistle]]s, [[succory]], and other plants in the [[tribe]] [[Cichorieae]] of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["citrus subfamily plants"] = {
type = "set",
description = "=[[citrus]] and other plants in the subfamily [[Aurantioideae]] of the rue family, [[Rutaceae]]",
parents = {"rue family plants", "trees", "shrubs"},
}
labels["club mosses"] = {
type = "set",
description = "=plants in the [[family]] [[Lycopodiaceae]]",
parents = {"spore plants"},
}
labels["Clusiaceae family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Clusiaceae]]",
parents = {"Malpighiales order plants"},
}
labels["combretum family plants"] = {
type = "set",
description = "=[[arjuna]], [[bushwillow]]s, [[leadwood]], [[myrobalan]]s, [[Rangoon creeper]], [[tropical almond]], [[white mangrove]], and other plants in the [[family]] [[Combretaceae]]",
parents = {"Myrtales order plants", "trees", "shrubs"},
}
labels["commelinids"] = {
type = "set",
description = "=[[arrowroot]]s, [[bamboo]]s, [[banana]]s, [[bird of paradise|birds of paradise]], [[bloodwort]]s, [[bromeliad]]s, [[canna]]s, [[cattail]]s, [[ginger]]s, [[grass]]es, [[kangaroo paw]], [[palm]]s, [[reed]]s, [[rush]]es, [[sedge]]s, [[spiderwort]]s, [[tule]]s, [[water hyacinth]]s, and other plants in the [[commelinid]] [[clade]]",
parents = {"plants"},
}
labels["composites"] = {
type = "set",
description = "=[[artichoke]]s, [[aster]]s, [[chamomile]], [[chrysanthemum]]s, [[daisy|daisies]], [[dandelion]]s, [[marigold]]s, [[sunflower]]s, [[thistle]]s, [[wormwood]]s and many other plants in the [[family]] [[Asteraceae]], also known as the [[Compositae]]",
parents = {"Asterales order plants"},
}
labels["conifers"] = {
type = "set",
parents = {"gymnosperms", "trees", "shrubs"},
}
labels["Coreopsideae tribe plants"] = {
type = "set",
description = "=[[beggar's ticks]] or [[bur marigold]]s, [[calliopsis]], [[coreopsis]], [[cosmos]], [[cota]], [[dahlia]]s, [[tickseed]]s and other plants in the [[tribe]] [[Coreopsideae]] of the daisy family, [[Asteraceae]]",
parents = {"composites"},
}
labels["Cornales order plants"] = {
type = "set",
description = "=[[assegai]], [[blazing star]], [[bunchberry]], [[cornel]], [[dogwood]]s, [[hydrangea]]s, [[tupelo]]s, and other plants in the [[order]] [[Cornales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["crucifers"] = {
type = "set",
description = "=[[alyssum]], [[cabbage]]s, [[cress]]es, [[mustard]]s, [[radish]]es, [[rocket]]s, [[stock]]s, [[turnip]]s, [[wallflower]]s and other plants in the [[family]] [[Brassicaceae]] (formerly known as the [[Cruciferae]])",
parents = {"Brassicales order plants"},
}
labels["Cucurbitales order plants"] = {
type = "set",
description = "=plants in the [[order]] [[Cucurbitales]]",
parents = {"plants"},
}
labels["Cucurbitas"] = {
type = "set",
description = "=[[marrow]]s, [[pumpkin]]s, [[squash]]es and other plants in the [[genus]] ''[[Cucurbita]]''",
parents = {"gourd family plants"},
}
labels["custard apple family plants"] = {
type = "set",
description = "=trees and shrubs in the [[family]] [[Annonaceae]]",
parents = {"Magnoliids", "trees", "shrubs"},
}
labels["cycads"] = {
type = "set",
description = "=primitive palm-tree-like [[gymnosperm]]s in the [[division]] [[Cycadophyta]]",
parents = {"gymnosperms"},
}
labels["cypress family plants"] = {
type = "set",
description = "=[[alerce]]s, [[arborvitae]]s, [[bald cypress]]es, [[cryptomeria]]s, [[cunninghamia]]s, [[cypress]]es, [[incense cedar]]s, [[juniper]]s, [[redwood]]s, [[sandarac]]s, and other trees and shrubs in the [[family]] [[Cupressaceae]]",
parents = {"conifers"},
}
labels["Cynodonteae tribe grasses"] = {
type = "set",
description = "=[[Bermuda grass]], [[deergrass]], [[goosegrass]], [[finger millet]], [[grama]], [[muhly]], [[saltgrass]], [[scratchgrass]], and other grasses in the [[tribe]] [[Cynodonteae]]",
parents = {"grasses"},
}
labels["Dalbergieae tribe plants"] = {
type = "set",
description = "=[[ambatch]], [[cocuswood]], [[deervetch]], [[padauk]], [[pallisander]], [[peanut]]s, [[pencil flower]]s, [[red sanders]], [[rosewood]]s, [[shola]], [[sissoo]], [[Tahitian chestnut]], [[tipu]], and other plants in the [[tribe]] [[Dalbergieae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Daturas"] = {
type = "set",
description = "=plants in the [[genus]] ''[[Datura]]''",
parents = {"nightshades", "recreational drugs"},
}
labels["Detarioideae subfamily plants"] = {
type = "set",
description = "=plants in the [[subfamily]] [[Detarioideae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Dioscoreales order plants"] = {
type = "set",
description = "=[[black bryony]], [[bog asphodel]]s, [[Polynesian arrowroot]], [[unicorn root]], [[yam]]s, and other plants in the [[order]] [[Dioscoreales]]",
parents = {"plants"},
}
labels["dillenia family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Dilleniaceae]]",
parents = {"plants"},
}
labels["dogbane family plants"] = {
type = "set",
description = "=[[carrion flower]]s, [[desert rose]], [[dogbane]]s, [[hoodia]], [[hoya]]s, [[milkweed]]s, [[Natal plum]], [[oleander]]s, [[periwinkle]]s, [[plumeria]]s and other plants in the [[family]] [[Apocynaceae]] (including the former family [[Asclepiadaceae]])",
parents = {"Gentianales order plants"},
}
labels["ebony family plants"] = {
type = "set",
description = "=[[ebony]], [[black sapote]] and [[persimmon]]s in the [[genus]] ''[[Diospyros]]'', [[guarri]] in the genus ''[[Euclea]]'', and other plants in the family [[Ebenaceae]]",
parents = {"Ericales order plants"},
}
labels["ephedras"] = {
type = "set",
description = "=plants in the [[genus]] ''[[Ephedra]]'', the only members of the [[gymnosperm]] [[family]] [[Ephedraceae]]",
parents = {"gymnosperms"},
}
labels["Ericales order plants"] = {
type = "set",
description = "=[[arbutus]], [[benjamin]], [[blueberry|blueberries]], [[brazil nut]]s, [[boojum]], [[camellia]]s, [[cobra lily]], [[cyclamen]]s, [[ebony]], [[jewelweed]], [[kiwifruit]], [[manzanita]]s, [[ocotillo]], [[persimmon]]s, [[phlox]]es, [[pipsissewa]], [[pitcher plant]]s, [[primrose]]s, [[rhododendron]]s, [[sapote]], [[shea]] tree, [[snowbell]]s, [[summersweet]], [[tea]], and other plants in the [[order]] [[Ericales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["eucalypts"] = {
type = "set",
description = "=[[eucalypt]]s – woody plants with capsule-fruiting bodies belonging to seven closely related genera found across Australasia: ''Eucalyptus'', ''Corymbia'', ''Angophora'', ''Stockwellia'', ''Allosyncarpia'', ''Eucalyptopsis'' and ''Arillastrum''",
parents = {"Myrtle family plants", "trees"},
}
labels["Eupatorieae tribe plants"] = {
type = "set",
description = "=[[ageratum]]s, [[blazing star]]s, [[boneset]]s, [[deer's tongue]], [[hempvine]], [[joe-pye weed]], [[stevia]], [[thoroughwort]]s, [[trumpetweed]]s, and other plants in the [[composite]] tribe Eupatorieae",
parents = {"composites"},
}
labels["evening primrose family plants"] = {
type = "set",
description = "=[[clarkia]]s, [[enchanter's nightshade]], [[evening primrose]]s, [[fuchsia]]s, [[suncup]]s, [[willowherb]]s and other plants in the [[family]] [[Onagraceae]] (not to be confused with the true [[primrose]]s in the family [[Primulaceae]])",
parents = {"Myrtales order plants", "flowers"},
}
labels["Fabales order plants"] = {
type = "set",
description = "=plants in the [[order]] [[Fabales]]",
parents = {"plants"},
}
labels["Fabeae tribe plants"] = {
type = "set",
description = "=[[beach pea]]s, [[fava bean]]s, [[lentil]]s, [[pea]]s, [[sweet pea]]s, [[vetch]]es, and other plants in the [[tribe]] [[Fabeae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Fagales order plants"] = {
type = "set",
description = "=[[alder]]s, [[bayberry|bayberries]], [[beech]]es, [[birch]]es, [[butternut]]s, [[chestnut]]s, [[hazel]]s, [[hickory|hickories]], [[hornbeam]]s, [[oak]]s, [[pecan]]s, [[she-oak]]s, [[sweet gale]], [[walnut]]s, [[wingnut]]s, and other plants in the [[order]] [[Fagales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["ferns"] = {
type = "set",
parents = {"spore plants"},
}
labels["fig trees"] = {
type = "set",
parents = {"mulberry family plants", "trees"},
}
labels["figwort family plants"] = {
type = "set",
description = "=[[figwort]]s, [[butterfly bush]]es, [[emu bush]]es, [[mudwort]]s, [[mullein]]s, [[myoporum]]s, [[nemesia]]s, and many other plants in the [[family]] [[Scrophulariaceae]], but not including many such as [[foxglove]]s and [[snapdragon]]s that are now in the [[Plantaginaceae]] as well as [[Indian paintbrush]]es and [[lousewort]]s/[[wood betony|wood betonies]], now in the [[Orobanchaceae]]",
parents = {"Lamiales order plants"},
}
labels["flowers"] = {
type = "set",
parents = {"plants"},
}
labels["four o'clock family plants"] = {
type = "set",
description = "=[[bougainvillea]]s, [[cabbagewood]], [[four o'clock]]s, [[mauka]], [[pisonia]]s, [[punarnava]], [[sand verbena]]s, [[spiderling]]s, [[tarvine]]s, [[wishbone bush]], and other plants in the [[family]] [[Nyctaginaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["Galegeae tribe plants"] = {
type = "set",
description = "=[[goat's rue]], [[bladder senna]], [[glory pea]], [[kakabeak]], [[licorice]], [[locoweed]] or [[milkvetch]], [[tragacanth]] and other plants in the [[tribe]] [[Galegeae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Garcinieae tribe plants"] = {
type = "set",
description = "=[[saptree]]s, [[mangosteen]]s, and other plants in the [[tribe]] [[Garcinieae]] of the [[family]] [[Clusiaceae]]",
parents = {"Clusiaceae family plants"},
}
labels["Genisteae tribe plants"] = {
type = "set",
description = "=[[broom]]s, [[furze]]/[[gorse]], [[laburnum]], [[lupine]]s, [[tagasaste]], [[whin]], [[woad-waxen]], and other plants in the [[tribe]] [[Genisteae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["gentian family plants"] = {
type = "set",
description = "=[[gentian]]s, [[bitterwort]], [[canchalagua]], [[centaury|centauries]], [[fieldwort]]s, [[yellowwort]], and other plants in the [[family]] [[Gentianaceae]]",
parents = {"Gentianales order plants"},
}
labels["Gentianales order plants"] = {
type = "set",
description = "=plants in the order [[Gentianales]]",
parents = {"plants"},
}
labels["Geraniales order plants"] = {
type = "set",
description = "=[[cranesbill]]s, [[filaree]]s, [[francoa]]s, [[geranium]]s, [[herb Robert]], [[honeybush]], [[pelargonium]]s, [[storksbill]]s, and other plants in the [[order]] [[Geraniales]]",
parents = {"plants"},
}
labels["ginger family plants"] = {
type = "set",
description = "= [[cardamom]], [[galangal]], [[ginger]]s, [[grains of paradise]], [[turmeric]], [[zedoary]], and other plants in the family [[Zingiberaceae]]",
parents = {"Zingiberales order plants", "spices and herbs"},
}
labels["Gnaphalieae tribe plants"] = {
type = "set",
description = "=[[billy buttons]], [[cudweed]]s, [[everlasting]]s, [[curry plant]], [[pussytoes]], [[strawflower]]s, [[vegetable sheep]] and other plants in the [[composite]] [[tribe]] [[Gnaphalieae]]",
parents = {"composites"},
}
labels["goosefoot subfamily plants"] = {
type = "set",
description = "=[[epazote]], [[hopsage]], [[lamb's quarters]], [[orach]], [[quinoa]], [[saltbush]], [[spinach]], [[winterfat]] and other plants in the [[subfamily]] [[Chenopodioideae]] of the [[family]] [[Amaranthaceae]]",
parents = {"amaranths and goosefoots"},
}
labels["gourd family plants"] = {
type = "set",
description = "= [[cucumber]]s, [[gourd]]s, [[melon]]s, [[squash]]es, and other plants in the family [[Cucurbitaceae]]",
parents = {"Cucurbitales order plants"},
}
labels["grape family plants"] = {
type = "set",
description = "=[[grapevine]]s, [[Boston ivy]], [[Virginia creeper]]. and other plants in the family [[Vitaceae]]",
parents = {"plants"},
}
labels["grapevines"] = {
type = "set",
parents = {"grape family plants", "wine"},
}
labels["grasses"] = {
type = "set",
description = "=[[grass]]es",
parents = {"commelinids"},
}
labels["groundcherries"] = {
type = "set",
description = "=[[groundcherry|groundcherries]], [[alkekengi]]s, [[Cape gooseberry|Cape gooseberries]], [[Chinese lantern]]s, [[goldenberry|goldenberries]], [[tomatillo]]s, and other plants in the [[genus]] ''[[Physalis]]'' and related [[genera]] in the [[nightshade]] [[subtribe]] [[Physalinae]], notable for bearing a [[tomato]]like fruit enclosed in a papery husk.",
parents = {"nightshades"},
}
labels["gymnosperms"] = {
type = "set",
description = "=various unrelated groups of [[seed plant]]s other than the [[flowering plant]]s",
parents = {"plants"},
}
labels["heather family plants"] = {
type = "set",
description = "=[[heather]]s, [[blueberry|blueberries]], [[rhododendron]]s, [[wintergreen]], and other plants in the family [[Ericaceae]]",
parents = {"Ericales order plants"},
}
labels["Heliantheae tribe plants"] = {
type = "set",
description = "=[[balsamroot]]s, [[brittlebush]], [[burrobrush]], [[cocklebur]]s, [[coneflower]]s, [[echinacea]], [[guayule]], [[Jerusalem artichoke]]s, [[mule's ears]], [[ox-eye daisy|ox-eye daisies]], [[pilotweed]]s, [[ragweed]]s, [[rosinweed]]s, [[sunflower]]s, [[tithonia]]s, [[zinnia]]s and other [[plant]]s in the [[composite]] [[tribe]] [[Heliantheae]]",
parents = {"composites"},
}
labels["hemp family plants"] = {
type = "set",
description = "=[[hemp]], [[hops]], [[hackberries]], and other plants in the family [[Cannabaceae]]",
parents = {"Rosales order plants"},
}
labels["herbs"] = {
type = "set",
parents = {"plants", "spices and herbs"},
}
labels["hollies"] = {
type = "set",
parents = {"plants", "shrubs", "trees"},
}
labels["honeysuckle family plants"] = {
type = "set",
description = "=[[abelia]]s, [[cornsalad]], [[honeysuckle]]s, [[scabious]], [[snowberry|snowberries]], [[spikenard]], [[teasel]]s, [[twinflower]]s, [[valerian]]s, and other plants in the [[family]] [[Caprifoliaceae]], including those in the former families [[Dipsacaceae]], [[Linnaeaceae]], and [[Valerianaceae]]",
parents = {"plants", "shrubs"},
}
labels["Hordeeae tribe grasses"] = {
type = "set",
description = "=[[barley]], [[emmer]], [[foxtail barley]], [[goatgrass]], [[lyme grass]], [[medusahead]], [[quackgrass]], [[rye]], [[spelt]], [[squirreltail]], [[wheat]], [[wheatgrass]], [[wild rye]], and other grasses in the [[tribe]] [[Hordeeae]], also known as the [[Triticeae]]",
parents = {"grasses"},
}
labels["horsetails"] = {
type = "set",
description = "=[[horsetail]]s, [[calamite]]s, and other plants in the [[taxon]] known as the [[subclass]] [[Equisetidae]] or either the [[class]] [[Equisetopsida]] or the class [[Sphenopsida]], depending on the classification system used",
parents = {"spore plants"},
}
labels["incense tree family plants"] = {
type = "set",
description = "=[[abilo]], [[Chinese olive]], [[elephant tree]], [[frankincense]], [[gumbo limbo]], [[myrrh]], [[pili nut]]s, and other plants in the family [[Burseraceae]]",
parents = {"plants", "shrubs", "trees"},
}
labels["iris family plants"] = {
type = "set",
description = "=[[crocus]]es, [[freesia]]s, [[gladiolus]]es, [[iris]]es, [[ixia]]s, [[sparaxis]], [[watsonia]]s, and other plants in the family [[Iridaceae]]",
parents = {"Asparagales order plants", "flowers"},
}
labels["Lamiales order plants"] = {
type = "set",
description = "=[[acanthus]]es, [[African violet]]s, [[ash]]es, [[betony]], [[brooklime]], [[butterfly bush]], [[catalpa]]s, [[chaste tree]], [[devil's claw]], [[eyebright]], [[foxglove]]s, [[hyssop]]s, [[jasmine]]s, [[lavender]]s, [[lilac]]s, [[lousewort]]s, [[mare's tail]], [[mint]]s, [[monkeyflower]]s, [[mullein]], [[olive]]s, [[oregano]]s, [[plantain]]s, [[privet]]s, [[sage]]s, [[sesame]], [[skullcap]]s, [[snapdragon]]s, [[teak]], [[thyme]]s, [[verbena]]s and other plants in the [[order]] [[Lamiales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["Lamioideae subfamily plants"] = {
type = "set",
description = "=[[bells of Ireland]], [[betony]], [[crosne]], [[deadnettle]], [[hemp-nettle]], [[henbit]], [[horehound]], [[ironwort]], [[Jerusalem sage]], [[lamb's ears]], [[lion's ear]], [[motherwort]], [[mountain tea]], [[obedient plant]], [[patchouli]], and other plants in the [[subfamily]] [[Lamioideae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants"},
}
labels["laurel family plants"] = {
type = "set",
description = "=plants in the family [[Lauraceae]]",
parents = {"Magnoliids", "trees", "shrubs"},
}
labels["legumes"] = {
type = "set",
description = "=plants in the family [[Fabaceae]], also known as the [[Leguminosae]]",
parents = {"Fabales order plants", "shrubs", "trees"},
}
labels["Liliales order plants"] = {
type = "set",
description = "=[[beargrass]], [[death camas]], [[false hellebore]], [[greenbrier]], [[herb Paris]], [[lily|lilies]], [[meadow saffron]], [[supplejack]], [[sarsparilla]], [[trillium]]s, [[tulip]]s, [[turkey's beard]], and other plants, in the [[order]] [[Liliales]]",
parents = {"plants"},
}
labels["lily family plants"] = {
type = "set",
description = "=plants in the family [[Liliaceae]]",
parents = {"Liliales order plants", "flowers"},
}
labels["madder family plants"] = {
type = "set",
description = "=[[bedstraw]], [[cinchona]], [[coffee]], [[gardenia]]s, [[ipecacuanha]], [[madder]], [[noni]], [[woodruff]], and other plants in the [[family]] [[Rubiaceae]]",
parents = {"Gentianales order plants", "shrubs"},
}
-- FIXME, should be lowercase.
labels["Magnoliids"] = {
type = "set",
description = "=[[allspice]], [[avocado]]s, [[black pepper]], [[champac]], [[cinnamon]], [[custard apple]]s, [[kava]], [[laurel]]s, [[magnolia]]s, [[nutmeg]], [[pipevine]]s, [[sassafras]]es, [[sweetshrub]]s, [[star anise]], [[tulip tree]], [[Winter's bark]], [[yerba mansa]], [[ylang-ylang]], and other plants in the [[Magnoliids]] [[clade]]",
parents = {"plants"},
}
labels["mahogany family plants"] = {
type = "set",
description = "=[[chinaberry]], [[langsat]], [[mahogany]], [[neem]], [[Spanish cedar]]s, [[toon]], [[santol]], and other plants in the [[family]] [[Meliaceae]]",
parents = {"trees", "shrubs"},
}
labels["maize (plant)"] = {
type = "set",
description = "=[[maize]] (''[[Zea mays]]'') as a plant, and for its various types",
additional = "For maize as a crop, see [[:Category:Maize (crop)]] and for maize as a food, see [[:Category:Maize (food)]].",
parents = {"Andropogoneae tribe grasses", "grains"},
}
labels["mallow family plants"] = {
type = "set",
description = "=[[balsa]], [[cacao]], [[cotton]], [[durian]]s, [[jute]], [[kola]]s, [[kurrajong]]s, [[hibiscus]]es, [[linden]]s, [[mallow]]s, [[peanut tree]]s, [[phalsa]], [[silk-cotton tree]]s, and other plants in the current [[family]] [[Malvaceae]], including a number of former families such as the [[Bombacaceae]], [[Sterculiaceae]], and the [[Tiliaceae]]",
parents = {"Malvales order plants", "shrubs"},
}
labels["mallow subfamily plants"] = {
type = "set",
description = "=[[abelmosk]], [[cotton]], [[hibiscus]]es, [[hollyhock]]s, [[mallow]]s, [[okra]], and other plants in the traditional [[family]] [[Malvaceae]], which is now considered to be the [[subfamily]] [[Malvoideae]] within the current [[Malvaceae]]",
parents = {"mallow family plants"},
}
labels["Malpighiales order plants"] = {
type = "set",
description = "=plants in the order [[Malpighiales]]",
parents = {"plants"},
}
labels["Malvales order plants"] = {
type = "set",
description = "=[[agalloch]], [[annatto]], [[balsa]], [[cacao]], [[cotton]], [[daphne]]s, [[durian]]s, [[jute]], [[hibiscus]]es, [[linden]]s, [[mallow]]s, [[rockrose]]s, [[sal]], [[silk-cotton tree]]s, [[tie bush]], and other plants in the [[order]] [[Malvales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["maples"] = {
type = "set",
parents = {"soapberry family plants", "trees"},
}
labels["Menthinae subtribe plants"] = {
type = "set",
description = "=[[American pennyroyal]], [[basil thyme]], [[bee balm]], [[calamint]], [[horsemint]], [[mint]]s, [[marjoram]], [[mountain mint]], [[oregano]], [[savory|savories]], [[thyme]]s and other plants in the [[subtribe]] [[Menthinae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants", "spices and herbs"},
}
labels["mimosa subfamily plants"] = {
type = "set",
description = "=[[acacia]]s, [[ice-cream bean]]s, [[mesquite]]s, [[mimosa]]s, [[rain tree]]s, and other plants in the [[subfamily]] [[Mimosoideae]] of the [[family]] [[Fabaceae]], which has been reclassified as a [[clade]] within the [[subfamily]] [[Caesalpinioideae]]",
parents = {"legumes", "caesalpinia subfamily plants"},
}
labels["mint family plants"] = {
type = "set",
description = "=[[balms]], [[basil]]s, [[betony]], [[coleus]]es, [[deadnettle]]s, [[ground ivy]], [[hyssop]]s, [[lavender]]s, [[mint]]s, [[oregano]]s, [[patchouli]], [[perilla]], [[sage]]s, [[savory|savories]], [[selfheal]], [[skullcap]]s, [[thyme]]s, and other plants in the [[family]] [[Lamiaceae]], also known as the [[Labiatae]]",
parents = {"Lamiales order plants", "spices and herbs"},
}
labels["mints"] = {
type = "set",
description = "=the true [[mint]]s, plants in the [[genus]] ''[[Mentha]]''",
parents = {"mint family plants", "Menthinae subtribe plants"},
}
labels["morning glory family plants"] = {
type = "set",
description = "=[[bindweed]]s, [[dichondra]], [[dodder]], [[morning glory|morning glories]], [[sweet potato|sweet potatoes]], [[wood rose]]s and other plants in the [[family]] [[Convolvulaceae]]",
parents = {"plants"},
}
labels["moschatel family plants"] = {
type = "set",
description = "=[[elderberry|elderberries]], [[moschatel]], [[viburnum]]s, and other plants in the [[family]] [[Adoxaceae]]",
parents = {"plants", "shrubs", "trees"},
}
labels["mosses"] = {
type = "set",
description = "=true [[moss]]es, plants in the [[division]] [[Bryophyta]] (excluding [[hornwort]]s and [[liverwort]]s), which doesn't include [[lichen]]s, [[club moss]]es, [[spike moss]]es, [[algae]], or mossy [[flowering plant]]s such as [[Irish moss]], or [[Spanish moss]]",
parents = {"spore plants", "bryology"},
}
labels["mulberry family plants"] = {
type = "set",
description = "=[[mulberry|mulberries]], [[breadfruit]], [[fig]]s and other trees in the family [[Moraceae]]",
parents = {"Rosales order plants", "trees"},
}
labels["Myrtales order plants"] = {
type = "set",
description = "=[[allspice]], [[arjuna]], [[bottlebrush]], [[clove]]s, [[eucalyptus]]es, [[evening primrose]]s, [[guava]]s, [[henna]], [[leadwood]], [[lilly-pilly]], [[loosestrife]]s, [[myrobalan]]s, [[myrtle]]s, [[pomegranate]]s, [[quaruba]], [[Rangoon creeper]], [[rose apple]]s, [[tea tree]], [[tropical almond]]s, [[water caltrop]]s, [[white mangrove]]s, [[willowherb]]s, and other plants, shrubs and trees in the [[order]] [[Myrtales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["myrtle family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Myrtaceae]]",
parents = {"Myrtales order plants", "trees", "shrubs"},
}
labels["Nepetinae subtribe plants"] = {
type = "set",
description = "=[[anise hyssop]], [[catnip]], [[dragonhead]], [[ground-ivy]], [[hyssop]], [[Korean mint]], [[licorice mint]], and other plants in the [[subtribe]] [[Nepetinae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants"},
}
labels["nettle family plants"] = {
type = "set",
description = "=[[baby's tears]], [[clearweed]], [[nettle]]s, [[ramie]], and other plants in the [[family]] [[Urticaceae]]",
parents = {"Rosales order plants"},
}
labels["nightshades"] = {
type = "set",
description = "=[[ashwagandha]], [[black nightshade]], [[boxthorn]]s, [[datura]]s, [[deadly nightshade]], [[eggplant]]s, [[goji]], [[henbane]], [[mandrake]], [[matrimony vine]], [[pepper]]s, [[petunia]]s, [[potato]]es, [[tobacco]], [[tomatillo]]s, [[tomato]]es and other plants in the family [[Solanaceae]]",
parents = {"plants"},
}
labels["Nymphaeales order plants"] = {
type = "set",
description = "=[[fanwort]]s, [[foxnut]]s, [[spatterdock]]s, [[water lily|water lilies]], [[water-shield]]s, and other plants in the [[order]] [[Nymphaeales]]",
parents = {"water plants"},
}
labels["oaks"] = {
type = "set",
description = "=[[oak]]s.\n\nMany languages recognize two main types: those with flat, [[deciduous]] leaves, and those with curled, often prickly, [[evergreen]] leaves (live oaks)",
parents = {"beech family plants", "trees"},
}
labels["olive family plants"] = {
type = "set",
description = "=[[olive]]s, [[ash]]es, [[jasmine]]s, [[lilac]]s, [[privet]]s and other plants in the family [[Oleaceae]]",
parents = {"Lamiales order plants"},
}
labels["orchids"] = {
type = "set",
description = "=plants in the [[family]] [[Orchidaceae]]",
parents = {"Asparagales order plants", "flowers"},
}
labels["Oryzeae tribe grasses"] = {
type = "set",
description = "=[[cutgrass]], [[rice]], [[wild rice]], and other grasses in the tribe [[Oryzeae]]",
parents = {"grasses"},
}
labels["Oxalidales order plants"] = {
type = "set",
description = "=[[bilimbi]], [[coachwood]], [[cudgerie]], [[makomako]], [[quandong]], [[rudraksha]], [[star fruit]], [[wood sorrel]]s, and other plants in the [[order]] [[Oxalidales]]",
parents = {"plants", "trees"},
}
labels["palm trees"] = {
type = "set",
description = "=[[palm]]s",
parents = {"commelinids", "trees"},
}
labels["Pandanales order plants"] = {
type = "set",
description = "=[[kiekie]], [[Panama hat palm]], [[pandanus]], [[stemona]], and other plants in the [[order]] [[Pandanales]]",
parents = {"plants", "trees"},
}
labels["Paniceae tribe grasses"] = {
type = "set",
description = "=[[burgrass]], [[basketgrass]], [[bristlegrass]]es, [[buffelgrass]], [[common millet]], [[crabgrass]], [[elephant grass]], [[foxtail millet]], [[fountaingrass]], [[Kikuyu grass]], [[Napier grass]], [[panicgrass]], [[Pará grass]], [[pigeongrass]], [[sandbur]], [[spinifex]], [[switchgrass]], [[watergrass]], and other grasses in the tribe [[Paniceae]]",
parents = {"grasses"},
}
labels["passion vine family plants"] = {
type = "set",
description = "=[[barbadine]]s, [[damiana]], [[granadilla]]s, [[maracock]]s, [[maypop]]s, [[passionflower]]s, [[water lemon]]s, and other plants in the [[family]] [[Passifloraceae]]",
parents = {"Malpighiales order plants"},
}
labels["peppers"] = {
type = "set",
description = "=[[aji]]s, [[chile]]s, [[pimiento]]s, [[sweet pepper]]s, and other plants in the [[genus]] ''[[Capsicum]]''",
parents = {"nightshades", "vegetables", "spices and herbs"},
}
labels["Phaseoleae tribe plants"] = {
type = "set",
description = "=[[azuki bean]]s, [[catjang]]s, [[Bambara groundnut]]s, [[Calabar bean]]s, [[coral tree]]s, [[green bean]]s, [[groundnut]]s, [[hyacinth bean]]s, [[jicama]], [[kidney bean]]s, [[kudzu]], [[mung bean]]s, [[pigeon pea]]s, [[runner bean]]s, [[snailflower]], [[soybean]]s, [[tepary]], [[winged bean]]s, [[yardlong bean]]s and other plants in the [[tribe]] [[Phaseoleae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Phaseolus beans"] = {
type = "set",
displaytitle = "''Phaseolus'' beans",
description = "=plants in the [[New World]] [[legume]] [[genus]] ''[[Phaseolus]]''",
parents = {"Phaseoleae tribe plants", "vegetables"},
}
labels["pines"] = {
type = "set",
parents = {"conifers"},
}
labels["Piperales order plants"] = {
type = "set",
description = "=[[betel pepper]], [[black pepper]], [[cubeb]], [[hoja santa]], [[kava]], [[lizard tail]], [[long pepper]], [[pipevine]], [[radiator plant]], [[wild ginger]], [[yerba mansa]], and other plants in the [[order]] [[Piperales]]",
parents = {"Magnoliids"},
}
labels["plantain family plants"] = {
type = "set",
description = "=[[bacopa]]s, [[brooklime]], [[foxglove]]s, [[mare's tail]], [[penstemon]]s, [[plantain]]s, [[snapdragon]]s, and many other plants in the [[family]] [[Plantaginaceae]], including many formerly included in the [[Scrophulariaceae]] and the [[Hippuridaceae]]",
parents = {"Lamiales order plants", "flowers"},
}
labels["podocarpus family plants"] = {
type = "set",
description = "=conifers in the family [[Podocarpaceae]]",
parents = {"conifers"},
}
labels["Poeae tribe grasses"] = {
type = "set",
description = "=[[beachgrass]], [[bentgrass]], [[bluegrass]], [[canary grass]], [[darnel]], [[fescue]], [[goldseed]], [[hair grass]], [[marram]], [[muttongrass]], [[nitgrass]], [[oat]]s, [[ribbongrass]], [[sweetgrass]], [[timothy]], and other grasses in the [[tribe]] [[Poeae]], including the former tribe [[Aveneae]]",
parents = {"grasses"},
}
labels["polynesian canoe plants"] = {
type = "set",
description = "=[[Polynesian]] [[canoe plant]]s, plants which the Polynesians are believed to have spread between islands before European contact",
parents = {"plants"},
}
labels["pome fruits"] = {
type = "set",
description = "=[[apple]]s, [[hawthorn]]s, [[pear]]s, [[quince]]s, [[serviceberry|serviceberries]] and other plants in [[subtribe]] [[Malinae]] of the family [[Rosaceae]]",
parents = {"rose family plants", "trees", "shrubs"},
}
labels["poppies"] = {
type = "set",
description = "=[[bleeding heart]], [[bloodroot]], [[celandine]], [[fumitory]], [[poppy|poppies]], and other plants in the family [[Papaveraceae]]",
parents = {"Ranunculales order plants"},
}
labels["primrose family plants"] = {
type = "set",
description = "=[[brookweed]], [[cyclamen]]s, [[marlberry]], [[pimpernel]]s, [[primrose]]s, [[shooting star]]s, [[snowbell]]s, [[starflower]]s and other plants in the family [[Primulaceae]], including the former [[family]] [[Myrsinaceae]]",
parents = {"Ericales order plants", "flowers"},
}
labels["proteales order plants"] = {
type = "set",
description = "=[[banksia]]s, [[grevillea]]s, [[hakea]]s, [[lotus]]es, [[macadamia]]s, [[plane]] trees, [[protea]]s, [[silk oak]]s, [[waratah]], and other plants in the [[order]] [[Proteales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["Prunus genus plants"] = {
type = "set",
displaytitle = "''Prunus'' genus plants",
description = "=[[almond]]s, [[apricot]]s, [[cherry|cherries]], [[peach]]es, [[plum]]s and other plants in the genus ''[[Prunus]]''",
parents = {"rose family plants", "stone fruits"},
}
labels["radishes"] = {
type = "set",
parents = {"crucifers", "vegetables"},
}
labels["Ranunculales order plants"] = {
type = "set",
description = "=[[akebia]], [[barberry|barberries]], [[buttercup]]s, [[calumba]], [[moonseed]]s, [[poppy|poppies]], [[serendipity berry]], and other plants in the [[order]] [[Ranunculales]]",
parents = {"plants"},
}
labels["Rosales order plants"] = {
type = "set",
description = "=[[agrimony]], [[almond]]s, [[apple]]s, [[baby's tears]], [[blackberry|blackberries]], [[breadfruit]], [[buffaloberry|buffaloberries]], [[buckthorn]]s, [[cherry|cherries]], [[elm]]s, [[fig]]s, [[hackberries]], [[hemp]], [[hop]]s, [[jujube]]s, [[mulberry|mulberries]], [[nettle]]s, [[oleaster]]s, [[Osage orange]], [[pilea]]s, [[plum]]s, [[rose]]s, [[spirea]]s, [[strawberry|strawberries]], [[zelkova]]s, and many other plants, trees and shrubs in the [[order]] [[Rosales]]",
parents = {"plants"},
}
labels["rose family plants"] = {
type = "set",
description = "=[[agrimony]], [[almond]]s, [[apple]]s, [[blackberry|blackberries]], [[cherry|cherries]], [[cinquefoil]]s, [[hawthorn]]s, [[meadowsweet]], [[rose]]s, [[strawberry|strawberries]], and many other plants, trees and shrubs in the family [[Rosaceae]]",
parents = {"Rosales order plants"},
}
labels["roses"] = {
type = "set",
parents = {"rose family plants", "flowers"},
}
labels["rue family plants"] = {
type = "set",
description = "=[[Amur cork tree]], [[boronia]]s, [[breath of heaven]], [[buchu]], [[citrus]]es, [[hoptree]], [[jaborandi]], [[prickly ash]]es, [[rue]], [[satinwood]]s, [[Sichuan pepper]], [[torchwood]]s, [[white sapote]]s and other plants in the [[family]] [[Rutaceae]]",
parents = {"Sapindales order plants", "trees", "shrubs"},
}
labels["rushes"] = {
type = "set",
description = "=plants in the family [[Juncaceae]]",
parents = {"commelinids", "water plants"},
}
labels["sages"] = {
type = "set",
description = "=plants in the [[genus]] ''[[Salvia]]'' (not to be confused with [[sagebrush]])",
parents = {"mint family plants", "herbs"},
}
labels["Santalales order plants"] = {
type = "set",
description = "=[[mistletoe]]s, [[quandong]], [[sandalwood]]s, and other plants in the [[order]] [[Santalales]]",
parents = {"plants"},
}
labels["Sapindales order plants"] = {
type = "set",
description = "=[[cashew]]s, [[Chinese olive]]s, [[chinaberry]], [[citrus]]es, [[frankincense]], [[jaborandi]], [[lychee]]s, [[mahogany]], [[mango]]s, [[maple]]s, [[myrrh]], [[neem]], [[pistachio]]s, [[poison ivy]], [[quassia]], [[rambutan]], [[rue]], [[Sichuan pepper]], [[soapberry]], [[sumac]]s, [[tamarind]], [[tree of heaven]], and many other plants, trees and shrubs in the [[order]] [[Sapindales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["sapote family plants"] = {
type = "set",
description = "=trees and shrubs in the family [[Sapotaceae]]",
parents = {"Ericales order plants"},
}
labels["Saxifragales order plants"] = {
type = "set",
description = "=[[alumroot]]s, [[astilbe]]s, [[currant]]s, [[foamflower]]s, [[gooseberry|gooseberries]], [[Indian rhubarb]], [[katsura]], [[London pride]], [[miterwort]]s, [[peony|peonies]], [[rockfoil]]s, [[saxifrage]]s, [[stonecrop]]s, [[sweet gum]]s, [[watermilfoil]]s, [[witch hazel]]s, [[youth-on-age]], and other plants in the [[order]] [[Saxifragales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["Scandiceae tribe plants"] = {
type = "set",
description = "=[[asafoetida]], [[carrot]]s, [[chervil]], [[cicely]], [[cumin]], [[lady's comb]], [[laserwort]], and other plants in the [[tribe]] [[Scandiceae]] of the celery [[family]], [[Apiaceae]]",
parents = {"celery family plants"},
}
labels["sedges"] = {
type = "set",
description = "=plants in the family [[Cyperaceae]]",
parents = {"commelinids"},
}
labels["Selineae tribe plants"] = {
type = "set",
description = "=[[angelica]], [[arracacha]], [[biscuitroot]], [[dog parsley]], [[dong quai]], [[hog fennel]], [[masterwort]], and other plants in the [[tribe]] [[Selineae]] of the celery [[family]], [[Apiaceae]]",
parents = {"celery family plants"},
}
labels["Senecioneae tribe plants"] = {
type = "set",
description = "=[[butterbur]]s, [[cineraria]]s, [[coltsfoot]]s, [[dusty miller]], [[groundsel]]s, [[leopardsbane]], [[ragwort]]s, [[string of pearls]], and other plants in the [[composite]] tribe [[Senecioneae]]",
parents = {"composites"},
}
labels["shrubs"] = {
type = "set",
parents = {"plants"},
wpcat = true,
commonscat = true,
}
labels["soapberry family plants"] = {
type = "set",
description = "=plants in the family [[Sapindaceae]]",
parents = {"Sapindales order plants", "trees", "shrubs"},
}
labels["solanums"] = {
type = "set",
description = "=[[bittersweet]], [[black nightshade]] [[buffalo bur]], [[eggplant]]s, [[Jerusalem cherry]], [[kangaroo apple]], [[pepino melon]], [[potato]]es, [[tamarillo]], [[tomato]]es, [[wonderberry]] and other plants in the [[genus]] ''[[Solanum]]''",
parents = {"nightshades", "vegetables"},
}
labels["spore plants"] = {
type = "set",
description = "=a number of unrelated true plants that reproduce by [[spore]]s, such as [[moss]]es, [[liverwort]]s, [[horsetail]]s and [[fern]]s, formerly classified as [[cryptogam]]s",
parents = {"plants"},
}
labels["spurges"] = {
type = "set",
description = "=[[candlenut]]s, [[cassava]], [[castor bean]]s, [[croton]]s, [[poinsettia]]s, [[rubber tree]]s, [[spurge]]s, [[tallow tree]]s, and other plants in the [[family]] [[Euphorbiaceae]]",
parents = {"Malpighiales order plants"},
}
labels["staff vine family plants"] = {
type = "set",
description = "=[[bittersweet]], [[burning bush]], [[candlewood]], [[grass of Parnassus]], [[khat]], [[mayten]], [[paxistima]]s, [[spindle tree]]s, [[staff vine]]s, [[thunder god vine]], [[wahoo]], and other plants in the family [[Celastraceae]]",
parents = {"plants", "shrubs"},
}
labels["stone fruits"] = {
type = "set",
description = "=[[fruit#Noun|fruit]] which are [[drupe]]s (having a [[fleshy]] portion surrounding a hard [[pit#Noun|pit]] or [[stone#Noun|stone]] containing a [[seed#Noun|seed]]). Plants that produce drupes include [[cashew]], [[coffee]], [[jujube]], [[mango]], [[olive]], most [[palm#Noun|palms]] (including [[açaí]], [[coconut]], [[date#Noun|date]], [[oil palm]]s, and [[sabal]]), [[pistachio]], and all members of the [[genus]] ''[[Prunus]]'' (including the [[almond]], [[apricot]], [[cherry]], [[damson]], [[nectarine]], [[peach]], and [[plum#Noun|plum]])",
parents = {"fruits", "shrubs", "trees"},
}
labels["stonecrop family plants"] = {
type = "set",
description = "=[[succulent]]s in the family [[Crassulaceae]]",
parents = {"Saxifragales order plants", "succulents"},
}
labels["succulents"] = {
type = "set",
description = "=plants with thickened, fleshy leaves or stems for storing water",
parents = {"plants"},
}
labels["sumac family plants"] = {
type = "set",
description = "=[[sumac]]s, [[cashew]]s, [[pistachio]]s, [[poison ivy]] and other plants in the family [[Anacardiaceae]]",
parents = {"Sapindales order plants", "trees", "shrubs"},
}
labels["thistles"] = {
type = "set",
description = "=[[artichoke]]s, [[burdock]]s, [[cardoon]]s, [[costus]], [[knapweed]]s, [[safflower]], [[sawwort]], [[thistle]]s and other plants in the [[tribe]] [[Cynareae]] (also known as the [[Cardueae]]) of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["tomatoes"] = {
type = "set",
description = "=plants in the cultivated [[species]] ''[[Solanum lycopersicum]]'' and its wild relative, ''[[Solanum pimpinellifolium]]''",
parents = {"nightshades", "solanums", "vegetables"},
}
labels["trees"] = {
type = "set",
parents = {"plants"},
wpcat = true,
commonscat = true,
}
labels["Trifolieae tribe plants"] = {
type = "set",
description = "=[[alfalfa]], [[alsike]], [[burclover]], [[clover]], [[fenugreek]], [[medick]], [[melilot]], [[restharrow]], and other plants in the [[tribe]] [[Trifolieae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Vigna beans"] = {
type = "set",
displaytitle = "''Vigna'' beans",
description = "=plants in the Asian [[legume]] [[genus]] ''[[Vigna]]'', including [[black-eyed pea]]s, [[Bambara groundnut]]s and what are variously called [[bean]]s, [[dal]]s or [[gram]]s",
parents = {"Phaseoleae tribe plants", "vegetables"},
}
labels["violet family plants"] = {
type = "set",
description = "=[[Johnny-jump-up]]s, [[mahoe]], [[pansy|pansies]], [[viola]]s, [[violet]]s, [[whiteywood]] and other plants in the family [[Violaceae]]",
parents = {"Malpighiales order plants"},
}
labels["Vitales order plants"] = {
type = "set",
displaytitle = "''Vitales'' order plants",
description = "=[[grape]]s and other plants in the ''[[Vitales]]'' order",
parents = {"plants"},
}
labels["walnut family plants"] = {
type = "set",
description = "=[[walnut]]s, [[butternut]]s, [[hickory|hickories]], [[pecan]]s, and other trees in the family [[Juglandaceae]]",
parents = {"trees", "nuts"},
}
labels["water plants"] = {
type = "set",
parents = {"plants"},
}
labels["willows and poplars"] = {
type = "set",
description = "=plants in the family [[Salicaceae]]",
parents = {"Malpighiales order plants", "trees"},
}
labels["Zingiberales order plants"] = {
type = "set",
description = "=[[arrowroot]], [[banana]]s, [[bird of paradise|birds of paradise]], [[canna]]s, [[ginger]]s, [[prayer plant]], and other plants in the [[order]] [[Zingiberales]]",
parents = {"commelinids"},
}
return labels
fsxby2188z2ebrak3ztyzr313sbmg82
88462
88461
2026-07-27T01:16:06Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Plants]]
88461
Scribunto
text/plain
local labels = {}
labels["plants"] = {
type = "type",
parents = {"lifeforms"},
wpcat = true,
commonscat = "Plantae",
}
labels["acacias"] = {
type = "set",
description = "=plants of the [[genus]] ''[[Acacia]]'' in its former sense, including what are now related genera such as ''[[Acaciella]]'', ''[[Senegalia]]'' and ''[[Vachellia]]'' – the [[tribe]] [[Acacieae]] in some classifications",
parents = {"mimosa subfamily plants"},
}
labels["acanthus family plants"] = {
type = "set",
description = "=[[acanthus]]es, [[aphelandra]]s, [[clock vine]], [[Malabar nut]], [[water willow]], and other plants in the [[family]] [[Acanthaceae]]",
parents = {"Lamiales order plants"},
}
labels["agavoideae subfamily plants"] = {
type = "set",
description = "=[[agave]]s, [[camas]]es, [[soap plant]]s, [[tuberose]]s, [[rush lily|rush lilies]], [[yucca]]s, and other plants in the [[subfamily]] [[Agavoideae]] of the [[family]] [[Asparagaceae]]",
parents = {"asparagus family plants", "succulents"},
}
labels["Aizoaceae family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Aizoaceae]], most of which are [[succulent]]s",
parents = {"Caryophyllales order plants", "succulents"},
}
labels["ajugoideae subfamily plants"] = {
type = "set",
description = "=[[bluecurls]], [[bugle]], [[cat thyme]], [[germander]], [[pagoda flower]], [[wood sage]], and other plants in the [[subfamily]] [[Ajugoideae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants"},
}
labels["Alismatales order plants"] = {
type = "set",
description = "=[[anacharis]], [[arrowgrass]]es, [[arrowhead]]s, [[arum]]s, [[burhead]]s, [[eelgrass]]es, [[flowering rush]], [[frogbit]], [[hydrilla]], [[Neptune grass]], [[philodendron]], [[pondweed]]s, [[seagrass]]es, [[taro]], [[velvetleaf]]s, [[water nymph]]s, [[water plantain]]s, [[waterpoppy]], and other plants in the [[order]] [[Alismatales]]",
parents = {"water plants"},
}
labels["alliums"] = {
type = "set",
description = "=[[chive]]s, [[garlic]], [[leek]]s, [[onion]]s, [[scallion]]s, [[shallot]]s, and other plants in the [[genus]] ''[[Allium]]''",
parents = {"amaryllis family plants", "root vegetables", "spices and herbs"},
}
labels["amaranth subfamily plants"] = {
type = "set",
description = "=[[achyranthe]], [[amaranth]], [[celosia]], [[goldenrod tree]], [[love-lies-bleeding]], [[marog]], [[prince's plume]], [[tampala]], [[waterhemp]], and other plants in the [[subfamily]] [[Amaranthoideae]] of the [[family]] [[Amaranthaceae]]",
parents = {"amaranths and goosefoots"},
}
labels["amaranths and goosefoots"] = {
type = "set",
description = "=[[amaranth]]s, [[beet]]s, [[blite]]s, [[glasswort]]s, [[lamb's quarters]], [[saltbush]]es, [[spinach]] and other plants in the [[family]] [[Amaranthaceae]], including the former family [[Chenopodiaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["amaryllis family plants"] = {
type = "set",
description = "=[[amaryllis]]es, [[daffodil]]s, [[garlic]], [[lily of the Nile]], [[rain lily|rain lilies]], [[snowdrops]], [[spider lily|spider lilies]] and other plants in the [[family]] [[Amaryllidaceae]], including the former family [[Alliaceae]]",
parents = {"Asparagales order plants", "flowers"},
}
labels["Anemoneae tribe plants"] = {
type = "set",
description = "=[[anemone]]s or [[windflower]]s, [[clematis]]es ([[old man's beard]], [[traveller's joy]], [[virgin's bower]], etc.), [[hepatica]]s or [[liverwort]]s, [[pasque flower]]s and other plants in the [[tribe]] [[Anemoneae]] of the [[family]] [[Ranunculaceae]]",
parents = {"buttercup family plants"},
}
labels["Anthemideae tribe plants"] = {
type = "set",
description = "=[[camomile]]s, [[chrysanthemum]]s, [[dogfennel]], [[feverfew]], [[lavender cotton]], [[oxeye daisy]], [[marguerite]]s, [[pellitory of Spain]], [[pineapple weed]], [[pyrethrum]], [[sagebrush]]es, [[sneezeweed]], [[sweet maudlin]], [[tansy]], [[wormwood]]s, [[yarrow]]s, and other plants in the [[tribe]] [[Anthemideae]] of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["Andropogoneae tribe grasses"] = {
type = "set",
description = "=[[bluestem]], [[broomsedge]], [[centipede grass]], [[cogon]], [[gama grass]], [[Job's tears]], [[Johnson grass]], [[lemongrass]], [[maize]], [[plume grass]], [[rosha grass]], [[sorghum]], [[sudangrass]], [[sugar cane]], [[susuki grass]], [[vetiver]], and other grasses in the tribe [[Andropogoneae]]",
parents = {"grasses"},
}
labels["Apiales order plants"] = {
type = "set",
description = "=[[anise]], [[apple-berry]], [[aralia]]s, [[carrot]]s, [[celery]], [[cumin]], [[ginseng]], [[hemlock]], [[ivy]], [[parsley]], [[pennywort]]s, [[pittosporum]]s, [[samphire]], [[sea holly]], [[sweet bursaria]], and other plants in the [[order]] [[Apiales]]",
parents = {"plants", "shrubs", "spices and herbs"},
}
labels["Apieae tribe plants"] = {
type = "set",
description = "=[[bishop's-weed]], [[celery]], [[dill]], [[fennel]], [[parsley]] and other plants in the [[tribe]] [[Apieae]] of the celery [[family]], [[Apiaceae]]",
parents = {"celery family plants"},
}
labels["aralia family plants"] = {
type = "set",
description = "=[[aralia]]s, [[ginseng]], [[eleuthero]], [[ivy]], [[umbrella tree]], [[parasol tree]], and other plants in the [[family]] [[Araliaceae]]",
parents = {"plants"},
}
labels["araucarians"] = {
type = "set",
description = "=primitive [[conifer]]s in the [[genus|genera]] ''[[Agathis]]'', ''[[Araucaria]]'' and ''[[Wollemia]]'' in the family [[Araucariaceae]]",
parents = {"conifers"},
}
labels["artemisias"] = {
type = "set",
description = "=[[mugwort]]s, [[sagebrush]]es, [[southernwood]], [[tarragon]], [[wormwood]], and other plants in the [[genus]] ''[[Artemisia]]''",
parents = {"Anthemideae tribe plants", "herbs"},
}
labels["arum family plants"] = {
type = "set",
description = "=[[arum]]s, [[duckweed]]s, [[Jack-in-the-pulpit]], [[philodendron]]s, [[skunk cabbage]], [[taro]], and other plants in the family [[Araceae]]",
parents = {"Alismatales order plants"},
}
labels["Asparagales order plants"] = {
type = "set",
description = "=[[agave]]s. [[allium]]s, [[aloe]]s, [[amaryllis]]es, [[asparagus]], [[crocus]]es, [[day lily|day lilies]], [[iris]]es, [[orchid]]s and other plants in the [[order]] [[Asparagales]]",
parents = {"plants"},
}
labels["asparagus family plants"] = {
type = "set",
description = "=[[agave]]s, [[asparagus]], [[bluebell]]s, [[butcher's broom]], [[dracaena]]s, [[hosta]]s, [[hyacinth]]s, [[lily of the valley]], [[Solomon's seal]]s, [[ti]], [[tuberose]], and other plants in the [[family]] [[Asparagaceae]], including those formerly in families such as the [[Agavaceae]], [[Hyacinthaceae]] and [[Ruscaceae]]",
parents = {"Asparagales order plants", "succulents", "flowers"},
}
labels["Asterales order plants"] = {
type = "set",
description = "=[[artichoke]]s, [[aster]]s, [[buckbean]]s, [[chamomile]], [[bellflower]]s, [[daisy|daisies]], [[dandelion]]s, [[lobelia]]s, [[sunflower]]s, [[thistle]]s, [[wormwood]]s and many other plants in the [[order]] [[Asterales]]",
parents = {"plants"},
}
labels["Astereae tribe plants"] = {
type = "set",
description = "=[[aster]]s, [[daisy|daisies]], [[fleabane]]s, [[goldenrod]]s, [[grindelia]]s, [[horseweed]]s, [[Michaelmas daisy]], [[muskwood]], [[rabbitbrush]]es, [[sharewort]], [[stabwort]], and other plants in the [[tribe]] [[Astereae]] of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["bamboos"] = {
type = "set",
description = "=grasses in the [[subfamily]] [[Bambusoideae]]",
parents = {"grasses"},
}
labels["barberry family plants"] = {
type = "set",
description = "=[[barberry|barberrie]]s, [[blue cohosh]], [[mayapple]], [[Oregon grape]]s, [[twinleaf]], and other plants in the [[family]] [[Berberidaceae]]",
parents = {"Ranunculales order plants", "shrubs"},
}
labels["beech family plants"] = {
type = "set",
description = "=[[beech]]es, [[chestnut]]s, [[oak]]s, and other plants in the family [[Fagaceae]]",
parents = {"Fagales order plants"},
}
labels["bignonia family plants"] = {
type = "set",
description = "=[[bignonia]]s, [[Cape honeysuckle]], [[catalpa]]s, [[jacaranda]]s, [[sausage tree]], [[trumpet vine]] and other plants in the family [[Bignoniaceae]]",
parents = {"Lamiales order plants", "shrubs", "flowers"},
}
labels["birch family plants"] = {
type = "set",
description = "=[[birch]]es, [[alder]]s, [[hazel]]s, [[hornbeam]]s and other plants in the family [[Betulaceae]]",
parents = {"Fagales order plants"},
}
labels["blueberry tribe plants"] = {
type = "set",
description = "=[[bilberry|bilberries]], [[blueberry|blueberries]], [[buckberry|buckberries]], [[cranberry|cranberries]], [[huckleberry|huckleberries]], [[lingonberry|lingonberries]], [[ohelo]], [[whortleberry|whortleberries]] and other plants in the [[heather]] [[family]] [[tribe]] [[Vaccinieae]]",
parents = {"heather family plants", "fruits"},
}
labels["borage family plants"] = {
type = "set",
description = "=[[alkanet]], [[borage]], [[comfrey]], [[fiddleneck]]s, [[forget-me-not]]s, [[heliotrope]]s, [[honeywort]]s, [[hound's tongue]], [[lungwort]], [[scorpionweed]], [[sebesten]], and other plants in the family [[Boraginaceae]]",
parents = {"plants"},
}
labels["brambles"] = {
type = "set",
description = "=[[blackberry|blackberries]], [[cloudberry|cloudberries]], [[dewberry|dewberries]], [[raspberry|raspberries]], [[thimbleberry|thimbleberries]], and other plants in the [[genus]] ''[[Rubus]]''",
parents = {"rose family plants", "berries"},
}
labels["Brassicales order plants"] = {
type = "set",
description = "=[[beachwort]], [[bladderpod]], [[cabbage]]s, [[caper]]s, [[cress]]es, [[meadowfoam]]s, [[mustard]]s, [[nasturtium]]s, [[papaya]]s, [[radish]]es, [[wallflower]]s, [[weld]] and other plants in the [[order]] [[Brassicales]]",
parents = {"plants"},
}
labels["brassicas"] = {
type = "set",
description = "=[[cabbage]]s, [[mustard]]s, and other plants in the genus ''[[Brassica]]''",
parents = {"crucifers"},
}
labels["bromeliads"] = {
type = "set",
description = "=[[pineapple]]s, and other plants in the family [[Bromeliaceae]]",
parents = {"commelinids"},
}
labels["broomrape family plants"] = {
type = "set",
description = "=[[broomrape]]s or [[broom rape]]s, [[beechdrops]], [[cow-wheat]], [[eyebright]]s, [[Indian paintbrush]]es, [[lousewort]]s, [[rattle]]s, [[witchweed]]s, and other plants in the family [[Orobanchaceae]]",
parents = {"Lamiales order plants"},
}
labels["buckthorn family plants"] = {
type = "set",
description = "=[[buckthorn]], [[ceanothus]]es, [[chewstick]], [[jujube]], and other plants in the [[family]] [[Rhamnaceae]]",
parents = {"Rosales order plants", "shrubs", "trees"},
}
labels["buckwheat family plants"] = {
type = "set",
description = "=[[buckwheat]], [[coral vine]], [[dock]], [[knotweed]], [[rhubarb]], [[sea grape]], [[smartweed]], [[sorrel]] and other plants in the [[family]] [[Polygonaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["buttercup family plants"] = {
type = "set",
description = "=plants in the family [[Ranunculaceae]]",
parents = {"Ranunculales order plants"},
}
labels["Buxales order plants"] = {
type = "set",
description = "=plants in the [[order]] [[Buxales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["cacti"] = {
type = "set",
parents = {"Caryophyllales order plants", "succulents"},
}
labels["caesalpinia subfamily plants"] = {
type = "set",
description = "=[[brazilwood]], [[carob]], [[honey locust]]s, [[Kentucky coffeetree]], [[logwood]], [[paloverde]]s, [[poinciana]]s, [[redbud]]s, [[senna]]s, [[tamarind]]s, and other plants in the [[subfamily]] [[Caesalpinioideae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["caltrop family plants"] = {
type = "set",
description = "=[[bean-caper]], [[caltrop]], [[creosote bush]], [[lignum vitae]], and other plants in the [[family]] [[Zygophyllaceae]]",
parents = {"plants", "shrubs", "trees"},
}
labels["Cardamineae tribe plants"] = {
type = "set",
description = "=[[bittercress]], [[dame's rocket]], [[horseradish]], [[lady's smock]], [[toothwort]], [[watercress]], [[wintercress]], and other plants in the [[brassicaceous]] [[tribe]] [[Cardamineae]]",
parents = {"crucifers"},
}
labels["carnation family plants"] = {
type = "set",
description = "=[[baby's breath]], [[campion]]s, [[carnation]]s, [[chickweed]], [[knawel]]s, [[sandwort]]s, [[pink]]s, [[rupturewort]]s, [[soapwort]] and other plants in the [[family]] [[Caryophyllaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["carnivorous plants"] = {
type = "set",
description = "=[[bladderwort]]s, [[butterwort]]s, [[pitcher plant]]s, [[sundew]]s, [[Venus flytrap]]s, and other plants that trap and obtain nutrients from animals",
parents = {"plants"},
}
labels["Caryophyllales order plants"] = {
type = "set",
description = "=[[amaranth]]s, [[buckwheat]], [[cacti]], [[carnation]]s, [[dock]], [[four-o'clock]]s, [[glasswort]], [[goosefoot]]s, [[greasewood]], [[ice plant]]s, [[jojoba]], [[knotweed]]s, [[Malabar spinach]], [[miner's lettuce]], [[plumbago]]s, [[pokeweed]], [[ragged robin]], [[rhubarb]], [[statice]], [[purslane]], [[saltbush]]es, [[spinach]], [[thrift]], [[tamarisk]], [[Venus flytrap]], and other plants in the [[order]] [[Caryophyllales]]",
parents = {"plants"},
}
labels["celery family plants"] = {
type = "set",
description = "=[[ajwain]], [[anise]], [[arracacha]], [[asafoetida]], [[carrot]]s, [[celery]], [[chuchupate]], [[coriander]], [[cumin]], [[dill]], [[galbanum]], [[hemlock]], [[hogweed]], [[lovage]], [[masterwort]], [[parsley]], [[parsnip]]s, [[samphire]], [[sanicle]]s, [[sea holly]], [[yampah]] and other plants in the [[family]] [[Apiaceae]], also known as the [[Umbelliferae]]",
parents = {"Apiales order plants"},
}
labels["Chickpeas"] = {
type = "set",
description = "=[[chickpea]]s",
parents = {"legumes"},
}
labels["Cichorieae tribe plants"] = {
type = "set",
description = "=[[chicory|chicories]], [[dandelion]]s, [[endive]], [[hawkweed]]s, [[lettuce]]s, [[murnong]], [[nipplewort]], [[oxtongue]], [[salsify]], [[sow thistle]]s, [[succory]], and other plants in the [[tribe]] [[Cichorieae]] of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["citrus subfamily plants"] = {
type = "set",
description = "=[[citrus]] and other plants in the subfamily [[Aurantioideae]] of the rue family, [[Rutaceae]]",
parents = {"rue family plants", "trees", "shrubs"},
}
labels["club mosses"] = {
type = "set",
description = "=plants in the [[family]] [[Lycopodiaceae]]",
parents = {"spore plants"},
}
labels["Clusiaceae family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Clusiaceae]]",
parents = {"Malpighiales order plants"},
}
labels["combretum family plants"] = {
type = "set",
description = "=[[arjuna]], [[bushwillow]]s, [[leadwood]], [[myrobalan]]s, [[Rangoon creeper]], [[tropical almond]], [[white mangrove]], and other plants in the [[family]] [[Combretaceae]]",
parents = {"Myrtales order plants", "trees", "shrubs"},
}
labels["commelinids"] = {
type = "set",
description = "=[[arrowroot]]s, [[bamboo]]s, [[banana]]s, [[bird of paradise|birds of paradise]], [[bloodwort]]s, [[bromeliad]]s, [[canna]]s, [[cattail]]s, [[ginger]]s, [[grass]]es, [[kangaroo paw]], [[palm]]s, [[reed]]s, [[rush]]es, [[sedge]]s, [[spiderwort]]s, [[tule]]s, [[water hyacinth]]s, and other plants in the [[commelinid]] [[clade]]",
parents = {"plants"},
}
labels["composites"] = {
type = "set",
description = "=[[artichoke]]s, [[aster]]s, [[chamomile]], [[chrysanthemum]]s, [[daisy|daisies]], [[dandelion]]s, [[marigold]]s, [[sunflower]]s, [[thistle]]s, [[wormwood]]s and many other plants in the [[family]] [[Asteraceae]], also known as the [[Compositae]]",
parents = {"Asterales order plants"},
}
labels["conifers"] = {
type = "set",
parents = {"gymnosperms", "trees", "shrubs"},
}
labels["Coreopsideae tribe plants"] = {
type = "set",
description = "=[[beggar's ticks]] or [[bur marigold]]s, [[calliopsis]], [[coreopsis]], [[cosmos]], [[cota]], [[dahlia]]s, [[tickseed]]s and other plants in the [[tribe]] [[Coreopsideae]] of the daisy family, [[Asteraceae]]",
parents = {"composites"},
}
labels["Cornales order plants"] = {
type = "set",
description = "=[[assegai]], [[blazing star]], [[bunchberry]], [[cornel]], [[dogwood]]s, [[hydrangea]]s, [[tupelo]]s, and other plants in the [[order]] [[Cornales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["crucifers"] = {
type = "set",
description = "=[[alyssum]], [[cabbage]]s, [[cress]]es, [[mustard]]s, [[radish]]es, [[rocket]]s, [[stock]]s, [[turnip]]s, [[wallflower]]s and other plants in the [[family]] [[Brassicaceae]] (formerly known as the [[Cruciferae]])",
parents = {"Brassicales order plants"},
}
labels["Cucurbitales order plants"] = {
type = "set",
description = "=plants in the [[order]] [[Cucurbitales]]",
parents = {"plants"},
}
labels["Cucurbitas"] = {
type = "set",
description = "=[[marrow]]s, [[pumpkin]]s, [[squash]]es and other plants in the [[genus]] ''[[Cucurbita]]''",
parents = {"gourd family plants"},
}
labels["custard apple family plants"] = {
type = "set",
description = "=trees and shrubs in the [[family]] [[Annonaceae]]",
parents = {"Magnoliids", "trees", "shrubs"},
}
labels["cycads"] = {
type = "set",
description = "=primitive palm-tree-like [[gymnosperm]]s in the [[division]] [[Cycadophyta]]",
parents = {"gymnosperms"},
}
labels["cypress family plants"] = {
type = "set",
description = "=[[alerce]]s, [[arborvitae]]s, [[bald cypress]]es, [[cryptomeria]]s, [[cunninghamia]]s, [[cypress]]es, [[incense cedar]]s, [[juniper]]s, [[redwood]]s, [[sandarac]]s, and other trees and shrubs in the [[family]] [[Cupressaceae]]",
parents = {"conifers"},
}
labels["Cynodonteae tribe grasses"] = {
type = "set",
description = "=[[Bermuda grass]], [[deergrass]], [[goosegrass]], [[finger millet]], [[grama]], [[muhly]], [[saltgrass]], [[scratchgrass]], and other grasses in the [[tribe]] [[Cynodonteae]]",
parents = {"grasses"},
}
labels["Dalbergieae tribe plants"] = {
type = "set",
description = "=[[ambatch]], [[cocuswood]], [[deervetch]], [[padauk]], [[pallisander]], [[peanut]]s, [[pencil flower]]s, [[red sanders]], [[rosewood]]s, [[shola]], [[sissoo]], [[Tahitian chestnut]], [[tipu]], and other plants in the [[tribe]] [[Dalbergieae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Daturas"] = {
type = "set",
description = "=plants in the [[genus]] ''[[Datura]]''",
parents = {"nightshades", "recreational drugs"},
}
labels["Detarioideae subfamily plants"] = {
type = "set",
description = "=plants in the [[subfamily]] [[Detarioideae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Dioscoreales order plants"] = {
type = "set",
description = "=[[black bryony]], [[bog asphodel]]s, [[Polynesian arrowroot]], [[unicorn root]], [[yam]]s, and other plants in the [[order]] [[Dioscoreales]]",
parents = {"plants"},
}
labels["dillenia family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Dilleniaceae]]",
parents = {"plants"},
}
labels["dogbane family plants"] = {
type = "set",
description = "=[[carrion flower]]s, [[desert rose]], [[dogbane]]s, [[hoodia]], [[hoya]]s, [[milkweed]]s, [[Natal plum]], [[oleander]]s, [[periwinkle]]s, [[plumeria]]s and other plants in the [[family]] [[Apocynaceae]] (including the former family [[Asclepiadaceae]])",
parents = {"Gentianales order plants"},
}
labels["ebony family plants"] = {
type = "set",
description = "=[[ebony]], [[black sapote]] and [[persimmon]]s in the [[genus]] ''[[Diospyros]]'', [[guarri]] in the genus ''[[Euclea]]'', and other plants in the family [[Ebenaceae]]",
parents = {"Ericales order plants"},
}
labels["ephedras"] = {
type = "set",
description = "=plants in the [[genus]] ''[[Ephedra]]'', the only members of the [[gymnosperm]] [[family]] [[Ephedraceae]]",
parents = {"gymnosperms"},
}
labels["Ericales order plants"] = {
type = "set",
description = "=[[arbutus]], [[benjamin]], [[blueberry|blueberries]], [[brazil nut]]s, [[boojum]], [[camellia]]s, [[cobra lily]], [[cyclamen]]s, [[ebony]], [[jewelweed]], [[kiwifruit]], [[manzanita]]s, [[ocotillo]], [[persimmon]]s, [[phlox]]es, [[pipsissewa]], [[pitcher plant]]s, [[primrose]]s, [[rhododendron]]s, [[sapote]], [[shea]] tree, [[snowbell]]s, [[summersweet]], [[tea]], and other plants in the [[order]] [[Ericales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["eucalypts"] = {
type = "set",
description = "=[[eucalypt]]s – woody plants with capsule-fruiting bodies belonging to seven closely related genera found across Australasia: ''Eucalyptus'', ''Corymbia'', ''Angophora'', ''Stockwellia'', ''Allosyncarpia'', ''Eucalyptopsis'' and ''Arillastrum''",
parents = {"Myrtle family plants", "trees"},
}
labels["Eupatorieae tribe plants"] = {
type = "set",
description = "=[[ageratum]]s, [[blazing star]]s, [[boneset]]s, [[deer's tongue]], [[hempvine]], [[joe-pye weed]], [[stevia]], [[thoroughwort]]s, [[trumpetweed]]s, and other plants in the [[composite]] tribe Eupatorieae",
parents = {"composites"},
}
labels["evening primrose family plants"] = {
type = "set",
description = "=[[clarkia]]s, [[enchanter's nightshade]], [[evening primrose]]s, [[fuchsia]]s, [[suncup]]s, [[willowherb]]s and other plants in the [[family]] [[Onagraceae]] (not to be confused with the true [[primrose]]s in the family [[Primulaceae]])",
parents = {"Myrtales order plants", "flowers"},
}
labels["Fabales order plants"] = {
type = "set",
description = "=plants in the [[order]] [[Fabales]]",
parents = {"plants"},
}
labels["Fabeae tribe plants"] = {
type = "set",
description = "=[[beach pea]]s, [[fava bean]]s, [[lentil]]s, [[pea]]s, [[sweet pea]]s, [[vetch]]es, and other plants in the [[tribe]] [[Fabeae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Fagales order plants"] = {
type = "set",
description = "=[[alder]]s, [[bayberry|bayberries]], [[beech]]es, [[birch]]es, [[butternut]]s, [[chestnut]]s, [[hazel]]s, [[hickory|hickories]], [[hornbeam]]s, [[oak]]s, [[pecan]]s, [[she-oak]]s, [[sweet gale]], [[walnut]]s, [[wingnut]]s, and other plants in the [[order]] [[Fagales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["ferns"] = {
type = "set",
parents = {"spore plants"},
}
labels["fig trees"] = {
type = "set",
parents = {"mulberry family plants", "trees"},
}
labels["figwort family plants"] = {
type = "set",
description = "=[[figwort]]s, [[butterfly bush]]es, [[emu bush]]es, [[mudwort]]s, [[mullein]]s, [[myoporum]]s, [[nemesia]]s, and many other plants in the [[family]] [[Scrophulariaceae]], but not including many such as [[foxglove]]s and [[snapdragon]]s that are now in the [[Plantaginaceae]] as well as [[Indian paintbrush]]es and [[lousewort]]s/[[wood betony|wood betonies]], now in the [[Orobanchaceae]]",
parents = {"Lamiales order plants"},
}
labels["flowers"] = {
type = "set",
parents = {"plants"},
}
labels["four o'clock family plants"] = {
type = "set",
description = "=[[bougainvillea]]s, [[cabbagewood]], [[four o'clock]]s, [[mauka]], [[pisonia]]s, [[punarnava]], [[sand verbena]]s, [[spiderling]]s, [[tarvine]]s, [[wishbone bush]], and other plants in the [[family]] [[Nyctaginaceae]]",
parents = {"Caryophyllales order plants"},
}
labels["Galegeae tribe plants"] = {
type = "set",
description = "=[[goat's rue]], [[bladder senna]], [[glory pea]], [[kakabeak]], [[licorice]], [[locoweed]] or [[milkvetch]], [[tragacanth]] and other plants in the [[tribe]] [[Galegeae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Garcinieae tribe plants"] = {
type = "set",
description = "=[[saptree]]s, [[mangosteen]]s, and other plants in the [[tribe]] [[Garcinieae]] of the [[family]] [[Clusiaceae]]",
parents = {"Clusiaceae family plants"},
}
labels["Genisteae tribe plants"] = {
type = "set",
description = "=[[broom]]s, [[furze]]/[[gorse]], [[laburnum]], [[lupine]]s, [[tagasaste]], [[whin]], [[woad-waxen]], and other plants in the [[tribe]] [[Genisteae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["gentian family plants"] = {
type = "set",
description = "=[[gentian]]s, [[bitterwort]], [[canchalagua]], [[centaury|centauries]], [[fieldwort]]s, [[yellowwort]], and other plants in the [[family]] [[Gentianaceae]]",
parents = {"Gentianales order plants"},
}
labels["Gentianales order plants"] = {
type = "set",
description = "=plants in the order [[Gentianales]]",
parents = {"plants"},
}
labels["Geraniales order plants"] = {
type = "set",
description = "=[[cranesbill]]s, [[filaree]]s, [[francoa]]s, [[geranium]]s, [[herb Robert]], [[honeybush]], [[pelargonium]]s, [[storksbill]]s, and other plants in the [[order]] [[Geraniales]]",
parents = {"plants"},
}
labels["ginger family plants"] = {
type = "set",
description = "= [[cardamom]], [[galangal]], [[ginger]]s, [[grains of paradise]], [[turmeric]], [[zedoary]], and other plants in the family [[Zingiberaceae]]",
parents = {"Zingiberales order plants", "spices and herbs"},
}
labels["Gnaphalieae tribe plants"] = {
type = "set",
description = "=[[billy buttons]], [[cudweed]]s, [[everlasting]]s, [[curry plant]], [[pussytoes]], [[strawflower]]s, [[vegetable sheep]] and other plants in the [[composite]] [[tribe]] [[Gnaphalieae]]",
parents = {"composites"},
}
labels["goosefoot subfamily plants"] = {
type = "set",
description = "=[[epazote]], [[hopsage]], [[lamb's quarters]], [[orach]], [[quinoa]], [[saltbush]], [[spinach]], [[winterfat]] and other plants in the [[subfamily]] [[Chenopodioideae]] of the [[family]] [[Amaranthaceae]]",
parents = {"amaranths and goosefoots"},
}
labels["gourd family plants"] = {
type = "set",
description = "= [[cucumber]]s, [[gourd]]s, [[melon]]s, [[squash]]es, and other plants in the family [[Cucurbitaceae]]",
parents = {"Cucurbitales order plants"},
}
labels["grape family plants"] = {
type = "set",
description = "=[[grapevine]]s, [[Boston ivy]], [[Virginia creeper]]. and other plants in the family [[Vitaceae]]",
parents = {"plants"},
}
labels["grapevines"] = {
type = "set",
parents = {"grape family plants", "wine"},
}
labels["grasses"] = {
type = "set",
description = "=[[grass]]es",
parents = {"commelinids"},
}
labels["groundcherries"] = {
type = "set",
description = "=[[groundcherry|groundcherries]], [[alkekengi]]s, [[Cape gooseberry|Cape gooseberries]], [[Chinese lantern]]s, [[goldenberry|goldenberries]], [[tomatillo]]s, and other plants in the [[genus]] ''[[Physalis]]'' and related [[genera]] in the [[nightshade]] [[subtribe]] [[Physalinae]], notable for bearing a [[tomato]]like fruit enclosed in a papery husk.",
parents = {"nightshades"},
}
labels["gymnosperms"] = {
type = "set",
description = "=various unrelated groups of [[seed plant]]s other than the [[flowering plant]]s",
parents = {"plants"},
}
labels["heather family plants"] = {
type = "set",
description = "=[[heather]]s, [[blueberry|blueberries]], [[rhododendron]]s, [[wintergreen]], and other plants in the family [[Ericaceae]]",
parents = {"Ericales order plants"},
}
labels["Heliantheae tribe plants"] = {
type = "set",
description = "=[[balsamroot]]s, [[brittlebush]], [[burrobrush]], [[cocklebur]]s, [[coneflower]]s, [[echinacea]], [[guayule]], [[Jerusalem artichoke]]s, [[mule's ears]], [[ox-eye daisy|ox-eye daisies]], [[pilotweed]]s, [[ragweed]]s, [[rosinweed]]s, [[sunflower]]s, [[tithonia]]s, [[zinnia]]s and other [[plant]]s in the [[composite]] [[tribe]] [[Heliantheae]]",
parents = {"composites"},
}
labels["hemp family plants"] = {
type = "set",
description = "=[[hemp]], [[hops]], [[hackberries]], and other plants in the family [[Cannabaceae]]",
parents = {"Rosales order plants"},
}
labels["herbs"] = {
type = "set",
parents = {"plants", "spices and herbs"},
}
labels["hollies"] = {
type = "set",
parents = {"plants", "shrubs", "trees"},
}
labels["honeysuckle family plants"] = {
type = "set",
description = "=[[abelia]]s, [[cornsalad]], [[honeysuckle]]s, [[scabious]], [[snowberry|snowberries]], [[spikenard]], [[teasel]]s, [[twinflower]]s, [[valerian]]s, and other plants in the [[family]] [[Caprifoliaceae]], including those in the former families [[Dipsacaceae]], [[Linnaeaceae]], and [[Valerianaceae]]",
parents = {"plants", "shrubs"},
}
labels["Hordeeae tribe grasses"] = {
type = "set",
description = "=[[barley]], [[emmer]], [[foxtail barley]], [[goatgrass]], [[lyme grass]], [[medusahead]], [[quackgrass]], [[rye]], [[spelt]], [[squirreltail]], [[wheat]], [[wheatgrass]], [[wild rye]], and other grasses in the [[tribe]] [[Hordeeae]], also known as the [[Triticeae]]",
parents = {"grasses"},
}
labels["horsetails"] = {
type = "set",
description = "=[[horsetail]]s, [[calamite]]s, and other plants in the [[taxon]] known as the [[subclass]] [[Equisetidae]] or either the [[class]] [[Equisetopsida]] or the class [[Sphenopsida]], depending on the classification system used",
parents = {"spore plants"},
}
labels["incense tree family plants"] = {
type = "set",
description = "=[[abilo]], [[Chinese olive]], [[elephant tree]], [[frankincense]], [[gumbo limbo]], [[myrrh]], [[pili nut]]s, and other plants in the family [[Burseraceae]]",
parents = {"plants", "shrubs", "trees"},
}
labels["iris family plants"] = {
type = "set",
description = "=[[crocus]]es, [[freesia]]s, [[gladiolus]]es, [[iris]]es, [[ixia]]s, [[sparaxis]], [[watsonia]]s, and other plants in the family [[Iridaceae]]",
parents = {"Asparagales order plants", "flowers"},
}
labels["Lamiales order plants"] = {
type = "set",
description = "=[[acanthus]]es, [[African violet]]s, [[ash]]es, [[betony]], [[brooklime]], [[butterfly bush]], [[catalpa]]s, [[chaste tree]], [[devil's claw]], [[eyebright]], [[foxglove]]s, [[hyssop]]s, [[jasmine]]s, [[lavender]]s, [[lilac]]s, [[lousewort]]s, [[mare's tail]], [[mint]]s, [[monkeyflower]]s, [[mullein]], [[olive]]s, [[oregano]]s, [[plantain]]s, [[privet]]s, [[sage]]s, [[sesame]], [[skullcap]]s, [[snapdragon]]s, [[teak]], [[thyme]]s, [[verbena]]s and other plants in the [[order]] [[Lamiales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["Lamioideae subfamily plants"] = {
type = "set",
description = "=[[bells of Ireland]], [[betony]], [[crosne]], [[deadnettle]], [[hemp-nettle]], [[henbit]], [[horehound]], [[ironwort]], [[Jerusalem sage]], [[lamb's ears]], [[lion's ear]], [[motherwort]], [[mountain tea]], [[obedient plant]], [[patchouli]], and other plants in the [[subfamily]] [[Lamioideae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants"},
}
labels["laurel family plants"] = {
type = "set",
description = "=plants in the family [[Lauraceae]]",
parents = {"Magnoliids", "trees", "shrubs"},
}
labels["legumes"] = {
type = "set",
description = "=plants in the family [[Fabaceae]], also known as the [[Leguminosae]]",
parents = {"Fabales order plants", "shrubs", "trees"},
}
labels["Liliales order plants"] = {
type = "set",
description = "=[[beargrass]], [[death camas]], [[false hellebore]], [[greenbrier]], [[herb Paris]], [[lily|lilies]], [[meadow saffron]], [[supplejack]], [[sarsparilla]], [[trillium]]s, [[tulip]]s, [[turkey's beard]], and other plants, in the [[order]] [[Liliales]]",
parents = {"plants"},
}
labels["lily family plants"] = {
type = "set",
description = "=plants in the family [[Liliaceae]]",
parents = {"Liliales order plants", "flowers"},
}
labels["madder family plants"] = {
type = "set",
description = "=[[bedstraw]], [[cinchona]], [[coffee]], [[gardenia]]s, [[ipecacuanha]], [[madder]], [[noni]], [[woodruff]], and other plants in the [[family]] [[Rubiaceae]]",
parents = {"Gentianales order plants", "shrubs"},
}
-- FIXME, should be lowercase.
labels["Magnoliids"] = {
type = "set",
description = "=[[allspice]], [[avocado]]s, [[black pepper]], [[champac]], [[cinnamon]], [[custard apple]]s, [[kava]], [[laurel]]s, [[magnolia]]s, [[nutmeg]], [[pipevine]]s, [[sassafras]]es, [[sweetshrub]]s, [[star anise]], [[tulip tree]], [[Winter's bark]], [[yerba mansa]], [[ylang-ylang]], and other plants in the [[Magnoliids]] [[clade]]",
parents = {"plants"},
}
labels["mahogany family plants"] = {
type = "set",
description = "=[[chinaberry]], [[langsat]], [[mahogany]], [[neem]], [[Spanish cedar]]s, [[toon]], [[santol]], and other plants in the [[family]] [[Meliaceae]]",
parents = {"trees", "shrubs"},
}
labels["maize (plant)"] = {
type = "set",
description = "=[[maize]] (''[[Zea mays]]'') as a plant, and for its various types",
additional = "For maize as a crop, see [[:Category:Maize (crop)]] and for maize as a food, see [[:Category:Maize (food)]].",
parents = {"Andropogoneae tribe grasses", "grains"},
}
labels["mallow family plants"] = {
type = "set",
description = "=[[balsa]], [[cacao]], [[cotton]], [[durian]]s, [[jute]], [[kola]]s, [[kurrajong]]s, [[hibiscus]]es, [[linden]]s, [[mallow]]s, [[peanut tree]]s, [[phalsa]], [[silk-cotton tree]]s, and other plants in the current [[family]] [[Malvaceae]], including a number of former families such as the [[Bombacaceae]], [[Sterculiaceae]], and the [[Tiliaceae]]",
parents = {"Malvales order plants", "shrubs"},
}
labels["mallow subfamily plants"] = {
type = "set",
description = "=[[abelmosk]], [[cotton]], [[hibiscus]]es, [[hollyhock]]s, [[mallow]]s, [[okra]], and other plants in the traditional [[family]] [[Malvaceae]], which is now considered to be the [[subfamily]] [[Malvoideae]] within the current [[Malvaceae]]",
parents = {"mallow family plants"},
}
labels["Malpighiales order plants"] = {
type = "set",
description = "=plants in the order [[Malpighiales]]",
parents = {"plants"},
}
labels["Malvales order plants"] = {
type = "set",
description = "=[[agalloch]], [[annatto]], [[balsa]], [[cacao]], [[cotton]], [[daphne]]s, [[durian]]s, [[jute]], [[hibiscus]]es, [[linden]]s, [[mallow]]s, [[rockrose]]s, [[sal]], [[silk-cotton tree]]s, [[tie bush]], and other plants in the [[order]] [[Malvales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["maples"] = {
type = "set",
parents = {"soapberry family plants", "trees"},
}
labels["Menthinae subtribe plants"] = {
type = "set",
description = "=[[American pennyroyal]], [[basil thyme]], [[bee balm]], [[calamint]], [[horsemint]], [[mint]]s, [[marjoram]], [[mountain mint]], [[oregano]], [[savory|savories]], [[thyme]]s and other plants in the [[subtribe]] [[Menthinae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants", "spices and herbs"},
}
labels["mimosa subfamily plants"] = {
type = "set",
description = "=[[acacia]]s, [[ice-cream bean]]s, [[mesquite]]s, [[mimosa]]s, [[rain tree]]s, and other plants in the [[subfamily]] [[Mimosoideae]] of the [[family]] [[Fabaceae]], which has been reclassified as a [[clade]] within the [[subfamily]] [[Caesalpinioideae]]",
parents = {"legumes", "caesalpinia subfamily plants"},
}
labels["mint family plants"] = {
type = "set",
description = "=[[balms]], [[basil]]s, [[betony]], [[coleus]]es, [[deadnettle]]s, [[ground ivy]], [[hyssop]]s, [[lavender]]s, [[mint]]s, [[oregano]]s, [[patchouli]], [[perilla]], [[sage]]s, [[savory|savories]], [[selfheal]], [[skullcap]]s, [[thyme]]s, and other plants in the [[family]] [[Lamiaceae]], also known as the [[Labiatae]]",
parents = {"Lamiales order plants", "spices and herbs"},
}
labels["mints"] = {
type = "set",
description = "=the true [[mint]]s, plants in the [[genus]] ''[[Mentha]]''",
parents = {"mint family plants", "Menthinae subtribe plants"},
}
labels["morning glory family plants"] = {
type = "set",
description = "=[[bindweed]]s, [[dichondra]], [[dodder]], [[morning glory|morning glories]], [[sweet potato|sweet potatoes]], [[wood rose]]s and other plants in the [[family]] [[Convolvulaceae]]",
parents = {"plants"},
}
labels["moschatel family plants"] = {
type = "set",
description = "=[[elderberry|elderberries]], [[moschatel]], [[viburnum]]s, and other plants in the [[family]] [[Adoxaceae]]",
parents = {"plants", "shrubs", "trees"},
}
labels["mosses"] = {
type = "set",
description = "=true [[moss]]es, plants in the [[division]] [[Bryophyta]] (excluding [[hornwort]]s and [[liverwort]]s), which doesn't include [[lichen]]s, [[club moss]]es, [[spike moss]]es, [[algae]], or mossy [[flowering plant]]s such as [[Irish moss]], or [[Spanish moss]]",
parents = {"spore plants", "bryology"},
}
labels["mulberry family plants"] = {
type = "set",
description = "=[[mulberry|mulberries]], [[breadfruit]], [[fig]]s and other trees in the family [[Moraceae]]",
parents = {"Rosales order plants", "trees"},
}
labels["Myrtales order plants"] = {
type = "set",
description = "=[[allspice]], [[arjuna]], [[bottlebrush]], [[clove]]s, [[eucalyptus]]es, [[evening primrose]]s, [[guava]]s, [[henna]], [[leadwood]], [[lilly-pilly]], [[loosestrife]]s, [[myrobalan]]s, [[myrtle]]s, [[pomegranate]]s, [[quaruba]], [[Rangoon creeper]], [[rose apple]]s, [[tea tree]], [[tropical almond]]s, [[water caltrop]]s, [[white mangrove]]s, [[willowherb]]s, and other plants, shrubs and trees in the [[order]] [[Myrtales]]",
parents = {"plants", "shrubs", "trees"},
}
labels["myrtle family plants"] = {
type = "set",
description = "=plants in the [[family]] [[Myrtaceae]]",
parents = {"Myrtales order plants", "trees", "shrubs"},
}
labels["Nepetinae subtribe plants"] = {
type = "set",
description = "=[[anise hyssop]], [[catnip]], [[dragonhead]], [[ground-ivy]], [[hyssop]], [[Korean mint]], [[licorice mint]], and other plants in the [[subtribe]] [[Nepetinae]] of the mint family, [[Lamiaceae]]",
parents = {"mint family plants"},
}
labels["nettle family plants"] = {
type = "set",
description = "=[[baby's tears]], [[clearweed]], [[nettle]]s, [[ramie]], and other plants in the [[family]] [[Urticaceae]]",
parents = {"Rosales order plants"},
}
labels["nightshades"] = {
type = "set",
description = "=[[ashwagandha]], [[black nightshade]], [[boxthorn]]s, [[datura]]s, [[deadly nightshade]], [[eggplant]]s, [[goji]], [[henbane]], [[mandrake]], [[matrimony vine]], [[pepper]]s, [[petunia]]s, [[potato]]es, [[tobacco]], [[tomatillo]]s, [[tomato]]es and other plants in the family [[Solanaceae]]",
parents = {"plants"},
}
labels["Nymphaeales order plants"] = {
type = "set",
description = "=[[fanwort]]s, [[foxnut]]s, [[spatterdock]]s, [[water lily|water lilies]], [[water-shield]]s, and other plants in the [[order]] [[Nymphaeales]]",
parents = {"water plants"},
}
labels["oaks"] = {
type = "set",
description = "=[[oak]]s.\n\nMany languages recognize two main types: those with flat, [[deciduous]] leaves, and those with curled, often prickly, [[evergreen]] leaves (live oaks)",
parents = {"beech family plants", "trees"},
}
labels["olive family plants"] = {
type = "set",
description = "=[[olive]]s, [[ash]]es, [[jasmine]]s, [[lilac]]s, [[privet]]s and other plants in the family [[Oleaceae]]",
parents = {"Lamiales order plants"},
}
labels["orchids"] = {
type = "set",
description = "=plants in the [[family]] [[Orchidaceae]]",
parents = {"Asparagales order plants", "flowers"},
}
labels["Oryzeae tribe grasses"] = {
type = "set",
description = "=[[cutgrass]], [[rice]], [[wild rice]], and other grasses in the tribe [[Oryzeae]]",
parents = {"grasses"},
}
labels["Oxalidales order plants"] = {
type = "set",
description = "=[[bilimbi]], [[coachwood]], [[cudgerie]], [[makomako]], [[quandong]], [[rudraksha]], [[star fruit]], [[wood sorrel]]s, and other plants in the [[order]] [[Oxalidales]]",
parents = {"plants", "trees"},
}
labels["palm trees"] = {
type = "set",
description = "=[[palm]]s",
parents = {"commelinids", "trees"},
}
labels["Pandanales order plants"] = {
type = "set",
description = "=[[kiekie]], [[Panama hat palm]], [[pandanus]], [[stemona]], and other plants in the [[order]] [[Pandanales]]",
parents = {"plants", "trees"},
}
labels["Paniceae tribe grasses"] = {
type = "set",
description = "=[[burgrass]], [[basketgrass]], [[bristlegrass]]es, [[buffelgrass]], [[common millet]], [[crabgrass]], [[elephant grass]], [[foxtail millet]], [[fountaingrass]], [[Kikuyu grass]], [[Napier grass]], [[panicgrass]], [[Pará grass]], [[pigeongrass]], [[sandbur]], [[spinifex]], [[switchgrass]], [[watergrass]], and other grasses in the tribe [[Paniceae]]",
parents = {"grasses"},
}
labels["passion vine family plants"] = {
type = "set",
description = "=[[barbadine]]s, [[damiana]], [[granadilla]]s, [[maracock]]s, [[maypop]]s, [[passionflower]]s, [[water lemon]]s, and other plants in the [[family]] [[Passifloraceae]]",
parents = {"Malpighiales order plants"},
}
labels["peppers"] = {
type = "set",
description = "=[[aji]]s, [[chile]]s, [[pimiento]]s, [[sweet pepper]]s, and other plants in the [[genus]] ''[[Capsicum]]''",
parents = {"nightshades", "vegetables", "spices and herbs"},
}
labels["Phaseoleae tribe plants"] = {
type = "set",
description = "=[[azuki bean]]s, [[catjang]]s, [[Bambara groundnut]]s, [[Calabar bean]]s, [[coral tree]]s, [[green bean]]s, [[groundnut]]s, [[hyacinth bean]]s, [[jicama]], [[kidney bean]]s, [[kudzu]], [[mung bean]]s, [[pigeon pea]]s, [[runner bean]]s, [[snailflower]], [[soybean]]s, [[tepary]], [[winged bean]]s, [[yardlong bean]]s and other plants in the [[tribe]] [[Phaseoleae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Phaseolus beans"] = {
type = "set",
displaytitle = "''Phaseolus'' beans",
description = "=plants in the [[New World]] [[legume]] [[genus]] ''[[Phaseolus]]''",
parents = {"Phaseoleae tribe plants", "vegetables"},
}
labels["pines"] = {
type = "set",
parents = {"conifers"},
}
labels["Piperales order plants"] = {
type = "set",
description = "=[[betel pepper]], [[black pepper]], [[cubeb]], [[hoja santa]], [[kava]], [[lizard tail]], [[long pepper]], [[pipevine]], [[radiator plant]], [[wild ginger]], [[yerba mansa]], and other plants in the [[order]] [[Piperales]]",
parents = {"Magnoliids"},
}
labels["plantain family plants"] = {
type = "set",
description = "=[[bacopa]]s, [[brooklime]], [[foxglove]]s, [[mare's tail]], [[penstemon]]s, [[plantain]]s, [[snapdragon]]s, and many other plants in the [[family]] [[Plantaginaceae]], including many formerly included in the [[Scrophulariaceae]] and the [[Hippuridaceae]]",
parents = {"Lamiales order plants", "flowers"},
}
labels["podocarpus family plants"] = {
type = "set",
description = "=conifers in the family [[Podocarpaceae]]",
parents = {"conifers"},
}
labels["Poeae tribe grasses"] = {
type = "set",
description = "=[[beachgrass]], [[bentgrass]], [[bluegrass]], [[canary grass]], [[darnel]], [[fescue]], [[goldseed]], [[hair grass]], [[marram]], [[muttongrass]], [[nitgrass]], [[oat]]s, [[ribbongrass]], [[sweetgrass]], [[timothy]], and other grasses in the [[tribe]] [[Poeae]], including the former tribe [[Aveneae]]",
parents = {"grasses"},
}
labels["polynesian canoe plants"] = {
type = "set",
description = "=[[Polynesian]] [[canoe plant]]s, plants which the Polynesians are believed to have spread between islands before European contact",
parents = {"plants"},
}
labels["pome fruits"] = {
type = "set",
description = "=[[apple]]s, [[hawthorn]]s, [[pear]]s, [[quince]]s, [[serviceberry|serviceberries]] and other plants in [[subtribe]] [[Malinae]] of the family [[Rosaceae]]",
parents = {"rose family plants", "trees", "shrubs"},
}
labels["poppies"] = {
type = "set",
description = "=[[bleeding heart]], [[bloodroot]], [[celandine]], [[fumitory]], [[poppy|poppies]], and other plants in the family [[Papaveraceae]]",
parents = {"Ranunculales order plants"},
}
labels["primrose family plants"] = {
type = "set",
description = "=[[brookweed]], [[cyclamen]]s, [[marlberry]], [[pimpernel]]s, [[primrose]]s, [[shooting star]]s, [[snowbell]]s, [[starflower]]s and other plants in the family [[Primulaceae]], including the former [[family]] [[Myrsinaceae]]",
parents = {"Ericales order plants", "flowers"},
}
labels["proteales order plants"] = {
type = "set",
description = "=[[banksia]]s, [[grevillea]]s, [[hakea]]s, [[lotus]]es, [[macadamia]]s, [[plane]] trees, [[protea]]s, [[silk oak]]s, [[waratah]], and other plants in the [[order]] [[Proteales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["Prunus genus plants"] = {
type = "set",
displaytitle = "''Prunus'' genus plants",
description = "=[[almond]]s, [[apricot]]s, [[cherry|cherries]], [[peach]]es, [[plum]]s and other plants in the genus ''[[Prunus]]''",
parents = {"rose family plants", "stone fruits"},
}
labels["radishes"] = {
type = "set",
parents = {"crucifers", "vegetables"},
}
labels["Ranunculales order plants"] = {
type = "set",
description = "=[[akebia]], [[barberry|barberries]], [[buttercup]]s, [[calumba]], [[moonseed]]s, [[poppy|poppies]], [[serendipity berry]], and other plants in the [[order]] [[Ranunculales]]",
parents = {"plants"},
}
labels["Rosales order plants"] = {
type = "set",
description = "=[[agrimony]], [[almond]]s, [[apple]]s, [[baby's tears]], [[blackberry|blackberries]], [[breadfruit]], [[buffaloberry|buffaloberries]], [[buckthorn]]s, [[cherry|cherries]], [[elm]]s, [[fig]]s, [[hackberries]], [[hemp]], [[hop]]s, [[jujube]]s, [[mulberry|mulberries]], [[nettle]]s, [[oleaster]]s, [[Osage orange]], [[pilea]]s, [[plum]]s, [[rose]]s, [[spirea]]s, [[strawberry|strawberries]], [[zelkova]]s, and many other plants, trees and shrubs in the [[order]] [[Rosales]]",
parents = {"plants"},
}
labels["rose family plants"] = {
type = "set",
description = "=[[agrimony]], [[almond]]s, [[apple]]s, [[blackberry|blackberries]], [[cherry|cherries]], [[cinquefoil]]s, [[hawthorn]]s, [[meadowsweet]], [[rose]]s, [[strawberry|strawberries]], and many other plants, trees and shrubs in the family [[Rosaceae]]",
parents = {"Rosales order plants"},
}
labels["roses"] = {
type = "set",
parents = {"rose family plants", "flowers"},
}
labels["rue family plants"] = {
type = "set",
description = "=[[Amur cork tree]], [[boronia]]s, [[breath of heaven]], [[buchu]], [[citrus]]es, [[hoptree]], [[jaborandi]], [[prickly ash]]es, [[rue]], [[satinwood]]s, [[Sichuan pepper]], [[torchwood]]s, [[white sapote]]s and other plants in the [[family]] [[Rutaceae]]",
parents = {"Sapindales order plants", "trees", "shrubs"},
}
labels["rushes"] = {
type = "set",
description = "=plants in the family [[Juncaceae]]",
parents = {"commelinids", "water plants"},
}
labels["sages"] = {
type = "set",
description = "=plants in the [[genus]] ''[[Salvia]]'' (not to be confused with [[sagebrush]])",
parents = {"mint family plants", "herbs"},
}
labels["Santalales order plants"] = {
type = "set",
description = "=[[mistletoe]]s, [[quandong]], [[sandalwood]]s, and other plants in the [[order]] [[Santalales]]",
parents = {"plants"},
}
labels["Sapindales order plants"] = {
type = "set",
description = "=[[cashew]]s, [[Chinese olive]]s, [[chinaberry]], [[citrus]]es, [[frankincense]], [[jaborandi]], [[lychee]]s, [[mahogany]], [[mango]]s, [[maple]]s, [[myrrh]], [[neem]], [[pistachio]]s, [[poison ivy]], [[quassia]], [[rambutan]], [[rue]], [[Sichuan pepper]], [[soapberry]], [[sumac]]s, [[tamarind]], [[tree of heaven]], and many other plants, trees and shrubs in the [[order]] [[Sapindales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["sapote family plants"] = {
type = "set",
description = "=trees and shrubs in the family [[Sapotaceae]]",
parents = {"Ericales order plants"},
}
labels["Saxifragales order plants"] = {
type = "set",
description = "=[[alumroot]]s, [[astilbe]]s, [[currant]]s, [[foamflower]]s, [[gooseberry|gooseberries]], [[Indian rhubarb]], [[katsura]], [[London pride]], [[miterwort]]s, [[peony|peonies]], [[rockfoil]]s, [[saxifrage]]s, [[stonecrop]]s, [[sweet gum]]s, [[watermilfoil]]s, [[witch hazel]]s, [[youth-on-age]], and other plants in the [[order]] [[Saxifragales]]",
parents = {"plants", "trees", "shrubs"},
}
labels["Scandiceae tribe plants"] = {
type = "set",
description = "=[[asafoetida]], [[carrot]]s, [[chervil]], [[cicely]], [[cumin]], [[lady's comb]], [[laserwort]], and other plants in the [[tribe]] [[Scandiceae]] of the celery [[family]], [[Apiaceae]]",
parents = {"celery family plants"},
}
labels["sedges"] = {
type = "set",
description = "=plants in the family [[Cyperaceae]]",
parents = {"commelinids"},
}
labels["Selineae tribe plants"] = {
type = "set",
description = "=[[angelica]], [[arracacha]], [[biscuitroot]], [[dog parsley]], [[dong quai]], [[hog fennel]], [[masterwort]], and other plants in the [[tribe]] [[Selineae]] of the celery [[family]], [[Apiaceae]]",
parents = {"celery family plants"},
}
labels["Senecioneae tribe plants"] = {
type = "set",
description = "=[[butterbur]]s, [[cineraria]]s, [[coltsfoot]]s, [[dusty miller]], [[groundsel]]s, [[leopardsbane]], [[ragwort]]s, [[string of pearls]], and other plants in the [[composite]] tribe [[Senecioneae]]",
parents = {"composites"},
}
labels["shrubs"] = {
type = "set",
parents = {"plants"},
wpcat = true,
commonscat = true,
}
labels["soapberry family plants"] = {
type = "set",
description = "=plants in the family [[Sapindaceae]]",
parents = {"Sapindales order plants", "trees", "shrubs"},
}
labels["solanums"] = {
type = "set",
description = "=[[bittersweet]], [[black nightshade]] [[buffalo bur]], [[eggplant]]s, [[Jerusalem cherry]], [[kangaroo apple]], [[pepino melon]], [[potato]]es, [[tamarillo]], [[tomato]]es, [[wonderberry]] and other plants in the [[genus]] ''[[Solanum]]''",
parents = {"nightshades", "vegetables"},
}
labels["spore plants"] = {
type = "set",
description = "=a number of unrelated true plants that reproduce by [[spore]]s, such as [[moss]]es, [[liverwort]]s, [[horsetail]]s and [[fern]]s, formerly classified as [[cryptogam]]s",
parents = {"plants"},
}
labels["spurges"] = {
type = "set",
description = "=[[candlenut]]s, [[cassava]], [[castor bean]]s, [[croton]]s, [[poinsettia]]s, [[rubber tree]]s, [[spurge]]s, [[tallow tree]]s, and other plants in the [[family]] [[Euphorbiaceae]]",
parents = {"Malpighiales order plants"},
}
labels["staff vine family plants"] = {
type = "set",
description = "=[[bittersweet]], [[burning bush]], [[candlewood]], [[grass of Parnassus]], [[khat]], [[mayten]], [[paxistima]]s, [[spindle tree]]s, [[staff vine]]s, [[thunder god vine]], [[wahoo]], and other plants in the family [[Celastraceae]]",
parents = {"plants", "shrubs"},
}
labels["stone fruits"] = {
type = "set",
description = "=[[fruit#Noun|fruit]] which are [[drupe]]s (having a [[fleshy]] portion surrounding a hard [[pit#Noun|pit]] or [[stone#Noun|stone]] containing a [[seed#Noun|seed]]). Plants that produce drupes include [[cashew]], [[coffee]], [[jujube]], [[mango]], [[olive]], most [[palm#Noun|palms]] (including [[açaí]], [[coconut]], [[date#Noun|date]], [[oil palm]]s, and [[sabal]]), [[pistachio]], and all members of the [[genus]] ''[[Prunus]]'' (including the [[almond]], [[apricot]], [[cherry]], [[damson]], [[nectarine]], [[peach]], and [[plum#Noun|plum]])",
parents = {"fruits", "shrubs", "trees"},
}
labels["stonecrop family plants"] = {
type = "set",
description = "=[[succulent]]s in the family [[Crassulaceae]]",
parents = {"Saxifragales order plants", "succulents"},
}
labels["succulents"] = {
type = "set",
description = "=plants with thickened, fleshy leaves or stems for storing water",
parents = {"plants"},
}
labels["sumac family plants"] = {
type = "set",
description = "=[[sumac]]s, [[cashew]]s, [[pistachio]]s, [[poison ivy]] and other plants in the family [[Anacardiaceae]]",
parents = {"Sapindales order plants", "trees", "shrubs"},
}
labels["thistles"] = {
type = "set",
description = "=[[artichoke]]s, [[burdock]]s, [[cardoon]]s, [[costus]], [[knapweed]]s, [[safflower]], [[sawwort]], [[thistle]]s and other plants in the [[tribe]] [[Cynareae]] (also known as the [[Cardueae]]) of the [[family]] [[Asteraceae]]",
parents = {"composites"},
}
labels["tomatoes"] = {
type = "set",
description = "=plants in the cultivated [[species]] ''[[Solanum lycopersicum]]'' and its wild relative, ''[[Solanum pimpinellifolium]]''",
parents = {"nightshades", "solanums", "vegetables"},
}
labels["trees"] = {
type = "set",
parents = {"plants"},
wpcat = true,
commonscat = true,
}
labels["Trifolieae tribe plants"] = {
type = "set",
description = "=[[alfalfa]], [[alsike]], [[burclover]], [[clover]], [[fenugreek]], [[medick]], [[melilot]], [[restharrow]], and other plants in the [[tribe]] [[Trifolieae]] of the [[family]] [[Fabaceae]]",
parents = {"legumes"},
}
labels["Vigna beans"] = {
type = "set",
displaytitle = "''Vigna'' beans",
description = "=plants in the Asian [[legume]] [[genus]] ''[[Vigna]]'', including [[black-eyed pea]]s, [[Bambara groundnut]]s and what are variously called [[bean]]s, [[dal]]s or [[gram]]s",
parents = {"Phaseoleae tribe plants", "vegetables"},
}
labels["violet family plants"] = {
type = "set",
description = "=[[Johnny-jump-up]]s, [[mahoe]], [[pansy|pansies]], [[viola]]s, [[violet]]s, [[whiteywood]] and other plants in the family [[Violaceae]]",
parents = {"Malpighiales order plants"},
}
labels["Vitales order plants"] = {
type = "set",
displaytitle = "''Vitales'' order plants",
description = "=[[grape]]s and other plants in the ''[[Vitales]]'' order",
parents = {"plants"},
}
labels["walnut family plants"] = {
type = "set",
description = "=[[walnut]]s, [[butternut]]s, [[hickory|hickories]], [[pecan]]s, and other trees in the family [[Juglandaceae]]",
parents = {"trees", "nuts"},
}
labels["water plants"] = {
type = "set",
parents = {"plants"},
}
labels["willows and poplars"] = {
type = "set",
description = "=plants in the family [[Salicaceae]]",
parents = {"Malpighiales order plants", "trees"},
}
labels["Zingiberales order plants"] = {
type = "set",
description = "=[[arrowroot]], [[banana]]s, [[bird of paradise|birds of paradise]], [[canna]]s, [[ginger]]s, [[prayer plant]], and other plants in the [[order]] [[Zingiberales]]",
parents = {"commelinids"},
}
return labels
fsxby2188z2ebrak3ztyzr313sbmg82
Mòideal:category tree/topic/Miscellaneous
828
17761
88463
2025-06-07T21:54:54Z
en>Benwing
0
Changed protection settings for "[[Module:category tree/topic/Miscellaneous]]": per discussion at [[Wiktionary:Beer_parlour/2025/June#upped_protection_for_category_tree_topic_data_pages]] ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88463
Scribunto
text/plain
local labels = {}
labels["miscellaneous"] = {
type = "grouping",
description = "{{{langname}}} topics that do not currently fit elsewhere.",
parents = {"all topics"},
}
labels["collectives"] = {
type = "set",
description = "=[[entity|entities]] involving or consisting of a [[congregation]] or [[membership]]",
parents = {"miscellaneous"},
}
return labels
d5ubr801yntpm4rr035twu7kz5zv6b7
88464
88463
2026-07-27T01:17:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:category_tree/topic/Miscellaneous]]
88463
Scribunto
text/plain
local labels = {}
labels["miscellaneous"] = {
type = "grouping",
description = "{{{langname}}} topics that do not currently fit elsewhere.",
parents = {"all topics"},
}
labels["collectives"] = {
type = "set",
description = "=[[entity|entities]] involving or consisting of a [[congregation]] or [[membership]]",
parents = {"miscellaneous"},
}
return labels
d5ubr801yntpm4rr035twu7kz5zv6b7