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("&#x21;", "!") :gsub("&#x3F;", "?") tr = rsub(tr, "%f[^%z%p%s](.)(.-[%.%?!‽])", function(m1, m2) return uupper(m1) .. m2 end) tr = tr:gsub("!", "&#x21;") :gsub("%?", "&#x3F;") 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 = "&#91;" .. norm .. "&#93;" 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&nbsp; |- | 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&nbsp; |- | 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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 &ndash; 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. \"&lt;&lt;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. \"&lt;&lt;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('"', "&quot;") -- & in attributes is automatically escaped. -- :gsub("&", "&amp;") :gsub("<", "&lt;") :gsub(">", "&gt;") 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('"', "&quot;") -- & in attributes is automatically escaped. -- :gsub("&", "&amp;") :gsub("<", "&lt;") :gsub(">", "&gt;") 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>&amp;#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>&amp;#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&#035;"}, 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&#035;"}, 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 &mdash; 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 &mdash; 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