Wiktionary
gdwiktionary
https://gd.wiktionary.org/wiki/Pr%C3%AComh-Dhuilleag
MediaWiki 1.47.0-wmf.13
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
Teamplaid:bor
10
11419
88512
2019-04-21T06:44:19Z
en>Chuck Entz
0
Protected "[[Template:bor]]": Highly visible template/module ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88512
wikitext
text/x-wiki
#REDIRECT [[Template:borrowed]]
kpp8xbtfnpsehnjcskr4y69rkhd28xd
88513
78093
2026-07-30T09:54:17Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:bor]]
78093
wikitext
text/x-wiki
{{#switch: {{{1|}}}
|1={{sai|1}}
|2={{sai|2}}
|3=Bororo
|4=of Bororo
|5={{sai|5}}
|6={{sai|6}}
|7={{sai|7}}
|t=f
|c-t=f
|ac|cinnteach|cinn|dn|def|definite=a' Bhororo
|aa|ann|sa|in|pp=sa Bhororo
|g=Bororo
|#Default=Bororo}}<noinclude>
<!-- From an email From: fios@akerbeltz.org Sent: Tuesday, July 17, 2018 8:22 AM To: Kibi78704 Subject: Re: Hàlo (warning: long-ish)
Akerbeltz is writing:
Anyway, because I saw Apaitis, we had to come up with some rules of engagement and they are (from memory) as follows:
1 Major/Key languages are localized (Cuimris, Eadailtis, Sìnis...), size, known-ness and proximity contribute
2 languages where English uses the native form or loans from other languages are (if 1 doesn't apply), retained as such e.g. Ainu = Ainu; Jicarilla = Jicarilla
3 languages where English suffixes, -(a)is and/or -(e)ach as appropriate can be added to the English: Aleut > Aleutais
4 -ese usually gets Cànan (nam/nan) e.g. Buginese > Cànan nam Bugis -->
{{Documentation}}
[[Roinn-seòrsa:Teamplaidean Cànain]]
[[Roinn-seòrsa:Teamplaidean {{bor|g}}]]
<!-- References
* https://iso639-3.sil.org/code_tables/639/data accessed 16 Apr 2020
* http://www.loc.gov/standards/iso639-5/hier.php accessed 16 Apr 2020
* [[:en:wikipedia:Bororo language]] accessed 16 Apr 2020
-->
</noinclude>
2f1cet1hjp3rygbu3a4x5bpdwixz3rq
88528
88513
2026-07-30T09:58:44Z
Altronic
4137
Chaidh an duilleag ath-stiùireadh gu [[Teamplaid:borrowed]]
88528
wikitext
text/x-wiki
#REDIRECT[[Template:borrowed]]
nsjdx3y6h4tcet0qwz39mrn6magt6wq
Mòideal:languages/data/3/m
828
16750
88669
86760
2026-07-30T11:27:32Z
Altronic
4137
88669
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["maa"] = {
"San Jerónimo Tecóatl Mazatec",
7692927,
"omq-maz",
"Latn",
}
m["mab"] = {
"Yutanduchi Mixtec",
12645448,
"omq-mxt",
"Latn",
}
m["mad"] = {
"Madurese",
36213,
"poz-msa",
"Latn, Java",
}
m["mae"] = {
"Bo-Rukul",
34967,
"nic-ple",
"Latn",
}
m["maf"] = {
"Mafa",
35819,
"cdc-cbm",
"Latn",
}
m["mag"] = {
"Magahi", -- Not to be confused with Magadhi Prakrit (pra-mag)
33728,
"inc-bih",
"Deva, Kthi",
translit = {
Deva = "bho-translit",
Kthi = "bho-Kthi-translit",
},
}
m["mai"] = {
"Maithili",
36109,
"inc-bih",
"Deva, Tirh, Kthi, Newa",
translit = {
Deva = "mai-translit",
Tirh = "mai-Tirh-translit",
Kthi = "bho-Kthi-translit",
},
}
m["maj"] = {
"Jalapa de Díaz Mazatec",
3915999,
"omq-maz",
"Latn",
}
m["mak"] = {
"Makasar",
33643,
"poz-ssw",
"Latn, Bugi, Maka",
}
m["mam"] = {
"Mam",
33467,
"myn",
"Latn",
}
m["man"] = {
"Mandingo",
35772,
"dmn-man",
"Latn",
}
m["maq"] = {
"Chiquihuitlán Mazatec",
5101757,
"omq-maz",
"Latn",
}
m["mas"] = {
"Maasai",
35787,
"sdv-lma",
"Latn",
}
m["mat"] = {
"Matlatzinca",
12953704,
"omq",
"Latn",
}
m["mau"] = {
"Huautla Mazatec",
36230,
"omq-maz",
"Latn",
}
m["mav"] = {
"Sateré-Mawé",
6794475,
"tup",
"Latn",
}
m["maw"] = {
"Mampruli",
35804,
"nic-wov",
"Latn",
}
m["max"] = {
"North Moluccan Malay",
7056136,
"crp",
"Latn",
ancestors = "ms",
}
m["maz"] = {
"Central Mazahua",
36228,
"oto",
"Latn",
}
m["mba"] = {
"Higaonon",
5753411,
"mno",
"Latn",
}
m["mbb"] = {
"Western Bukidnon Manobo",
7987643,
"mno",
"Latn",
}
m["mbc"] = {
"Macushi",
56633,
"sai-pem",
"Latn",
}
m["mbd"] = {
"Dibabawon Manobo",
18755523,
"mno",
"Latn",
}
m["mbe"] = {
"Molale",
3319444,
"nai-plp",
"Latn",
}
m["mbf"] = {
"Baba Malay",
18642798,
"crp",
"Latn",
ancestors = "ms",
}
m["mbh"] = {
"Mangseng",
6749147,
"poz-ocw",
"Latn",
}
m["mbi"] = {
"Ilianen Manobo",
14916911,
"mno",
"Latn",
}
m["mbj"] = {
"Nadëb",
3335011,
"sai-nad",
"Latn",
}
m["mbk"] = {
"Malol",
6744477,
"poz-ocw",
"Latn",
}
m["mbl"] = {
"Maxakalí",
3029682,
"sai-mje",
"Latn",
}
m["mbm"] = {
"Ombamba",
36407,
"bnt-mbt",
"Latn",
}
m["mbn"] = {
"Macaguán",
3273980,
"sai-guh",
"Latn",
}
m["mbo"] = { -- is, like 'bqz', 'bsi' and 'bss', a dialect of Manenguba
"Mbo (Cameroon)",
36011,
"bnt-mne",
"Latn",
}
m["mbp"] = {
"Wiwa",
3012604,
"cba",
"Latn",
}
m["mbq"] = {
"Maisin",
3448149,
nil,
"Latn",
}
m["mbr"] = {
"Nukak Makú",
3346228,
"sai-nad",
"Latn",
}
m["mbs"] = {
"Sarangani Manobo",
7423093,
"mno",
"Latn",
}
m["mbt"] = {
"Matigsalug Manobo",
6787447,
"mno",
"Latn",
}
m["mbu"] = {
"Mbula-Bwazza",
3913324,
"nic-jrn",
"Latn",
}
m["mbv"] = {
"Mbulungish",
36003,
"alv-nal",
"Latn",
}
m["mbw"] = {
"Maring",
3293280,
"ngf-jim",
"Latn",
}
m["mbx"] = {
"Mari (Sepik)",
6760942,
"paa-sep",
"Latn",
}
m["mby"] = {
"Memoni",
4180871,
"inc-snd",
"Gujr, ur-Arab",
}
m["mbz"] = {
"Amoltepec Mixtec",
13583504,
"omq-mxt",
"Latn",
}
m["mca"] = {
"Maca",
3281043,
"sai-mtc",
"Latn",
}
m["mcb"] = {
"Machiguenga",
3915441,
"awd",
"Latn",
}
m["mcc"] = {
"Bitur",
4919173,
"paa-tir",
"Latn",
}
m["mcd"] = {
"Sharanahua",
12953881,
"sai-pan",
"Latn",
}
m["mce"] = {
"Itundujia Mixtec",
12953727,
"omq-mxt",
"Latn",
}
m["mcf"] = {
"Matsés",
2981620,
"sai-pan",
"Latn",
}
m["mcg"] = {
"Mapoyo",
56946,
"sai-map",
"Latn",
}
m["mch"] = {
"Ye'kwana",
3082027,
"sai-car",
"Latn",
sort_key = {
remove_diacritics = "%-%s",
from = {"'", "ñ", "ö", "sh", "ü"},
to = {"’", "n" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1]}
}
}
m["mci"] = {
"Mese",
6821190,
"ngf-san",
"Latn",
}
m["mcj"] = {
"Mvanip",
3913281,
"nic-mmb",
"Latn",
}
m["mck"] = {
"Mbunda",
34170,
"bnt-clu",
"Latn",
}
m["mcl"] = {
"Macaguaje",
6722435,
"sai-tuc",
"Latn",
}
m["mcm"] = {
"Kristang",
2669169,
"crp",
"Latn",
ancestors = "pt",
}
m["mcn"] = {
"Masana",
56668,
"cdc-mas",
}
m["mco"] = {
"Coatlán Mixe",
25559716,
"nai-miz",
"Latn",
}
m["mcp"] = {
"Makaa",
35803,
"bnt-mka",
"Latn",
}
m["mcq"] = {
"Ese",
5397551,
"ngf-koi",
"Latn",
}
m["mcr"] = {
"Menya",
11732444,
"ngf-kme",
"Latn",
}
m["mcs"] = {
"Mambai",
6748872,
"alv-mbm",
"Latn",
}
m["mcu"] = {
"Cameroon Mambila",
19359039,
"nic-mmb",
"Latn",
}
-- mcv (Minanibai) merged into ffi (Foia Foia) per Glottolog
m["mcw"] = {
"Mawa",
3441333,
"cdc-est",
"Latn",
}
m["mcx"] = {
"Mpiemo",
35908,
"bnt-bek",
"Latn",
}
m["mcy"] = {
"South Watut",
12953293,
"poz-ocw",
"Latn",
}
m["mcz"] = {
"Mawan",
11732429,
"ngf-han",
"Latn",
}
m["mda"] = {
"Mada (Nigeria)",
3915843,
"nic-nin",
"Latn",
}
m["mdb"] = {
"Morigi",
6912195,
"paa-kiw",
"Latn",
}
m["mdc"] = {
"Male",
6742927,
"ngf-min",
"Latn",
}
m["mdd"] = {
"Mbum",
36170,
"alv-mbm",
"Latn",
}
m["mde"] = {
"Bura Mabang",
35860,
"ssa",
"Arab, Latn",
}
m["mdf"] = {
"Moksha",
13343,
"urj-mdv",
"Cyrl",
translit = "mdf-translit",
strip_diacritics = {remove_diacritics = c.acute},
override_translit = true,
sort_key = "mdf-sortkey",
}
m["mdg"] = {
"Massalat",
759984,
nil,
"Latn",
}
m["mdh"] = {
"Maguindanao",
33717,
"phi",
"Latn, Arab",
}
m["mdi"] = {
"Mamvu",
3033594,
"csu-mle",
"Latn",
}
m["mdj"] = {
"Mangbetu",
56327,
"csu-maa",
"Latn",
}
m["mdk"] = {
"Mangbutu",
6748877,
"csu-mle",
"Latn",
}
m["mdl"] = {
"Maltese Sign Language",
6744816,
"sgn",
}
m["mdm"] = {
"Mayogo",
6797580,
"nic-nke",
"Latn",
}
m["mdn"] = {
"Mbati",
36165,
"bnt-ngn",
"Latn",
}
m["mdp"] = {
"Mbala",
6799583,
"bnt-pen",
"Latn",
}
m["mdq"] = {
"Mbole",
6799727,
"bnt-mbe",
"Latn",
}
m["mdr"] = {
"Mandar",
35995,
"poz-ssw",
"Bugi, Latn",
}
m["mds"] = {
"Maria",
3448673,
"paa-man",
"Latn",
}
m["mdt"] = {
"Mbere",
36062,
"bnt-mbt",
"Latn",
}
m["mdu"] = {
"Mboko",
36058,
"bnt-mbo",
"Latn",
}
m["mdv"] = {
"Santa Lucía Monteverde Mixtec",
12953722,
"omq-mxt",
"Latn",
}
m["mdw"] = {
"Mbosi",
36035,
"bnt-mbo",
"Latn",
}
m["mdx"] = {
"Dizin",
35313,
"omv-diz",
"Ethi, Latn",
}
m["mdy"] = {
"Maale",
795327,
"omv-ome",
"Latn",
}
m["mdz"] = {
"Suruí Do Pará",
10322149,
"tup-gua",
"Latn",
}
m["mea"] = {
"Menka",
36078,
"nic-grs",
"Latn",
}
m["meb"] = {
"Ikobi-Mena",
11732241,
"paa-tki",
"Latn",
}
m["mec"] = {
"Mara",
6772774,
}
m["med"] = {
"Melpa",
36166,
"ngf-hag",
"Latn",
}
m["mee"] = {
"Mengen",
3305831,
"poz-ocw",
"Latn",
}
m["mef"] = {
"Megam",
6808589,
}
m["meh"] = {
"Southwestern Tlaxiaco Mixtec",
7070686,
"omq-mxt",
"Latn",
}
m["mei"] = {
"Midob",
36007,
"nub",
"Latn",
}
m["mej"] = {
"Meyah",
11732436,
"paa-ebh",
"Latn",
}
m["mek"] = {
"Mekeo",
3304803,
"poz-ocw",
"Latn",
}
m["mel"] = {
"Central Melanau",
18638319,
"poz-swa",
"Latn",
}
m["mem"] = {
"Mangala",
6748664,
}
m["men"] = {
"Mende (Sierra Leone)",
1478672,
"dmn-msw",
"Latn, Mend",
}
m["meo"] = {
"Kedah Malay",
4925684,
"poz-mly",
"Latn, ms-Arab, Thai",
strip_diacritics = {
from = {u(0xF70F)},
to = {"ญ"}
},
sort_key = {Thai = "Thai-sortkey"},
}
m["mep"] = {
"Miriwoong",
3111847,
"aus-jar",
"Latn",
}
m["meq"] = {
"Merey",
3502314,
"cdc-cbm",
"Latn",
}
m["mer"] = {
"Meru",
13313,
"bnt-kka",
"Latn",
}
m["mes"] = {
"Masmaje",
3440448,
}
m["met"] = {
"Mato",
3299190,
"poz-ocw",
"Latn",
}
m["meu"] = {
"Motu",
33516,
"poz-ocw",
"Latn",
}
m["mev"] = {
"Mano",
3913286,
"dmn-mda",
"Latn",
}
m["mew"] = {
"Maaka",
3438764,
"cdc-wst",
"Latn",
}
m["mey"] = {
"Hassaniya Arabic",
56231,
"sem-arb",
"Arab",
}
m["mez"] = {
"Menominee",
13363,
"alg",
"Latn",
sort_key = {remove_diacritics = "·"},
}
m["mfa"] = {
"Pattani Malay",
1199751,
"poz-mly",
"Latn, ms-Arab, Thai",
strip_diacritics = {
from = {u(0xF70F)},
to = {"ญ"}
},
sort_key = {Thai = "Thai-sortkey"},
}
m["mfb"] = {
"Bangka",
3258818,
"poz-mly",
"Latn, Arab",
}
m["mfc"] = {
"Mba",
4286464,
"nic-mbc",
"Latn",
}
m["mfd"] = {
"Mendankwe-Nkwen",
11129537,
"nic-nge",
"Latn",
}
m["mfe"] = {
"Mauritian Creole",
33661,
"crp",
"Latn",
ancestors = "fr",
sort_key = s["roa-oil-sortkey"],
}
m["mff"] = {
"Naki",
36083,
"nic-bbe",
"Latn",
}
m["mfg"] = {
"Mixifore",
3914478,
"dmn-mok",
}
m["mfh"] = {
"Matal",
3501751,
"cdc-cbm",
"Latn",
}
m["mfi"] = {
"Wandala",
3441249,
"cdc-cbm",
"Latn",
}
m["mfj"] = {
"Mefele",
3501871,
"cdc-cbm",
"Latn",
}
m["mfk"] = {
"North Mofu",
56303,
"cdc-cbm",
"Latn",
}
m["mfl"] = {
"Putai",
56291,
"cdc-cbm",
"Latn",
}
m["mfm"] = {
"Marghi South",
56248,
}
m["mfn"] = {
"Cross River Mbembe",
3915395,
"nic-uce",
"Latn",
}
m["mfo"] = {
"Mbe",
36075,
"nic-eko",
"Latn",
}
m["mfp"] = {
"Makassar Malay",
12952776,
"qfa-mix",
"Latn",
ancestors = "ms, mak"
}
m["mfq"] = {
"Moba",
19921578,
"nic-grm",
"Latn",
}
m["mfr"] = {
"Marrithiyel",
6773014,
"aus-dal",
"Latn",
}
m["mfs"] = {
"Mexican Sign Language",
3915511,
"sgn",
"Latn", -- when documented
}
m["mft"] = {
"Mokerang",
3319387,
"poz-aay",
"Latn",
}
m["mfu"] = {
"Mbwela",
11004988,
"bnt-clu",
ancestors = "lch",
}
m["mfv"] = {
"Mandjak",
35822,
"alv-pap",
}
m["mfw"] = {
"Mulaha",
6933720,
"paa-kwa",
"Latn",
}
m["mfx"] = {
"Melo",
6813268,
"omv-nom",
}
m["mfy"] = {
"Mayo",
56729,
"azc-trc",
"Latn",
sort_key = {remove_diacritics = c.acute},
}
m["mfz"] = {
"Mabaan",
20526385,
"sdv",
"Latn",
}
m["mga"] = {
"Meadhan-Ghàidhlig",
36116,
"cel-gae",
"Latn",
ancestors = "sga",
strip_diacritics = {remove_diacritics = c.dotabove .. c.diaer .. "·"},
sort_key = "mga-sortkey",
}
m["mgb"] = {
"Mararit",
56359,
"sdv-tmn",
}
m["mgc"] = {
"Morokodo",
6913216,
"csu-bbk",
"Latn",
}
m["mgd"] = {
"Moru",
6915014,
"csu-mma",
"Latn, Arab",
}
m["mge"] = {
"Mango",
713659,
"csu-sar",
"Latn",
}
m["mgf"] = {
"Maklew",
6739816,
"paa-bul",
"Latn",
}
m["mgg"] = {
"Mpongmpong",
35924,
"bnt-bek",
}
m["mgh"] = {
"Makhuwa-Meetto",
33604,
"bnt-mak",
"Latn",
ancestors = "vmw",
}
m["mgi"] = {
"Jili",
3914497,
"nic-pls",
}
m["mgj"] = {
"Abureni",
3441256,
"nic-cde",
"Latn",
}
m["mgk"] = {
"Mawes",
6794395,
"qfa-dis", -- Papuan; isolate in Glottolog, Foley (2018) and Hammarström (2010); in the Tor-Kwerba languages per
-- Usher (2020)
"Latn",
}
m["mgl"] = {
"Maleu-Kilenge",
3281884,
}
m["mgm"] = {
"Mambae",
35774,
"poz-tim",
"Latn",
}
m["mgn"] = {
"Mbangi",
11017443,
"nic-ngd",
"Latn",
}
m["mgo"] = {
"Meta'",
36054,
"nic-mom",
"Latn",
}
m["mgp"] = {
"Eastern Magar",
12952758,
"sit-gma",
"Deva, Latn",
}
m["mgq"] = {
"Malila",
6743679,
"bnt-mby",
"Latn",
}
m["mgr"] = {
"Mambwe-Lungu",
626210,
"bnt-mwi",
"Latn",
}
m["mgs"] = {
"Manda (Tanzania)",
16939267,
"bnt-bki",
}
m["mgt"] = {
"Mwakai",
11260674,
"paa-wke",
"Latn",
}
m["mgu"] = {
"Mailu",
3278246,
"paa-mal",
"Latn",
}
m["mgv"] = {
"Matengo",
6786446,
"bnt-mbi",
"Latn",
}
m["mgw"] = {
"Matumbi",
6791974,
"bnt-mbi",
"Latn",
}
m["mgy"] = {
"Mbunga",
6799817,
"bnt-kil",
}
m["mgz"] = {
"Mbugwe",
3426367,
"bnt-mra",
}
m["mha"] = {
"Manda (India)",
56760,
"dra-kki",
"Orya",
translit = "kxv-translit",
}
m["mhb"] = {
"Mahongwe",
35816,
"bnt-kel",
}
m["mhc"] = {
"Mocho",
1941682,
"myn",
}
m["mhd"] = {
"Mbugu",
36152,
"qfa-mix",
"Latn",
ancestors = "asa",
}
m["mhe"] = {
"Besisi",
2742262,
"mkh-asl",
"Latn",
}
m["mhf"] = {
"Mamaa",
6745346,
"ngf-era",
"Latn",
}
m["mhg"] = {
"Marrgu",
6772812,
}
m["mhi"] = {
"Ma'di",
56670,
"csu-mma",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.grave .. c.tilde .. c.dotbelow},
}
m["mhj"] = {
"Mogholi",
13336,
"xgn",
"fa-Arab, Latn",
translit = "fa-cls-translit",
strip_diacritics = {
["fa-Arab"] = "ar-stripdiacritics",
},
}
m["mhk"] = {
"Mungaka",
36068,
"nic-nun",
}
m["mhl"] = {
"Mauwake",
6794095,
"ngf-kum",
"Latn",
}
m["mhm"] = {
"Makhuwa-Moniga",
6900145,
"bnt-mak",
}
m["mhn"] = {
"Mòcheno",
268130,
"gmw-hgm",
"Latn",
ancestors = "bar",
sort_key = {remove_diacritics = c.grave},
}
m["mho"] = {
"Mashi",
10962737,
"bnt-kav",
"Latn",
}
m["mhp"] = {
"Balinese Malay",
12473441,
"crp",
"Latn, Bali, ms-Arab",
}
m["mhq"] = {
"Mandan",
1957120,
"sio",
"Latn",
}
m["mhr"] = {
"Eastern Mari",
3906614,
"chm",
"Cyrl",
translit = "chm-translit",
override_translit = true,
strip_diacritics = {remove_diacritics = c.grave .. c.acute},
sort_key = {
from = {"ё", "ҥ", "ӧ", "ӱ"},
to = {"е" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1]}
}
}
m["mhs"] = {
"Buru (Indonesia)",
2928650,
"poz-cma",
"Latn",
}
m["mht"] = {
"Mandahuaca",
6747924,
"awd-nwk",
}
m["mhu"] = {
"Taraon",
56400,
"sit-gsi",
"Latn",
}
m["mhw"] = {
"Mbukushu",
2691548,
"bnt",
"Latn",
}
m["mhx"] = {
"Lhao Vo",
11149315,
"tbq-brm",
"Latn",
}
m["mhy"] = {
"Ma'anyan",
2328761,
"poz-bre",
"Latn",
}
m["mhz"] = {
"Mor (Austronesian)",
2122792,
"poz-hce",
"Latn",
}
m["mia"] = {
"Miami",
56523,
"alg",
"Latn",
}
m["mib"] = {
"Atatláhuca Mixtec",
32093046,
"omq-mxt",
"Latn",
}
m["mic"] = {
"Mi'kmaq",
13321,
"alg-eas",
"Latn",
}
m["mid"] = {
"Mandaic",
6991742,
"sem-ase",
"Mand",
ancestors = "myz",
translit = {
Mand = "Mand-translit",
},
strip_diacritics = {
Mand = "Mand-stripdiacritics",
}
}
m["mie"] = {
"Ocotepec Mixtec",
25559575,
"omq-mxt",
"Latn",
}
m["mif"] = {
"Mofu-Gudur",
1365132,
"cdc-cbm",
"Latn",
}
m["mig"] = {
"San Miguel el Grande Mixtec",
12953719,
"omq-mxt",
"Latn",
}
m["mih"] = {
"Chayuco Mixtec",
13583510,
"omq-mxt",
"Latn",
}
m["mii"] = {
"Chigmecatitlán Mixtec",
12953724,
"omq-mxt",
"Latn",
}
m["mij"] = {
"Mungbam",
34725,
"nic-beb",
"Latn",
}
m["mik"] = {
"Mikasuki",
13316,
"nai-mus",
"Latn",
}
m["mil"] = {
"Peñoles Mixtec",
42411307,
"omq-mxt",
"Latn",
}
m["mim"] = {
"Alacatlatzala Mixtec",
14697894,
"omq-mxt",
"Latn",
}
m["min"] = {
"Minangkabau",
13324,
"poz-mly",
"Latn, Arab",
}
m["mio"] = {
"Pinotepa Nacional Mixtec",
7196415,
"omq-mxt",
"Latn",
}
m["mip"] = {
"Apasco-Apoala Mixtec",
13583505,
"omq-mxt",
"Latn",
}
m["miq"] = {
"Miskito",
1516803,
"nai-min",
"Latn",
strip_diacritics = {remove_diacritics = c.circ},
}
m["mir"] = {
"Isthmus Mixe",
6088873,
"nai-miz",
"Latn",
}
m["mit"] = {
"Southern Puebla Mixtec",
7570345,
"omq-mxt",
"Latn",
}
m["miu"] = {
"Cacaloxtepec Mixtec",
12953723,
"omq-mxt",
"Latn",
}
m["miw"] = {
"Akoye",
3327462,
"ngf-taa",
"Latn",
}
m["mix"] = {
"Mixtepec Mixtec",
6884125,
"omq-mxt",
"Latn",
}
m["miy"] = {
"Ayutla Mixtec",
13583508,
"omq-mxt",
"Latn",
}
m["miz"] = {
"Coatzospan Mixtec",
3317290,
"omq-mxt",
"Latn",
}
m["mjb"] = {
"Makalero",
35729,
"paa-alp",
"Latn",
}
m["mjc"] = {
"San Juan Colorado Mixtec",
12953718,
"omq-mxt",
"Latn",
}
m["mjd"] = {
"Northwest Maidu",
3198700,
"nai-mdu",
"Latn",
}
m["mje"] = {
"Muskum",
3913334,
}
-- mjg "Monguor" is not recognized as a language, but it is a family code
m["mji"] = {
"Kim Mun",
1115317,
"hmx-mie",
"Latn",
}
m["mjj"] = {
"Mawak",
11732427,
"ngf-tib",
"Latn",
}
m["mjk"] = {
"Matukar",
6791963,
"poz-ocw",
"Latn",
}
m["mjl"] = {
"Mandeali",
6747931,
"him",
"Deva, Takr",
translit = "hi-translit",
}
m["mjm"] = {
"Medebur",
6805227,
"poz-ocw",
"Latn",
}
m["mjn"] = {
"Mebu",
6804364,
"ngf-yup",
"Latn",
}
m["mjo"] = {
"Malankuravan",
14916887,
"dra-mal",
}
m["mjp"] = {
"Malapandaram",
10575729,
"dra-tam",
}
m["mjq"] = {
"Malaryan",
12952773,
"dra-mal",
}
m["mjr"] = {
"Malavedan",
12952775,
"dra-mal",
"Mlym",
-- Mlym translit in [[Module:scripts/data]]
}
m["mjs"] = {
"Miship",
3441264,
"cdc-wst",
"Latn",
}
m["mjt"] = {
"Sawriya Paharia",
33907,
"dra-mlo",
"Beng, Deva",
}
m["mju"] = {
"Manna-Dora",
10576453,
"dra-tel",
}
m["mjv"] = {
"Mannan",
3286037,
"dra-tam",
"Mlym, Taml",
translit = {
Taml = "ta-translit",
},
-- Mlym translit in [[Module:scripts/data]]
}
m["mjw"] = {
"Karbi",
56591,
"tbq-kuk",
"Latn",
}
m["mjx"] = {
"Mahali",
12953686,
"mun",
}
m["mjy"] = {
"Mahican",
3182562,
"alg-eas",
"Latn",
}
m["mjz"] = {
"Majhi",
6737786,
"inc-bih",
}
m["mka"] = {
"Mbre",
3450154,
"nic", --unclassified within niger-congo tho
}
m["mkb"] = {
"Mal Paharia",
6583595,
"inc-eas",
"Deva",
}
m["mkc"] = {
"Siliput",
7515090,
"paa-mam",
"Latn",
}
m["mke"] = {
"Mawchi",
21403317,
}
m["mkf"] = {
"Miya",
43328,
"cdc-wst",
"Latn",
}
m["mkg"] = {
"Mak (China)",
3280623,
"qfa-kms",
}
m["mki"] = {
"Dhatki",
32480,
"raj",
"Deva, Mahj, Arab",
}
m["mkj"] = {
"Mokilese",
2335528,
"poz-mic",
"Latn",
}
m["mkk"] = {
"Byep",
35052,
"bnt-mka",
}
m["mkl"] = {
"Mokole",
36047,
"alv-yor",
"Latn",
}
m["mkm"] = {
"Moklen",
3319380,
}
m["mkn"] = {
"Kupang Malay",
18458203,
"crp",
"Latn",
}
m["mko"] = {
"Mingang Doso",
3915382,
"alv-bwj",
}
m["mkp"] = {
"Moikodi",
6894594,
"ngf-yar",
"Latn",
}
m["mkq"] = {
"Bay Miwok",
3460957,
"nai-utn",
"Latn",
}
m["mkr"] = {
"Malas",
11732402,
"ngf-nad",
"Latn",
}
m["mks"] = {
"Silacayoapan Mixtec",
7514027,
"omq-mxt",
"Latn",
}
m["mkt"] = {
"Vamale",
14916907,
"poz-cln",
"Latn",
}
m["mku"] = {
"Konyanka Maninka",
11163298,
"dmn-mnk",
}
m["mkv"] = {
"Mav̋ea",
3073532,
"poz-vnn",
"Latn",
}
m["mkx"] = {
"Cinamiguin Manobo",
12953697,
"mno",
"Latn",
}
m["mky"] = {
"Taba",
3512690,
"poz-hce",
"Latn",
}
m["mkz"] = {
"Makasae",
35782,
"paa-eti",
"Latn",
}
m["mla"] = {
"Tamambo",
1153276,
"poz-vnn",
"Latn",
}
m["mlb"] = {
"Mbule",
35843,
"nic-ymb",
"Latn",
}
m["mlc"] = {
"Caolan",
3446682,
"tai-cho",
"Latn, Hani",
sort_key = {Hani = "Hani-sortkey"},
}
m["mle"] = {
"Manambu",
11732406,
"paa-nnd",
"Latn",
}
m["mlf"] = {
"Mal",
3281057,
"mkh-khm",
}
m["mlh"] = {
"Mape",
6753787,
"ngf-kma",
"Latn",
}
m["mli"] = {
"Malimpung",
12473435,
}
m["mlj"] = {
"Miltu",
3441310,
}
m["mlk"] = {
"Ilwana",
6001357,
"bnt-sab",
}
m["mll"] = {
"Malua Bay",
6744946,
"poz-vnc",
"Latn",
}
m["mlm"] = {
"Mulam",
3092284,
"qfa-kms",
"Latn",
}
m["mln"] = {
"Malango",
3281522,
"poz-sls",
"Latn",
}
m["mlo"] = {
"Mlomp",
36009,
"alv-bak",
}
m["mlp"] = {
"Bargam",
4860543,
"ngf-mad",
"Latn",
}
m["mlq"] = {
"Western Maninkakan",
11028033,
"dmn-wmn",
}
m["mlr"] = {
"Vame",
3515088,
"cdc-cbm",
"Latn",
}
m["mls"] = {
"Masalit",
56557,
"ssa",
}
m["mlu"] = {
"To'abaita",
36645,
"poz-sls",
"Latn",
}
m["mlv"] = {
"Mwotlap",
2475538,
"poz-vnn",
"Latn",
}
m["mlw"] = {
"Moloko",
1965222,
"cdc-cbm",
"Latn",
}
m["mlx"] = {
"Malfaxal",
2157421,
"poz-vnc",
"Latn",
}
m["mlz"] = {
"Malaynon",
18755512,
"phi",
}
m["mma"] = {
"Mama",
3913963,
"nic-jrn",
}
m["mmb"] = {
"Momina",
6897297,
}
m["mmc"] = {
"Michoacán Mazahua",
12953705,
"oto",
"Latn",
}
m["mmd"] = {
"Maonan",
3092293,
"qfa-kms",
"Latn",
}
m["mme"] = {
"Tirax",
3276286,
"poz-vnc",
"Latn",
}
m["mmf"] = {
"Mundat",
56263,
"cdc-wst",
"Latn",
}
m["mmg"] = {
"North Ambrym",
2842468,
"poz-vnc",
"Latn",
}
m["mmh"] = {
"Mehináku",
3501838,
"awd",
"Latn",
}
m["mmi"] = {
"Hember Avu",
6940113,
"ngf-tib",
"Latn",
}
m["mmj"] = {
"Majhwar",
6737795,
}
m["mmk"] = {
"Mukha-Dora",
6933447,
}
m["mml"] = {
"Man Met",
3194984,
"mkh-pal",
}
m["mmm"] = {
"Maii",
6735599,
"poz-vnc",
"Latn",
}
m["mmn"] = {
"Mamanwa",
3206623,
"phi",
"Latn",
}
m["mmo"] = {
"Mangga Buang",
12952294,
"poz-ocw",
"Latn",
}
m["mmp"] = {
"Musan",
2605703,
"paa-amu",
"Latn",
}
m["mmq"] = {
"Aisi",
6940074,
"ngf-ais",
"Latn",
}
m["mmr"] = {
"Western Xiangxi Miao",
3307901,
"hmn",
"Latn",
}
m["mmt"] = {
"Malalamai",
3281496,
"poz-ocw",
"Latn",
}
m["mmu"] = {
"Mmaala",
13123461,
"nic-ymb",
"Latn",
}
m["mmv"] = {
"Miriti",
6873567,
"sai-tuc",
"Latn",
}
m["mmw"] = {
"Emae",
3051961,
"poz-pnp",
"Latn",
}
m["mmx"] = {
"Madak",
3275205,
"poz-ocw",
"Latn",
}
m["mmy"] = {
"Migaama",
56259,
"cdc-est",
"Latn",
}
m["mmz"] = {
"Mabaale",
11003249,
"bnt-ngn",
}
m["mna"] = {
"Mbula",
3303572,
"poz-ocw",
"Latn",
}
m["mnb"] = {
"Muna",
6935584,
"poz-mun",
"Latn",
}
m["mnc"] = {
"Manchu",
33638,
"tuw-jrc",
"mnc-Mong, Latn",
ancestors = "juc",
-- mnc-Mong translit in [[Module:scripts/data]]
}
m["mnd"] = {
"Mondé",
6898840,
"tup",
"Latn",
}
m["mne"] = {
"Naba",
760732,
"csu-bgr",
}
m["mnf"] = {
"Mundani",
35839,
"nic-mom",
"Latn",
}
m["mng"] = {
"Eastern Mnong",
12953747,
"mkh-ban",
"Latn, Khmr",
}
m["mnh"] = {
"Mono (Congo)",
33501,
"bad-cnt",
"Latn",
}
m["mni"] = {
"Manipuri",
33868,
"sit",
"Mtei, Beng",
ancestors = "omp",
translit = {Mtei = "Mtei-translit"},
}
m["mnj"] = {
"Munji",
33639,
"ira-mny",
"Arab",
}
m["mnk"] = {
"Mandinka",
33678,
"dmn-wmn",
"Latn, Arab, Nkoo",
}
m["mnl"] = {
"Tiale",
6744350,
"poz-vnn",
"Latn",
}
m["mnm"] = {
"Mapena",
11732415,
"ngf-dag",
"Latn",
}
m["mnn"] = {
"Southern Mnong",
23857582,
"mkh-ban",
}
m["mnp"] = {
"Northern Min",
36457,
"zhx-inm",
"Hants",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["mnq"] = {
"Minriq",
2742268,
"mkh-asl",
"Latn",
}
m["mnr"] = {
"Mono (California)",
33591,
"azc-num",
"Latn",
}
m["mnt"] = {
"Maykulan",
3915696,
"aus-pam",
"Latn",
}
m["mnu"] = {
"Mer",
6817854,
"paa-mai",
"Latn",
}
m["mnv"] = {
"Rennellese",
3397346,
"poz-pnp",
"Latn",
}
m["mnw"] = {
"Mon",
13349,
"mkh-mnc",
"Mymr",
ancestors = "mkh-mmn",
sort_key = {
from = {"ျ", "ြ", "ွ", "ှ", "ၞ", "ၟ", "ၠ", "ၚ", "ဿ"},
to = {"္ယ", "္ရ", "္ဝ", "္ဟ", "္န", "္မ", "္လ", "င", "သ္သ"}
},
}
m["mnx"] = {
"Sougb",
3507964,
"paa-ebh",
"Latn",
}
m["mny"] = {
"Manyawa",
11002622,
"bnt-mak",
ancestors = "vmw",
}
m["mnz"] = {
"Moni",
6899857,
"ngf-pan",
"Latn",
}
m["moa"] = {
"Mwan",
3320111,
"dmn-nbe",
"Latn",
}
m["moc"] = {
"Mocoví",
3027906,
"sai-guc",
"Latn",
}
m["mod"] = {
"Mobilian",
13333,
"crp",
"Latn",
ancestors = "cho, cic",
}
m["moe"] = {
"Montagnais",
13351,
"alg",
"Latn",
ancestors = "cr",
strip_diacritics = {remove_diacritics = c.macron},
}
m["mog"] = {
"Mongondow",
3058458,
"phi",
"Latn",
}
m["moh"] = {
"Mohawk",
13339,
"iro-nor",
"Latn",
ancestors = "iro-omo",
}
m["moi"] = {
"Mboi",
3914417,
"alv-yun",
}
m["moj"] = {
"Monzombo",
11154772,
"nic-nkk",
"Latn",
}
m["mok"] = {
"Morori",
6913275,
}
m["mom"] = {
"Monimbo",
56542,
}
m["moo"] = {
"Monom",
6901726,
"mkh-ban",
}
m["mop"] = {
"Mopan Maya",
36183,
"myn",
"Latn",
}
m["moq"] = {
"Mor (Papuan)",
11732468,
"qfa-dis", -- Papuan; isolate in Glottolog and Palmer (2018); top-level TNG in Ross (2005), in Berau Gulf (under
-- TNG) in Usher (2020)
}
m["mor"] = {
"Moro",
36172,
"alv-hei",
"Latn",
}
m["mos"] = {
"Moore",
36096,
"nic-mre",
"Latn",
}
m["mot"] = {
"Barí",
2886281,
"cba",
"Latn",
}
m["mou"] = {
"Mogum",
3440473,
"cdc-est",
"Latn",
}
m["mov"] = {
"Mojave",
56510,
"nai-yuc",
"Latn",
}
m["mow"] = {
"Moi (Congo)",
11124792,
"bnt-bmo",
"Latn",
}
m["mox"] = {
"Molima",
3319495,
"poz-ocw",
"Latn",
}
m["moy"] = {
"Shekkacho",
56827,
"omv-gon",
}
m["moz"] = {
"Mukulu",
3440403,
"cdc-est",
}
m["mpa"] = {
"Mpoto",
6928303,
"bnt-mbi",
"Latn",
}
m["mpb"] = {
"Mullukmulluk",
6741120,
}
m["mpc"] = {
"Mangarayi",
6748829,
}
m["mpd"] = {
"Machinere",
12953681,
"awd",
"Latn",
}
m["mpe"] = {
"Majang",
56724,
"sdv",
}
m["mpg"] = {
"Marba",
56614,
"cdc-mas",
}
m["mph"] = {
"Maung",
6792550,
"aus-wdj",
"Latn",
}
m["mpi"] = {
"Mpade",
3280670,
"cdc-cbm",
"Latn",
}
m["mpj"] = {
"Martu Wangka",
3295916,
"aus-pam",
"Latn",
}
m["mpk"] = {
"Mbara (Chad)",
3912770,
"cdc-cbm",
}
m["mpl"] = {
"Middle Watut",
15887910,
"poz-ocw",
"Latn",
}
m["mpm"] = {
"Yosondúa Mixtec",
12953741,
"omq-mxt",
"Latn",
}
m["mpn"] = {
"Mindiri",
6863842,
"poz-ocw",
"Latn",
}
m["mpo"] = {
"Miu",
6883668,
"poz-ocw",
"Latn",
}
m["mpp"] = {
"Migabac",
11732448,
"ngf-sop",
"Latn",
}
m["mpq"] = {
"Matís",
3299145,
"sai-pan",
"Latn",
}
m["mpr"] = {
"Vangunu",
3554582,
"poz-ocw",
"Latn",
}
m["mps"] = {
"Dadibi",
5208077,
"paa-teb",
"Latn",
}
m["mpt"] = {
"Mian",
12952846,
"ngf-msu",
"Latn",
}
m["mpu"] = {
"Makuráp",
3281037,
"tup",
"Latn",
}
m["mpv"] = {
"Mungkip",
11732485,
"ngf-boa",
"Latn",
}
m["mpw"] = {
"Mapidian",
6753812,
"awd",
"Latn",
}
m["mpx"] = {
"Misima-Paneati",
6875666,
"poz-ocw",
"Latn",
}
m["mpy"] = {
"Mapia",
3287224,
"poz-mic",
"Latn",
}
m["mpz"] = {
"Mpi",
6928276,
"tbq-bka",
}
m["mqa"] = {
"Maba",
3273750,
}
m["mqb"] = {
"Mbuko",
3502213,
"cdc-cbm",
"Latn",
}
m["mqc"] = {
"Mangole",
6749097,
"poz-cma",
"Latn",
}
m["mqe"] = {
"Matepi",
11732426,
"ngf-han",
"Latn",
}
m["mqf"] = {
"Momuna",
6897518,
}
m["mqg"] = {
"Kota Bangun Kutai Malay",
12952778,
}
m["mqh"] = {
"Tlazoyaltepec Mixtec",
12953740,
"omq-mxt",
"Latn",
}
m["mqi"] = {
"Mariri",
6765544,
}
m["mqj"] = {
"Mamasa",
6745452,
"poz-ssw",
"Latn",
}
m["mqk"] = {
"Rajah Kabunsuwan Manobo",
12953700,
"mno",
}
m["mql"] = {
"Mbelime",
4286473,
"nic-eov",
"Latn",
}
m["mqm"] = {
"South Marquesan",
19694214,
"poz-pep",
"Latn",
}
m["mqn"] = {
"Moronene",
642581,
"poz-btk",
"Latn",
}
m["mqo"] = {
"Modole",
11732457,
"paa-gto",
"Latn",
}
m["mqp"] = {
"Manipa",
6749799,
"poz-cma",
"Latn",
}
m["mqq"] = {
"Minokok",
18642293,
"poz-san",
"Latn",
}
m["mqr"] = {
"Mander",
6747979,
"paa-tor",
"Latn",
}
m["mqs"] = {
"West Makian",
3033575,
"paa-nha",
"Latn",
}
m["mqt"] = {
"Mok",
13018559,
"mkh-pal",
}
m["mqu"] = {
"Mandari",
3285426,
"sdv-bri",
}
m["mqv"] = {
"Mosimo",
11732478,
"ngf-nwh",
"Latn",
}
m["mqw"] = {
"Murupi",
11732486,
"ngf-nwh",
"Latn",
}
m["mqx"] = {
"Mamuju",
6746004,
"poz-ssw",
"Latn",
}
m["mqy"] = {
"Manggarai",
3285748,
"poz-cet",
"Latn",
}
m["mqz"] = {
"Malasanga",
14916889,
"poz-ocw",
"Latn",
}
m["mra"] = {
"Mlabri",
3073465,
"mkh",
}
m["mrb"] = {
"Sungwadia",
3293299,
"poz-vnn",
"Latn",
}
m["mrc"] = {
"Maricopa",
56386,
"nai-yuc",
"Latn",
}
m["mrd"] = {
"Western Magar",
22303263,
"sit-gma",
"Deva",
}
m["mre"] = {
"Martha's Vineyard Sign Language",
33494,
"sgn",
"Latn, Sgnw",
}
m["mrf"] = {
"Elseng",
3915667,
"qfa-unc", -- "Border or language isolate"; unclassifiable due to paucity of data
"Latn",
}
m["mrg"] = {
"Mising",
3316328,
"sit-tan",
"Latn, Beng, Deva",
ancestors = "adi",
}
m["mrh"] = {
"Mara Chin",
4175893,
"tbq-kuk",
"Latn",
}
m["mrj"] = {
"Western Mari",
1776032,
"chm",
"Cyrl",
translit = "chm-translit",
sort_key = "mrj-sortkey",
}
m["mrk"] = {
"Hmwaveke",
5873712,
"poz-cln",
"Latn",
}
m["mrl"] = {
"Mortlockese",
3324598,
"poz-mic",
"Latn",
}
m["mrm"] = {
"Mwerlap",
3331115,
"poz-vnn",
"Latn",
}
m["mrn"] = {
"Cheke Holo",
2962165,
"poz-ocw",
"Latn",
}
m["mro"] = {
"Mru",
1951521,
"sit-mru",
"Latn, Mroo",
}
m["mrp"] = {
"Morouas",
6913299,
"poz-vnn",
"Latn",
}
m["mrq"] = {
"North Marquesan",
2603808,
"poz-pep",
"Latn",
}
m["mrr"] = {
"Hill Maria",
27602,
"dra-mdy",
"Deva",
}
m["mrs"] = {
"Maragus",
6754640,
"poz-vnc",
"Latn",
}
m["mrt"] = {
"Margi",
56241,
"cdc-cbm",
"Latn",
}
m["mru"] = {
"Mono (Cameroon)",
11031964,
"alv-mbm",
"Latn",
}
m["mrv"] = {
"Mangarevan",
36237,
"poz-pep",
"Latn",
}
m["mrw"] = {
"Maranao",
33800,
"phi",
"Latn, Arab",
}
m["mrx"] = {
"Dineor",
5278044,
"paa-tor",
"Latn",
}
m["mry"] = {
"Karaga Mandaya",
6747925,
"phi",
}
m["mrz"] = {
"Marind",
6763970,
"paa-mri",
"Latn",
}
m["msb"] = {
"Masbatenyo",
33948,
"phi",
"Latn",
}
m["msc"] = {
"Sankaran Maninka",
11155812,
"dmn-mnk",
}
m["msd"] = {
"Yucatec Maya Sign Language",
34281,
"sgn",
"Latn", -- when documented
}
m["mse"] = {
"Musey",
56328,
"cdc-mas",
}
m["msf"] = {
"Mekwei",
4544752,
"paa-nim",
"Latn",
}
m["msg"] = {
"Moraid",
6909020,
"paa-wbh",
"Latn",
}
m["msi"] = {
"Sabah Malay",
10867404,
"crp",
"Latn, Arab",
}
m["msj"] = {
"Ma",
6720909,
"nic-mbc",
"Latn",
}
m["msk"] = {
"Mansaka",
12952800,
"phi",
"Latn",
}
m["msl"] = {
"Molof",
4300950,
}
m["msm"] = {
"Agusan Manobo",
12953696,
"mno",
"Latn",
}
m["msn"] = {
"Vurës",
3563857,
"poz-vnn",
"Latn",
}
m["mso"] = {
"Mombum",
6897079,
"ngf-mom",
"Latn",
}
m["msp"] = {
"Maritsauá",
6765915,
"tup",
"Latn",
}
m["msq"] = {
"Caac",
2932212,
"poz-cln",
"Latn",
}
m["msr"] = {
"Mongolian Sign Language",
3915499,
"sgn",
}
m["mss"] = {
"West Masela",
12952816,
"poz-tim",
}
m["msu"] = {
"Musom",
6943041,
"poz-ocw",
"Latn",
}
m["msv"] = {
"Maslam",
3502273,
}
m["msw"] = {
"Mansoanka",
35814,
}
m["msx"] = {
"Moresada",
11732475,
"ngf-pom",
"Latn",
}
m["msy"] = {
"Aruamu",
3501809,
"paa-rub",
"Latn",
}
m["msz"] = {
"Momare",
6897030,
"ngf-sop",
"Latn",
}
m["mta"] = {
"Cotabato Manobo",
12953698,
"mno",
"Latn",
}
m["mtb"] = {
"Anyin Morofo",
3502338,
"alv-ctn",
"Latn",
ancestors = "any",
}
m["mtc"] = {
"Munit",
11732482,
"ngf-kok",
"Latn",
}
m["mtd"] = {
"Mualang",
3073458,
"poz-mly",
"Latn",
}
m["mte"] = {
"Alu",
33503,
"poz-ocw",
"Latn",
}
m["mtf"] = {
"Murik (New Guinea)",
7050035,
"paa-lse",
"Latn",
}
m["mtg"] = {
"Una",
5580728,
"ngf-mek",
"Latn",
}
m["mth"] = {
"Munggui",
6936018,
"poz-hce",
"Latn",
}
m["mti"] = {
"Maiwa (New Guinea)",
6737223,
"ngf-dag",
"Latn",
}
m["mtj"] = {
"Moskona",
11288953,
"paa-ebh",
"Latn",
}
m["mtk"] = {
"Mbe'",
10964025,
"nic-nka",
"Latn",
}
m["mtl"] = {
"Montol",
3440457,
"cdc-wst",
"Latn",
}
m["mtm"] = {
"Mator",
20669419,
"syd",
"Cyrl",
}
m["mtn"] = {
"Matagalpa",
3490756,
"nai-min",
}
m["mto"] = {
"Totontepec Mixe",
7828400,
"nai-miz",
"Latn",
}
m["mtp"] = {
"Wichí Lhamtés Nocten",
5908756,
"sai-wic",
"Latn",
}
m["mtq"] = {
"Muong",
3236789,
"mkh-vie",
"Latn",
sort_key = "vi-sortkey",
}
m["mtr"] = {
"Mewari",
2992857,
"raj",
"Deva",
translit = "hi-translit", -- for now
}
m["mts"] = {
"Yora",
3572572,
"sai-pan",
"Latn",
}
m["mtt"] = {
"Mota",
3325052,
"poz-vnn",
"Latn",
}
m["mtu"] = {
"Tututepec Mixtec",
7857069,
"omq-mxt",
"Latn",
}
m["mtv"] = {
"Asaro'o",
3503684,
"ngf-war", -- ngf-moa if we split out Molet from Asaro'o
"Latn",
}
m["mtw"] = {
"Magahat",
6729600,
"phi",
}
m["mtx"] = {
"Tidaá Mixtec",
7800805,
"omq-mxt",
"Latn",
}
m["mty"] = {
"Nabi",
6956858,
"paa-wpa",
"Latn",
}
m["mua"] = {
"Mundang",
36032,
"alv-mbm",
}
m["mub"] = {
"Mubi",
3440518,
"cdc-est",
"Latn",
}
m["muc"] = {
"Mbu'",
35868,
"nic-beb",
"Latn",
}
m["mud"] = {
"Mednyj Aleut",
1977419,
"qfa-mix",
ancestors = "ale, ru"
}
m["mue"] = {
"Media Lengua",
36066,
"qfa-mix",
"Latn",
ancestors = "es, qu",
}
m["mug"] = {
"Musgu",
3123545,
"cdc-cbm",
"Latn",
}
m["muh"] = {
"Mündü",
35981,
"nic-nke",
"Latn",
}
m["mui"] = {
"Musi",
615660,
"poz-mly",
"Latn",
}
m["muj"] = {
"Mabire",
3440437,
}
m["mul"] = {
"Translingual",
7834564,
"qfa-not",
"All",
-- NOTE: The following sort keys are used in process_page() in [[Module:headword/page]], which generates
-- the default sort key for the page (corresponding to {{DEFAULTSORT:...}}) by generating a sort key for
-- the pagename using `makeSortKey()` called on language object "mul". Currently this just handles
-- Japanese sort keys.
--
-- FIXME: This should be smarter and use the language of the page if there's only one.
sort_key = {
Hani = "Hani-sortkey",
Jpan = "Jpan-sortkey",
Hrkt = "Hira-sortkey", -- Sort all kana as Hira.
Hira = "Hira-sortkey",
Kana = "Hira-sortkey",
},
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" .. c.punc,
}
m["mum"] = {
"Maiwala",
12952764,
"poz-ocw",
"Latn",
}
m["muo"] = {
"Nyong",
36373,
"alv-lek",
}
m["mup"] = {
"Malvi",
33413,
"raj",
"Deva",
translit = "hi-translit"
}
m["muq"] = {
"Eastern Xiangxi Miao",
27431376,
"hmn",
}
m["mur"] = {
"Murle",
56727,
"sdv",
}
m["mus"] = {
"Creek",
523014,
"nai-mus",
"Latn",
}
m["mut"] = {
"Western Muria",
12952886,
"dra-mur",
}
m["muu"] = {
"Yaaku",
34222,
"cus-eas",
}
m["muv"] = {
"Muthuvan",
3327420,
"dra-tam",
}
m["mux"] = {
"Bo-Ung",
15831607,
"ngf-hag",
"Latn",
}
m["muy"] = {
"Muyang",
3502301,
"cdc-cbm",
"Latn",
}
m["muz"] = {
"Mursi",
36013,
"sdv",
}
m["mva"] = {
"Manam",
6746851,
"poz-ocw",
"Latn",
}
m["mvb"] = {
"Mattole",
20824,
"ath-pco",
"Latn",
}
m["mvd"] = {
"Mamboru",
578815,
"poz",
"Latn",
}
m["mvg"] = {
"Yucuañe Mixtec",
25562736,
"omq-mxt",
"Latn",
}
m["mvh"] = {
"Mire",
3441359,
}
m["mvi"] = {
"Miyako",
36218,
"jpx-sry",
"Jpan",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["mvk"] = {
"Mekmek",
6810592,
"paa-yua",
"Latn",
}
m["mvl"] = {
"Mbara (Australia)",
6799620,
"aus-pam",
"Latn",
}
m["mvm"] = {
"Muya",
2422759,
"sit-qia",
}
m["mvn"] = {
"Minaveha",
6863278,
"poz-ocw",
"Latn",
}
m["mvo"] = {
"Marovo",
3294683,
"poz-ocw",
"Latn",
}
m["mvp"] = {
"Duri",
3915414,
"poz-ssw",
"Latn",
}
m["mvq"] = {
"Moere",
11732458,
"ngf-kum",
"Latn",
}
m["mvr"] = {
"Marau",
6755069,
"poz-hce",
"Latn",
}
m["mvs"] = {
"Massep",
3502895,
"qfa-dis", -- poorly documented (but in vigorous use); isolate per Ethnologue, Glottolog, and Foley (2018); Greater
-- Kwerba per Usher
"Latn",
}
m["mvt"] = {
"Mpotovoro",
6928305,
"poz-vnc",
"Latn",
}
m["mvu"] = {
"Marfa",
713633,
}
m["mvv"] = {
"Tagal Murut",
7675300,
"poz-san",
"Latn",
}
m["mvw"] = {
"Machinga",
12952754,
"bnt-rvm",
}
m["mvx"] = {
"Meoswar",
6817777,
"poz-hce",
"Latn",
}
m["mvy"] = {
"Indus Kohistani",
33399,
"inc-koh",
"Arab",
}
m["mvz"] = {
"Mesqan",
6821677,
"sem-eth",
}
m["mwa"] = {
"Mwatebu",
14916896,
"poz-ocw",
"Latn",
}
m["mwb"] = {
"Juwal",
6319103,
"paa-mmu",
"Latn",
}
m["mwc"] = {
"Are",
29277,
"poz-ocw",
"Latn",
}
m["mwe"] = {
"Mwera",
6944725,
"bnt-rvm",
"Latn",
}
m["mwf"] = {
"Murrinh-Patha",
2980398,
"aus-dal",
"Latn",
}
m["mwg"] = {
"Aiklep",
3399652,
"poz-ocw",
"Latn",
}
m["mwh"] = {
"Mouk-Aria",
3325498,
"poz-ocw",
"Latn",
}
m["mwi"] = {
"Labo",
2157452,
"poz-vnc",
"Latn",
}
m["mwk"] = {
"Kita Maninkakan",
3015523,
"dmn-wmn",
}
m["mwl"] = {
"Mirandese",
13330,
"roa-asl",
"Latn",
}
m["mwm"] = {
"Sar",
56850,
"csu-sar",
"Latn",
}
m["mwn"] = {
"Nyamwanga",
6944666,
"bnt-mwi",
"Latn",
}
m["mwo"] = {
"Sungwadaga",
3276435,
"poz-vnn",
"Latn",
}
m["mwp"] = {
"Kala Lagaw Ya",
2591262,
"aus-pam",
"Latn",
}
m["mwq"] = {
"Mün Chin",
331340,
"tbq-kuk",
}
m["mwr"] = {
"Marwari",
56312,
"raj",
"Deva, Mahj",
translit = {
Deva = "hi-translit", -- for now
Mahj = "Mahj-translit",
},
}
m["mws"] = {
"Mwimbi-Muthambi",
15632357,
"bnt-kka",
"Latn",
}
m["mwt"] = {
"Moken",
18648701,
"poz",
}
m["mwu"] = {
"Mittu",
6883573,
"csu-bbk",
"Latn",
}
m["mwv"] = {
"Mentawai",
13365,
"poz-nws",
"Latn",
}
m["mww"] = {
"White Hmong",
3138829,
"hmn",
"Latn, Hmng, Hmnp",
}
m["mwz"] = {
"Moingi",
11011905,
}
m["mxa"] = {
"Northwest Oaxaca Mixtec",
12953739,
"omq-mxt",
"Latn",
}
m["mxb"] = {
"Tezoatlán Mixtec",
3317286,
"omq-mxt",
"Latn",
}
m["mxd"] = {
"Modang",
6888037,
"poz",
"Latn",
}
m["mxe"] = {
"Mele-Fila",
3305008,
"poz-pnp",
"Latn",
}
m["mxf"] = {
"Malgbe",
3502224,
}
m["mxg"] = {
"Mbangala",
6799612,
"bnt-yak",
}
m["mxh"] = {
"Mvuba",
6944591,
"csu-mle",
"Latn",
}
m["mxi"] = {
"Mozarabic",
317044,
"roa-ibe",
"Arab, Hebr, Latn",
translit = "mxi-translit",
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["mxj"] = {
"Miju",
56332,
"sit-mdz",
"Latn, Deva",
}
m["mxk"] = {
"Monumbo",
6906792,
"paa-mon",
"Latn",
}
m["mxl"] = {
"Maxi Gbe",
35770,
"alv-gbe",
}
m["mxm"] = {
"Meramera",
6817936,
"poz-ocw",
"Latn",
}
m["mxn"] = {
"Moi (Indonesia)",
11732459,
"paa-wbh",
"Latn",
}
m["mxo"] = {
"Mbowe",
10962309,
"bnt-kav",
}
m["mxp"] = {
"Tlahuitoltepec Mixe",
7810697,
}
m["mxq"] = {
"Juquila Mixe",
25559721,
}
m["mxr"] = {
"Murik (Malaysia)",
3328150,
nil,
"Latn",
}
m["mxs"] = {
"Huitepec Mixtec",
12953729,
"omq-mxt",
"Latn",
}
m["mxt"] = {
"Jamiltepec Mixtec",
12953730,
"omq-mxt",
"Latn",
}
m["mxu"] = {
"Mada (Cameroon)",
3441206,
"cdc-cbm",
"Latn",
}
m["mxv"] = {
"Metlatónoc Mixtec",
36363,
"omq-mxt",
"Latn",
}
m["mxw"] = {
"Namo",
12952923,
"paa-nam",
"Latn",
}
m["mxx"] = {
"Mahou",
11004334,
"dmn-mnk",
"Latn, Nkoo",
}
m["mxy"] = {
"Southeastern Nochixtlán Mixtec",
7070684,
"omq-mxt",
"Latn",
}
m["mxz"] = {
"Central Masela",
42575433,
"poz-tim",
"Latn",
}
m["myb"] = {
"Mbay",
3033565,
"csu-sar",
"Latn",
}
m["myc"] = {
"Mayeka",
11129517,
"bnt-boa",
}
m["mye"] = {
"Myene",
35832,
"bnt-tso",
"Latn",
}
m["myf"] = {
"Bambassi",
56540,
"omv-mao",
"Latn",
}
m["myg"] = {
"Manta",
35799,
"nic-mom",
"Latn",
}
m["myh"] = {
"Makah",
3280640,
"wak",
"Latn",
}
m["myj"] = {
"Mangayat",
35988,
"nic-ser",
}
m["myk"] = {
"Mamara",
36187,
"alv-sma",
"Latn",
}
m["myl"] = {
"Moma",
6897018,
"poz",
"Latn",
}
m["mym"] = {
"Me'en",
3408516,
"sdv",
}
m["myo"] = {
"Anfillo",
34928,
"omv-gon",
}
m["myp"] = {
"Pirahã",
33825,
"sai-mur",
"Latn",
}
m["myr"] = {
"Muniche",
3915654,
}
m["mys"] = {
"Mesmes",
3508617,
"sem-eth",
}
m["myu"] = {
"Mundurukú",
746723,
"tup",
"Latn",
}
m["myv"] = {
"Erzya",
29952,
"urj-mdv",
"Cyrl",
translit = "myv-translit",
override_translit = true,
}
m["myw"] = {
"Muyuw",
3502878,
"poz-ocw",
"Latn",
}
m["myx"] = {
"Masaba",
12952814,
"bnt-msl",
"Latn",
}
m["myy"] = {
"Macuna",
3275059,
"sai-tuc",
"Latn",
}
m["myz"] = {
"Classical Mandaic",
25559314,
"sem-ase",
"Mand",
translit = {
Mand = "Mand-translit",
},
strip_diacritics = {
Mand = "Mand-stripdiacritics",
}
}
m["mza"] = {
"Santa María Zacatepec Mixtec",
8063756,
"omq-mxt",
"Latn",
}
m["mzb"] = {
"Northern Saharan Berber",
11156769,
"ber",
"Arab, Latn, Tfng",
}
m["mzc"] = {
"Madagascar Sign Language",
12715020,
"sgn",
}
m["mzd"] = {
"Malimba",
35806,
"bnt-saw",
}
m["mze"] = {
"Morawa",
6909384,
"paa-mal",
"Latn",
}
m["mzg"] = {
"Monastic Sign Language",
3217333,
"sgn",
}
m["mzh"] = {
"Wichí Lhamtés Güisnay",
7998197,
"sai-wic",
"Latn",
}
m["mzi"] = {
"Ixcatlán Mazatec",
6101049,
"omq-maz",
"Latn",
}
m["mzj"] = {
"Manya",
11006832,
"dmn-mnk",
}
m["mzk"] = {
"Nigeria Mambila",
11004163,
"nic-mmb",
"Latn",
}
m["mzl"] = {
"Mazatlán Mixe",
25559728,
}
m["mzm"] = {
"Mumuye",
36021,
"alv-mum",
"Latn",
}
m["mzn"] = {
"Mazanderani",
13356,
"ira-msh",
"mzn-Arab",
}
m["mzo"] = {
"Matipuhy",
6787588,
"sai-kui",
"Latn",
}
m["mzp"] = {
"Movima",
1659701,
"qfa-iso",
"Latn",
}
m["mzq"] = {
"Mori Atas",
3324070,
"poz-btk",
"Latn",
}
m["mzr"] = {
"Marúbo",
3296011,
"sai-pan",
"Latn",
}
m["mzs"] = {
"Macanese",
35785,
"crp",
"Latn",
ancestors = "pt",
sort_key = {Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.diaer .. c.cedilla}},
}
m["mzt"] = {
"Mintil",
6869641,
"mkh-asl",
}
m["mzu"] = {
"Inapang",
6013569,
"paa-tam",
"Latn",
}
m["mzv"] = {
"Manza",
36038,
"gba-eas",
}
m["mzw"] = {
"Deg",
35183,
"nic-gnw",
"Latn",
}
m["mzx"] = {
"Mawayana",
6794377,
"awd",
}
m["mzy"] = {
"Mozambican Sign Language",
6927809,
"sgn",
}
m["mzz"] = {
"Maiadomu",
6735234,
"poz-ocw",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
jqsbkrtgamohmworzulrydmmobc7pr4
Mòideal:gd-mutation
828
16880
88497
86429
2026-07-29T20:28:09Z
Altronic
4137
update text
88497
Scribunto
text/plain
local lang = require("Module:languages").getByCode("gd")
local links = require("Module:links")
local export = {}
local function repl(forms, param)
if param ~= "normal" and forms[param] == forms["normal"] then
return "''chan urrainn dheth''"
end
local ret = links.full_link({ lang = lang, term = forms[param] })
if param == "lenited" and forms.an ~= forms.normal then
ret = ret .. "<br/>''leis " .. links.full_link({ lang = lang, alt = "an"}) .. "'', " .. links.full_link({ lang = lang, term = forms.an })
end
return ret
end
local vowel_table = [=[
! bun !! ur-dhubhadh !! le ''h''-ro-shuidheachadh !! le ''t''-ro-shuidheachadh
|-
| {{{normal}}}
| {{{eclipsis}}}
| {{{hpro}}}
| {{{tpro}}}
]=]
local consonant_table = [=[
! bun
! [[sèimheachadh]]
|-
| {{{normal}}}
| {{{lenited}}}
]=]
function export.drawtable(frame)
local title = require("Module:headword/data").pagename
local forms = require("Module:gd-common").mutate(title)
local wikicode = mw.ustring.find(mw.ustring.lower(title), "^[aàeèiìoòuùáéó]") and vowel_table or consonant_table
local result = frame:expandTemplate{
title = "inflection-table-top",
args = {
title = "Sèimheachadh dhen " .. require("Module:links").full_link({ lang = lang, alt = title }, 'term'),
palette = 'blue'
}
}
result = result .. '\n'
result = result .. mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", function(param) return repl(forms, param) end)
result = result .. frame:expandTemplate{
title = 'inflection-table-bottom',
args = {
notes = '<p style="font-size:85%;"><i>An Aire:</i> Chan urrainn dheth a h-uile cruth sèimhichte a chruthachadh anns a\' Ghàidhlig stannardach.<br>Chaidh a h-uile cruthan \'s a ghabhas a shealltainn an-seo.</p>'
}
}
return result
end
return export
2e7dty5lv3niiavja14nli02gasaltg
Mòideal:languages/data/3/s
828
17017
88533
86758
2026-07-30T10:31:04Z
Altronic
4137
88533
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
local m = {}
m["saa"] = {
"Saba",
3914885,
"cdc-est",
"Latn",
}
m["sab"] = {
"Buglere",
3368506,
"cba",
"Latn",
}
m["sac"] = {
"Fox",
12714767,
"alg-sfk",
"Latn",
}
m["sad"] = {
"Sandawe",
34016,
"qfa-iso",
"Latn",
}
m["sae"] = {
"Sabanê",
3460478,
"sai-nmk",
"Latn",
}
m["saf"] = {
"Safaliba",
36432,
"nic-mre",
"Latn",
}
m["sah"] = {
"Yakut",
34299,
"trk-nsb",
"Cyrl",
translit = "sah-translit",
override_translit = true,
}
m["saj"] = {
"Sahu",
7399757,
"paa-sah",
"Latn",
}
m["sak"] = {
"Sake",
36425,
"bnt-kel",
"Latn",
}
m["sam"] = {
"Samaritan Aramaic",
56612,
"sem-arw",
"Samr",
translit = "Samr-translit",
-- Samr strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["sao"] = {
"Sause",
4409155,
"qfa-dis", -- isolate per Glottolog, possibly related to Kapauri in a Kapauri-Sause family under Greater Kwerba
"Latn",
}
m["saq"] = {
"Samburu",
56536,
"sdv-lma",
}
m["sar"] = {
"Saraveca",
3450556,
"awd",
"Latn",
}
m["sas"] = {
"Sasak",
1294047,
"poz-bss",
"Latn, Bali, Java",
}
m["sat"] = {
"Santali",
33965,
"mun",
"Olck",
translit = "Olck-translit",
override_translit = true,
}
m["sau"] = {
"Saleman",
7404262,
"poz-cet",
}
m["sav"] = {
"Saafi-Saafi",
36308,
"alv-cng",
"Arab, Latn",
}
m["saw"] = {
"Sawi",
677064,
"ngf-awd",
"Latn",
}
m["sax"] = {
"Sa",
3460352,
"poz-vnn",
"Latn",
}
m["say"] = {
"Saya",
3914431,
"cdc-wst",
"Latn",
}
m["saz"] = {
"Saurashtra",
13292,
"inc-wes",
"Saur, Latn, Taml, Deva",
translit = "saz-translit",
ancestors = "inc-ogu",
}
m["sba"] = {
"Ngambay",
2372207,
"csu-sar",
"Latn",
}
m["sbb"] = {
"Simbo",
3484101,
"poz-ocw",
}
m["sbc"] = {
"Gele'",
3194847,
"poz-aay",
"Latn",
}
m["sbd"] = {
"Southern Samo",
33122730,
"dmn-sam",
"Latn",
}
m["sbe"] = {
"Saliba (New Guinea)",
3469737,
"poz-ocw",
}
m["sbf"] = {
"Shabo",
36342,
"ssa",
"Latn",
}
m["sbg"] = {
"Seget",
7446237,
"paa-wbh",
"Latn",
}
m["sbh"] = {
"Sori-Harengan",
36515,
"poz-aay",
"Latn",
}
m["sbi"] = {
"Seti",
7456682,
"paa-trr",
"Latn",
}
m["sbj"] = {
"Surbakhal",
759995,
}
m["sbk"] = {
"Safwa",
4121160,
"bnt-mby",
"Latn",
}
m["sbl"] = {
"Botolan Sambal",
4095195,
"phi",
"Latn",
}
m["sbm"] = {
"Sagala",
11732610,
"bnt-ruv",
"Latn",
}
m["sbn"] = {
"Sindhi Bhil",
25559289,
"inc-snd",
"Arab, Deva, Sind, Guru",
ancestors = "sd",
}
m["sbo"] = {
"Sabüm",
7396535,
"mkh-asl",
}
m["sbp"] = {
"Sangu (Tanzania)",
7418149,
"bnt-bki",
"Latn",
}
m["sbq"] = {
"Sirva",
7514337,
"ngf-nso",
"Latn",
}
m["sbr"] = {
"Sembakung Murut",
7449148,
"poz-san",
}
m["sbs"] = {
"Subiya",
6442073,
"bnt-bot",
"Latn",
}
m["sbt"] = {
"Kimki",
6410160,
"qfa-dis", -- Papuan; Glottolog and Foley treat as an isolate, Usher puts in South Pauwasi
"Latn",
}
m["sbu"] = {
"Stod Bhoti",
15622700,
"sit-las",
}
m["sbv"] = {
"Sabine",
65455885,
"itc-sbl",
"Latn",
display_text = s["itc-Latn-displaytext"],
strip_diacritics = s["itc-Latn-stripdiacritics"],
sort_key = s["itc-Latn-sortkey"],
}
m["sbw"] = {
"Simba",
36430,
"bnt-tso",
"Latn",
}
m["sbx"] = {
"Seberuang",
12473470,
"poz-mly",
}
m["sby"] = {
"Soli",
7557754,
"bnt-bot",
"Latn",
}
m["sbz"] = {
"Sara Kaba",
25559318,
"csu-kab",
"Latn",
}
m["scb"] = {
"Chut",
2967709,
"mkh-vie",
"Latn",
}
m["sce"] = {
"Dongxiang",
32947,
"xgn-shr",
"Arab, Latn",
}
m["scf"] = {
"San Miguel Creole French",
12953094,
"crp",
"Latn",
ancestors = "gcf",
sort_key = s["roa-oil-sortkey"],
}
m["scg"] = {
"Sanggau",
12473466,
"day",
}
m["sch"] = {
"Sakachep",
37054,
"tbq-kuk",
}
m["sci"] = {
"Sri Lankan Creole Malay",
1089151,
"crp",
"Latn",
ancestors = "ms",
}
m["sck"] = {
"Sadri",
765922,
"inc-bih",
"Deva, Kthi",
translit = {
Deva = "hi-translit",
Kthi = "bho-Kthi-translit",
},
}
m["scl"] = {
"Shina",
1353320,
"inc-shn",
"ur-Arab, Deva",
}
m["scn"] = {
"Sicilian",
33973,
"roa-itr",
ancestors = "scn-old",
"Latn",
}
m["sco"] = {
"Scots",
14549,
"gmw-ang",
"Latn",
ancestors = "gmw-msc",
}
m["scp"] = {
"Yolmo",
22662107,
"sit-kyk",
"Deva",
}
m["scq"] = {
"Sa'och",
6583617,
"mkh-pea",
}
m["scs"] = {
"North Slavey",
20628,
"den",
"Latn",
}
m["scu"] = {
"Shumcho",
22077739,
"sit-kin",
}
m["scv"] = {
"Sheni",
11015820,
"nic-jer",
"Latn",
ancestors = "zir",
}
m["scw"] = {
"Sha",
3438816,
"cdc-wst",
"Latn",
}
m["scx"] = {
"Sicel",
36667,
"itc",
"Polyt",
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["scz"] = {
"Shetland",
3069598,
"qfa-mix",
"Latn",
ancestors = "nrn, gmw-msc",
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzØøÖüÜü0123456789" .. c.punc,
}
m["sda"] = {
"Toraja-Sa'dan",
36673,
"poz-ssw",
"Latn",
}
m["sdb"] = {
"Shabak",
3289596,
"ira-zgr",
ancestors = "hac",
}
m["sdc"] = {
"Sassarese",
845441,
"roa-itr",
"Latn",
}
m["sde"] = {
"Surubu",
3913336,
"nic-kau",
"Latn",
}
m["sdf"] = {
"Sarli",
7424256,
"ira-zgr",
ancestors = "hac",
}
m["sdg"] = {
"Savi",
3474654,
"inc-dng",
}
m["sdh"] = {
"Southern Kurdish",
1496597,
"ku",
"ku-Arab",
translit = "sdh-translit",
strip_diacritics = {remove_diacritics = c.kasra .. c.sukun},
}
m["sdj"] = {
"Suundi",
7650407,
"bnt-kng",
"Latn",
}
m["sdk"] = {
"Sos Kundi",
7563811,
"paa-nnd",
"Latn",
}
m["sdl"] = {
"Saudi Arabian Sign Language",
3504160,
"sgn",
}
m["sdm"] = {
"Semandang",
7449012,
"day",
}
m["sdn"] = {
"Gallurese",
612220,
"roa-itr",
"Latn",
ancestors = "co",
}
m["sdo"] = {
"Bukar-Sadung Bidayuh",
2927799,
"day",
"Latn",
}
m["sdp"] = {
"Sherdukpen",
7494785,
"sit-khm",
}
m["sdr"] = {
"Oraon Sadri",
12953860,
"inc-bih",
}
m["sds"] = {
"Tunisian Berber",
5329732,
"ber",
"Latn",
}
m["sdu"] = {
"Sarudu",
7424700,
"poz-cet",
}
m["sdx"] = {
"Sibu Melanau",
18642842,
"poz-bnn",
}
m["sea"] = {
"Semai",
3135426,
"mkh-asl",
"Latn",
}
-- seb is a duplicate code of spp
m["sec"] = {
"Sechelt",
7442898,
"sal",
"Latn",
}
m["sed"] = {
"Sedang",
56448,
"mkh-nbn",
"Latn",
}
m["see"] = {
"Seneca",
1185133,
"iro-nor",
"Latn",
}
m["sef"] = {
"Cebaara",
10975121,
"alv-snr",
"Latn",
}
m["seg"] = {
"Segeju",
17584599,
"bnt-mij",
"Latn",
}
m["seh"] = {
"Sena",
2964008,
"bnt-sna",
"Latn",
}
m["sei"] = {
"Seri",
36583,
"qfa-iso",
"Latn",
}
m["sej"] = {
"Sene",
7450252,
"ngf-ehu",
"Latn",
}
m["sek"] = {
"Sekani",
28562,
"ath-nor",
"Latn",
}
m["sen"] = {
"Nanerige",
36002,
"alv-sma",
}
m["seo"] = {
"Asaba",
7630513,
"qfa-dis", -- Papuan; isolate or unclassified in Glottolog; Sepik language in Foley (2018)
"Latn",
}
m["sep"] = {
"Sicite",
56787,
"alv-sma",
}
m["seq"] = {
"Senara", -- not to be confused with Syenara (shz)
35210,
"alv-snr",
}
m["ser"] = {
"Serrano",
3479942,
"azc-tak",
"Latn",
}
m["ses"] = {
"Koyraboro Senni",
35655,
"son",
"Latn",
}
m["set"] = {
"Sentani",
3441672,
"paa-sen",
"Latn",
}
m["seu"] = {
"Serui-Laut",
7455503,
"poz-hce",
"Latn",
}
m["sev"] = {
"Nyarafolo",
36306,
"alv-snr",
}
m["sew"] = {
"Sewa Bay",
7458126,
"poz-ocw",
}
m["sey"] = {
"Secoya",
3477218,
"sai-tuc",
"Latn",
}
m["sez"] = {
"Senthang Chin",
7451223,
"tbq-kuk",
}
m["sfb"] = {
"French Belgian Sign Language",
3217332,
"sgn",
}
m["sfe"] = {
"Eastern Subanun",
63311321,
"phi",
"Latn",
}
m["sfm"] = {
"Small Flowery Miao",
7542773,
"hmn",
}
m["sfs"] = {
"South African Sign Language",
3322093,
"sgn",
}
m["sfw"] = {
"Sehwi",
36593,
"alv-ctn",
"Latn",
}
m["sga"] = {
"Seann-Ghàidhlig",
35308,
"cel-gae",
"Latn, Ogam",
strip_diacritics = {remove_diacritics = c.dotabove .. c.diaer .. "·"},
sort_key = "sga-sortkey",
standard_chars = "AaÁáBbCcDdEeÉéFfGgHhIiÍíLlMmNnOoÓóPpRrSsTtUuÚú0123456789ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔ" .. c.punc,
}
m["sgb"] = {
"Mag-Anchi Ayta",
4356243,
"phi",
"Latn",
}
m["sgc"] = {
"Kipsigis",
56339,
"sdv-nma",
}
m["sgd"] = {
"Surigaonon",
34140,
"phi",
"Latn",
}
m["sge"] = {
"Segai",
7446180,
}
m["sgg"] = {
"Swiss-German Sign Language",
35150,
"sgn",
}
m["sgh"] = {
"Shughni",
34053,
"ira-shr",
"Latn, Cyrl",
translit = "sgh-translit",
override_translit = true,
}
m["sgi"] = {
"Suga",
36475,
"nic-mmb",
"Latn",
}
m["sgk"] = {
"Sangkong",
2945610,
"tbq-bis",
}
m["sgm"] = {
"Singa",
7522797,
"bnt-lok",
"Latn",
}
m["sgp"] = {
"Singpho",
7524158,
"sit-jnp",
"Latn",
}
m["sgr"] = {
"Sangisari",
3394363,
"ira-kms",
"Arab",
}
m["sgs"] = {
"Samogitian",
213434,
"bat-eas",
"Latn",
wikimedia_codes = "bat-smg",
ancestors = "olt",
display_text = "lt-common",
strip_diacritics = "lt-common",
sort_key = "lt-common",
}
m["sgt"] = {
"Brokpake",
56603,
"sit-tib",
"Tibt",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["sgu"] = {
"Salas",
7403694,
"poz-cma",
}
m["sgw"] = {
"Sebat Bet Gurage",
2707343,
"sem-eth",
"Ethi",
}
m["sgx"] = {
"Sierra Leone Sign Language",
7511448,
"sgn-asl",
}
m["sgy"] = {
"Sanglechi",
3472220,
"ira-sgi",
}
m["sgz"] = {
"Sursurunga",
36511,
"poz-ocw",
"Latn",
}
m["sha"] = {
"Shall-Zwall",
3915355,
"nic-beo",
}
m["shb"] = {
"Ninam",
3436586,
"sai-ynm",
"Latn",
}
m["shc"] = {
"Sonde",
7560881,
"bnt-pen",
"Latn",
}
m["shd"] = {
"Kundal Shahi",
6444265,
"inc-shn",
"Arab",
}
m["she"] = {
"Sheko",
3183355,
"omv-diz",
}
m["shg"] = {
"Shua",
3501092,
"khi-kal",
"Latn",
}
m["shh"] = {
"Shoshone",
33811,
"azc-num",
"Latn",
}
m["shi"] = {
"Tashelhit",
34152,
"ber",
"Latn, Arab, Tfng, Hebr",
ancestors = "shi-med",
translit = {
Tfng = "Tfng-translit",
},
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["shj"] = {
"Shatt",
56344,
"sdv-daj",
}
m["shk"] = {
"Shilluk",
36486,
"sdv-lon",
"Latn",
}
m["shl"] = {
"Shendu",
22074616,
"tbq-kuk",
}
m["shm"] = {
"Shahrudi",
7462280,
"xme-ttc",
"fa-Arab, Latn",
ancestors = "xme-ttc-cen",
}
m["shn"] = {
"Shan",
56482,
"tai-swe",
"Mymr",
translit = "shn-translit",
sort_key = {
from = {"[ၢႃ]", "ဵ", "ႅ", "ႇ", "ႈ", "း", "ႉ", "ႊ"},
to = {"ာ", "ေ", "ႄ", "႒", "႓", "႔", "႕", "႖"}
},
}
m["sho"] = {
"Shanga",
3913931,
"dmn-bbu",
"Latn",
}
m["shp"] = {
"Shipibo-Conibo",
2671988,
"sai-pan",
"Latn",
}
m["shq"] = {
"Sala",
10961665,
"bnt-bot",
"Latn",
}
m["shr"] = {
"Shi",
3481999,
"bnt-shh",
"Latn",
}
m["shs"] = {
"Shuswap",
3482685,
"sal",
"Latn",
}
m["sht"] = {
"Shasta",
56396,
"nai-shs",
"Latn",
}
m["shu"] = {
"Chadian Arabic",
56497,
"sem-arb",
"Arab",
strip_diacritics = {
remove_diacritics = c.kashida .. c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
from = {u(0x0671)},
to = {u(0x0627)}
},
}
m["shv"] = {
"Shehri",
33445,
"sem-sar",
"Arab, Latn",
}
m["shw"] = {
"Shwai",
36527,
"alv-hei",
}
m["shx"] = {
"She",
2605689,
"hmn",
}
m["shy"] = {
"Tachawit",
33274,
"ber",
"Tfng, Arab, Latn",
translit = "Tfng-translit",
}
m["shz"] = {
"Syenara", -- not to be confused with Senara (seq)
36316,
"alv-snr",
}
m["sia"] = {
"Akkala Sami",
35241,
"smi",
"Cyrl, Latn",
translit = "sia-translit",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = "'ˈ"},
}
m["sib"] = {
"Sebop",
7442799,
"poz-swa",
"Latn",
}
m["sid"] = {
"Sidamo",
33786,
"cus-hec",
"Latn, Ethi",
}
m["sie"] = {
"Simaa",
7517329,
"bnt-kav",
"Latn",
}
m["sif"] = {
"Siamou",
36252,
}
m["sig"] = {
"Paasaal",
36426,
"nic-sis",
"Latn",
}
m["sih"] = {
"Sîshëë",
8072753,
"poz-cln",
"Latn",
}
m["sii"] = {
"Shom Peng",
1039346,
"aav",
}
m["sij"] = {
"Numbami",
3346277,
"poz-ocw",
"Latn",
}
m["sik"] = {
"Sikiana",
3443734,
"sai-prk",
"Latn",
}
m["sil"] = {
"Tumulung Sisaala",
25383006,
"nic-sis",
"Latn",
}
m["sim"] = {
"Mende (New Guinea)",
7446815,
"paa-sep",
"Latn",
}
m["sip"] = {
"Sikkimese",
35285,
"sit-tib",
"Tibt",
ancestors = "xct",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["siq"] = {
"Sonia",
7561770,
"ngf-bos",
"Latn",
}
m["sir"] = {
"Siri",
3438729,
"cdc-wst",
"Latn",
}
m["sis"] = {
"Siuslaw",
2315424,
}
m["siu"] = {
"Sinagen",
7521655,
"paa-wap",
"Latn",
}
m["siv"] = {
"Sumariup",
7636966,
"paa-sep",
"Latn",
}
m["siw"] = {
"Siwai",
7532519,
"paa-sbo",
"Latn",
}
m["six"] = {
"Sumau",
7637021,
"ngf-pek",
"Latn",
}
m["siy"] = {
"Sivandi",
13269,
"xme",
"fa-Arab, Latn",
ancestors = "xme-mid",
}
m["siz"] = {
"Siwi",
36814,
"ber",
"Tfng, Arab, Latn",
}
m["sja"] = {
"Epena",
3055682,
"sai-chc",
"Latn",
}
m["sjb"] = {
"Sajau Basap",
4684353,
"poz-bnn",
}
m["sjc"] = {
"Shaojiang Min",
3431451,
"zhx-inm",
"Hants",
generate_forms = "zh-generateforms",
sort_key = "Hani-sortkey",
}
m["sjd"] = {
"Kildin Sami",
33656,
"smi",
"Cyrl",
translit = "sjd-translit",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = "'ˈ"},
}
m["sje"] = {
"Pite Sami",
56314,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = c.macron .. "'ˈ"},
sort_key = "sje-sortkey",
}
m["sjg"] = {
"Assangori",
3502255,
"sdv-tmn",
}
m["sjk"] = {
"Kemi Sami",
35871,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = "'ˈ"},
}
m["sjl"] = {
"Miji",
6845470,
"sit-hrs",
}
m["sjm"] = {
"Mapun",
3287253,
"poz-sbj",
"Latn",
}
m["sjn"] = {
"Sindarin",
56437,
"art",
"Latn, Teng",
type = "appendix-constructed",
}
m["sjo"] = {
"Xibe",
13223,
"tuw-jrc",
"sjo-Mong",
ancestors = "mnc",
}
m["sjp"] = {
"Surjapuri",
7645351,
"inc-krd",
"Deva, as-Beng, Kthi",
}
m["sjr"] = {
"Siar-Lak",
3482907,
"poz-ocw",
}
m["sjs"] = {
"Senhaja de Srair",
56744,
"ber",
"Latn, Tfng, Arab",
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
translit = {
Tfng = "Tfng-translit",
}
}
m["sjt"] = {
"Ter Sami",
36656,
"smi",
"Cyrl, Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = "'ˈ"},
translit = "sjt-translit",
}
m["sju"] = {
"Ume Sami",
56415,
"smi",
"Latn",
strip_diacritics = {remove_diacritics = c.macron .. "'ˈ"},
display_text = {
from = {"'"},
to = {"ˈ"}
},
sort_key = "sju-sortkey",
}
m["sjw"] = {
"Shawnee",
2669206,
"alg",
"Latn",
}
-- [ska] Skagit is treated as part of [lut] Lushootseed
m["skb"] = {
"Saek",
36437,
"tai-nor",
"Thai",
sort_key = "Thai-sortkey",
}
m["skc"] = {
"Ma Manda",
6720783,
"ngf-era",
"Latn",
}
m["skd"] = {
"Southern Sierra Miwok",
3492334,
"nai-utn",
"Latn",
}
m["ske"] = {
"Ske",
7534244,
"poz-vnn",
"Latn",
}
m["skf"] = {
"Mekéns",
3304806,
"tup",
"Latn",
}
m["skh"] = {
"Sikule",
3121081,
"poz-nws",
}
m["ski"] = {
"Sika",
33960,
"poz-cet",
"Latn",
}
m["skj"] = { -- compare 'ths'
"Seke",
30226846,
"sit-tam",
}
m["skk"] = {
"Sok",
12953887,
"mkh-ban",
}
m["skm"] = {
"Sakam",
6448517,
"ngf-uru",
"Latn",
}
m["skn"] = {
"Kolibugan Subanon",
18755617,
"phi",
"Latn",
}
m["sko"] = {
"Seko Tengah",
15613270,
"poz",
}
m["skp"] = {
"Sekapan",
7447132,
"poz-bnn",
}
m["skq"] = {
"Sininkere",
3914896,
"dmn-snb",
"Latn",
}
m["skr"] = {
"Saraiki",
33902,
"inc-pan",
"pa-Arab, Mult, Deva",
strip_diacritics = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna},
translit = {
["pa-Arab"] = "pa-Arab-translit",
Deva = "hi-translit",
Mult = "Mult-translit",
},
}
m["sks"] = {
"Maia",
12952760,
"ngf-kau",
"Latn",
}
m["skt"] = {
"Sakata",
36691,
"bnt-bnm",
"Latn",
}
m["sku"] = {
"Sakao",
3298421,
"poz-vnn",
"Latn",
}
m["skv"] = {
"Skou",
3915200,
"paa-isk",
"Latn",
}
m["skw"] = {
"Skepi Creole Dutch",
2522153,
"crp",
"Latn",
ancestors = "nl",
}
m["skx"] = {
"Seko Padang",
15613282,
"poz-ssw",
"Latn",
}
m["sky"] = {
"Sikaiana",
7439242,
"poz-pnp",
"Latn",
}
m["skz"] = {
"Sekar",
7447136,
"poz-cet",
}
m["slc"] = {
"Saliba (Colombia)",
3441097,
nil,
"Latn",
}
m["sld"] = {
"Sisaala",
11020264,
"nic-sis",
"Latn",
}
m["sle"] = {
"Sholaga",
7500203,
"dra-kan",
"Knda",
-- Knda translit in [[Module:scripts/data]]
}
m["slf"] = {
"Swiss-Italian Sign Language",
12953479,
"sgn",
}
m["slg"] = {
"Selungai Murut",
7448844,
"poz-san",
}
-- [slh] Southern Puget Sound Salish is treated as part of [lut] Lushootseed
-- "sli" "Silesian German" IS SUBSUMED INTO "gmw-ecg" "East Central German"
m["slj"] = {
"Salumá",
7406296,
"sai-prk",
"Latn",
}
m["sll"] = {
"Salt-Yui",
7405785,
"ngf-sim",
"Latn",
}
m["slm"] = {
"Pangutaran Sama",
3362086,
"poz-sbj",
"Latn",
}
m["sln"] = {
"Salinan",
1568938,
"qfa-iso",
"Latn",
}
m["slp"] = {
"Lamaholot",
6480777,
"poz-cet",
"Latn",
}
m["slr"] = {
"Salar",
33963,
"trk-ogz",
"Arab, Latn",
ancestors = "trk-eog",
}
m["sls"] = {
"Singapore Sign Language",
7512563,
"sgn",
}
m["slt"] = {
"Sila",
7514021,
"tbq-sil",
}
m["slu"] = {
"Selaru",
7447500,
"poz-cet",
"Latn",
}
m["slw"] = {
"Sialum",
7506694,
"ngf-ehu",
"Latn",
}
m["slx"] = {
"Salampasu",
7403607,
"bnt-lun",
"Latn",
}
m["sly"] = {
"Selayar",
7447520,
"poz-ssw",
}
m["slz"] = {
"Ma'ya",
2291492,
"poz-hce",
"Latn",
}
m["sma"] = {
"Southern Sami",
13293,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = "'ˈ"},
sort_key = "sma-sortkey",
}
m["smb"] = {
"Simbari",
7517427,
"ngf-bsi",
"Latn",
}
m["smc"] = {
"Som",
7559081,
"ngf-uru",
"Latn",
}
m["smd"] = {
"Sama",
6407456,
"bnt-kmb",
"Latn",
}
m["smf"] = {
"Auwe",
3502072,
"paa-war",
"Latn",
ancestors = "dnd",
}
m["smg"] = {
"Simbali",
56692,
"paa-bai",
"Latn",
}
m["smh"] = {
"Samei",
7409269,
"tbq-axi",
}
m["smj"] = {
"Lule Sami",
56322,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = c.macron .. "'ˈ"},
sort_key = "smj-sortkey",
}
m["smk"] = {
"Bolinao",
2669235,
"phi",
"Latn, Tglg",
}
m["sml"] = {
"Central Sama",
3470593,
"poz-sbj",
"Latn",
}
m["smm"] = {
"Musasa",
6940122,
"inc-bih",
}
m["smn"] = {
"Inari Sami",
33462,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = c.dotbelow .. "'ˈ"},
sort_key = "smn-sortkey",
}
m["smp"] = {
"Samaritan Hebrew",
56502,
"sem-can",
"Samr",
translit = "Samr-translit",
-- Samr strip_diacritics, sort_key in [[Module:scripts/data]]
ancestors = "hbo",
}
m["smq"] = {
"Samo",
7409884,
"ngf-est",
"Latn",
}
m["smr"] = {
"Simeulue",
2992833,
"poz-nws",
"Latn",
}
m["sms"] = {
"Skolt Sami",
13271,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = c.dotbelow .. "'ˈ"},
sort_key = "sms-sortkey",
}
m["smt"] = {
"Simte",
7521268,
"tbq-kuk",
}
m["smu"] = {
"Somray",
6583612,
"mkh-pea",
}
m["smv"] = {
"Samvedi",
6345632,
"inc-sou",
}
m["smw"] = {
"Sumbawa",
3182585,
"poz-bss",
"Latn",
}
m["smx"] = {
"Samba",
11120157,
"bnt-pen",
"Latn",
}
m["smy"] = {
"Semnani",
14531212,
"xme",
"fa-Arab, Latn",
}
m["smz"] = {
"Simeku",
7517534,
"paa-sbo",
"Latn",
}
m["snb"] = {
"Sebuyau",
7442836,
"poz-mly",
"Latn",
}
m["snc"] = {
"Sinaugoro",
4170719,
"poz-ocw",
"Latn",
}
m["sne"] = {
"Bau Bidayuh",
2891938,
"day",
"Latn",
}
m["snf"] = {
"Noon",
36304,
"alv-cng",
"Latn",
}
m["sng"] = {
"Sanga (Congo)",
3438316,
"bnt-lub",
"Latn",
}
m["sni"] = {
"Sensi",
7451029,
"sai-pan",
"Latn",
}
m["snj"] = {
"Riverain Sango",
25559751,
"crp",
"Latn",
ancestors = "ngb",
}
m["snk"] = {
"Soninke",
36660,
"dmn-snb",
"Latn",
}
m["snl"] = {
"Sangil",
3472206,
"phi",
"Latn",
}
m["snm"] = {
"Southern Ma'di",
15637273,
"csu-mma",
}
m["snn"] = {
"Siona",
3485116,
"sai-tuc",
"Latn",
}
-- [sno] Snohomish is treated as part of [lut] Lushootseed
m["snp"] = {
"Siane",
7506812,
"ngf-gor",
"Latn",
}
m["snq"] = {
"Sangu (Gabon)",
36609,
"bnt-sir",
"Latn",
}
m["snr"] = {
"Sihan",
7513400,
"ngf-gum",
"Latn",
}
m["sns"] = {
"Nahavaq",
2160435,
"poz-vnc",
"Latn",
}
m["snu"] = {
"Senggi",
7929052,
"paa-war",
"Latn",
}
m["snv"] = {
"Sa'ban",
3474891,
"poz-swa",
"Latn",
}
m["snw"] = {
"Selee",
36272,
"alv-ntg",
"Latn",
}
m["snx"] = {
"Sam",
7408387,
"ngf-min",
"Latn",
}
m["sny"] = {
"Saniyo-Hiyewe",
7418302,
"paa-sep",
"Latn",
}
m["snz"] = {
"Kou",
7525035, -- also 4803639
"ngf-eva",
"Latn",
}
m["soa"] = {
"Thai Song",
7709159,
"tai-swe",
"Tavt, Thai",
--translit = "Tavt-translit",
sort_key = {
from = {"([ꪵꪶꪹꪻꪼ])([ꪀ-ꪯ])", "([เแโใไ])([ก-ฮ])"},
to = {"%2%1", "%2%1"}
},
}
m["sob"] = {
"Sobei",
3121035,
"poz-ocw",
"Latn",
}
m["soc"] = {
"Soko",
7555138,
"bnt-ske",
"Latn",
}
m["sod"] = {
"Songoora",
7561296,
"bnt-lgb",
"Latn",
}
m["soe"] = {
"Songomeno",
5713543,
"bnt-bsh",
"Latn",
}
m["sog"] = {
"Sogdian",
205979,
"ira-sgc",
"Sogd, Mani, Syrc, Sogo",
translit = {
Sogd = "Sogd-translit",
-- Mani translit in [[Module:scripts/data]]
Sogo = "Sogo-translit",
},
}
m["soh"] = {
"Aka (Sudan)",
3450949,
"sdv-eje",
"Latn",
}
m["soi"] = {
"Sonha",
12953890,
"inc-eas",
}
m["sok"] = {
"Sokoro",
3441303,
"cdc-est",
"Latn",
}
m["sol"] = {
"Solos",
3489591,
"poz-ocw",
}
m["soo"] = {
"Nsong",
12953148,
"bnt-bdz",
"Latn",
}
m["sop"] = {
"Songe",
3130911,
"bnt-lbn",
"Latn",
}
m["soq"] = {
"Kanasi",
11732656,
"ngf-dag",
"Latn",
}
m["sor"] = {
"Somrai",
3123566,
"cdc-est",
"Latn",
}
m["sos"] = {
"Seenku",
36274,
"dmn-smg",
}
m["sou"] = {
"Southern Thai",
56508,
"tai-swe",
"Thai",
sort_key = "Thai-sortkey",
}
m["sov"] = {
"Sonsorolese",
13281,
"poz-mic",
"Latn",
}
m["sow"] = {
"Sowanda",
7571845,
"paa-war",
"Latn",
}
m["sox"] = {
"Swo",
36604,
"bnt-mka",
"Latn",
}
m["soy"] = {
"Miyobe",
35913,
"alv-sav",
"Latn",
}
m["soz"] = {
"Temi",
13278,
"bnt-kka",
"Latn",
}
m["spb"] = {
"Sepa (Indonesia)",
18603687,
"poz-cma",
"Latn",
}
m["spc"] = {
"Sapé",
2888158,
nil,
"Latn",
}
m["spd"] = {
"Saep",
7398312,
"ngf-yag",
"Latn",
}
m["spe"] = {
"Sepa (New Guinea)",
7451725,
"poz-ocw",
"Latn",
}
m["spg"] = {
"Sian",
7506806,
"poz-bnn",
}
m["spi"] = {
"Saponi",
3915418,
"paa-rsa",
"Latn",
}
m["spk"] = {
"Sengo",
7450584,
"paa-nnd",
"Latn",
}
m["spl"] = {
"Selepet",
7447917,
"ngf-kab",
"Latn",
}
m["spm"] = {
"Sepen",
4701931,
"paa-rub",
"Latn",
}
m["spn"] = {
"Sanapaná",
3033556,
"sai-mas",
"Latn",
}
m["spo"] = {
"Spokane",
3493704,
"sal",
}
m["spp"] = {
"Supyire",
56284,
"alv-sma",
"Latn",
}
m["spr"] = {
"Saparua",
7420921,
"poz-cma",
"Latn",
}
m["sps"] = {
"Saposa",
3473187,
"poz-ocw",
"Latn",
}
m["spt"] = {
"Spiti Bhoti",
22080879,
"sit-las",
}
m["spu"] = {
"Sapuan",
7421168,
"mkh-ban",
"Latn", -- in the limited documentation that so far exists
}
m["spv"] = {
"Sambalpuri",
6433240,
"inc-eas",
"Orya",
translit = "or-translit",
ancestors = "or",
}
m["spx"] = {
"South Picene",
36688,
"itc-sbl",
"Ital, Latn",
-- Ital translit in [[Module:scripts/data]]
display_text = {
Latn = s["itc-Latn-displaytext"]
},
strip_diacritics = {
Latn = s["itc-Latn-stripdiacritics"],
},
sort_key = {
Latn = s["itc-Latn-sortkey"],
},
}
m["spy"] = {
"Sabaot",
7395896,
"sdv-kln",
}
m["sqa"] = {
"Shama-Sambuga",
3914392,
"nic-kmk",
"Latn",
}
m["sqh"] = {
"Shau",
3913925,
"nic-jer",
"Latn",
}
m["sqk"] = {
"Albanian Sign Language",
4709168,
"sgn",
}
m["sqm"] = {
"Suma",
11008431,
"gba-wes",
}
m["sqn"] = {
"Susquehannock",
3505736,
"iro-nor",
"Latn",
}
m["sqo"] = {
"Sorkhei",
3491964,
"ira-kms",
}
m["sqq"] = {
"Sou",
16979751,
"mkh-ban",
}
m["sqr"] = {
"Siculo-Arabic",
1069489,
"sem-arb",
"Arab",
}
m["sqs"] = {
"Sri Lankan Sign Language",
3915466,
"sgn",
}
m["sqt"] = {
"Soqotri",
13283,
"sem-sar",
"Arab, Latn",
}
m["squ"] = {
"Squamish",
2484579,
"sal",
"Latn",
}
m["sra"] = {
"Saruga",
7424699,
"ngf-han",
"Latn",
}
m["srb"] = {
"Sora",
13284,
"mun",
"Sora, Latn, Orya",
}
m["sre"] = {
"Sara",
33957,
"day",
}
m["srf"] = {
"Nafi",
6958174,
"poz-ocw",
}
m["srg"] = {
"Sulod",
7636489,
"phi",
"Latn",
}
m["srh"] = {
"Sarikoli",
33873,
"ira-shr",
"Latn, ug-Arab, Cyrl",
}
m["sri"] = {
"Siriano",
3485264,
"sai-tuc",
"Latn",
}
m["srk"] = {
"Serudung Murut",
7455497,
"poz-san",
}
m["srl"] = {
"Isirawa",
4203802,
"paa-gkw",
"Latn",
}
m["srm"] = {
"Saramaccan",
33779,
"crp",
"Latn",
ancestors = "en, pt",
}
m["srn"] = {
"Sranan Tongo",
33989,
"crp",
"Latn",
ancestors = "en",
}
m["srq"] = {
"Sirionó",
3027953,
"tup-gua",
"Latn",
}
m["srr"] = {
"Serer",
36284,
"alv-fwo",
"Latn",
}
m["srs"] = {
"Tsuut'ina",
20825,
"ath-nor",
"Latn",
}
m["srt"] = {
"Sauri",
7427547,
"paa-egb",
"Latn",
}
m["sru"] = {
"Suruí",
7646993,
"tup",
"Latn",
}
m["srv"] = {
"Waray Sorsogon",
18755610,
"phi",
"Latn",
}
m["srw"] = {
"Serua",
14916905,
"poz-cet",
}
m["srx"] = {
"Sirmauri",
7530505,
"him",
}
m["sry"] = {
"Sera",
7452602,
"poz-ocw",
"Latn",
}
m["srz"] = {
"Shahmirzadi",
12953126,
"ira-msh",
"fa-Arab",
}
m["ssb"] = {
"Southern Sama",
3470594,
"poz-sbj",
"Latn",
}
m["ssc"] = {
"Suba-Simbiti",
7630687,
"bnt-lok",
"Latn",
}
m["ssd"] = {
"Siroi",
10771067,
"ngf-rai",
"Latn",
}
m["sse"] = {
"Balangingi",
2880535,
"poz-sbj",
"Latn",
}
m["ssf"] = {
"Thao",
676492,
"map",
"Latn",
}
m["ssg"] = {
"Seimat",
3182581,
"poz-aay",
"Latn",
}
m["ssh"] = {
"Shihhi Arabic",
56571,
"sem-arb",
"Arab",
strip_diacritics = {
remove_diacritics = c.kashida .. c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
from = {u(0x0671)},
to = {u(0x0627)}
},
}
m["ssi"] = {
"Sansi",
3309366,
"inc-nwe",
}
m["ssj"] = {
"Sausi",
7427605,
"ngf-eva",
"Latn",
}
m["ssk"] = {
"Sunam",
11002210,
"sit-kin",
}
m["ssl"] = {
"Western Sisaala",
11154776,
"nic-sis",
"Latn",
}
m["ssm"] = {
"Semnam",
7449713,
"mkh-asl",
"Latn",
}
m["sso"] = {
"Sissano",
7530937,
"poz-ocw",
"Latn",
}
m["ssp"] = {
"Spanish Sign Language",
3100814,
"sgn",
}
m["ssq"] = {
"So'a",
7572120,
"poz-cet",
"Latn",
}
m["ssr"] = {
"Swiss-French Sign Language",
12953483,
"sgn",
}
m["sss"] = {
"Sô",
3082037,
"mkh-kat",
}
m["sst"] = {
"Sinasina",
7521813,
"ngf-sim",
"Latn",
}
m["ssu"] = {
"Susuami",
7649752,
"ngf-woj",
"Latn",
}
m["ssv"] = {
"Shark Bay",
7489783,
"poz-vnn",
"Latn",
}
m["ssx"] = {
"Samberigi",
7409020,
"ngf-sak",
"Latn",
}
m["ssy"] = {
"Saho",
36353,
"cus-eas",
"Latn, Ethi, Arab",
}
m["ssz"] = {
"Sengseng",
7450601,
"poz-ocw",
"Latn",
}
m["stb"] = {
"Northern Subanen",
12953892,
"phi",
"Latn",
}
m["std"] = {
"Sentinelese",
568377,
"qfa-unc", -- presumed Ongan
}
m["ste"] = {
"Liana-Seti",
6539924,
"poz-cma",
}
m["stf"] = {
"Seta",
7456326,
"paa-trr",
"Latn",
}
m["stg"] = {
"Trieng",
22694648,
"mkh-ban",
}
m["sth"] = {
"Shelta",
36705,
"qfa-mix",
"Latn",
ancestors = "ga, en",
}
m["sti"] = {
"Bulo Stieng",
15771431,
"mkh-ban",
"Khmr, Latn",
}
m["stj"] = {
"Matya Samo",
10974879,
"dmn-sam",
"Latn",
}
m["stk"] = {
"Arammba",
3502094,
"paa-ton",
"Latn",
}
m["stm"] = {
"Setaman",
7456333,
"ngf-mok",
"Latn",
}
m["stn"] = {
"Owa",
1324132,
"poz-sls",
"Latn",
}
m["sto"] = {
"Stoney",
3033570,
"sio-dkt",
"Latn",
}
m["stp"] = {
"Southeastern Tepehuan",
12953917,
"azc-pim",
"Latn",
}
m["stq"] = {
"Saterland Frisian",
27154,
"gmw-fri",
"Latn",
}
m["str"] = {
"Saanich",
36444,
"sal",
"Latn",
}
m["sts"] = {
"Shumashti",
33777,
"inc-kun",
"Arab",
}
m["stt"] = {
"Budeh Stieng",
12953891,
"mkh-ban",
}
m["stu"] = {
"Samtao",
25559550,
"mkh-pal",
}
m["stv"] = {
"Silt'e",
33880,
"sem-eth",
"Ethi",
}
m["stw"] = {
"Satawalese",
28477,
"poz-mic",
"Latn",
}
m["sty"] = {
"Siberian Tatar",
4418344,
"trk-kno",
"Cyrl",
}
m["sua"] = {
"Sulka",
7636341,
"qfa-iso", -- Papuan; isolate in Glottolog and Palmer (2018)
"Latn",
}
m["sub"] = {
"Suku",
12953160,
"bnt-yak",
"Latn",
}
m["suc"] = {
"Western Subanon",
16113894,
"phi",
"Latn",
}
m["sue"] = {
"Suena",
7634386,
"ngf-nbi",
"Latn",
}
m["sug"] = {
"Suganga",
7634706,
"ngf-msu",
"Latn",
}
m["sui"] = {
"Suki",
2089984,
"ngf-gsu",
"Latn",
}
m["suk"] = {
"Sukuma",
2638144,
"bnt-tkm",
"Latn",
}
m["suo"] = {
"Bouni",
65043887,
"paa-pio",
"Latn",
}
m["suq"] = {
"Suri",
5364172,
"sdv",
}
m["sur"] = {
"Mwaghavul",
3440486,
"cdc-wst",
"Latn",
}
m["sus"] = {
"Susu",
33990,
"dmn-sya",
"Latn",
}
m["sut"] = {
"Subtiaba",
3915405,
"omq",
"Latn",
}
m["suv"] = {
"Puroik",
56408,
"sit-khb",
"Beng, Deva, Latn",
ancestors = "sit-khp-pro",
}
m["suw"] = {
"Sumbwa",
7637055,
"bnt-glb",
"Latn",
}
m["sux"] = {
"Sumerian",
36790,
"qfa-iso",
"Xsux, Latn",
}
m["suy"] = {
"Suyá",
3505859,
"sai-nje",
"Latn",
}
m["suz"] = {
"Sunwar",
56549,
"sit-kiw",
"Deva, Sunu"
}
m["sva"] = {
"Svan",
34067,
"ccs",
"Geor, Cyrl",
translit = {
Geor = "sva-translit",
},
override_translit = true,
}
m["svb"] = {
"Ulau-Suain",
7878769,
"poz-ocw",
"Latn",
}
m["svc"] = {
"Vincentian Creole English",
3501785,
"crp",
"Latn",
ancestors = "en",
}
m["sve"] = {
"Serili",
7454834,
"poz-tim",
}
m["svk"] = {
"Slovakian Sign Language",
7541557,
"sgn",
}
m["svm"] = {
"Slavomolisano",
36254,
"zls",
"Latn",
ancestors = "sh",
}
m["svs"] = {
"Savosavo",
3130296,
"qfa-dis", -- Papuan; isolate in Glottolog; in the tentative Central Solomons family by Ross (2005) and Pedrós
-- (2015)
"Latn",
}
m["svx"] = {
"Skalvian",
3486125,
"bat-wes",
"Latn",
}
m["swb"] = {
"Maore Comorian",
34075,
"bnt-com",
"Latn",
sort_key = "bnt-com-sortkey",
}
m["swf"] = {
"Sere",
7453056,
"nic-ser",
"Latn",
}
m["swg"] = {
"Swabian",
327274,
"gmw-hgm",
"Latn",
ancestors = "gsw",
}
m["swi"] = {
"Sui",
3112388,
"qfa-kms",
"Latn, Shui, Hani",
sort_key = {Hani = "Hani-sortkey"},
}
m["swj"] = {
"Sira",
36599,
"bnt-sir",
"Latn",
}
m["swl"] = {
"Swedish Sign Language",
36558,
"sgn",
}
m["swm"] = {
"Samosa",
7410037,
"ngf-nwh",
"Latn",
}
m["swn"] = {
"Sokna",
2988323,
"ber",
}
m["swo"] = {
"Shanenawa",
61974839,
"sai-pan",
"Latn",
}
m["swp"] = {
"Suau",
3502368,
"poz-ocw",
}
m["swq"] = {
"Sharwa",
56791,
"cdc-cbm",
"Latn",
}
m["swr"] = {
"Saweru",
3474649,
"paa-ysa",
"Latn",
}
m["sws"] = {
"Seluwasan",
7448845,
"poz-cet",
"Latn",
}
m["swt"] = {
"Sawila",
7428639,
"paa-alp",
"Latn",
}
m["swu"] = {
"Suwawa",
7650588,
"phi",
"Latn",
}
m["sww"] = {
"Sowa",
7571843,
"poz-vnn",
"Latn",
}
m["swx"] = {
"Suruahá",
3114402,
"auf",
}
m["swy"] = {
"Sarua",
56261,
"cdc-est",
"Latn",
}
m["sxb"] = {
"Suba",
33916,
"bnt-lok",
"Latn",
}
m["sxc"] = {
"Sicanian",
36335,
"qfa-unc", -- extinct; lack of data: only names deciphered
"Polyt",
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["sxe"] = {
"Sighu",
36431,
"bnt-kel",
"Latn",
}
m["sxg"] = {
"Shixing",
56337,
"sit-nax",
"Latn",
}
m["sxk"] = {
"Southern Kalapuya",
3192122,
"nai-klp",
}
m["sxl"] = {
"Selonian",
36491,
"bat-eas",
"Latn",
}
m["sxm"] = {
"Samre",
6583615,
"mkh-pea",
}
m["sxn"] = {
"Sangir",
25714758,
"phi",
"Latn",
}
m["sxo"] = {
"Sorothaptic",
2762254,
}
m["sxr"] = {
"Saaroa",
716599,
"map",
"Latn",
}
m["sxs"] = {
"Sasaru",
3913384,
"alv-yek",
"Latn",
}
-- "sxu" "Upper Saxon" IS SUBSUMED INTO "gmw-ecg" "East Central German"
m["sxw"] = {
"Saxwe Gbe",
7428892,
"alv-pph",
"Latn",
}
m["sya"] = {
"Siang",
3482903,
}
m["syb"] = {
"Central Subanen",
12953893,
"phi",
"Latn",
}
m["syc"] = {
"Classical Syriac",
33538,
"sem-are",
"Syrc",
strip_diacritics = {remove_diacritics = c.macron .. c.diaer .. c.macronbelow .. u(0x0730) .. "-" .. u(0x0748)},
}
m["syi"] = {
"Seki",
36547,
"bnt-kel",
"Latn",
}
m["syk"] = {
"Sukur",
56292,
"cdc-cbm",
"Latn",
}
m["syl"] = {
"Sylheti",
2044560,
"inc-bas",
"Sylo, Beng",
ancestors = "inc-obn",
translit = "syl-translit",
}
m["sym"] = {
"Maya Samo",
10950421,
"dmn-sam",
"Latn",
}
m["syn"] = {
"Senaya",
33914,
"sem-nna",
}
m["syo"] = {
"Suoy",
7641864,
"mkh-pea",
}
m["sys"] = {
"Sinyar",
56840,
"csu",
"Latn",
}
m["syw"] = {
"Kagate",
12952538,
"sit-kyk",
"Deva",
}
m["syx"] = {
"Osamayi",
7408415,
"bnt-kel",
"Latn",
}
m["syy"] = {
"Al-Sayyid Bedouin Sign Language",
2915457,
"sgn",
}
m["sza"] = {
"Semelai",
3111827,
"mkh-asl",
"Latn",
}
m["szb"] = {
"Ngalum",
11732516,
"ngf-okk",
"Latn",
}
m["szc"] = {
"Semaq Beri",
7449119,
"mkh-asl",
"Latn",
}
m["szd"] = {
"Seru",
7455488,
"poz-bnn",
"Latn",
}
m["sze"] = {
"Seze",
373683,
"omv-mao",
"Latn",
}
m["szg"] = {
"Sengele",
7450555,
"bnt-mon",
"Latn",
}
m["szl"] = {
"Silesian",
30319,
"zlw-lch",
"Latn",
ancestors = "zlw-opl",
}
m["szn"] = {
"Sula",
3503403,
"poz-cma",
"Latn",
}
m["szp"] = {
"Suabo",
7630429,
"ngf-sbh",
"Latn",
}
m["szs"] = {
"Solomon Islands Sign Language",
26449924,
"sgn",
}
m["szv"] = {
"Isubu",
35431,
"bnt-saw",
"Latn",
}
m["szw"] = {
"Sawai",
3447258,
"poz-hce",
"Latn",
}
m["szy"] = {
"Sakizaya",
718269,
"map",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
4jot2dsm7wb1l6cs3jkt15gdqv9y7sp
Teamplaid:synonyms
10
17762
88500
88470
2026-07-29T22:12:14Z
Altronic
4137
change text
88500
wikitext
text/x-wiki
{{#invoke:nyms|nyms|co-fhacal}}<noinclude>{{documentation}}</noinclude>
2wy2lpjva5dzoo5n7qkreqywjux8a4r
88503
88500
2026-07-29T22:18:55Z
Altronic
4137
88503
wikitext
text/x-wiki
{{#invoke:nyms|nyms|co-fhacal|co-fhacail}}<noinclude>{{documentation}}</noinclude>
kjlads4z5gsbnzi4jhsz076885056ts
88505
88503
2026-07-29T22:21:03Z
Altronic
4137
88505
wikitext
text/x-wiki
{{#invoke:nyms|nyms|co-fhacal||co-fhacail}}<noinclude>{{documentation}}</noinclude>
55e9v90fk798c3y84pj56nngt9pckgp
88506
88505
2026-07-29T22:21:28Z
Altronic
4137
88506
wikitext
text/x-wiki
{{#invoke:nyms|nyms|co-fhacal|co-fhacail}}<noinclude>{{documentation}}</noinclude>
kjlads4z5gsbnzi4jhsz076885056ts
88508
88506
2026-07-29T22:22:10Z
Altronic
4137
88508
wikitext
text/x-wiki
{{#invoke:nyms|nyms|co-fhacal|pl=co-fhacail}}<noinclude>{{documentation}}</noinclude>
m6n8k2vbzfxxfw5phj3ckiw03ycmahu
Mòideal:nyms
828
17763
88499
88472
2026-07-29T22:12:04Z
Altronic
4137
change some text
88499
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">" .. mw.getContentLanguage():ucfirst(nym_type) ..
((#items > 1 or thesaurus_text ~= "") and "an" or "") .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
8zqbz9gos3lrzhjlpt5enpgkrs56yk8
88502
88499
2026-07-29T22:18:15Z
Altronic
4137
test plural support
88502
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
[3] = {required = true, type = "parameter"}
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local plural = args[3]
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">" .. mw.getContentLanguage():ucfirst(nym_type) ..
((#items > 1 or thesaurus_text ~= "") and plural or "") .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
8y2d8trpq1mecv6cldjf3hnenbesesy
88504
88502
2026-07-29T22:20:34Z
Altronic
4137
more plurals
88504
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
[3] = {required = true, type = "parameter"}
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local plural = args[3]
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">"
if #items > 1 or thesaurus_text ~= "" then
caption = caption .. mw.getContentLanguage():ucfirst(nym_type)
else
caption = caption .. plural or ""
end
caption = caption .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
7qjvc9bgexlxc7s4689at1nhrv5zvsf
88507
88504
2026-07-29T22:22:08Z
Altronic
4137
88507
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
["pl"] = {required = true, type = "parameter"}
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local plural = args["pl"]
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">"
if #items > 1 or thesaurus_text ~= "" then
caption = caption .. mw.getContentLanguage():ucfirst(nym_type)
else
caption = caption .. plural or ""
end
caption = caption .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
8qw0p0p27lw1mu4g4278s2e28jxhd4n
88509
88507
2026-07-29T22:24:23Z
Altronic
4137
fix
88509
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local plural = frame.args["pl"]
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">"
if #items > 1 or thesaurus_text ~= "" then
caption = caption .. plural or ""
else
caption = caption .. mw.getContentLanguage():ucfirst(nym_type)
end
caption = caption .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
3tfrjpwlpvq0eu4t8mnz93oixlon4j4
88510
88509
2026-07-29T22:27:44Z
Altronic
4137
test
88510
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local plural = frame.args["pl"]
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">"
if #items > 1 or thesaurus_text ~= "" then
caption = caption .. mw.ustring.gsub(plural, "^(.)", mw.ustring.upper("%1")) or ""
else
caption = caption .. mw.getContentLanguage():ucfirst(nym_type)
end
caption = caption .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
jebiyuu89r8vhh48qyffosbwz2t7ikv
88511
88510
2026-07-29T22:28:06Z
Altronic
4137
Neo-dhèan mùthadh [[Special:Diff/88510|88510]] leis [[Special:Contributions/Altronic|Altronic]] ([[User talk:Altronic|an deasbaireachd]])
88511
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameter_utilities_module = "Module:parameter utilities"
local parse_utilities_module = "Module:parse utilities"
local pron_qualifier_module = "Module:pron qualifier"
local function track(page)
return require(debug_track_module)("nyms/" .. page)
end
local function wrap_span(text, lang, sc)
return '<span class="' .. sc .. '" lang="' .. lang .. '">' .. text .. '</span>'
end
local function term_already_linked(term)
-- optimization to avoid unnecessarily loading [[Module:parse utilities]]
return term:find("[<{]") and require(parse_utilities_module).term_already_linked(term)
end
function export.nyms(frame)
local parent_args = frame:getParent().args
-- FIXME: Temporary error message and tracking.
for arg, _ in pairs(parent_args) do
if type(arg) == "string" and arg:find("^lb[0-9]*$") then
local llarg = arg:gsub("^lb", "ll")
error(("%s= is deprecated; use %s= instead, per the documentation"):format(arg, llarg))
end
if arg == "q" or arg == "qq" then
track(arg)
end
if type(arg) == "string" and arg:find("^tag[0-9]*$") then
local larg = arg:gsub("^tag", "l")
local llarg = arg:gsub("^tag", "ll")
error(("Use %s= (on the left) or %s= (on the right) instead of %s="):format(larg, llarg, arg))
end
end
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {list = true, allow_holes = true, required = true},
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "ref", "l"}},
-- For compatibility, we don't distinguish q= from q1= and qq= from q1=. FIXME: Maybe we should change this.
{group = "q", separate_no_index = false},
{param = "lb", deprecated = true},
}
local special_separators = mw.clone(m_param_utils.default_special_separators)
special_separators["<"] = " < "
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
track_module = "nyms",
lang = 1,
special_separators = special_separators,
sc = "sc.default",
}
local nym_type = frame.args[1]
local nym_type_class = string.gsub(nym_type, "%s", "-")
local lang = args[1]
local langcode = lang:getCode()
local plural = frame.args["pl"]
local data = {
lang = lang,
items = items,
sc = args.sc.default,
l = args.l.default,
ll = args.ll.default,
q = args.q.default,
qq = args.qq.default,
}
local parts = {}
local thesaurus_parts = {}
for i, item in ipairs(data.items) do
if item.lb then
error("Inline modifier <lb:...> is deprecated; use <ll:...> per the documentation")
end
local explicit_item_lang = item.lang
item.lang = item.lang or data.lang
item.sc = item.sc or data.sc
local text
local is_thesaurus
if item.term and item.term:find("^Thesaurus:") then
is_thesaurus = true
for k, _ in pairs(item) do
if m_param_utils.item_key_is_property(k) and k ~= "lang" and k ~= "sc" and k ~= "q" and k ~= "qq" and
k ~= "l" and k ~= "ll" and k ~= "refs" then
error(("You cannot use most named parameters and inline modifiers with Thesaurus links, but saw %s%s= or its equivalent inline modifier <%s:...>"):format(
k, item.itemno, k))
end
end
local term = item.term:match("^Thesaurus:(.*)$")
-- Chop off fragment
term = term:match("^(.-)#.*$") or term
local lang = item.lang
local sccode = (item.sc or lang:findBestScript(term)):getCode()
-- FIXME: I assume it's better to include full-language codes in the CSS rather than etym-language codes,
-- which are generally specific to Wiktionary. However, we should probably instead be using the functions
-- from [[Module:script utilities]] in preference to rolling our own.
text = "[[" .. item.term .. "#" .. lang:getFullName() .. "|Thesaurus:" .. wrap_span(term, lang:getFullCode(), sccode) .. "]]"
else
if thesaurus_parts[1] then
error("Links to the Thesaurus must follow all non-Thesaurus links")
end
local raw_term = item.alt or item.term
if raw_term and term_already_linked(raw_term) then
text = raw_term
else
text = require(links_module).full_link(item)
end
end
local qq = item.qq
-- If a separate language code was given for the term, display the language name as a right qualifier.
-- Otherwise it may not be obvious that the term is in a separate language (e.g. if the main language is 'zh'
-- and the term language is a Chinese lect such as Min Nan). But don't do this for Translingual terms, which
-- are often added to the list of English and other-language terms.
if explicit_item_lang then
local explicit_code = explicit_item_lang:getCode()
if explicit_code ~= langcode and explicit_code ~= "mul" then
qq = mw.clone(qq) or {}
table.insert(qq, 1, explicit_item_lang:getCanonicalName())
end
end
if item.q and item.q[1] or qq and qq[1] or item.l and item.l[1] or item.ll and item.ll[1] or
item.refs and item.refs[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = item.lang,
text = text,
q = item.q,
qq = qq,
l = item.l,
ll = item.ll,
refs = item.refs,
}
end
local insert_place = is_thesaurus and thesaurus_parts or parts
-- Don't include the separator if this is the first item of this class that we're inserting.
table.insert(insert_place, insert_place[1] and item.separator or "")
table.insert(insert_place, text)
end
local text = table.concat(parts)
local thesaurus_text = table.concat(thesaurus_parts)
local caption = "<span style=\"font-size: smaller\">"
if #items > 1 or thesaurus_text ~= "" then
caption = caption .. plural or ""
else
caption = caption .. mw.getContentLanguage():ucfirst(nym_type)
end
caption = caption .. ":</span> " -- plural
text = caption .. text
local function qualifier_error_if_no_terms()
if not parts[1] then
error("Cannot specify overall qualifiers if no non-Thesaurus terms given")
end
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.l and data.l[1] then
qualifier_error_if_no_terms()
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
l = data.l,
-- ll handled specially for compatibility's sake
}
end
if data.ll and data.ll[1] then
qualifier_error_if_no_terms()
text = text .. " — " .. require(labels_module).show_labels {
lang = data.lang,
labels = data.ll,
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
if thesaurus_text ~= "" then
local thesaurus_intro = parts[1] and "; ''faic air cuideachd'' " or "''faic air'' "
text = text .. thesaurus_intro .. thesaurus_text
end
return "<span class=\"nyms " .. nym_type_class .. "\">" .. text .. "</span>"
end
return export
3tfrjpwlpvq0eu4t8mnz93oixlon4j4
Wiktionary:Doras na coimhearsnachd
4
17771
88498
88492
2026-07-29T20:39:16Z
Altronic
4137
Earrann ùr /* Interface administrator access */
88498
wikitext
text/x-wiki
__NEWSECTIONLINK__
== Interface administrator access ==
I'm applying for [https://meta.wikimedia.org/wiki/Interface_administrators interface administrator] access, which will allow me to upload site-wide CSS and JavaScript code for things. This is needed to fix a couple templates that are currently broken. (see a page like [[darllen]]) [[Cleachdaiche:Altronic|Altronic]] ([[Deasbaireachd a' chleachdaiche:Altronic|an deasbaireachd]]) 20:39, 29 dhen Iuchar 2026 (UTC)
sm97uht1nnmm6159rtyvy9fkcfpd6qz
Teamplaid:co-fhacail
10
17773
88501
2026-07-29T22:12:50Z
Altronic
4137
Chaidh an duilleag ath-stiùireadh gu [[Teamplaid:synonyms]]
88501
wikitext
text/x-wiki
#REDIRECT[[Template:synonyms]]
psh1j8ebyfyhzxhuho2zowftnk5thyo
Teamplaid:sga-IPA
10
17774
88514
2025-08-18T17:32:58Z
en>Surjection
0
Protected "[[Template:sga-IPA]]": Highly visible template/module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
88514
wikitext
text/x-wiki
<includeonly>{{#invoke:sga-IPA|show}}</includeonly><!--
--><noinclude>{{documentation}}</noinclude>
8kfnl0uwxbz2cc8etaoxvvetim8juqm
88515
88514
2026-07-30T09:54:56Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:sga-IPA]]
88514
wikitext
text/x-wiki
<includeonly>{{#invoke:sga-IPA|show}}</includeonly><!--
--><noinclude>{{documentation}}</noinclude>
8kfnl0uwxbz2cc8etaoxvvetim8juqm
Teamplaid:sga-verb
10
17775
88516
2026-07-10T03:01:17Z
en>Chuck Entz
0
88516
wikitext
text/x-wiki
<includeonly>{{#invoke:checkparams|warn}}</includeonly>{{head|sga|verb|head={{{head|}}}|altform={{{altform|}}}<!--
-->|{{#if:{{{conj|}}}|conjunct}}<!--
-->|{{{conj}}}<!--
-->|{{#if:{{{conj2|}}}|or}}<!--
-->|{{{conj2}}}<!--
-->|{{#if:{{{prot|}}}|prototonic}}<!--
-->|{{{prot}}}<!--
-->|{{#if:{{{prot2|}}}|or}}<!--
-->|{{{prot2}}}<!--
-->|{{#if:{{{1|}}}|verbal noun}}<!--
-->|{{{1}}}<!--
-->|{{#if:{{{2|}}}|or}}<!--
-->|{{{2}}}<!--
-->}}<!--
-->{{#if:{{{dep|}}}|{{catlangname|sga|deponent verbs}}}}<!--
--><noinclude>{{documentation}}</noinclude>
elp0lumjwz72mw6gzvl65dexf22dbye
88517
88516
2026-07-30T09:55:07Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:sga-verb]]
88516
wikitext
text/x-wiki
<includeonly>{{#invoke:checkparams|warn}}</includeonly>{{head|sga|verb|head={{{head|}}}|altform={{{altform|}}}<!--
-->|{{#if:{{{conj|}}}|conjunct}}<!--
-->|{{{conj}}}<!--
-->|{{#if:{{{conj2|}}}|or}}<!--
-->|{{{conj2}}}<!--
-->|{{#if:{{{prot|}}}|prototonic}}<!--
-->|{{{prot}}}<!--
-->|{{#if:{{{prot2|}}}|or}}<!--
-->|{{{prot2}}}<!--
-->|{{#if:{{{1|}}}|verbal noun}}<!--
-->|{{{1}}}<!--
-->|{{#if:{{{2|}}}|or}}<!--
-->|{{{2}}}<!--
-->}}<!--
-->{{#if:{{{dep|}}}|{{catlangname|sga|deponent verbs}}}}<!--
--><noinclude>{{documentation}}</noinclude>
elp0lumjwz72mw6gzvl65dexf22dbye
Teamplaid:sga-conj-simple
10
17776
88518
2026-05-18T22:07:13Z
en>Mahagaja
0
Reverted edits by [[Special:Contributions/Mahagaja|Mahagaja]]. If you think this rollback is in error, please leave a message on my talk page.
88518
wikitext
text/x-wiki
{{#invoke:sga-verbs|manual|template=sga-conj-table-simple|cat=simple}}<noinclude>{{documentation}}</noinclude>
6cg2zztezyr0f5o6a1pazuvcusqlo1t
88519
88518
2026-07-30T09:55:37Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:sga-conj-simple]]
88518
wikitext
text/x-wiki
{{#invoke:sga-verbs|manual|template=sga-conj-table-simple|cat=simple}}<noinclude>{{documentation}}</noinclude>
6cg2zztezyr0f5o6a1pazuvcusqlo1t
Mòideal:sga-verbs
828
17777
88520
2025-08-10T16:17:11Z
en>Surjection
0
Protected "[[Module:sga-verbs]]": Highly visible template/module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
88520
Scribunto
text/plain
local m_utilities = require("Module:utilities")
local m_links = require("Module:links")
local export = {}
local lang = require("Module:languages").getByCode("sga")
-- Inflection functions
export["manual"] = function(frame)
local wikicode = frame:expandTemplate { title = frame.args["template"], args = {} }
local params = {
["present_class"] = { list = true },
["preterite_class"] = { list = true },
["future_class"] = { list = true },
["subjunctive_class"] = { list = true },
["class"] = {},
}
local form_params = {}
for match in mw.ustring.gmatch(wikicode, "{{{([a-z0-9_]+)}}}") do
if match ~= "info" then
params[match] = { list = true, default = mw.title.getCurrentTitle().nsText == "Template" and
"{{{" .. match .. "}}}" or nil }
params[match .. "_q"] = { list = match .. "\1_q", allow_holes = true },
table.insert(form_params, match)
end
end
local args = require("Module:parameters").process(frame:getParent().args, params)
local data = { info = { frame.args["cat"] }, categories = { lang:getCanonicalName() .. " " .. frame.args["cat"] .. " verbs" } }
for _, tense in ipairs({ "present", "preterite", "future", "subjunctive" }) do
if #args[tense .. "_class"] > 0 then
local classtext = tense == "present" and "class " or ""
table.insert(data.info, classtext .. mw.text.listToText(args[tense .. "_class"]) .. " " .. tense)
for _, class in ipairs(args[tense .. "_class"]) do
table.insert(data.categories,
lang:getCanonicalName() .. " " .. classtext .. class .. " " .. tense .. " verbs")
end
end
end
if args["class"] then
require("Module:debug").track("sga-verbs/class")
table.insert(data.info, args["class"])
end
data.info = table.concat(data.info, ", ")
data.args = args
return make_table(data, wikicode)
end
-- Expand something like "as·ruba(i)rtat(ar)" into "as·rubartat, as·rubairtat, as·rubartatar, as·rubairtatar".
local function expand_parens(form)
local parts = require("Module:string utilities").split(form, "%((.-)%)")
local so_far = { parts[1] }
for i = 2, #parts - 1, 2 do
local new = {}
for _, sf in ipairs(so_far) do
table.insert(new, sf .. parts[i + 1])
end
for _, sf in ipairs(so_far) do
table.insert(new, sf .. parts[i] .. parts[i + 1])
end
so_far = new
end
return so_far
end
local function link(form)
return m_links.full_link { lang = lang, term = form }
end
-- Make the table
function make_table(data, wikicode)
local function repl(param)
if param == "info" then
return mw.getContentLanguage():ucfirst(data.info or "")
end
local form = data.args[param]
if not form or #form == 0 then
return ""
end
local ret = {}
for key, subform in ipairs(form) do
local qtext
if not data.args[param .. "_q"] or not data.args[param .. "_q"][key] then
qtext = ""
else
qtext = ' <span style="font-size:85%;">' ..
require("Module:qualifier").format_qualifier({ data.args[param .. "_q"][key] }) .. "</span>"
end
if subform:find("<") then
-- already linked
else
local indiv_forms = mw.text.split(subform, "%s*,%s*")
for i, indiv_form in ipairs(indiv_forms) do
if indiv_form:find("%(") then
local new_subforms = expand_parens(indiv_form)
for j, subform in ipairs(new_subforms) do
new_subforms[j] = link(new_subforms[j])
end
indiv_form = table.concat(new_subforms, ", ")
else
indiv_form = link(indiv_form)
end
indiv_forms[i] = indiv_form
end
subform = table.concat(indiv_forms, ", ")
end
table.insert(ret, subform .. qtext)
end
return table.concat(ret, "; ")
end
return mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl) .. m_utilities.format_categories(data.categories, lang)
end
return export
8qhy79w2jnfmzxqufww9rwu1v371qi9
88521
88520
2026-07-30T09:55:48Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:sga-verbs]]
88520
Scribunto
text/plain
local m_utilities = require("Module:utilities")
local m_links = require("Module:links")
local export = {}
local lang = require("Module:languages").getByCode("sga")
-- Inflection functions
export["manual"] = function(frame)
local wikicode = frame:expandTemplate { title = frame.args["template"], args = {} }
local params = {
["present_class"] = { list = true },
["preterite_class"] = { list = true },
["future_class"] = { list = true },
["subjunctive_class"] = { list = true },
["class"] = {},
}
local form_params = {}
for match in mw.ustring.gmatch(wikicode, "{{{([a-z0-9_]+)}}}") do
if match ~= "info" then
params[match] = { list = true, default = mw.title.getCurrentTitle().nsText == "Template" and
"{{{" .. match .. "}}}" or nil }
params[match .. "_q"] = { list = match .. "\1_q", allow_holes = true },
table.insert(form_params, match)
end
end
local args = require("Module:parameters").process(frame:getParent().args, params)
local data = { info = { frame.args["cat"] }, categories = { lang:getCanonicalName() .. " " .. frame.args["cat"] .. " verbs" } }
for _, tense in ipairs({ "present", "preterite", "future", "subjunctive" }) do
if #args[tense .. "_class"] > 0 then
local classtext = tense == "present" and "class " or ""
table.insert(data.info, classtext .. mw.text.listToText(args[tense .. "_class"]) .. " " .. tense)
for _, class in ipairs(args[tense .. "_class"]) do
table.insert(data.categories,
lang:getCanonicalName() .. " " .. classtext .. class .. " " .. tense .. " verbs")
end
end
end
if args["class"] then
require("Module:debug").track("sga-verbs/class")
table.insert(data.info, args["class"])
end
data.info = table.concat(data.info, ", ")
data.args = args
return make_table(data, wikicode)
end
-- Expand something like "as·ruba(i)rtat(ar)" into "as·rubartat, as·rubairtat, as·rubartatar, as·rubairtatar".
local function expand_parens(form)
local parts = require("Module:string utilities").split(form, "%((.-)%)")
local so_far = { parts[1] }
for i = 2, #parts - 1, 2 do
local new = {}
for _, sf in ipairs(so_far) do
table.insert(new, sf .. parts[i + 1])
end
for _, sf in ipairs(so_far) do
table.insert(new, sf .. parts[i] .. parts[i + 1])
end
so_far = new
end
return so_far
end
local function link(form)
return m_links.full_link { lang = lang, term = form }
end
-- Make the table
function make_table(data, wikicode)
local function repl(param)
if param == "info" then
return mw.getContentLanguage():ucfirst(data.info or "")
end
local form = data.args[param]
if not form or #form == 0 then
return ""
end
local ret = {}
for key, subform in ipairs(form) do
local qtext
if not data.args[param .. "_q"] or not data.args[param .. "_q"][key] then
qtext = ""
else
qtext = ' <span style="font-size:85%;">' ..
require("Module:qualifier").format_qualifier({ data.args[param .. "_q"][key] }) .. "</span>"
end
if subform:find("<") then
-- already linked
else
local indiv_forms = mw.text.split(subform, "%s*,%s*")
for i, indiv_form in ipairs(indiv_forms) do
if indiv_form:find("%(") then
local new_subforms = expand_parens(indiv_form)
for j, subform in ipairs(new_subforms) do
new_subforms[j] = link(new_subforms[j])
end
indiv_form = table.concat(new_subforms, ", ")
else
indiv_form = link(indiv_form)
end
indiv_forms[i] = indiv_form
end
subform = table.concat(indiv_forms, ", ")
end
table.insert(ret, subform .. qtext)
end
return table.concat(ret, "; ")
end
return mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl) .. m_utilities.format_categories(data.categories, lang)
end
return export
8qhy79w2jnfmzxqufww9rwu1v371qi9
Teamplaid:desc
10
17778
88522
2020-06-23T06:54:41Z
en>Erutuon
0
Protected "[[Template:desc]]": Highly visible template/module ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88522
wikitext
text/x-wiki
#REDIRECT [[Template:descendant]]
e7h16zunlouve3kpv2f9ka14fe6gt2v
88523
88522
2026-07-30T09:56:01Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:desc]]
88522
wikitext
text/x-wiki
#REDIRECT [[Template:descendant]]
e7h16zunlouve3kpv2f9ka14fe6gt2v
Teamplaid:descendant
10
17779
88524
2024-06-23T21:17:46Z
en>Surjection
0
Changed protection settings for "[[Template:descendant]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88524
wikitext
text/x-wiki
{{#invoke:etymology/templates/descendant|descendant}}<noinclude>
{{documentation}}
</noinclude>
5i762qwxh1fn2n8ve51agjddncrfsgo
88525
88524
2026-07-30T09:56:07Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:descendant]]
88524
wikitext
text/x-wiki
{{#invoke:etymology/templates/descendant|descendant}}<noinclude>
{{documentation}}
</noinclude>
5i762qwxh1fn2n8ve51agjddncrfsgo
Teamplaid:borrowed
10
17780
88526
2025-02-08T03:28:13Z
en>Benwing2
0
entry points consolidated into [[Module:etymology/templates]]
88526
wikitext
text/x-wiki
<includeonly>{{#invoke:etymology/templates|borrowed}}</includeonly><noinclude>{{bor|und|und|term}}{{documentation}}</noinclude>
fbvj70ebedv4eun4d2995lgurplzevs
88527
88526
2026-07-30T09:58:25Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:borrowed]]
88526
wikitext
text/x-wiki
<includeonly>{{#invoke:etymology/templates|borrowed}}</includeonly><noinclude>{{bor|und|und|term}}{{documentation}}</noinclude>
fbvj70ebedv4eun4d2995lgurplzevs
Teamplaid:derived
10
17781
88529
2025-02-08T03:28:16Z
en>Benwing2
0
entry points consolidated into [[Module:etymology/templates]]
88529
wikitext
text/x-wiki
<includeonly>{{#invoke:etymology/templates|derived}}</includeonly><!--
--><noinclude>{{der|und|und|term}}{{documentation}}</noinclude>
qy162q531c9y9k498mdiw259aiw0jl1
88530
88529
2026-07-30T10:00:19Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:derived]]
88529
wikitext
text/x-wiki
<includeonly>{{#invoke:etymology/templates|derived}}</includeonly><!--
--><noinclude>{{der|und|und|term}}{{documentation}}</noinclude>
qy162q531c9y9k498mdiw259aiw0jl1
Teamplaid:der
10
17782
88531
2019-04-21T06:50:25Z
en>Chuck Entz
0
Protected "[[Template:der]]": Highly visible template/module ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88531
wikitext
text/x-wiki
#REDIRECT [[Template:derived]]
nd4w2bxfjgjo43uih5x5enmq310hza1
88532
88531
2026-07-30T10:00:28Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:der]]
88531
wikitext
text/x-wiki
#REDIRECT [[Template:derived]]
nd4w2bxfjgjo43uih5x5enmq310hza1
Teamplaid:infl of
10
17783
88534
2024-11-09T20:22:14Z
en>Surjection
0
Changed protection settings for "[[Template:infl of]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88534
wikitext
text/x-wiki
#REDIRECT [[Template:inflection of]]
gm95npjoyrknzmi50i0rj3pijsf2544
88535
88534
2026-07-30T10:31:29Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:infl_of]]
88534
wikitext
text/x-wiki
#REDIRECT [[Template:inflection of]]
gm95npjoyrknzmi50i0rj3pijsf2544
Teamplaid:inflection of
10
17784
88536
2025-02-11T00:04:16Z
en>Benwing2
0
remove code to categorize into [[Category:Inflections with a red link for lemma]] per [[Wiktionary:Grease_pit/2025/February#Invisible_module_error_in_Template:inflection_of]]
88536
wikitext
text/x-wiki
{{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!--
-->{{#invoke:form of/templates|inflection_of_t}}<!--
-->}}<!--
--><noinclude>{{documentation}}</noinclude>
pbx4m25a7bhwoqyt9gtape8lta7t6ez
88537
88536
2026-07-30T10:31:38Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:inflection_of]]
88536
wikitext
text/x-wiki
{{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!--
-->{{#invoke:form of/templates|inflection_of_t}}<!--
-->}}<!--
--><noinclude>{{documentation}}</noinclude>
pbx4m25a7bhwoqyt9gtape8lta7t6ez
88538
88537
2026-07-30T10:31:56Z
Altronic
4137
88538
wikitext
text/x-wiki
{{#invoke:form of/templates|inflection_of_t}}<!--
--><noinclude>{{documentation}}</noinclude>
jmqmwf12j7j0uj2xa0d7i4uuntitbgv
Teamplaid:inflection of/documentation
10
17785
88539
2025-01-03T00:28:49Z
en>Benwing2
0
der4 -> col4
88539
wikitext
text/x-wiki
{{documentation subpage}}
{{shortcut|Template:infl of}}
{{uses lua|Module:form of/templates|Module:languages/templates}}
This template is used to create definition lines for inflected (non-lemma) forms. For example, {{m|en|goes}}, {{m|en|going}}, {{m|en|went}} and {{m|en|gone}} are non-lemma forms of the lemma {{m|en|go}}, and {{tl|inflection of}} can be used to show the relationship between the lemma and respective non-lemma forms.
This template takes the same general parameters as {{temp|l}} and {{temp|m}}, and it uses the same post-processing on the parameters. This includes script detection, removing diacritics, processing embedded links, and so on.
==Parameters==
; {{para|1|req=1}}
: The [[WT:LANGCODE|language code]] of the lemma, of which this term is an inflection. See [[Wiktionary:List of languages]]. <small>The parameter {{para|lang}} is a deprecated synonym; please do not use. If this is used, all numbered parameters move down by one.</small>
; {{para|2|req=1}}
: The lemma of which this term is an inflection. A link is created to the lemma, similar to links created using {{tl|l}} and {{tl|m}} (but normally displayed in upright boldface). To specify more than one lemma, separate them by commas. Inline modifiers can also be attached to individual lemmas to specify transliteration, qualifiers, etc. See the section below on [[#Multiple lemmas and inline modifiers|multiple lemmas and inline modifiers]].
; {{para|3}} or {{para|alt}}
: The alternative display form of the lemma. This works like the third parameter of {{temp|l}} and {{temp|m}}.
; {{para|4|req=1}}, {{para|5}} ... etc.
: One or more grammar tags to show. These give the definition by describing the relevant grammatical properties of this inflected form. A grammar tag can potentially be any text, but certain tags such as <code>nominative</code>, <code>feminine</code>, <code>first-person</code> or <code>subjunctive</code> that are recognized internally will automatically be linked to the appropriate entry in [[Appendix:Glossary]] (or in some cases, to the relevant Wiktionary or Wikipedia entry). As an example, <code>nominative</code> is displayed as ''{{glossary|nominative}}'', with an appropriate link. Certain tags are recognised as shortcuts and are equivalent to spelling out the tag. For example, <code>1</code> is equivalent to <code>first-person</code>; both will be displayed as ''{{glossary|first-person}}''. Similarly, <code>f</code> is equivalent to <code>feminine</code>, and <code>nom</code> is equivalent to <code>nominative</code>. The full, up-to-date list of recognized tags and their shortcuts and display forms is specified below.
:Multiple tags are normally separated by spaces, so that e.g. <code>nom|f|s</code> will be displayed as ''{{glossary|nominative}} {{glossary|feminine}} {{glossary|singular}}''. However, when punctuation characters are used as tags, they will be displayed appropriately for that punctuation character. For example, <code>nom|,|with|3|s|object</code> will display as ''{{glossary|nominative}}, with {{glossary|third-person}} {{glossary|singular}} object'' (i.e. without a space preceding the comma). Among the punctuation characters recognized and handled correctly are comma, colon, parens, brackets, slash, and hyphen. The full list can be found below.
:It is also possible to put <code>//</code> separators between one or more tags or shortcuts to create a list separated by slashes. For example, writing <code>nom//acc</code> will expand to ''{{glossary|nominative}}/{{glossary|accusative}}'', and writing <code>nom//acc//voc//dat</code> will expand to ''{{glossary|nominative}}/{{glossary|accusative}}/{{glossary|vocative}}/{{glossary|dative}}''.
:The inflection tag <code>;</code> is recognized specially and is used to separate two inflections of the same word. Sets of tags separated by a semicolon tag will be displayed on separate lines. See examples below.
; {{para|t}} or {{para|gloss}}
: A gloss or short translation of the lemma. Normally not needed, but can be used to disambiguate homonymous lemmas, i.e. multiple lemmas that happen to be spelled the same way, and where the inflected term may be a form of only one of the lemmas. For example, {{m|en|rang}} is the past tense of {{m|en|ring|t=to sound (e.g. a bell)}} but not of the homonymous verb {{m|en|ring|t=to surround}}, whose past tense is {{m|en|ringed}}. In such cases, you can also use the {{para|id}} parameter to link the lemma to the appropriate section of the page.
; {{para|tr}}
: Transliteration of the lemma, if written in a non-Latin script and the automatically-generated transliteration is either missing or incorrect.
; {{para|ts}}
: Transcription of the lemma, for non-Latin-script terms whose transliteration is markedly different from the actual pronunciation. Should not be used for IPA pronunciations. See {{temp|l}}.
; {{para|g}}
: Gender and number of the lemma. See [[Module:gender and number]] for details. To specify multiple gender/number specs for a single lemma, separate them with a comma. Normally not needed, but could be used e.g. to disambiguate homonymous lemmas; see the discussion under the {{para|t}} parameter for more information.
; {{para|p}} or {{para|POS}}
: Categorization part-of-speech tag of the lemma, or an abbreviation thereof (see below). Not displayed; used *ONLY* for categorization purposes, depending on the particular inflection tags and the language in question. Note that there are related templates {{temp|noun form of}}, {{temp|verb form of}} and {{temp|adj form of}}, which are exactly like {{temp|inflection of}} but automatically set (respectively) the {{para|p|n}}, {{para|p|v}} and {{para|p|a}} parameters.
; {{para|pos}}
: Displayed part-of-speech indication for lemma. See {{temp|l}}. *NOT* the same as the categorization part of speech tag in {{para|p}}. The value of this parameter is displayed in parens after the lemma link, similarly to how other links work. Rarely needed.
; {{para|lit}}
: A literal translation for the lemma. See {{temp|l}}. Rarely needed.
; {{para|id}}
: A sense ID for the lemma, which links to anchors on the page set by the {{temp|senseid}} template. Can be used e.g. to disambiguate homonymous lemmas; see the discussion under the {{para|t}} parameter for more information.
; {{para|sc}}
: The script code (see [[Wiktionary:Scripts]]) for the script that the lemma is written in. See {{temp|l}}. Rarely needed as it is autodetected (usually correctly).
; {{para|enclitic}}
: One or more enclitics that are attached to the inflected form being described. This is useful in agglutinative languages such as Finnish that support enclitics being attached to inflected forms. See Example 5 below. To specify more than one enclitic, separate them by commas. Inline modifiers can also be attached to individual enclitics to specify transliteration, qualifiers, etc. See the section below on inline modifiers.
==Multiple lemmas and inline modifiers==
In some cases, a term is the inflection of multiple lemmas, which work alike and are alternative forms of each other. In this case, rather than duplicating the inflection tags on separate lines with separate calls to {{tl|inflection of}} (one per lemma), you can list multiple lemmas in a single call to {{tl|inflection of}}. To do this, separate the lemmas with a comma (without a following space). You can attach ''inline modifiers'' to each individual lemma in place of separate params such as {{para|tr}} and {{para|t}}, similarly to {{tl|col}} (and variants such as {{tl|col3}}, {{tl|col4}}, etc.); {{tl|syn}} (and variants such as {{tl|ant}}); etc. The general syntax looks like <code>Изабе́лла<tr:Izabɛ́lla><t:Isabelle></code> to specify modifiers such as transliterations, glosses and qualifiers. With multiple lemmas, the syntax looks like <code>Изабе́ла<tr:Izabɛ́la>,Изабе́лла<tr:Izabɛ́lla><t:Isabelle></code>. See Example 3 below for an example that uses inline modifiers.
The following modifiers are recognized; see {{temp|link}} for the exact meaning of these modifiers.
* <code>t</code>: gloss
* <code>tr</code>: transliteration
* <code>ts</code>: transcription, for languages where the transliteration and pronunciation are markedly different
* <code>q</code>: qualifier, e.g. ''rare''; this appears *BEFORE* the term, parenthesized and italicized
* <code>qq</code>: qualifier, e.g. ''rare''; this appears *AFTER* the term, parenthesized and italicized
* <code>g</code>: comma-separated list of gender/number specifications
* <code>alt</code>: alternative display text
* <code>pos</code>: part of speech
* <code>lit</code>: literal meaning
* <code>id</code>: sense ID; see {{temp|senseid}}
* <code>sc</code>: script code
Enclitics specified using the {{para|enclitic}} parameter can similarly have inline modifiers attached to them. Do not go overboard in the use of these modifiers; it is better in most cases to just specify the bare enclitic and put all the relevant information for the clitic in the linked page. But in some cases it may be necessary to specify e.g. manual transliterations, for languages such as Persian and Hebrew that don't provide automatic transliteration; glosses and/or sense ID's for homonymous enclitics; etc.
==Examples==
===Example 1===
On the page for the Spanish non-lemma form {{m|es|aman}}:
<syntaxhighlight lang="wikitext"># {{inflection of|es|amar||3|p|pres|act|ind}}</syntaxhighlight> gives
# {{inflection of|es|amar||3|p|pres|act|ind}}
===Example 2===
On the page for the Russian non-lemma form {{m|ru|пути́}}:
<syntaxhighlight lang="wikitext"># {{inflection of|ru|путь||gen//dat//pre|s|;|nom//acc|p}}</syntaxhighlight> gives
# {{inflection of|ru|путь||gen//dat//pre|s|;|nom//acc|p}}
Note here how the <code>//</code> separator separates tags when multiple tags apply, and <code>;</code> separates inflections. When <code>;</code> is used, the display format changes to a multi-line format, as shown. Furthermore, since the lemma is in a non-Latin script in a language with automatic transliteration, that transliteration is automatically shown.
===Example 3===
On the page for the Japanese non-lemma form {{m|ja|飛び移らず|tr=tobiutsurazu}}:
<syntaxhighlight lang="wikitext"># {{inflection of|ja|飛び移る<tr:tobiutsuru>||neg|continuative}}</syntaxhighlight> gives
# {{inflection of|ja|飛び移る<tr:tobiutsuru>||neg|continuative}}
Note here how an unrecognized tag <code>continuative</code> is used. Such tags need to be spelled out in full, and won't be linked to anything. Furthermore, in this case, although Japanese uses a non-Latin script, no automatic transliteration is available, so the transliteration needs to be manually supplied if desired.
===Example 4===
On the page for the Russian non-lemma form {{m|ru|дости́гнем}}:
<syntaxhighlight lang="wikitext"># {{inflection of|ru|дости́гнуть,дости́чь||1|p|fut|ind|pfv}}</syntaxhighlight> gives
# {{inflection of|ru|дости́гнуть,дости́чь||1|p|fut|ind|pfv}}
Here, {{m|ru|дости́чь}} is an alternative infinitive form of the lemma {{m|ru|дости́гнуть}}, so we specify both lemmas, comma-separated, rather than duplicating the {{tl|inflection of}} call on two lines.
===Example 5===
On the page for the Finnish non-lemma form {{m|fi|kävelisinköhän}}:
<syntaxhighlight lang="wikitext"># {{infl of|fi|kävellä||1|s|pres|cond|enclitic=-ko,-han|t=to walk}}</syntaxhighlight> gives
# {{infl of|fi|kävellä||1|s|pres|cond|enclitic=-ko,-han|t=to walk}}
This particular term is a first-singular present conditional form of the verb {{m|fi|kävellä|t=to walk}}, with two enclitics attached to the end.
===Example 6===
On the page for the Gothic non-lemma form {{m|got|𐍅𐌹𐍄𐌰𐌽𐌳𐌴𐌹|tr=witāndei}}:
<syntaxhighlight lang="wikitext"># {{infl of|got|𐍅𐌹𐍄𐌰𐌽𐌳𐍃<tr:witānds>||nom|f|s|prespart-of=𐍅𐌹𐍄𐌰𐌽<tr:witān><t:to observe>}}</syntaxhighlight> gives
# {{infl of|got|𐍅𐌹𐍄𐌰𐌽𐌳𐍃<tr:witānds>||nom|f|s|prespart-of=𐍅𐌹𐍄𐌰𐌽<tr:witān><t:to observe>}}
The lemma page contains two different verbs with the same spelling, {{m|got|𐍅𐌹𐍄𐌰𐌽|t=to know}} and {{m|got|𐍅𐌹𐍄𐌰𐌽|tr=witān|t=to observe}} (with a long vowel). As a result, the page for the above non-lemma form has entries for the same two verbs, and it is necessary to supply the transliteration of the long-vowel variant along with a gloss to disambiguate the two.
===Example 7===
On the page for the Ukrainian noun {{m|uk|пере́гляд}}:
<syntaxhighlight lang="wikitext"># {{infl of|uk|перегляда́ти<g:impf>,перегля́нути<g:pf>,перегля́діти<g:pf>||vnoun}}</syntaxhighlight>
# {{infl of|uk|перегляда́ти<g:impf>,перегля́нути<g:pf>,перегля́діти<g:pf>||vnoun}}
This example shows the use of inline modifiers with multiple lemmas.
==Inflection tags==
The following non-language-specific inflection tags are available for use in describing inflections as per [[Module:form of/data/1]] (more common tags) and [[Module:form of/data/2]] (less common tags):
{{#invoke:form of doc/templates|tagtable_t}}
Other items (such as "atelic") may be used as needed, but should be spelled out in full (see examples).
==Non-alias shortcuts==
The following additional non-language-specific shortcuts are available for use in describing inflections as per [[Module:form of/data/1]] (more common shortcuts) and [[Module:form of/data/2]] (less common shortcuts):
{{#invoke:form of doc/templates|non_alias_shortcut_table_t}}
==Lang-specific information==
The following tables contain all the language-specific information embedded into {{tl|inflection of}}. The following types of information are provided:
# Language-specific inflection tags.
# Language-specific non-alias shortcuts (where "non-alias" means any shortcut that is not a simple alias for an inflection tag).
# Additional parameters that are available for the language in question to display the base lemma where an inflected form (e.g. the comparative, superlative, present participle, past participle, etc.) can in turn be inflected.
# Language-specific categories that are added in certain circumstances, depending on the particular inflection tags present (and in some cases, the value of the {{para|POS}}/{{para|p}} parameter, which supplies the part of speech for categorization purposes). The exact circumstances are not currently listed because they may be somewhat complex, but are described exactly in [[Module:form of/cats]].
# Language-specific labels that are added in circumstances similar to those where categories are added, and which are described in [[Module:form of/cats]]. Note that some labels may in turn cause categories to be added, just as with other labels. These categories are listed below along with the labels themselves.
{{#invoke:form of doc/templates|lang_specific_tables_t}}
==Language-independent categorization==
Depending on the particular tags and on the presence/absence of the {{para|p}}/{{para|POS}} parameter, language-specific or language-independent categories may be added. The exact conditions under which this happens are described in [[Module:form of/cats]], but the following is a list of all language-independent categories that may be added:
{{#invoke:form of doc/templates|lang_independent_category_table_t}}
==Language-independent labels==
Depending on the particular tags and on the presence/absence of the {{para|p}}/{{para|POS}} parameter, language-specific or language-independent labels may be added, as with categories. The exact conditions under which this happens are described in [[Module:form of/cats]], but the following is a list of all language-independent labels that may be added:
{{#invoke:form of doc/templates|lang_independent_label_table_t}}
==Part-of-speech tags==
The following part-of-speech tags are available for use as the {{para|p}} or {{para|POS}} parameter. Note that either the full (canonical) form or any of the short forms can be used and are equivalent.
{{#invoke:form of doc/templates|postable_t}}
<includeonly>
[[Category:Form-of templates|*]]
[[Category:Grammar form-of templates|*]]
</includeonly>
m57ohf8dvcek8lbrklqr2q5jyvrdhz4
88540
88539
2026-07-30T10:32:20Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:inflection_of/documentation]]
88539
wikitext
text/x-wiki
{{documentation subpage}}
{{shortcut|Template:infl of}}
{{uses lua|Module:form of/templates|Module:languages/templates}}
This template is used to create definition lines for inflected (non-lemma) forms. For example, {{m|en|goes}}, {{m|en|going}}, {{m|en|went}} and {{m|en|gone}} are non-lemma forms of the lemma {{m|en|go}}, and {{tl|inflection of}} can be used to show the relationship between the lemma and respective non-lemma forms.
This template takes the same general parameters as {{temp|l}} and {{temp|m}}, and it uses the same post-processing on the parameters. This includes script detection, removing diacritics, processing embedded links, and so on.
==Parameters==
; {{para|1|req=1}}
: The [[WT:LANGCODE|language code]] of the lemma, of which this term is an inflection. See [[Wiktionary:List of languages]]. <small>The parameter {{para|lang}} is a deprecated synonym; please do not use. If this is used, all numbered parameters move down by one.</small>
; {{para|2|req=1}}
: The lemma of which this term is an inflection. A link is created to the lemma, similar to links created using {{tl|l}} and {{tl|m}} (but normally displayed in upright boldface). To specify more than one lemma, separate them by commas. Inline modifiers can also be attached to individual lemmas to specify transliteration, qualifiers, etc. See the section below on [[#Multiple lemmas and inline modifiers|multiple lemmas and inline modifiers]].
; {{para|3}} or {{para|alt}}
: The alternative display form of the lemma. This works like the third parameter of {{temp|l}} and {{temp|m}}.
; {{para|4|req=1}}, {{para|5}} ... etc.
: One or more grammar tags to show. These give the definition by describing the relevant grammatical properties of this inflected form. A grammar tag can potentially be any text, but certain tags such as <code>nominative</code>, <code>feminine</code>, <code>first-person</code> or <code>subjunctive</code> that are recognized internally will automatically be linked to the appropriate entry in [[Appendix:Glossary]] (or in some cases, to the relevant Wiktionary or Wikipedia entry). As an example, <code>nominative</code> is displayed as ''{{glossary|nominative}}'', with an appropriate link. Certain tags are recognised as shortcuts and are equivalent to spelling out the tag. For example, <code>1</code> is equivalent to <code>first-person</code>; both will be displayed as ''{{glossary|first-person}}''. Similarly, <code>f</code> is equivalent to <code>feminine</code>, and <code>nom</code> is equivalent to <code>nominative</code>. The full, up-to-date list of recognized tags and their shortcuts and display forms is specified below.
:Multiple tags are normally separated by spaces, so that e.g. <code>nom|f|s</code> will be displayed as ''{{glossary|nominative}} {{glossary|feminine}} {{glossary|singular}}''. However, when punctuation characters are used as tags, they will be displayed appropriately for that punctuation character. For example, <code>nom|,|with|3|s|object</code> will display as ''{{glossary|nominative}}, with {{glossary|third-person}} {{glossary|singular}} object'' (i.e. without a space preceding the comma). Among the punctuation characters recognized and handled correctly are comma, colon, parens, brackets, slash, and hyphen. The full list can be found below.
:It is also possible to put <code>//</code> separators between one or more tags or shortcuts to create a list separated by slashes. For example, writing <code>nom//acc</code> will expand to ''{{glossary|nominative}}/{{glossary|accusative}}'', and writing <code>nom//acc//voc//dat</code> will expand to ''{{glossary|nominative}}/{{glossary|accusative}}/{{glossary|vocative}}/{{glossary|dative}}''.
:The inflection tag <code>;</code> is recognized specially and is used to separate two inflections of the same word. Sets of tags separated by a semicolon tag will be displayed on separate lines. See examples below.
; {{para|t}} or {{para|gloss}}
: A gloss or short translation of the lemma. Normally not needed, but can be used to disambiguate homonymous lemmas, i.e. multiple lemmas that happen to be spelled the same way, and where the inflected term may be a form of only one of the lemmas. For example, {{m|en|rang}} is the past tense of {{m|en|ring|t=to sound (e.g. a bell)}} but not of the homonymous verb {{m|en|ring|t=to surround}}, whose past tense is {{m|en|ringed}}. In such cases, you can also use the {{para|id}} parameter to link the lemma to the appropriate section of the page.
; {{para|tr}}
: Transliteration of the lemma, if written in a non-Latin script and the automatically-generated transliteration is either missing or incorrect.
; {{para|ts}}
: Transcription of the lemma, for non-Latin-script terms whose transliteration is markedly different from the actual pronunciation. Should not be used for IPA pronunciations. See {{temp|l}}.
; {{para|g}}
: Gender and number of the lemma. See [[Module:gender and number]] for details. To specify multiple gender/number specs for a single lemma, separate them with a comma. Normally not needed, but could be used e.g. to disambiguate homonymous lemmas; see the discussion under the {{para|t}} parameter for more information.
; {{para|p}} or {{para|POS}}
: Categorization part-of-speech tag of the lemma, or an abbreviation thereof (see below). Not displayed; used *ONLY* for categorization purposes, depending on the particular inflection tags and the language in question. Note that there are related templates {{temp|noun form of}}, {{temp|verb form of}} and {{temp|adj form of}}, which are exactly like {{temp|inflection of}} but automatically set (respectively) the {{para|p|n}}, {{para|p|v}} and {{para|p|a}} parameters.
; {{para|pos}}
: Displayed part-of-speech indication for lemma. See {{temp|l}}. *NOT* the same as the categorization part of speech tag in {{para|p}}. The value of this parameter is displayed in parens after the lemma link, similarly to how other links work. Rarely needed.
; {{para|lit}}
: A literal translation for the lemma. See {{temp|l}}. Rarely needed.
; {{para|id}}
: A sense ID for the lemma, which links to anchors on the page set by the {{temp|senseid}} template. Can be used e.g. to disambiguate homonymous lemmas; see the discussion under the {{para|t}} parameter for more information.
; {{para|sc}}
: The script code (see [[Wiktionary:Scripts]]) for the script that the lemma is written in. See {{temp|l}}. Rarely needed as it is autodetected (usually correctly).
; {{para|enclitic}}
: One or more enclitics that are attached to the inflected form being described. This is useful in agglutinative languages such as Finnish that support enclitics being attached to inflected forms. See Example 5 below. To specify more than one enclitic, separate them by commas. Inline modifiers can also be attached to individual enclitics to specify transliteration, qualifiers, etc. See the section below on inline modifiers.
==Multiple lemmas and inline modifiers==
In some cases, a term is the inflection of multiple lemmas, which work alike and are alternative forms of each other. In this case, rather than duplicating the inflection tags on separate lines with separate calls to {{tl|inflection of}} (one per lemma), you can list multiple lemmas in a single call to {{tl|inflection of}}. To do this, separate the lemmas with a comma (without a following space). You can attach ''inline modifiers'' to each individual lemma in place of separate params such as {{para|tr}} and {{para|t}}, similarly to {{tl|col}} (and variants such as {{tl|col3}}, {{tl|col4}}, etc.); {{tl|syn}} (and variants such as {{tl|ant}}); etc. The general syntax looks like <code>Изабе́лла<tr:Izabɛ́lla><t:Isabelle></code> to specify modifiers such as transliterations, glosses and qualifiers. With multiple lemmas, the syntax looks like <code>Изабе́ла<tr:Izabɛ́la>,Изабе́лла<tr:Izabɛ́lla><t:Isabelle></code>. See Example 3 below for an example that uses inline modifiers.
The following modifiers are recognized; see {{temp|link}} for the exact meaning of these modifiers.
* <code>t</code>: gloss
* <code>tr</code>: transliteration
* <code>ts</code>: transcription, for languages where the transliteration and pronunciation are markedly different
* <code>q</code>: qualifier, e.g. ''rare''; this appears *BEFORE* the term, parenthesized and italicized
* <code>qq</code>: qualifier, e.g. ''rare''; this appears *AFTER* the term, parenthesized and italicized
* <code>g</code>: comma-separated list of gender/number specifications
* <code>alt</code>: alternative display text
* <code>pos</code>: part of speech
* <code>lit</code>: literal meaning
* <code>id</code>: sense ID; see {{temp|senseid}}
* <code>sc</code>: script code
Enclitics specified using the {{para|enclitic}} parameter can similarly have inline modifiers attached to them. Do not go overboard in the use of these modifiers; it is better in most cases to just specify the bare enclitic and put all the relevant information for the clitic in the linked page. But in some cases it may be necessary to specify e.g. manual transliterations, for languages such as Persian and Hebrew that don't provide automatic transliteration; glosses and/or sense ID's for homonymous enclitics; etc.
==Examples==
===Example 1===
On the page for the Spanish non-lemma form {{m|es|aman}}:
<syntaxhighlight lang="wikitext"># {{inflection of|es|amar||3|p|pres|act|ind}}</syntaxhighlight> gives
# {{inflection of|es|amar||3|p|pres|act|ind}}
===Example 2===
On the page for the Russian non-lemma form {{m|ru|пути́}}:
<syntaxhighlight lang="wikitext"># {{inflection of|ru|путь||gen//dat//pre|s|;|nom//acc|p}}</syntaxhighlight> gives
# {{inflection of|ru|путь||gen//dat//pre|s|;|nom//acc|p}}
Note here how the <code>//</code> separator separates tags when multiple tags apply, and <code>;</code> separates inflections. When <code>;</code> is used, the display format changes to a multi-line format, as shown. Furthermore, since the lemma is in a non-Latin script in a language with automatic transliteration, that transliteration is automatically shown.
===Example 3===
On the page for the Japanese non-lemma form {{m|ja|飛び移らず|tr=tobiutsurazu}}:
<syntaxhighlight lang="wikitext"># {{inflection of|ja|飛び移る<tr:tobiutsuru>||neg|continuative}}</syntaxhighlight> gives
# {{inflection of|ja|飛び移る<tr:tobiutsuru>||neg|continuative}}
Note here how an unrecognized tag <code>continuative</code> is used. Such tags need to be spelled out in full, and won't be linked to anything. Furthermore, in this case, although Japanese uses a non-Latin script, no automatic transliteration is available, so the transliteration needs to be manually supplied if desired.
===Example 4===
On the page for the Russian non-lemma form {{m|ru|дости́гнем}}:
<syntaxhighlight lang="wikitext"># {{inflection of|ru|дости́гнуть,дости́чь||1|p|fut|ind|pfv}}</syntaxhighlight> gives
# {{inflection of|ru|дости́гнуть,дости́чь||1|p|fut|ind|pfv}}
Here, {{m|ru|дости́чь}} is an alternative infinitive form of the lemma {{m|ru|дости́гнуть}}, so we specify both lemmas, comma-separated, rather than duplicating the {{tl|inflection of}} call on two lines.
===Example 5===
On the page for the Finnish non-lemma form {{m|fi|kävelisinköhän}}:
<syntaxhighlight lang="wikitext"># {{infl of|fi|kävellä||1|s|pres|cond|enclitic=-ko,-han|t=to walk}}</syntaxhighlight> gives
# {{infl of|fi|kävellä||1|s|pres|cond|enclitic=-ko,-han|t=to walk}}
This particular term is a first-singular present conditional form of the verb {{m|fi|kävellä|t=to walk}}, with two enclitics attached to the end.
===Example 6===
On the page for the Gothic non-lemma form {{m|got|𐍅𐌹𐍄𐌰𐌽𐌳𐌴𐌹|tr=witāndei}}:
<syntaxhighlight lang="wikitext"># {{infl of|got|𐍅𐌹𐍄𐌰𐌽𐌳𐍃<tr:witānds>||nom|f|s|prespart-of=𐍅𐌹𐍄𐌰𐌽<tr:witān><t:to observe>}}</syntaxhighlight> gives
# {{infl of|got|𐍅𐌹𐍄𐌰𐌽𐌳𐍃<tr:witānds>||nom|f|s|prespart-of=𐍅𐌹𐍄𐌰𐌽<tr:witān><t:to observe>}}
The lemma page contains two different verbs with the same spelling, {{m|got|𐍅𐌹𐍄𐌰𐌽|t=to know}} and {{m|got|𐍅𐌹𐍄𐌰𐌽|tr=witān|t=to observe}} (with a long vowel). As a result, the page for the above non-lemma form has entries for the same two verbs, and it is necessary to supply the transliteration of the long-vowel variant along with a gloss to disambiguate the two.
===Example 7===
On the page for the Ukrainian noun {{m|uk|пере́гляд}}:
<syntaxhighlight lang="wikitext"># {{infl of|uk|перегляда́ти<g:impf>,перегля́нути<g:pf>,перегля́діти<g:pf>||vnoun}}</syntaxhighlight>
# {{infl of|uk|перегляда́ти<g:impf>,перегля́нути<g:pf>,перегля́діти<g:pf>||vnoun}}
This example shows the use of inline modifiers with multiple lemmas.
==Inflection tags==
The following non-language-specific inflection tags are available for use in describing inflections as per [[Module:form of/data/1]] (more common tags) and [[Module:form of/data/2]] (less common tags):
{{#invoke:form of doc/templates|tagtable_t}}
Other items (such as "atelic") may be used as needed, but should be spelled out in full (see examples).
==Non-alias shortcuts==
The following additional non-language-specific shortcuts are available for use in describing inflections as per [[Module:form of/data/1]] (more common shortcuts) and [[Module:form of/data/2]] (less common shortcuts):
{{#invoke:form of doc/templates|non_alias_shortcut_table_t}}
==Lang-specific information==
The following tables contain all the language-specific information embedded into {{tl|inflection of}}. The following types of information are provided:
# Language-specific inflection tags.
# Language-specific non-alias shortcuts (where "non-alias" means any shortcut that is not a simple alias for an inflection tag).
# Additional parameters that are available for the language in question to display the base lemma where an inflected form (e.g. the comparative, superlative, present participle, past participle, etc.) can in turn be inflected.
# Language-specific categories that are added in certain circumstances, depending on the particular inflection tags present (and in some cases, the value of the {{para|POS}}/{{para|p}} parameter, which supplies the part of speech for categorization purposes). The exact circumstances are not currently listed because they may be somewhat complex, but are described exactly in [[Module:form of/cats]].
# Language-specific labels that are added in circumstances similar to those where categories are added, and which are described in [[Module:form of/cats]]. Note that some labels may in turn cause categories to be added, just as with other labels. These categories are listed below along with the labels themselves.
{{#invoke:form of doc/templates|lang_specific_tables_t}}
==Language-independent categorization==
Depending on the particular tags and on the presence/absence of the {{para|p}}/{{para|POS}} parameter, language-specific or language-independent categories may be added. The exact conditions under which this happens are described in [[Module:form of/cats]], but the following is a list of all language-independent categories that may be added:
{{#invoke:form of doc/templates|lang_independent_category_table_t}}
==Language-independent labels==
Depending on the particular tags and on the presence/absence of the {{para|p}}/{{para|POS}} parameter, language-specific or language-independent labels may be added, as with categories. The exact conditions under which this happens are described in [[Module:form of/cats]], but the following is a list of all language-independent labels that may be added:
{{#invoke:form of doc/templates|lang_independent_label_table_t}}
==Part-of-speech tags==
The following part-of-speech tags are available for use as the {{para|p}} or {{para|POS}} parameter. Note that either the full (canonical) form or any of the short forms can be used and are equivalent.
{{#invoke:form of doc/templates|postable_t}}
<includeonly>
[[Category:Form-of templates|*]]
[[Category:Grammar form-of templates|*]]
</includeonly>
m57ohf8dvcek8lbrklqr2q5jyvrdhz4
Teamplaid:para
10
17786
88541
2025-08-12T21:28:29Z
en>Kiril kovachev
0
Fix list parameter coding
88541
wikitext
text/x-wiki
<code>|{{#if:{{{}}}|{{#if:{{{1<includeonly>|</includeonly>}}}|{{{1}}}{{#if:{{{list|}}}|<var>N</var>}}=}}{{{2<includeonly>|</includeonly>}}}|={{{1|}}}}}</code><!--
-->{{#if:{{{3|}}}<!--
-->| ({{#if:{{{req|}}}|'''''required''''', }}{{#if:{{{opt|}}}|''optional'', }}{{{3}}})<!--
-->|{{#if:{{{req|}}}| ('''''required''''')}}{{#if:{{{opt|}}}| (''optional'')}}<!--
-->}}<!--
--><noinclude>{{documentation}}</noinclude>
ila07avdxjfpqibvzqu562e2zqxw53f
88542
88541
2026-07-30T10:33:20Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:para]]
88541
wikitext
text/x-wiki
<code>|{{#if:{{{}}}|{{#if:{{{1<includeonly>|</includeonly>}}}|{{{1}}}{{#if:{{{list|}}}|<var>N</var>}}=}}{{{2<includeonly>|</includeonly>}}}|={{{1|}}}}}</code><!--
-->{{#if:{{{3|}}}<!--
-->| ({{#if:{{{req|}}}|'''''required''''', }}{{#if:{{{opt|}}}|''optional'', }}{{{3}}})<!--
-->|{{#if:{{{req|}}}| ('''''required''''')}}{{#if:{{{opt|}}}| (''optional'')}}<!--
-->}}<!--
--><noinclude>{{documentation}}</noinclude>
ila07avdxjfpqibvzqu562e2zqxw53f
Mòideal:form of/data
828
17787
88543
2024-12-17T03:26:07Z
en>Theknightwho
0
88543
Scribunto
text/plain
local export = {}
local ipairs = ipairs
local next = next
local type = type
export.TAG_TYPE = 1
export.GLOSSARY = 2
local SHORTCUTS = 3; export.SHORTCUTS = SHORTCUTS
export.WIKIDATA = 4
export.APPENDIX = true
export.WIKT = 0
export.WP = false
local function process_shortcut(tags, shortcuts, name, shortcut)
-- If the shortcut is already in the list, then there is a duplicate.
if shortcuts[shortcut] then
error("The shortcut \"" .. shortcut .. "\" (for the inflection tag \"" .. name .. "\") conflicts with an existing shortcut for the tag \"" .. shortcuts[shortcut] .. "\".")
elseif tags[shortcut] then
error("The shortcut \"" .. shortcut .. "\" (for the inflection tag \"" .. name .. "\") conflicts with an existing tag with that name.")
end
shortcuts[shortcut] = name
end
function export.finalize(tags, shortcuts)
for name, data in next, tags do
local data_shortcuts = data[SHORTCUTS]
if data_shortcuts then
if type(data_shortcuts) == "string" then
process_shortcut(tags, shortcuts, name, data_shortcuts)
else
for _, shortcut in ipairs(data_shortcuts) do
process_shortcut(tags, shortcuts, name, shortcut)
end
end
end
end
end
return export
mxr0ilpfejbl0ove2gt0ylcegf7jfyp
88544
88543
2026-07-30T10:34:26Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/data]]
88543
Scribunto
text/plain
local export = {}
local ipairs = ipairs
local next = next
local type = type
export.TAG_TYPE = 1
export.GLOSSARY = 2
local SHORTCUTS = 3; export.SHORTCUTS = SHORTCUTS
export.WIKIDATA = 4
export.APPENDIX = true
export.WIKT = 0
export.WP = false
local function process_shortcut(tags, shortcuts, name, shortcut)
-- If the shortcut is already in the list, then there is a duplicate.
if shortcuts[shortcut] then
error("The shortcut \"" .. shortcut .. "\" (for the inflection tag \"" .. name .. "\") conflicts with an existing shortcut for the tag \"" .. shortcuts[shortcut] .. "\".")
elseif tags[shortcut] then
error("The shortcut \"" .. shortcut .. "\" (for the inflection tag \"" .. name .. "\") conflicts with an existing tag with that name.")
end
shortcuts[shortcut] = name
end
function export.finalize(tags, shortcuts)
for name, data in next, tags do
local data_shortcuts = data[SHORTCUTS]
if data_shortcuts then
if type(data_shortcuts) == "string" then
process_shortcut(tags, shortcuts, name, data_shortcuts)
else
for _, shortcut in ipairs(data_shortcuts) do
process_shortcut(tags, shortcuts, name, shortcut)
end
end
end
end
end
return export
mxr0ilpfejbl0ove2gt0ylcegf7jfyp
Mòideal:form of/cats
828
17788
88545
2025-09-17T19:34:28Z
en>Benwing2
0
[[User:Ultimateria]] remove Scots categories as they failed RFD some time ago
88545
Scribunto
text/plain
local cats = {}
--[=[
-- FIXME: Data structure is highly inefficient, as it involves lots of nested tables.
This contains categorization specs for specific languages and for all languages.
The particular categories listed are listed without the preceding canonical
language name, which will automatically be prepended, and the text "<<p>>"
in a category will be replaced with the user-specified part of speech.
The value of an entry in the cats[] table is a list of specifications to apply
to inflections in a specific language (except that the entry for "und" applies
to all languages). Each specification indicates the conditions under which a
given category is applied. Each specification is processed independently; if
multiple specifications apply, all the resulting categories will be added to
the page. (This is equivalent to wrapping the specifications in a
{"multi", ...} clause; see below.)
A specification is one of:
(1) A string:
Always apply that category.
(2) A list {"has", TAG, SPEC} or {"has", TAG, SPEC, ELSESPEC}:
TAG is an inflection tag, and can either be the full form or any
abbreviation; if that tag is present among the user-supplied tags, SPEC is
applied, otherwise ELSESPEC is applied if present. SPEC and ELSESPEC are
specifications just as at the top level; i.e. they can be strings, nested
conditions, etc.
(2) A list {"hasall", TAGS, SPEC} or {"hasall", TAGS, SPEC, ELSESPEC}:
Similar to {"has", ...} but only activates if all of the tags in TAGS
(a list) are present among the user-supplied tags (in any order, and
other tags may be present, including between the tags in TAGS).
(3) A list {"hasany", TAGS, SPEC} or {"hasany", TAGS, SPEC, ELSESPEC}:
Similar to {"has", ...} but activates if any of the tags in TAGS
(a list) are present among the user-supplied tags.
(4) A list {"tags=", TAGS, SPEC} or {"tags=", TAGS, SPEC, ELSESPEC}:
Similar to {"hasall", ...} but activates only if the
user-supplied tags exactly match the tags in TAGS, including
the order. (But, as above, any tag abbreviation can be given
in TAGS, and will match any equivalent abbreviation or full
form.)
(5) A list {"p=", VALUE, SPEC} or {"p=", VALUE, SPEC, ELSESPEC}:
Similar to {"has", ...} but activates if the value supplied for the p=
or POS= parameters is the specified value (which can be either the full
form or any abbreviation).
(6) A list {"pany", VALUES, SPEC} or {"pany", VALUES, SPEC, ELSESPEC}:
Similar to {"p=", ...} but activates if the value supplied for the p=
or POS= parameters is any of the specified values (which can be either
the full forms or any abbreviation).
(7) A list {"pexists", SPEC} or {"pexists", SPEC, ELSESPEC}:
Activates if any value was specified for the p= or POS= parameters.
(8) A list {"cond", SPEC1, SPEC2, ...}:
If SPEC1 applies, it will be applied; otherwise, if SPEC2 applies, it
will be applied; etc. This stops processing specifications as soon as it
finds one that applies.
(9) A list {"multi", SPEC1, SPEC2, ...}:
If SPEC1 applies, it will be applied; in addition, if SPEC2 applies, it
will also be applied; etc. Unlike {"cond", ...}, this continues
processing specifications even if a previous one has applied.
(10) A list {"not", CONDITION, SPEC} or {"not", CONDITION, SPEC, ELSESPEC}:
If CONDITION does *NOT* apply, SPEC will be applied, otherwise ELSESPEC
will be applied if present. CONDITION is one of:
-- {"has", TAG}
-- {"hasall", TAGS}
-- {"hasany", TAGS}
-- {"tags=", TAGS},
-- {"p=", VALUE}
-- {"pany", VALUES}
-- {"pexists"}
-- {"not", CONDITION}
-- {"and", CONDITION1, CONDITION2}
-- {"or", CONDITION1, CONDITION2}
-- {"call", FUNCTION} where FUNCTION is a string naming a function listed
in cat_functions in [[Module:form of/functions]], which is passed a
single argument (see (10) below) and should return true or false.
That is, conditions are similar to if-else SPECS but without any
specifications given.
(11) A list {"and", CONDITION1, CONDITION2, SPEC} or {"and", CONDITION1, CONDITION2, SPEC, ELSESPEC}:
If CONDITION1 and CONDITION2 both apply, SPEC will be applied, otherwise
ELSESPEC will be applied if present. CONDITION is as above for "not".
(12) A list {"or", CONDITION1, CONDITION2, SPEC} or {"or", CONDITION1, CONDITION2, SPEC, ELSESPEC}:
If either CONDITION1 or CONDITION2 apply, SPEC will be applied, otherwise
ELSESPEC will be applied if present. CONDITION is as above for "not".
(13) A list {"call", FUNCTION}:
FUNCTION is the name of a function listed in cat_functions in
[[Module:form of/functions]], which is passed a single argument, a table
containing the parameters given to the template call, and which should
return a specification (a string naming a category, a list of any of the
formats described above). In the table, the following keys are present:
"lang": the structure describing the language (usually the first
parameter);
"tags": the list of tags (canonicalized to their full forms);
"term": the term to link to (will be missing if no term is given);
"alt": the display form of the term (will be missing if no display form
is given);
"t": the gloss of the term (will be missing if no gloss is given);
In addition, any other parameters specified will be located under a key
corresponding to the parameter name.
As a simple example, consider this:
cats["et"] = {
{"has", "part", "participles"},
}
This says that, for language code "et" (Estonian), if the "part" tag is
present (or if "participle" is present, which is the equivalent full form),
the page will be categorized into [[:Category:Estonian participles]].
Another example:
cats["lt"] = {
{"p=", "part",
{"has", "pron",
"pronominal dalyvis participle forms",
"dalyvis participle forms",
}
}
}
This says that, for language code "lt" (Lithuanian), if the "p=" parameter
was given with the value "part" (or "participle", the equivalent full form),
then if the "pron" tag is present (or the equivalent full form "pronominal"),
categorize into [[:Category:Lithuanian pronominal dalyvis participle forms]],
else categorize into [["Category:Lithuanian dalyvis participle forms]]. Note
that, if p= isn't specified, or has a value other than "part" or
"participle", no categories will be added to the page, because there is no
"else" specification associated with the "p=" specification.
--]=]
-- First, the language-independent categories; be careful here not to
-- overcategorize. In practice we achieve this using tags=; we should
-- probably be smarter. But we don't e.g. want to categorize a page
-- into "present participles" if it has the tags f|s|pres|part, which
-- is a participle form rather than a participle itself.
--
-- We include the categorization here rather than in e.g. {{augmentative of}}
-- because we want the categorization to also apply when e.g. an augmentative
-- is specified using {{inflection of|LANG|...|aug}} rather than
-- {{augmentative of|LANG}}.
--[==[Disable all of these for now as they are somewhat controversial.
cats["und"] = {
{"tags=", {"aug"}, "augmentative <<p=n>>s"},
{"tags=", {"dim"}, "diminutive <<p=n>>s"},
{"or", {"tags=", {"end"}},
{"or", {"tags=", {"end", "form"}}, {"tags=", {"end", "dim"}}},
"endearing <<p=n>>s"},
{"tags=", {"pej"}, "derogatory terms"},
{"tags=", {"comd"}, "comparative <<p=a>>s"},
{"tags=", {"supd"}, "superlative <<p=a>>s"},
{"tags=", {"equd"}, "<<p=a>> equative forms"},
{"tags=", {"caus"}, "causative <<p=v>>s"},
{"tags=", {"freq"}, "frequentative <<p=v>>s"},
{"tags=", {"iter"}, "iterative <<p=v>>s"},
{"tags=", {"refl"}, "reflexive <<p=v>>s"},
{"or", {"tags=", {"impfv"}}, {"tags=", {"impfv", "form"}}, "imperfective <<p=v>>s"},
{"or", {"tags=", {"pfv"}}, {"tags=", {"pfv", "form"}}, "perfective <<p=v>>s"},
{"tags=", {"nomzn"}, "nominalized adjectives"},
{"tags=", {"ger"}, "gerunds"},
{"tags=", {"vnoun"}, "verbal nouns"},
{"tags=", {"pass"}, "<<p=v>> passive forms"},
-- [[User:Rua]] objects to these categories
{"tags=", {"past", "act", "part"}, "past active participles"},
{"tags=", {"past", "pass", "part"}, "past passive participles"},
{"tags=", {"past", "part"}, "past participles"},
{"tags=", {"pres", "act", "part"}, "present active participles"},
{"tags=", {"pres", "pass", "part"}, "present passive participles"},
{"tags=", {"pres", "part"}, "present participles"},
{"tags=", {"perf", "part"}, "perfect participles"},
}]==]
cats["az"] = {
{"hasall", {"subject", "past", "participle"}, "subject past participles"},
{"hasall", {"broken", "plural"}, "broken noun plural forms"},
}
cats["bg"] = {
{"cond",
{"hasall", {"adv", "part"}, "adverbial participles"},
{"has", "part",
-- If this is a lemma participle form, categorize appropriately
-- for the type of participle, otherwise put into
-- "participle forms". We determine a lemma if all of the
-- following apply:
-- (1) either is masculine, or no gender listed; and
-- (2) either is indefinite, or no definiteness listed; and
-- (3) not listed as either subjective or objective form.
{"and",
{"or", {"has", "m"}, {"not", {"hasany", {"f", "n", "p"}}}},
{"and",
{"or", {"has", "indef"}, {"not", {"has", "def"}}},
{"not", {"hasany", {"sbjv", "objv"}}},
},
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
{"hasall", {"past", "act", "aor"}, "past active aorist participles"},
{"hasall", {"past", "act", "impf"}, "past active imperfect participles"},
},
-- FIXME: "participle forms" probably not necessary,
-- should be handled by headword
"participle forms"
}
}
},
}
cats["br"] = {
{"p=", "n",
{"has", "p", "noun plural forms"}
},
}
cats["ca"] = {
{"has", "part",
{"cond",
-- FIXME, not clear if we need all of these conditions;
-- may partly be handled by headword
{"hasany", {"f", "p"}, "participle forms"},
{"has", "pres", "present participles"},
{"has", "past", "past participles"},
}
},
}
cats["de"] = {
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["el"] = {
{"has", "dat", "dative forms"},
{"cond",
{"hasall", {"1", "s", "past"}, "verb past tense forms"},
{"has", "nonfinite", "verb nonfinite forms"},
},
}
cats["en"] = {
{"cond",
-- The display of these labels and their categorization is controlled by [[Module:labels/data/lang/en]].
-- This label will categorize into [[:Category:English archaic third-person singular forms]].
{"has", "3-th", {labels = {"archaic third singular"}}},
-- This label will categorize into [[:Category:English second-person singular forms]].
{"hasall", {"2-st", "pres"}, {labels = {"archaic second singular present"}}},
-- This label will categorize into [[:Category:English second-person singular past tense forms]].
{"hasall", {"2-st", "past"}, {labels = {"archaic second singular past"}}},
},
-- Add irregular plural categories. The corresponding code is in [[Module:form of/lang-data/en/functions]].
{"tags=", {"p"}, {"call", "en-irregular-plural-categories"}},
}
cats["enm"] = {
{"not", {"hasany", {"sub", "imp"}},
{"multi",
{"hasall", {"1", "s", "pres"}, "first-person singular forms"},
{"hasall", {"2", "s", "pres"}, "second-person singular forms"},
{"hasall", {"3", "s", "pres"}, "third-person singular forms"},
{"hasall", {"1//3", "s", "past"}, "first/third-person singular past forms"},
{"hasall", {"2", "s", "past"}, "second-person singular past forms"},
{"hasall", {"p", "pres"}, "plural forms"},
},
},
{"hasall", {"p", "pres", "ind"}, "plural forms"},
{"hasall", {"p", "pres", "sub"}, "plural subjunctive forms"},
{"hasall", {"p", "past"}, "plural past forms"},
{"hasall", {"s", "pres", "sub"}, "singular subjunctive forms"},
{"hasall", {"s", "past", "sub"}, "singular past subjunctive forms"},
{"hasall", {"s", "imp"}, "singular imperative forms"},
{"hasall", {"p", "imp"}, "plural imperative forms"},
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["et"] = {
{"has", "part", "participles"},
}
cats["fi"] = {
{"has", "inf",
{"cond",
{"hasall", {"long", "first"}, "long first infinitives"},
{"hasall", {"second", "act"}, "active second infinitives"},
{"hasall", {"second", "pass"}, "passive second infinitives"},
{"hasall", {"third", "act"}, "active third infinitives"},
{"hasall", {"third", "pass"}, "passive third infinitives"},
{"has", "fifth", "fifth infinitives"},
}
},
}
cats["got"] = {
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["hu"] = {
{"hasall", {"past", "part"}, "past participles"},
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"fut", "part"}, "future participles"},
{"hasall", {"adv", "part"}, "adverbial participles"},
{"hasall", {"verbal", "part"}, "verbal participles"},
}
cats["ja"] = {
{"p=", "v",
{"multi",
{"has", "past", "past tense verb forms"},
{"has", "conj", "conjunctive verb forms"},
}
},
}
cats["kmr"] = {
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["liv"] = {
{"has", "part",
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"pres", "pass"}, "present passive participles"},
{"hasall", {"past", "act"}, "past active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
},
},
{"cond",
{"has", "ger", "gerunds"},
{"hasall", {"sup", "abe"}, "supine abessives"},
{"has", "sup", "supines"},
{"has", "deb", "debitives"},
},
}
cats["lt"] = {
{"has", "part",
{"cond",
-- Three types of adverbial participles.
{"has", "budinys", "būdinys participles"},
{"has", "padalyvis", "padalyvis participles"},
{"has", "pusdalyvis", "pusdalyvis participles"},
-- If it's a non-adverbial participle, it's a dalyvis = regular
-- adjectival participle. It's a participle per se if it has
-- no case, number or gender listed.
{"not", {"hasany", {
"nom", "gen", "dat", "acc", "ins", "loc", "voc",
"m", "f", "s", "p"
}}, "dalyvis participles"},
}
},
{"p=", "a",
{"has", "pron",
{"cond",
{"has", "comd", "comparative pronominal adjective forms"},
{"has", "supd", "superlative pronominal adjective forms"},
},
{"cond",
{"has", "comd", "comparative adjective forms"},
{"has", "supd", "superlative adjective forms"},
},
}
},
}
cats["lv"] = {
{"has", "neg", "negative verb forms"},
{"has", "comd", "comparative adjectives"},
{"has", "supd", "superlative adjectives"},
{"has", "part",
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"pres", "pass"}, "present passive participles"},
{"hasall", {"past", "act"}, "past active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
},
},
}
cats["mk"] = {
{"has", "vnoun",
{"multi", "verbal nouns", "verb forms"},
},
{"has", "part",
{"multi",
"participles",
"verb forms",
{"cond",
{"hasall", {"adj", "part"}, "adjectival participles"},
{"hasall", {"adv", "part"}, "adverbial participles"},
{"hasall", {"perf", "part"}, "perfect participles"},
{"hasall", {"aor", "act", "part"}, "aorist l-participles"},
{"hasall", {"impf", "act", "part"}, "imperfect l-participles"},
},
}
},
{"has", "lptcp",
{"multi",
{"has", "aor", "aorist l-participles"},
{"has", "impf", "imperfect l-participles"},
{"hasall", {"m", "s"}, "participles", "participle forms"},
},
},
{"hasall", {"col", "pl"}, "collective plurals"},
}
cats["nl"] = {
{"tags=", {"pl", "imp"}, {labels = {"plural imperative"}}},
{"has", "sub", {labels = {"subjunctive"}}},
-- Depending on the part of speech, a specific case-form category is added, or if no
-- recognized part of speech is present, the generic case-form category is used. The
-- label "archaic" will also be added, for which see [[Module:labels/data/lang/nl]].
{"hasany", {"acc", "dat", "gen"},
{"multi",
{labels = {"archaic case form"}},
{"cond",
{"p=", "n", "noun case forms"},
{"p=", "a", "adjective case forms"},
-- Only goes to "case forms" umbrella cat if no (/no recognized) POS given
"case forms"
}
}
}
}
cats["pl"] = {
{"has", "short", "short adjective forms"},
}
cats["sa"] = {
{"has", "desid",
{"multi",
"desiderative verbs",
"verbs derived from primitive verbs"
},
},
{"has", "freq",
{"multi",
"frequentative verbs",
"verbs derived from primitive verbs"
},
},
{"has", "root", "root forms"},
}
cats["sv"] = {
{"cond",
-- The display of these labels is controlled by [[Module:labels/data/lang/sv]].
{"hasall", {"past", "sub"}, {labels = {"past subjunctive"}}},
{"hasall", {"pres", "sub"}, {labels = {"present subjunctive"}}},
-- If it just has 'sub' (subjunctive), not labeled as present or past, treat it like the past subjunctive, whose label
-- is "weaker" than the present subjunctive (dated vs. archaic).
{"has", "sub", {labels = {"past subjunctive"}}},
{"hasall", {"1", "p", "pres"}, {labels = {"1st plural present indicative"}}},
{"hasall", {"2", "p", "pres"}, {labels = {"2nd plural present indicative"}}},
{"hasall", {"p", "pres"}, {labels = {"plural present indicative"}}},
{"hasall", {"1", "p", "past"}, {labels = {"1st plural past indicative"}}},
{"hasall", {"2", "p", "past"}, {labels = {"2nd plural past indicative"}}},
{"hasall", {"p", "past"}, {labels = {"plural past indicative"}}},
{"hasall", {"1", "p", "imp"}, {labels = {"1st plural imperative"}}},
{"hasall", {"p", "imp"}, {labels = {"2nd plural imperative"}}},
},
}
cats["uk"] = {
{"has", "part",
{"multi",
"participles",
"verb forms",
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"pres", "pass"}, "present passive participles"},
{"hasall", {"pres", "adv"}, "present adverbial participles"},
{"hasall", {"past", "act"}, "past active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
{"hasall", {"past", "adv"}, "past adverbial participles"},
},
}
},
}
return cats
cnhxumcr3cajnqtfpficwhzfl7ttnla
88546
88545
2026-07-30T10:34:29Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/cats]]
88545
Scribunto
text/plain
local cats = {}
--[=[
-- FIXME: Data structure is highly inefficient, as it involves lots of nested tables.
This contains categorization specs for specific languages and for all languages.
The particular categories listed are listed without the preceding canonical
language name, which will automatically be prepended, and the text "<<p>>"
in a category will be replaced with the user-specified part of speech.
The value of an entry in the cats[] table is a list of specifications to apply
to inflections in a specific language (except that the entry for "und" applies
to all languages). Each specification indicates the conditions under which a
given category is applied. Each specification is processed independently; if
multiple specifications apply, all the resulting categories will be added to
the page. (This is equivalent to wrapping the specifications in a
{"multi", ...} clause; see below.)
A specification is one of:
(1) A string:
Always apply that category.
(2) A list {"has", TAG, SPEC} or {"has", TAG, SPEC, ELSESPEC}:
TAG is an inflection tag, and can either be the full form or any
abbreviation; if that tag is present among the user-supplied tags, SPEC is
applied, otherwise ELSESPEC is applied if present. SPEC and ELSESPEC are
specifications just as at the top level; i.e. they can be strings, nested
conditions, etc.
(2) A list {"hasall", TAGS, SPEC} or {"hasall", TAGS, SPEC, ELSESPEC}:
Similar to {"has", ...} but only activates if all of the tags in TAGS
(a list) are present among the user-supplied tags (in any order, and
other tags may be present, including between the tags in TAGS).
(3) A list {"hasany", TAGS, SPEC} or {"hasany", TAGS, SPEC, ELSESPEC}:
Similar to {"has", ...} but activates if any of the tags in TAGS
(a list) are present among the user-supplied tags.
(4) A list {"tags=", TAGS, SPEC} or {"tags=", TAGS, SPEC, ELSESPEC}:
Similar to {"hasall", ...} but activates only if the
user-supplied tags exactly match the tags in TAGS, including
the order. (But, as above, any tag abbreviation can be given
in TAGS, and will match any equivalent abbreviation or full
form.)
(5) A list {"p=", VALUE, SPEC} or {"p=", VALUE, SPEC, ELSESPEC}:
Similar to {"has", ...} but activates if the value supplied for the p=
or POS= parameters is the specified value (which can be either the full
form or any abbreviation).
(6) A list {"pany", VALUES, SPEC} or {"pany", VALUES, SPEC, ELSESPEC}:
Similar to {"p=", ...} but activates if the value supplied for the p=
or POS= parameters is any of the specified values (which can be either
the full forms or any abbreviation).
(7) A list {"pexists", SPEC} or {"pexists", SPEC, ELSESPEC}:
Activates if any value was specified for the p= or POS= parameters.
(8) A list {"cond", SPEC1, SPEC2, ...}:
If SPEC1 applies, it will be applied; otherwise, if SPEC2 applies, it
will be applied; etc. This stops processing specifications as soon as it
finds one that applies.
(9) A list {"multi", SPEC1, SPEC2, ...}:
If SPEC1 applies, it will be applied; in addition, if SPEC2 applies, it
will also be applied; etc. Unlike {"cond", ...}, this continues
processing specifications even if a previous one has applied.
(10) A list {"not", CONDITION, SPEC} or {"not", CONDITION, SPEC, ELSESPEC}:
If CONDITION does *NOT* apply, SPEC will be applied, otherwise ELSESPEC
will be applied if present. CONDITION is one of:
-- {"has", TAG}
-- {"hasall", TAGS}
-- {"hasany", TAGS}
-- {"tags=", TAGS},
-- {"p=", VALUE}
-- {"pany", VALUES}
-- {"pexists"}
-- {"not", CONDITION}
-- {"and", CONDITION1, CONDITION2}
-- {"or", CONDITION1, CONDITION2}
-- {"call", FUNCTION} where FUNCTION is a string naming a function listed
in cat_functions in [[Module:form of/functions]], which is passed a
single argument (see (10) below) and should return true or false.
That is, conditions are similar to if-else SPECS but without any
specifications given.
(11) A list {"and", CONDITION1, CONDITION2, SPEC} or {"and", CONDITION1, CONDITION2, SPEC, ELSESPEC}:
If CONDITION1 and CONDITION2 both apply, SPEC will be applied, otherwise
ELSESPEC will be applied if present. CONDITION is as above for "not".
(12) A list {"or", CONDITION1, CONDITION2, SPEC} or {"or", CONDITION1, CONDITION2, SPEC, ELSESPEC}:
If either CONDITION1 or CONDITION2 apply, SPEC will be applied, otherwise
ELSESPEC will be applied if present. CONDITION is as above for "not".
(13) A list {"call", FUNCTION}:
FUNCTION is the name of a function listed in cat_functions in
[[Module:form of/functions]], which is passed a single argument, a table
containing the parameters given to the template call, and which should
return a specification (a string naming a category, a list of any of the
formats described above). In the table, the following keys are present:
"lang": the structure describing the language (usually the first
parameter);
"tags": the list of tags (canonicalized to their full forms);
"term": the term to link to (will be missing if no term is given);
"alt": the display form of the term (will be missing if no display form
is given);
"t": the gloss of the term (will be missing if no gloss is given);
In addition, any other parameters specified will be located under a key
corresponding to the parameter name.
As a simple example, consider this:
cats["et"] = {
{"has", "part", "participles"},
}
This says that, for language code "et" (Estonian), if the "part" tag is
present (or if "participle" is present, which is the equivalent full form),
the page will be categorized into [[:Category:Estonian participles]].
Another example:
cats["lt"] = {
{"p=", "part",
{"has", "pron",
"pronominal dalyvis participle forms",
"dalyvis participle forms",
}
}
}
This says that, for language code "lt" (Lithuanian), if the "p=" parameter
was given with the value "part" (or "participle", the equivalent full form),
then if the "pron" tag is present (or the equivalent full form "pronominal"),
categorize into [[:Category:Lithuanian pronominal dalyvis participle forms]],
else categorize into [["Category:Lithuanian dalyvis participle forms]]. Note
that, if p= isn't specified, or has a value other than "part" or
"participle", no categories will be added to the page, because there is no
"else" specification associated with the "p=" specification.
--]=]
-- First, the language-independent categories; be careful here not to
-- overcategorize. In practice we achieve this using tags=; we should
-- probably be smarter. But we don't e.g. want to categorize a page
-- into "present participles" if it has the tags f|s|pres|part, which
-- is a participle form rather than a participle itself.
--
-- We include the categorization here rather than in e.g. {{augmentative of}}
-- because we want the categorization to also apply when e.g. an augmentative
-- is specified using {{inflection of|LANG|...|aug}} rather than
-- {{augmentative of|LANG}}.
--[==[Disable all of these for now as they are somewhat controversial.
cats["und"] = {
{"tags=", {"aug"}, "augmentative <<p=n>>s"},
{"tags=", {"dim"}, "diminutive <<p=n>>s"},
{"or", {"tags=", {"end"}},
{"or", {"tags=", {"end", "form"}}, {"tags=", {"end", "dim"}}},
"endearing <<p=n>>s"},
{"tags=", {"pej"}, "derogatory terms"},
{"tags=", {"comd"}, "comparative <<p=a>>s"},
{"tags=", {"supd"}, "superlative <<p=a>>s"},
{"tags=", {"equd"}, "<<p=a>> equative forms"},
{"tags=", {"caus"}, "causative <<p=v>>s"},
{"tags=", {"freq"}, "frequentative <<p=v>>s"},
{"tags=", {"iter"}, "iterative <<p=v>>s"},
{"tags=", {"refl"}, "reflexive <<p=v>>s"},
{"or", {"tags=", {"impfv"}}, {"tags=", {"impfv", "form"}}, "imperfective <<p=v>>s"},
{"or", {"tags=", {"pfv"}}, {"tags=", {"pfv", "form"}}, "perfective <<p=v>>s"},
{"tags=", {"nomzn"}, "nominalized adjectives"},
{"tags=", {"ger"}, "gerunds"},
{"tags=", {"vnoun"}, "verbal nouns"},
{"tags=", {"pass"}, "<<p=v>> passive forms"},
-- [[User:Rua]] objects to these categories
{"tags=", {"past", "act", "part"}, "past active participles"},
{"tags=", {"past", "pass", "part"}, "past passive participles"},
{"tags=", {"past", "part"}, "past participles"},
{"tags=", {"pres", "act", "part"}, "present active participles"},
{"tags=", {"pres", "pass", "part"}, "present passive participles"},
{"tags=", {"pres", "part"}, "present participles"},
{"tags=", {"perf", "part"}, "perfect participles"},
}]==]
cats["az"] = {
{"hasall", {"subject", "past", "participle"}, "subject past participles"},
{"hasall", {"broken", "plural"}, "broken noun plural forms"},
}
cats["bg"] = {
{"cond",
{"hasall", {"adv", "part"}, "adverbial participles"},
{"has", "part",
-- If this is a lemma participle form, categorize appropriately
-- for the type of participle, otherwise put into
-- "participle forms". We determine a lemma if all of the
-- following apply:
-- (1) either is masculine, or no gender listed; and
-- (2) either is indefinite, or no definiteness listed; and
-- (3) not listed as either subjective or objective form.
{"and",
{"or", {"has", "m"}, {"not", {"hasany", {"f", "n", "p"}}}},
{"and",
{"or", {"has", "indef"}, {"not", {"has", "def"}}},
{"not", {"hasany", {"sbjv", "objv"}}},
},
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
{"hasall", {"past", "act", "aor"}, "past active aorist participles"},
{"hasall", {"past", "act", "impf"}, "past active imperfect participles"},
},
-- FIXME: "participle forms" probably not necessary,
-- should be handled by headword
"participle forms"
}
}
},
}
cats["br"] = {
{"p=", "n",
{"has", "p", "noun plural forms"}
},
}
cats["ca"] = {
{"has", "part",
{"cond",
-- FIXME, not clear if we need all of these conditions;
-- may partly be handled by headword
{"hasany", {"f", "p"}, "participle forms"},
{"has", "pres", "present participles"},
{"has", "past", "past participles"},
}
},
}
cats["de"] = {
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["el"] = {
{"has", "dat", "dative forms"},
{"cond",
{"hasall", {"1", "s", "past"}, "verb past tense forms"},
{"has", "nonfinite", "verb nonfinite forms"},
},
}
cats["en"] = {
{"cond",
-- The display of these labels and their categorization is controlled by [[Module:labels/data/lang/en]].
-- This label will categorize into [[:Category:English archaic third-person singular forms]].
{"has", "3-th", {labels = {"archaic third singular"}}},
-- This label will categorize into [[:Category:English second-person singular forms]].
{"hasall", {"2-st", "pres"}, {labels = {"archaic second singular present"}}},
-- This label will categorize into [[:Category:English second-person singular past tense forms]].
{"hasall", {"2-st", "past"}, {labels = {"archaic second singular past"}}},
},
-- Add irregular plural categories. The corresponding code is in [[Module:form of/lang-data/en/functions]].
{"tags=", {"p"}, {"call", "en-irregular-plural-categories"}},
}
cats["enm"] = {
{"not", {"hasany", {"sub", "imp"}},
{"multi",
{"hasall", {"1", "s", "pres"}, "first-person singular forms"},
{"hasall", {"2", "s", "pres"}, "second-person singular forms"},
{"hasall", {"3", "s", "pres"}, "third-person singular forms"},
{"hasall", {"1//3", "s", "past"}, "first/third-person singular past forms"},
{"hasall", {"2", "s", "past"}, "second-person singular past forms"},
{"hasall", {"p", "pres"}, "plural forms"},
},
},
{"hasall", {"p", "pres", "ind"}, "plural forms"},
{"hasall", {"p", "pres", "sub"}, "plural subjunctive forms"},
{"hasall", {"p", "past"}, "plural past forms"},
{"hasall", {"s", "pres", "sub"}, "singular subjunctive forms"},
{"hasall", {"s", "past", "sub"}, "singular past subjunctive forms"},
{"hasall", {"s", "imp"}, "singular imperative forms"},
{"hasall", {"p", "imp"}, "plural imperative forms"},
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["et"] = {
{"has", "part", "participles"},
}
cats["fi"] = {
{"has", "inf",
{"cond",
{"hasall", {"long", "first"}, "long first infinitives"},
{"hasall", {"second", "act"}, "active second infinitives"},
{"hasall", {"second", "pass"}, "passive second infinitives"},
{"hasall", {"third", "act"}, "active third infinitives"},
{"hasall", {"third", "pass"}, "passive third infinitives"},
{"has", "fifth", "fifth infinitives"},
}
},
}
cats["got"] = {
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["hu"] = {
{"hasall", {"past", "part"}, "past participles"},
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"fut", "part"}, "future participles"},
{"hasall", {"adv", "part"}, "adverbial participles"},
{"hasall", {"verbal", "part"}, "verbal participles"},
}
cats["ja"] = {
{"p=", "v",
{"multi",
{"has", "past", "past tense verb forms"},
{"has", "conj", "conjunctive verb forms"},
}
},
}
cats["kmr"] = {
{"hasall", {"pres", "part"}, "present participles"},
{"hasall", {"past", "part"}, "past participles"},
}
cats["liv"] = {
{"has", "part",
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"pres", "pass"}, "present passive participles"},
{"hasall", {"past", "act"}, "past active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
},
},
{"cond",
{"has", "ger", "gerunds"},
{"hasall", {"sup", "abe"}, "supine abessives"},
{"has", "sup", "supines"},
{"has", "deb", "debitives"},
},
}
cats["lt"] = {
{"has", "part",
{"cond",
-- Three types of adverbial participles.
{"has", "budinys", "būdinys participles"},
{"has", "padalyvis", "padalyvis participles"},
{"has", "pusdalyvis", "pusdalyvis participles"},
-- If it's a non-adverbial participle, it's a dalyvis = regular
-- adjectival participle. It's a participle per se if it has
-- no case, number or gender listed.
{"not", {"hasany", {
"nom", "gen", "dat", "acc", "ins", "loc", "voc",
"m", "f", "s", "p"
}}, "dalyvis participles"},
}
},
{"p=", "a",
{"has", "pron",
{"cond",
{"has", "comd", "comparative pronominal adjective forms"},
{"has", "supd", "superlative pronominal adjective forms"},
},
{"cond",
{"has", "comd", "comparative adjective forms"},
{"has", "supd", "superlative adjective forms"},
},
}
},
}
cats["lv"] = {
{"has", "neg", "negative verb forms"},
{"has", "comd", "comparative adjectives"},
{"has", "supd", "superlative adjectives"},
{"has", "part",
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"pres", "pass"}, "present passive participles"},
{"hasall", {"past", "act"}, "past active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
},
},
}
cats["mk"] = {
{"has", "vnoun",
{"multi", "verbal nouns", "verb forms"},
},
{"has", "part",
{"multi",
"participles",
"verb forms",
{"cond",
{"hasall", {"adj", "part"}, "adjectival participles"},
{"hasall", {"adv", "part"}, "adverbial participles"},
{"hasall", {"perf", "part"}, "perfect participles"},
{"hasall", {"aor", "act", "part"}, "aorist l-participles"},
{"hasall", {"impf", "act", "part"}, "imperfect l-participles"},
},
}
},
{"has", "lptcp",
{"multi",
{"has", "aor", "aorist l-participles"},
{"has", "impf", "imperfect l-participles"},
{"hasall", {"m", "s"}, "participles", "participle forms"},
},
},
{"hasall", {"col", "pl"}, "collective plurals"},
}
cats["nl"] = {
{"tags=", {"pl", "imp"}, {labels = {"plural imperative"}}},
{"has", "sub", {labels = {"subjunctive"}}},
-- Depending on the part of speech, a specific case-form category is added, or if no
-- recognized part of speech is present, the generic case-form category is used. The
-- label "archaic" will also be added, for which see [[Module:labels/data/lang/nl]].
{"hasany", {"acc", "dat", "gen"},
{"multi",
{labels = {"archaic case form"}},
{"cond",
{"p=", "n", "noun case forms"},
{"p=", "a", "adjective case forms"},
-- Only goes to "case forms" umbrella cat if no (/no recognized) POS given
"case forms"
}
}
}
}
cats["pl"] = {
{"has", "short", "short adjective forms"},
}
cats["sa"] = {
{"has", "desid",
{"multi",
"desiderative verbs",
"verbs derived from primitive verbs"
},
},
{"has", "freq",
{"multi",
"frequentative verbs",
"verbs derived from primitive verbs"
},
},
{"has", "root", "root forms"},
}
cats["sv"] = {
{"cond",
-- The display of these labels is controlled by [[Module:labels/data/lang/sv]].
{"hasall", {"past", "sub"}, {labels = {"past subjunctive"}}},
{"hasall", {"pres", "sub"}, {labels = {"present subjunctive"}}},
-- If it just has 'sub' (subjunctive), not labeled as present or past, treat it like the past subjunctive, whose label
-- is "weaker" than the present subjunctive (dated vs. archaic).
{"has", "sub", {labels = {"past subjunctive"}}},
{"hasall", {"1", "p", "pres"}, {labels = {"1st plural present indicative"}}},
{"hasall", {"2", "p", "pres"}, {labels = {"2nd plural present indicative"}}},
{"hasall", {"p", "pres"}, {labels = {"plural present indicative"}}},
{"hasall", {"1", "p", "past"}, {labels = {"1st plural past indicative"}}},
{"hasall", {"2", "p", "past"}, {labels = {"2nd plural past indicative"}}},
{"hasall", {"p", "past"}, {labels = {"plural past indicative"}}},
{"hasall", {"1", "p", "imp"}, {labels = {"1st plural imperative"}}},
{"hasall", {"p", "imp"}, {labels = {"2nd plural imperative"}}},
},
}
cats["uk"] = {
{"has", "part",
{"multi",
"participles",
"verb forms",
{"cond",
{"hasall", {"pres", "act"}, "present active participles"},
{"hasall", {"pres", "pass"}, "present passive participles"},
{"hasall", {"pres", "adv"}, "present adverbial participles"},
{"hasall", {"past", "act"}, "past active participles"},
{"hasall", {"past", "pass"}, "past passive participles"},
{"hasall", {"past", "adv"}, "past adverbial participles"},
},
}
},
}
return cats
cnhxumcr3cajnqtfpficwhzfl7ttnla
Mòideal:form of/data/1
828
17789
88547
2026-04-12T20:31:33Z
en>Polomo
0
adding glossary link to "past historic" tag, as requested on the talk page
88547
Scribunto
text/plain
--[=[
This module lists the more common recognized inflection tags, along with their shortcut aliases, the corresponding
glossary entry or page describing the tag, and the corresponding wikidata entry. The less common tags are in
[[Module:form of/data/2]]. We divide the tags this way to save memory space. Be careful adding more tags to this module;
add them to the other module unless you're sure they are common.
TAGS is a table where keys are the canonical form of an inflection tag and the corresponding values are tables
describing the tags, consisting of the following keys:
- 1: Type of the tag ("person", "number", "gender", "case", "animacy", "tense-aspect", "mood", "voice-valence",
etc.).
- 2: Anchor or page describing the inflection tag, with the following values:
* nil: No link.
* APPENDIX: Anchor in [[Appendix:Glossary]] whose name is the same as the tag
* WIKT: Page in the English Wiktionary whose name is the same as the tag.
* WP: Page in the English Wikipedia whose name is the same as the tag.
* A string: If prefixed by 'w:' the specified page in the English Wikipedia. If prefixed by 'wikt:', the
specified page in the English Wiktionary. Otherwise, an anchor in [[Appendix:Glossary]].
NOTE: GLOSSARY ANCHORS ARE PREFERRED. Other types of entries should be migrated to the glossary, with links to
Wikipedia and/or Wiktionary entries as appropriate.
- 3: List of shortcuts (i.e. aliases for the inflection tag) or a single shortcut string, or nil.
- 4: Numeric value of Wikidata identifier (see wikidata.org) for the concept most closely describing this tag.
(The actual Wikidata identifier is a string formed by prefixing the number with Q.)
- display: If specified, consists of text to display in the definition line, in lieu of the canonical form of the
inflection tag. If there is a glossary entry, the displayed text forms the right side of the two-part
glossary link.
- no_space_on_left: If specified, don't display a space to the left of the tag. Used for punctuation.
- no_space_on_right: If specified, don't display a space to the right of the tag. Used for punctuation.
SHORTCUTS is a table mapping shortcut aliases to canonical inflection tag names. Shortcuts are of one of three types:
(1) A simple alias of a tag. These do not need to be entered explicitly into the table; code at the end of the module
automatically fills in these entries based on the information in TAGS.
(2) An alias to a multipart tag. For example, the alias "mf" maps to the multipart tag "m//f", which will in turn be
expanded into the canonical multipart tag {"masculine", "feminine"}, which will display as (approximately)
"[[Appendix:Glossary#gender|masculine]] and [[Appendix:Glossary#gender|feminine]]". The number of such aliases
should be liminted, and should cover only the most common combinations.
Normally, multipart tags are displayed using serialCommaJoin() in [[Module:table]] to appropriately join the display
form of the individual tags using commas and/or "and". However, some multipart tags are displayed specially; see
DISPLAY_HANDLERS below. Note that aliases to multipart tags can themselves contain simple aliases in them.
(3) An alias to a list of multiple tags (which may themselves be simple or multipart aliases). Specifying the alias is
exactly equivalent to specifying the tags in the list in order, one after another. An example is "1s", which maps to
the list {"1", "s"}. The number of such aliases should be limited, and should cover only the most common
combinations.
NOTE: In some cases below, multiple tags point to the same wikidata, because Wikipedia considers them synonyms. Examples
are indirect case vs. objective case vs. oblique case, and inferential mood vs. renarrative mood. We do this because
(a) we want to allow users to choose their own terminology; (b) we want to be able to use the terminology most common
for the language in question; (c) terms considered synonyms may or may not actually be synonyms, as different languages
may use the terms differently. For example, although the Wikipedia page on [[w:inferential mood]] claims that
inferential and renarrative moods are the same, the page on [[w:Bulgarian_verbs#Evidentials]] claims that Bulgarian has
both, and that they are not the same.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Person -----------------------
tags["first-person"] = {
"person",
"first person",
"1",
21714344,
}
tags["second-person"] = {
"person",
"second person",
"2",
51929049,
}
tags["third-person"] = {
"person",
"third person",
"3",
51929074,
}
tags["impersonal"] = {
"person",
APPENDIX,
"impers",
}
shortcuts["12"] = "1//2"
shortcuts["13"] = "1//3"
shortcuts["23"] = "2//3"
shortcuts["123"] = "1//2//3"
----------------------- Number -----------------------
tags["singular"] = {
"number",
"singular number",
{"s", "sg"},
110786,
}
tags["dual"] = {
"number",
"dual number",
{"d", "du"},
110022,
}
tags["plural"] = {
"number",
"plural number",
{"p", "pl"},
146786,
}
tags["single-possession"] = {
"number",
"singular number",
"spos",
110786, -- Singular
}
tags["multiple-possession"] = {
"number",
"plural number",
"mpos",
146786, -- Plural
}
shortcuts["1s"] = {"1", "s"}
shortcuts["2s"] = {"2", "s"}
shortcuts["3s"] = {"3", "s"}
shortcuts["1d"] = {"1", "d"}
shortcuts["2d"] = {"2", "d"}
shortcuts["3d"] = {"3", "d"}
shortcuts["1p"] = {"1", "p"}
shortcuts["2p"] = {"2", "p"}
shortcuts["3p"] = {"3", "p"}
----------------------- Gender -----------------------
tags["masculine"] = {
"gender",
"gender",
"m",
499327,
}
-- This is useful e.g. in Swedish.
tags["natural masculine"] = {
"gender",
"gender",
"natm",
}
tags["feminine"] = {
"gender",
"gender",
"f",
1775415,
}
tags["neuter"] = {
"gender",
"gender",
"n",
1775461,
}
tags["common"] = {
"gender",
"gender",
"c",
1305037,
}
tags["nonvirile"] = {
"gender",
APPENDIX,
"nv",
}
shortcuts["mf"] = "m//f"
shortcuts["mn"] = "m//n"
shortcuts["fn"] = "f//n"
shortcuts["mfn"] = "m//f//n"
----------------------- Animacy -----------------------
-- (may be useful sometimes for [[Module:object usage]].)
tags["animate"] = {
"animacy",
APPENDIX,
"an",
51927507,
}
tags["inanimate"] = {
"animacy",
APPENDIX,
{"in", "inan"},
51927539,
}
tags["personal"] = {
"animacy",
APPENDIX,
{"pr", "pers"},
63302102,
}
----------------------- Tense/aspect -----------------------
tags["present"] = {
"tense-aspect",
"present tense",
"pres",
192613,
}
tags["past"] = {
"tense-aspect",
"past tense",
nil,
1994301,
}
tags["future"] = {
"tense-aspect",
"future tense",
{"fut", "futr"},
501405,
}
tags["future perfect"] = {
"tense-aspect",
APPENDIX,
{"futp", "fperf"},
1234617,
}
tags["non-past"] = {
"tense-aspect",
"non-past tense",
"npast",
16916993,
}
tags["progressive"] = {
"tense-aspect",
APPENDIX,
"prog",
56653945,
}
tags["preterite"] = {
"tense-aspect",
APPENDIX,
"pret",
442485,
}
tags["perfect"] = {
"tense-aspect",
APPENDIX,
"perf",
625420,
}
tags["imperfect"] = {
"tense-aspect",
APPENDIX,
{"impf", "imperf"},
}
tags["pluperfect"] = {
"tense-aspect",
APPENDIX,
{"plup", "pluperf"},
623742,
}
tags["aorist"] = {
"tense-aspect",
"aorist tense",
{"aor", "aori"},
216497,
}
tags["past historic"] = {
"tense-aspect",
"past historic tense",
"phis",
442485, -- Preterite
}
tags["imperfective"] = {
"tense-aspect",
APPENDIX,
{"impfv", "imperfv"},
371427,
}
tags["perfective"] = {
"tense-aspect",
APPENDIX,
{"pfv", "perfv"},
1424306,
}
shortcuts["spast"] = {"simple", "past"}
shortcuts["simple past"] = {"simple", "past"}
shortcuts["spres"] = {"simple", "present"}
shortcuts["simple present"] = {"simple", "present"}
----------------------- Mood -----------------------
tags["imperative"] = {
"mood",
"imperative mood",
{"imp", "impr", "impv"},
22716,
}
tags["indicative"] = {
"mood",
"indicative mood",
{"ind", "indc", "indic"},
682111,
}
tags["subjunctive"] = {
"mood",
"subjunctive mood",
{"sub", "subj"},
473746,
}
tags["conditional"] = {
"mood",
"conditional mood",
"cond",
625581,
}
tags["modal"] = {
"mood",
"w:modality (linguistics)",
"mod",
1243600,
}
tags["optative"] = {
"mood",
"optative mood",
{"opt", "opta"},
527205,
}
tags["jussive"] = {
"mood",
"jussive mood",
{"jus", "juss"},
462367,
}
tags["hortative"] = {
"mood",
WP,
"hort",
5906629,
}
----------------------- Voice/valence -----------------------
-- This tag type combines what is normally called "voice" (active, passive, middle, mediopassive) with other tags that
-- aren't normally called voice but are similar in that they control the valence/valency (number and structure of the
-- arguments of a verb).
tags["active"] = {
"voice-valence",
"active voice",
{"act", "actv"},
1317831,
}
tags["middle"] = {
"voice-valence",
"middle voice",
{"mid", "midl"},
}
tags["passive"] = {
"voice-valence",
"passive voice",
{"pass", "pasv"},
1194697,
}
tags["mediopassive"] = {
"voice-valence",
APPENDIX,
{"mp", "mpass", "mpasv", "mpsv"},
1601545,
}
tags["reflexive"] = {
"voice-valence",
APPENDIX,
"refl",
13475484, -- for "reflexive verb"
}
tags["transitive"] = {
"voice-valence",
"transitive verb",
{"tr", "vt"},
1774805, -- for "transitive verb"
}
tags["intransitive"] = {
"voice-valence",
"intransitive verb",
{"intr", "vi"},
1166153, -- for "intransitive verb"
}
tags["ditransitive"] = {
"voice-valence",
"ditransitive verb",
"ditr",
2328313, -- for "ditransitive verb"
}
tags["causative"] = {
"voice-valence",
APPENDIX,
"caus",
56677011, -- for "causative verb"
}
----------------------- Non-finite -----------------------
tags["infinitive"] = {
"non-finite",
APPENDIX,
"inf",
179230,
}
-- A form found in Portuguese and Galician, as well as in Hungarian. This is probably unnecessary and can be replaced
-- with the regular "infinitive" tag. A personal infinitive is not a separate infinitive from the plain infinitive, just
-- an inflection of the infinitive.
tags["personal infinitive"] = {
"non-finite",
"w:Portuguese verb conjugation",
"pinf",
}
tags["participle"] = {
"non-finite",
APPENDIX,
{"part", "ptcp"},
814722,
}
tags["verbal noun"] = {
"non-finite",
APPENDIX,
"vnoun",
1350145,
}
tags["gerund"] = {
"non-finite",
APPENDIX,
"ger",
1923028,
}
tags["supine"] = {
"non-finite",
APPENDIX,
"sup",
548470,
}
tags["transgressive"] = {
"non-finite",
APPENDIX,
nil,
904896,
}
----------------------- Case -----------------------
tags["ablative"] = {
"case",
"ablative case",
"abl",
156986,
}
tags["accusative"] = {
"case",
"accusative case",
"acc",
146078,
}
tags["dative"] = {
"case",
"dative case",
"dat",
145599,
}
tags["genitive"] = {
"case",
"genitive case",
"gen",
146233,
}
tags["instrumental"] = {
"case",
"instrumental case",
"ins",
192997,
}
tags["locative"] = {
"case",
"locative case",
"loc",
202142,
}
tags["nominative"] = {
"case",
"nominative case",
"nom",
131105,
}
tags["prepositional"] = {
"case",
"prepositional case",
{"pre", "prep"},
2114906,
}
tags["vocative"] = {
"case",
"vocative case",
"voc",
185077,
}
----------------------- State -----------------------
tags["construct"] = {
"state",
"construct state",
{"cons", "construct state"},
1641446,
display = "construct state",
}
tags["definite"] = {
"state",
APPENDIX,
{"def", "defn", "definite state"},
53997851,
}
tags["indefinite"] = {
"state",
APPENDIX,
{"indef", "indf", "indefinite state"},
53997857,
}
tags["possessive"] = {
"state",
WP,
"poss",
2105891,
}
tags["strong"] = {
"state",
"indefinite",
"str",
53997857, -- Indefinite
}
tags["weak"] = {
"state",
"definite",
"wk",
53997851, -- Definite
}
tags["mixed"] = {
"state",
APPENDIX,
"mix",
63302161,
}
tags["attributive"] = {
"state",
APPENDIX,
"attr",
}
tags["predicative"] = {
"state",
APPENDIX,
"pred",
}
----------------------- Degrees of comparison -----------------------
tags["positive degree"] = {
"comparison",
"positive",
{"posd", "positive"},
3482678, -- Doesn't exist in English; only in Czech, Estonian, Finnish and various Nordic languages.
}
tags["comparative degree"] = {
"comparison",
"comparative",
{"comd", "comparative"},
14169499,
}
tags["superlative degree"] = {
"comparison",
"superlative",
{"supd", "superlative"},
1817208,
}
----------------------- Register -----------------------
----------------------- Deixis -----------------------
----------------------- Clusivity -----------------------
----------------------- Inflectional class -----------------------
tags["pronominal"] = {
"class",
WIKT,
"pron",
12721180, -- for "pronominal attribute", existing only in the Romanian Wikipedia
}
----------------------- Attitude -----------------------
-- This is a vague tag type grouping augmentative, diminutive and pejorative, which generally indicate the speaker's
-- attitude towards the object in question (as well as often indicating size).
tags["augmentative"] = {
"attitude",
APPENDIX,
{"aug", "augmentive"}, -- augm = augmented
1358239,
}
tags["diminutive"] = {
"attitude",
APPENDIX,
"dim",
108709,
}
tags["pejorative"] = {
"attitude",
APPENDIX,
"pej",
545779,
}
----------------------- Sound changes -----------------------
tags["augmented"] = {
"sound change",
"augment",
"augm", -- aug = augmentative
760437,
}
tags["contracted"] = {
"sound change",
"contraction",
"contr",
126473,
}
tags["unaugmented"] = {
"sound change",
"augment",
"unaugm",
760437,
}
tags["uncontracted"] = {
"sound change",
"contraction",
"uncontr",
126473,
}
----------------------- Misc grammar -----------------------
shortcuts["past-cl"] = {"past", "-", "tense", "clause"}
shortcuts["pres-cl"] = {"pres", "-", "tense", "clause"}
shortcuts["fut-cl"] = {"fut", "-", "tense", "clause"}
shortcuts["ind-cl"] = {"ind", "clause"}
shortcuts["sub-cl"] = {"sub", "clause"}
shortcuts["past-sub-cl"] = {"past", "sub", "clause"}
shortcuts["pres-sub-cl"] = {"pres", "sub", "clause"}
shortcuts["fut-sub-cl"] = {"fut", "sub", "clause"}
shortcuts["cond-cl"] = {"cond", "clause"}
shortcuts["cond-past-cl"] = {"cond", "past", "clause"}
tags["simple"] = {
"grammar",
nil,
"sim",
}
tags["short"] = {
"grammar",
}
tags["long"] = {
"grammar",
}
tags["form"] = {
"grammar",
}
tags["adjectival"] = {
"grammar",
WIKT,
"adj",
}
tags["adverbial"] = {
"grammar",
APPENDIX,
"adv",
}
tags["negative"] = {
"grammar",
"w:affirmation and negation",
"neg",
63302088,
}
tags["nominalized"] = {
"grammar",
nil,
"nomz",
4683152, -- entry for "nominalized adjective"
}
tags["nominalization"] = {
"grammar",
nil,
"nomzn",
1500667,
}
tags["root"] = {
"grammar",
nil,
nil,
111029,
}
tags["stem"] = {
"grammar",
nil,
nil,
210523,
}
tags["dependent"] = {
"grammar",
nil,
"dep",
1122094, -- entry for "dependent clause"
}
tags["independent"] = {
"grammar",
nil,
"indep",
1419215, -- entry for "independent clause"
}
tags["subject"] = {
"grammar",
APPENDIX,
"sbj", -- sub and subj used for subjunctive
164573,
}
tags["object"] = {
"grammar",
APPENDIX,
"obj",
175026,
}
tags["direct object"] = {
"grammar",
APPENDIX,
"dirobj",
2990574,
}
tags["indirect object"] = {
"grammar",
APPENDIX,
"indirobj",
1094061,
}
tags["tense"] = {
"grammar",
APPENDIX,
nil,
177691,
}
tags["clause"] = {
"grammar",
APPENDIX,
nil,
117364,
}
tags["phrase"] = {
"grammar",
APPENDIX,
nil,
187931,
}
tags["indirect question"] = {
"grammar",
WP,
{"indq", "indirq"},
1661444,
}
----------------------- Other tags -----------------------
-- This consists of non-content words like "and" as well as punctuation characters. If the punctuation characters appear
-- by themselves as tags, we special-case the handling of surrounding spaces so the output looks correct.
tags["and"] = {
"other",
}
-- HACK! "in" is a shortcut for "inanimate" so create "!in" to display "in". We should generalize this like for labels.
tags["!in"] = {
"other",
display = "in",
}
tags[","] = {
"other",
no_space_on_left = true,
}
tags[":"] = {
"other",
no_space_on_left = true,
}
tags["/"] = {
"other",
no_space_on_left = true,
no_space_on_right = true,
}
tags["("] = {
"other",
no_space_on_right = true,
}
tags[")"] = {
"other",
no_space_on_left = true,
}
tags["["] = {
"other",
no_space_on_right = true,
}
tags["]"] = {
"other",
no_space_on_left = true,
}
tags["-"] = { -- regular hyphen-minus
"other",
no_space_on_left = true,
no_space_on_right = true,
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
m4t6mw0hppmbdtj76brwy5o3hw4dcah
88548
88547
2026-07-30T10:34:35Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/data/1]]
88547
Scribunto
text/plain
--[=[
This module lists the more common recognized inflection tags, along with their shortcut aliases, the corresponding
glossary entry or page describing the tag, and the corresponding wikidata entry. The less common tags are in
[[Module:form of/data/2]]. We divide the tags this way to save memory space. Be careful adding more tags to this module;
add them to the other module unless you're sure they are common.
TAGS is a table where keys are the canonical form of an inflection tag and the corresponding values are tables
describing the tags, consisting of the following keys:
- 1: Type of the tag ("person", "number", "gender", "case", "animacy", "tense-aspect", "mood", "voice-valence",
etc.).
- 2: Anchor or page describing the inflection tag, with the following values:
* nil: No link.
* APPENDIX: Anchor in [[Appendix:Glossary]] whose name is the same as the tag
* WIKT: Page in the English Wiktionary whose name is the same as the tag.
* WP: Page in the English Wikipedia whose name is the same as the tag.
* A string: If prefixed by 'w:' the specified page in the English Wikipedia. If prefixed by 'wikt:', the
specified page in the English Wiktionary. Otherwise, an anchor in [[Appendix:Glossary]].
NOTE: GLOSSARY ANCHORS ARE PREFERRED. Other types of entries should be migrated to the glossary, with links to
Wikipedia and/or Wiktionary entries as appropriate.
- 3: List of shortcuts (i.e. aliases for the inflection tag) or a single shortcut string, or nil.
- 4: Numeric value of Wikidata identifier (see wikidata.org) for the concept most closely describing this tag.
(The actual Wikidata identifier is a string formed by prefixing the number with Q.)
- display: If specified, consists of text to display in the definition line, in lieu of the canonical form of the
inflection tag. If there is a glossary entry, the displayed text forms the right side of the two-part
glossary link.
- no_space_on_left: If specified, don't display a space to the left of the tag. Used for punctuation.
- no_space_on_right: If specified, don't display a space to the right of the tag. Used for punctuation.
SHORTCUTS is a table mapping shortcut aliases to canonical inflection tag names. Shortcuts are of one of three types:
(1) A simple alias of a tag. These do not need to be entered explicitly into the table; code at the end of the module
automatically fills in these entries based on the information in TAGS.
(2) An alias to a multipart tag. For example, the alias "mf" maps to the multipart tag "m//f", which will in turn be
expanded into the canonical multipart tag {"masculine", "feminine"}, which will display as (approximately)
"[[Appendix:Glossary#gender|masculine]] and [[Appendix:Glossary#gender|feminine]]". The number of such aliases
should be liminted, and should cover only the most common combinations.
Normally, multipart tags are displayed using serialCommaJoin() in [[Module:table]] to appropriately join the display
form of the individual tags using commas and/or "and". However, some multipart tags are displayed specially; see
DISPLAY_HANDLERS below. Note that aliases to multipart tags can themselves contain simple aliases in them.
(3) An alias to a list of multiple tags (which may themselves be simple or multipart aliases). Specifying the alias is
exactly equivalent to specifying the tags in the list in order, one after another. An example is "1s", which maps to
the list {"1", "s"}. The number of such aliases should be limited, and should cover only the most common
combinations.
NOTE: In some cases below, multiple tags point to the same wikidata, because Wikipedia considers them synonyms. Examples
are indirect case vs. objective case vs. oblique case, and inferential mood vs. renarrative mood. We do this because
(a) we want to allow users to choose their own terminology; (b) we want to be able to use the terminology most common
for the language in question; (c) terms considered synonyms may or may not actually be synonyms, as different languages
may use the terms differently. For example, although the Wikipedia page on [[w:inferential mood]] claims that
inferential and renarrative moods are the same, the page on [[w:Bulgarian_verbs#Evidentials]] claims that Bulgarian has
both, and that they are not the same.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Person -----------------------
tags["first-person"] = {
"person",
"first person",
"1",
21714344,
}
tags["second-person"] = {
"person",
"second person",
"2",
51929049,
}
tags["third-person"] = {
"person",
"third person",
"3",
51929074,
}
tags["impersonal"] = {
"person",
APPENDIX,
"impers",
}
shortcuts["12"] = "1//2"
shortcuts["13"] = "1//3"
shortcuts["23"] = "2//3"
shortcuts["123"] = "1//2//3"
----------------------- Number -----------------------
tags["singular"] = {
"number",
"singular number",
{"s", "sg"},
110786,
}
tags["dual"] = {
"number",
"dual number",
{"d", "du"},
110022,
}
tags["plural"] = {
"number",
"plural number",
{"p", "pl"},
146786,
}
tags["single-possession"] = {
"number",
"singular number",
"spos",
110786, -- Singular
}
tags["multiple-possession"] = {
"number",
"plural number",
"mpos",
146786, -- Plural
}
shortcuts["1s"] = {"1", "s"}
shortcuts["2s"] = {"2", "s"}
shortcuts["3s"] = {"3", "s"}
shortcuts["1d"] = {"1", "d"}
shortcuts["2d"] = {"2", "d"}
shortcuts["3d"] = {"3", "d"}
shortcuts["1p"] = {"1", "p"}
shortcuts["2p"] = {"2", "p"}
shortcuts["3p"] = {"3", "p"}
----------------------- Gender -----------------------
tags["masculine"] = {
"gender",
"gender",
"m",
499327,
}
-- This is useful e.g. in Swedish.
tags["natural masculine"] = {
"gender",
"gender",
"natm",
}
tags["feminine"] = {
"gender",
"gender",
"f",
1775415,
}
tags["neuter"] = {
"gender",
"gender",
"n",
1775461,
}
tags["common"] = {
"gender",
"gender",
"c",
1305037,
}
tags["nonvirile"] = {
"gender",
APPENDIX,
"nv",
}
shortcuts["mf"] = "m//f"
shortcuts["mn"] = "m//n"
shortcuts["fn"] = "f//n"
shortcuts["mfn"] = "m//f//n"
----------------------- Animacy -----------------------
-- (may be useful sometimes for [[Module:object usage]].)
tags["animate"] = {
"animacy",
APPENDIX,
"an",
51927507,
}
tags["inanimate"] = {
"animacy",
APPENDIX,
{"in", "inan"},
51927539,
}
tags["personal"] = {
"animacy",
APPENDIX,
{"pr", "pers"},
63302102,
}
----------------------- Tense/aspect -----------------------
tags["present"] = {
"tense-aspect",
"present tense",
"pres",
192613,
}
tags["past"] = {
"tense-aspect",
"past tense",
nil,
1994301,
}
tags["future"] = {
"tense-aspect",
"future tense",
{"fut", "futr"},
501405,
}
tags["future perfect"] = {
"tense-aspect",
APPENDIX,
{"futp", "fperf"},
1234617,
}
tags["non-past"] = {
"tense-aspect",
"non-past tense",
"npast",
16916993,
}
tags["progressive"] = {
"tense-aspect",
APPENDIX,
"prog",
56653945,
}
tags["preterite"] = {
"tense-aspect",
APPENDIX,
"pret",
442485,
}
tags["perfect"] = {
"tense-aspect",
APPENDIX,
"perf",
625420,
}
tags["imperfect"] = {
"tense-aspect",
APPENDIX,
{"impf", "imperf"},
}
tags["pluperfect"] = {
"tense-aspect",
APPENDIX,
{"plup", "pluperf"},
623742,
}
tags["aorist"] = {
"tense-aspect",
"aorist tense",
{"aor", "aori"},
216497,
}
tags["past historic"] = {
"tense-aspect",
"past historic tense",
"phis",
442485, -- Preterite
}
tags["imperfective"] = {
"tense-aspect",
APPENDIX,
{"impfv", "imperfv"},
371427,
}
tags["perfective"] = {
"tense-aspect",
APPENDIX,
{"pfv", "perfv"},
1424306,
}
shortcuts["spast"] = {"simple", "past"}
shortcuts["simple past"] = {"simple", "past"}
shortcuts["spres"] = {"simple", "present"}
shortcuts["simple present"] = {"simple", "present"}
----------------------- Mood -----------------------
tags["imperative"] = {
"mood",
"imperative mood",
{"imp", "impr", "impv"},
22716,
}
tags["indicative"] = {
"mood",
"indicative mood",
{"ind", "indc", "indic"},
682111,
}
tags["subjunctive"] = {
"mood",
"subjunctive mood",
{"sub", "subj"},
473746,
}
tags["conditional"] = {
"mood",
"conditional mood",
"cond",
625581,
}
tags["modal"] = {
"mood",
"w:modality (linguistics)",
"mod",
1243600,
}
tags["optative"] = {
"mood",
"optative mood",
{"opt", "opta"},
527205,
}
tags["jussive"] = {
"mood",
"jussive mood",
{"jus", "juss"},
462367,
}
tags["hortative"] = {
"mood",
WP,
"hort",
5906629,
}
----------------------- Voice/valence -----------------------
-- This tag type combines what is normally called "voice" (active, passive, middle, mediopassive) with other tags that
-- aren't normally called voice but are similar in that they control the valence/valency (number and structure of the
-- arguments of a verb).
tags["active"] = {
"voice-valence",
"active voice",
{"act", "actv"},
1317831,
}
tags["middle"] = {
"voice-valence",
"middle voice",
{"mid", "midl"},
}
tags["passive"] = {
"voice-valence",
"passive voice",
{"pass", "pasv"},
1194697,
}
tags["mediopassive"] = {
"voice-valence",
APPENDIX,
{"mp", "mpass", "mpasv", "mpsv"},
1601545,
}
tags["reflexive"] = {
"voice-valence",
APPENDIX,
"refl",
13475484, -- for "reflexive verb"
}
tags["transitive"] = {
"voice-valence",
"transitive verb",
{"tr", "vt"},
1774805, -- for "transitive verb"
}
tags["intransitive"] = {
"voice-valence",
"intransitive verb",
{"intr", "vi"},
1166153, -- for "intransitive verb"
}
tags["ditransitive"] = {
"voice-valence",
"ditransitive verb",
"ditr",
2328313, -- for "ditransitive verb"
}
tags["causative"] = {
"voice-valence",
APPENDIX,
"caus",
56677011, -- for "causative verb"
}
----------------------- Non-finite -----------------------
tags["infinitive"] = {
"non-finite",
APPENDIX,
"inf",
179230,
}
-- A form found in Portuguese and Galician, as well as in Hungarian. This is probably unnecessary and can be replaced
-- with the regular "infinitive" tag. A personal infinitive is not a separate infinitive from the plain infinitive, just
-- an inflection of the infinitive.
tags["personal infinitive"] = {
"non-finite",
"w:Portuguese verb conjugation",
"pinf",
}
tags["participle"] = {
"non-finite",
APPENDIX,
{"part", "ptcp"},
814722,
}
tags["verbal noun"] = {
"non-finite",
APPENDIX,
"vnoun",
1350145,
}
tags["gerund"] = {
"non-finite",
APPENDIX,
"ger",
1923028,
}
tags["supine"] = {
"non-finite",
APPENDIX,
"sup",
548470,
}
tags["transgressive"] = {
"non-finite",
APPENDIX,
nil,
904896,
}
----------------------- Case -----------------------
tags["ablative"] = {
"case",
"ablative case",
"abl",
156986,
}
tags["accusative"] = {
"case",
"accusative case",
"acc",
146078,
}
tags["dative"] = {
"case",
"dative case",
"dat",
145599,
}
tags["genitive"] = {
"case",
"genitive case",
"gen",
146233,
}
tags["instrumental"] = {
"case",
"instrumental case",
"ins",
192997,
}
tags["locative"] = {
"case",
"locative case",
"loc",
202142,
}
tags["nominative"] = {
"case",
"nominative case",
"nom",
131105,
}
tags["prepositional"] = {
"case",
"prepositional case",
{"pre", "prep"},
2114906,
}
tags["vocative"] = {
"case",
"vocative case",
"voc",
185077,
}
----------------------- State -----------------------
tags["construct"] = {
"state",
"construct state",
{"cons", "construct state"},
1641446,
display = "construct state",
}
tags["definite"] = {
"state",
APPENDIX,
{"def", "defn", "definite state"},
53997851,
}
tags["indefinite"] = {
"state",
APPENDIX,
{"indef", "indf", "indefinite state"},
53997857,
}
tags["possessive"] = {
"state",
WP,
"poss",
2105891,
}
tags["strong"] = {
"state",
"indefinite",
"str",
53997857, -- Indefinite
}
tags["weak"] = {
"state",
"definite",
"wk",
53997851, -- Definite
}
tags["mixed"] = {
"state",
APPENDIX,
"mix",
63302161,
}
tags["attributive"] = {
"state",
APPENDIX,
"attr",
}
tags["predicative"] = {
"state",
APPENDIX,
"pred",
}
----------------------- Degrees of comparison -----------------------
tags["positive degree"] = {
"comparison",
"positive",
{"posd", "positive"},
3482678, -- Doesn't exist in English; only in Czech, Estonian, Finnish and various Nordic languages.
}
tags["comparative degree"] = {
"comparison",
"comparative",
{"comd", "comparative"},
14169499,
}
tags["superlative degree"] = {
"comparison",
"superlative",
{"supd", "superlative"},
1817208,
}
----------------------- Register -----------------------
----------------------- Deixis -----------------------
----------------------- Clusivity -----------------------
----------------------- Inflectional class -----------------------
tags["pronominal"] = {
"class",
WIKT,
"pron",
12721180, -- for "pronominal attribute", existing only in the Romanian Wikipedia
}
----------------------- Attitude -----------------------
-- This is a vague tag type grouping augmentative, diminutive and pejorative, which generally indicate the speaker's
-- attitude towards the object in question (as well as often indicating size).
tags["augmentative"] = {
"attitude",
APPENDIX,
{"aug", "augmentive"}, -- augm = augmented
1358239,
}
tags["diminutive"] = {
"attitude",
APPENDIX,
"dim",
108709,
}
tags["pejorative"] = {
"attitude",
APPENDIX,
"pej",
545779,
}
----------------------- Sound changes -----------------------
tags["augmented"] = {
"sound change",
"augment",
"augm", -- aug = augmentative
760437,
}
tags["contracted"] = {
"sound change",
"contraction",
"contr",
126473,
}
tags["unaugmented"] = {
"sound change",
"augment",
"unaugm",
760437,
}
tags["uncontracted"] = {
"sound change",
"contraction",
"uncontr",
126473,
}
----------------------- Misc grammar -----------------------
shortcuts["past-cl"] = {"past", "-", "tense", "clause"}
shortcuts["pres-cl"] = {"pres", "-", "tense", "clause"}
shortcuts["fut-cl"] = {"fut", "-", "tense", "clause"}
shortcuts["ind-cl"] = {"ind", "clause"}
shortcuts["sub-cl"] = {"sub", "clause"}
shortcuts["past-sub-cl"] = {"past", "sub", "clause"}
shortcuts["pres-sub-cl"] = {"pres", "sub", "clause"}
shortcuts["fut-sub-cl"] = {"fut", "sub", "clause"}
shortcuts["cond-cl"] = {"cond", "clause"}
shortcuts["cond-past-cl"] = {"cond", "past", "clause"}
tags["simple"] = {
"grammar",
nil,
"sim",
}
tags["short"] = {
"grammar",
}
tags["long"] = {
"grammar",
}
tags["form"] = {
"grammar",
}
tags["adjectival"] = {
"grammar",
WIKT,
"adj",
}
tags["adverbial"] = {
"grammar",
APPENDIX,
"adv",
}
tags["negative"] = {
"grammar",
"w:affirmation and negation",
"neg",
63302088,
}
tags["nominalized"] = {
"grammar",
nil,
"nomz",
4683152, -- entry for "nominalized adjective"
}
tags["nominalization"] = {
"grammar",
nil,
"nomzn",
1500667,
}
tags["root"] = {
"grammar",
nil,
nil,
111029,
}
tags["stem"] = {
"grammar",
nil,
nil,
210523,
}
tags["dependent"] = {
"grammar",
nil,
"dep",
1122094, -- entry for "dependent clause"
}
tags["independent"] = {
"grammar",
nil,
"indep",
1419215, -- entry for "independent clause"
}
tags["subject"] = {
"grammar",
APPENDIX,
"sbj", -- sub and subj used for subjunctive
164573,
}
tags["object"] = {
"grammar",
APPENDIX,
"obj",
175026,
}
tags["direct object"] = {
"grammar",
APPENDIX,
"dirobj",
2990574,
}
tags["indirect object"] = {
"grammar",
APPENDIX,
"indirobj",
1094061,
}
tags["tense"] = {
"grammar",
APPENDIX,
nil,
177691,
}
tags["clause"] = {
"grammar",
APPENDIX,
nil,
117364,
}
tags["phrase"] = {
"grammar",
APPENDIX,
nil,
187931,
}
tags["indirect question"] = {
"grammar",
WP,
{"indq", "indirq"},
1661444,
}
----------------------- Other tags -----------------------
-- This consists of non-content words like "and" as well as punctuation characters. If the punctuation characters appear
-- by themselves as tags, we special-case the handling of surrounding spaces so the output looks correct.
tags["and"] = {
"other",
}
-- HACK! "in" is a shortcut for "inanimate" so create "!in" to display "in". We should generalize this like for labels.
tags["!in"] = {
"other",
display = "in",
}
tags[","] = {
"other",
no_space_on_left = true,
}
tags[":"] = {
"other",
no_space_on_left = true,
}
tags["/"] = {
"other",
no_space_on_left = true,
no_space_on_right = true,
}
tags["("] = {
"other",
no_space_on_right = true,
}
tags[")"] = {
"other",
no_space_on_left = true,
}
tags["["] = {
"other",
no_space_on_right = true,
}
tags["]"] = {
"other",
no_space_on_left = true,
}
tags["-"] = { -- regular hyphen-minus
"other",
no_space_on_left = true,
no_space_on_right = true,
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
m4t6mw0hppmbdtj76brwy5o3hw4dcah
Mòideal:form of/data/1/documentation
828
17790
88549
2024-12-17T00:17:28Z
en>Theknightwho
0
88549
wikitext
text/x-wiki
This module provides the more common tag data for [[Module:form of]] and the templates that use it. For the less common tag data, see [[Module:form of/data/2]].
<includeonly>
[[Category:Data modules]]
</includeonly>
o6zk0gpmsvnnfs89ipptmdsuyuoj92f
88550
88549
2026-07-30T10:34:41Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/data/1/documentation]]
88549
wikitext
text/x-wiki
This module provides the more common tag data for [[Module:form of]] and the templates that use it. For the less common tag data, see [[Module:form of/data/2]].
<includeonly>
[[Category:Data modules]]
</includeonly>
o6zk0gpmsvnnfs89ipptmdsuyuoj92f
Mòideal:form of/data/2
828
17791
88551
2026-05-31T15:24:45Z
en>Fenakhay
0
88551
Scribunto
text/plain
--[=[
This module lists the less common recognized inflection tags, in the same format as for [[Module:form of/data/1]] (which
contains the more common tags). We split the tags this way to save memory, so we avoid loading the less common tags in
the majority of cases.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Person -----------------------
tags["fourth-person"] = {
"person",
"wikt:fourth person",
"4",
3348541,
}
tags["second-person-object form"] = {
"person",
APPENDIX,
"2o",
}
----------------------- Number -----------------------
tags["associative plural"] = {
"number",
WIKT,
{"ass p", "ass pl", "assoc p", "assoc pl"},
}
tags["collective"] = {
"number",
"collective number",
"col",
694268,
}
tags["collective-possession"] = {
"number",
"collective number",
{"cpos", "colpos"},
}
-- same as "count form" below, but included for backwards-compatibility with uses of "count|form"
tags["count"] = {
"number",
"count form",
nil,
12273953,
}
tags["count form"] = {
"number",
WIKT,
nil,
12273953,
}
tags["distributive paucal"] = {
"number",
WIKT,
"dpau",
}
tags["paucal"] = {
"number",
WIKT,
"pau",
489410,
}
tags["singulative"] = {
"number",
"singulative number",
"sgl",
1450795,
}
tags["transnumeral"] = {
"number",
APPENDIX,
"trn",
113631596,
display = "singular or plural",
}
tags["trial"] = {
"number",
"trial number",
"tri",
2142560,
}
----------------------- Gender -----------------------
tags["natural feminine"] = {
"gender",
"gender",
"natf",
}
tags["virile"] = {
"gender",
APPENDIX,
"vr",
}
----------------------- Animacy -----------------------
----------------------- Tense/aspect -----------------------
tags["abtemporal"] = {
"tense-aspect",
WIKT,
"abtemp",
}
tags["anterior"] = {
"tense-aspect",
"w:relative and absolute tense",
"ant",
}
tags["cessative"] = {
"tense-aspect",
WP,
"cess",
17027342,
}
-- Aspect in Tagalog; presumably similar to the perfect tense/aspect but not necessarily similar enough to use the same
-- Wikidata ID
tags["complete"] = {
"tense-aspect",
"w:Tagalog grammar#Aspect",
"compl",
}
tags["concomitant"] = {
"tense-aspect",
WIKT,
"concom",
}
tags["confirmative"] = {
"tense-aspect",
WIKT,
"conf",
}
-- Aspect in Tagalog
tags["contemplative"] = {
"tense-aspect",
"w:Tagalog grammar#Aspect",
"contem",
}
tags["contemporal"] = {
"tense-aspect",
WIKT,
"contemp",
}
tags["continuative"] = {
"tense-aspect",
WP,
nil,
28130104,
}
tags["continuous"] = {
"tense-aspect",
"w:continuous aspect",
"cont",
12721117,
}
tags["delimitative"] = {
"tense-aspect",
"w:delimitative aspect",
"delim",
5316270,
}
tags["durative"] = {
"tense-aspect",
WP,
"dur",
}
tags["futuritive"] = {
"tense-aspect",
WP,
{"futv", "futrv"},
}
tags["frequentative"] = {
"tense-aspect",
WP,
{"freq", "frequentive"},
467562,
}
tags["habitual"] = {
"tense-aspect",
"w:habitual aspect",
"hab",
5636904,
}
-- same as the habitual; used in Mongolian linguistics
tags["habitive"] = {
"tense-aspect",
WP,
"habv",
}
-- same as the habitual; used in Celtic linguistics
tags["consuetudinal"] = {
"tense-aspect",
WIKT,
"consu",
}
tags["immediative"] = {
"tense-aspect",
WIKT,
{"imm", "immed"},
}
tags["incidental"] = {
"tense-aspect",
WIKT,
"incid",
}
tags["iterative"] = {
"tense-aspect",
"w:iterative aspect",
"iter",
2866772,
}
tags["momentane"] = {
"tense-aspect",
WP,
nil,
6897160,
}
tags["momentaneous"] = {
"tense-aspect",
WIKT,
"mom",
115110791,
}
tags["posterior"] = {
"tense-aspect",
"w:relative and absolute tense",
"post",
}
tags["preconditional"] = {
"tense-aspect",
WIKT,
"precond",
}
-- Type of participle in Hindi; also called agentive or agentive-prospective
tags["prospective"] = {
"tense-aspect",
"w:prospective aspect",
"pros",
}
tags["purposive"] = {
"tense-aspect",
WIKT,
"purp",
}
-- Aspect in Tagalog; presumably similar to the perfect tense/aspect but not necessarily similar enough to use the same
-- Wikidata ID
tags["recently complete"] = {
"tense-aspect",
"w:Tagalog grammar#Aspect",
"rcompl",
}
tags["resultative"] = {
"tense-aspect",
WP,
{"res", "resultive"},
7316356,
}
tags["semelfactive"] = {
"tense-aspect",
WP,
"semf",
7449203,
}
tags["serial"] = {
"tense-aspect",
WIKT,
"ser",
}
tags["successive"] = {
"tense-aspect",
WIKT,
"succ",
}
-- be careful not to clash with terminative case tag
tags["terminative aspect"] = {
"tense-aspect",
"w:cessative aspect",
"term",
display = "terminative",
}
----------------------- Mood -----------------------
tags["benedictive"] = {
"mood",
WP,
"bened",
4887358,
}
tags["cohortative"] = {
"mood",
"w:cohortative mood",
{"coho", "cohort"},
}
tags["concessive"] = {
"mood",
WIKT,
"conc",
}
tags["contrafactual"] = {
"mood",
WIKT,
"cfact",
110323459,
}
-- Same as the contrafactual, but terminology depends on language.
tags["counterfactual"] = {
"mood",
WP,
"counterf",
1783264, -- for "counterfactual conditional"
}
tags["desiderative"] = {
"mood",
WP,
{"des", "desid"},
1200631,
}
tags["dubitative"] = {
"mood",
"w:dubitative mood",
"dub",
1263049,
}
tags["energetic"] = {
"mood",
"w:energetic mood",
"ener",
}
tags["inferential"] = {
"mood",
"w:inferential mood",
{"infer", "infr"},
-- Per [[w:inferential mood]], also called "renarrative mood" or (in Estonian) "oblique mood" (but
-- "renarrative mood" may be different, see its entry).
3332616,
}
-- It's not clear that this is exactly a mood, but I'm not sure where
-- else to group it
tags["intensive"] = {
"mood",
WP,
{"inten", "intens"}, -- FIXME: "inten" is too ambiguous (e.g. with "intentional")
10965321, -- for "intensive word form"
}
tags["intentional"] = {
"mood",
WIKT,
"intent",
}
tags["injunctive"] = {
"mood",
APPENDIX,
{"inj", "injunc"},
1431843,
}
tags["interrogative"] = {
"mood",
WP,
{"interr", "interrog"},
12021746,
}
tags["necessitative"] = {
"mood",
WIKT,
{"nec", "necessitive"},
}
tags["permissive"] = {
"mood",
"w:permissive mood",
"perm",
4351483,
}
tags["potential"] = {
"mood",
"w:potential mood",
"potn",
2296856,
}
tags["precative"] = {
"mood",
WIKT,
"prec",
}
tags["prescriptive"] = {
"mood",
WIKT,
"prescr",
}
tags["presumptive"] = {
"mood",
"w:presumptive mood",
"presump",
25463575,
}
-- Exists at least in Estonian
tags["quotative"] = {
"mood",
"w:quotative evidential mood",
"quot",
-- 7272884, -- this is for "quotative" morphemes, not the same
}
tags["renarrative"] = {
"mood",
"w:renarrative mood",
"renarr",
-- Per [[w:inferential mood]], renarrative and inferential mood are the same; but per
-- [[w:Bulgarian verbs#Evidentials]], they are different, and Bulgarian has both.
3332616,
}
tags["volitive"] = {
"mood",
"w:volitive mood",
"voli",
10716592,
}
tags["voluntative"] = {
"mood",
WIKT,
{"voln", "volun"},
}
----------------------- Voice/valence -----------------------
tags["antipassive"] = {
"voice-valence",
"w:antipassive voice",
{"apass", "apasv", "apsv"},
287232,
}
tags["applicative"] = {
"voice-valence",
"w:applicative voice",
"appl",
621634,
}
tags["cooperative"] = { -- ("all together") used in Mongolian
"voice-valence",
"wikt:cooperative voice",
"coop",
114033228,
}
tags["pluritative"] = { -- ("many together") used in Mongolian
"voice-valence",
"wikt:pluritative voice",
"plur",
114033289,
}
tags["reciprocal"] = {
"voice-valence",
"w:reciprocal (grammar)",
{"recp", "recip"},
1964083,
}
-- Specific to Modern Irish, similar to impersonal
tags["autonomous"] = {
"voice-valence",
WIKT,
"auton",
}
----------------------- Non-finite -----------------------
-- be careful not to clash with agentive case tag
tags["agentive"] = {
"non-finite",
"w:agent noun",
{"ag", "agent"},
}
-- Latin etc.
tags["gerundive"] = {
"non-finite",
WP,
"gerv",
731298, -- Wikidata claims this is a grammatical mood, which is not really correct
}
-- Old Irish etc.
tags["verbal of necessity"] = {
"non-finite",
"w:gerundive",
"verbnec",
731298, -- gerundive
}
tags["l-participle"] = {
"non-finite",
"participle",
{"l-ptcp", "lptcp"},
814722, -- "participle"
}
-- Finnish agent participle
tags["agent participle"] = {
"non-finite",
"w:Finnish grammar#Agent participle",
"agentpart",
}
-- Hungarian participle
tags["verbal participle"] = {
"non-finite",
WIKT,
nil,
2361676, -- attributive verb, aka verbal participle
}
tags["converb"] = {
"non-finite",
WP,
"conv",
149761,
}
tags["connegative"] = {
"non-finite",
APPENDIX,
{"conn", "conneg"},
5161718,
}
-- Occurs in Hindi as a type of participle used to conjoin two clauses; similarly occurs in Japanese as the "te-form"
tags["conjunctive"] = {
"non-finite",
"w:serial verb construction", -- FIXME! No good link for "conjunctive"; another possibility is "converb"
"conj",
}
tags["absolutive verb form"] = {
"non-finite",
"wikt:absolutive#Noun",
"absvf",
display = "absolutive",
}
-- FIXME! Should this be a mood?
tags["debitive"] = {
"non-finite",
WP,
"deb",
17119041,
}
----------------------- Case -----------------------
tags["abessive"] = {
"case",
"w:abessive case",
"abe",
319822,
}
tags["absolutive"] = {
"case",
"w:absolutive case",
"absv", -- FIXME, find uses of "abs" = absolutive
332734,
}
tags["adessive"] = {
"case",
"w:adessive case",
"ade",
281954,
}
-- be careful not to clash with adverbial grammar tag
tags["adverbial case"] = {
"case",
WP,
"advc",
display = "adverbial",
}
-- be careful not to clash with agentive non-finite tag
tags["agentive case"] = {
"case",
WP,
"agc",
display = "agentive",
}
tags["allative"] = {
"case",
"wikt:allative case",
"all",
655020,
}
--No evidence of the existence of this case on the web, and the shortcuts are better used elsewhere.
--tags["anterior"] = {
-- "case",
-- nil,
-- {"ant"},
--}
tags["associative"] = {
"case",
"w:associative case",
{"ass", "assoc"},
15948746,
}
tags["benefactive"] = {
"case",
"w:benefactive case",
{"ben", "bene"},
664905,
}
tags["causal"] = {
"case",
"w:causal case",
{"cauc", "causc"},
2943136,
}
tags["causal-final"] = {
"case",
"w:causal-final case",
{"cfi", "cfin"},
18012653,
}
tags["comitative"] = {
"case",
"w:comitative case",
"com",
838581,
}
-- be careful not to clash with comparative degree
tags["comparative case"] = {
"case",
WP,
"comc",
5155633,
display = "comparative",
}
tags["delative"] = {
"case",
"w:delative case",
"del",
1183901,
}
tags["direct"] = {
"case",
"w:direct case",
"dir",
1751855,
}
tags["directive"] = {
"case",
"wikt:directive case",
"dirc",
56526905,
}
tags["distributive"] = {
"case",
"w:distributive case",
{"dis", "dist", "distr"},
492457,
}
tags["elative"] = {
"case",
"elative case",
"ela",
394253,
}
tags["ergative"] = {
"case",
"ergative case",
"erg",
324305,
}
-- be careful not to clash with equative degree tag
tags["equative"] = {
"case",
"w:equative case",
"equc",
3177653,
}
tags["essive-formal"] = {
"case",
"w:essive-formal case",
{"esf", "efor"},
3827688,
}
tags["essive-modal"] = {
"case",
"w:essive-modal case",
{"esm", "emod"},
3827703,
}
tags["essive"] = {
"case",
"w:essive case",
"ess",
148465,
}
--No evidence of the existence of this case on the web, and the shortcuts are better used elsewhere.
--tags["exclusive"] = {
-- "case",
-- nil,
-- {"exc", "excl"},
--}
tags["illative"] = {
"case",
"w:illative case",
"ill",
474668,
}
tags["indirect"] = {
"case",
"w:direct case",
"indir",
1233197, -- Same as oblique.
}
tags["inessive"] = {
"case",
"w:inessive case",
"ine",
282031,
}
tags["instructive"] = {
"case",
"w:instructive case",
"ist",
1665275,
}
tags["lative"] = {
"case",
"w:lative case",
"lat",
260425,
}
tags["limitative"] = {
"case",
"w:list of grammatical cases",
{"lim", "limitive"},
35870079,
}
tags["locative-qualitative"] = {
"case",
"locative-qualitative case",
{"lqu", "lqua", "locative-qualitive"},
}
tags["objective"] = {
"case",
"objective case",
"objv", -- obj used for "object"
1233197, -- Same as oblique.
}
tags["oblique"] = {
"case",
"oblique case",
"obl",
1233197,
}
tags["partitive"] = {
"case",
"w:partitive case",
{"ptv", "par"},
857325,
}
--certain languages use this term for the abessive
tags["privative"] = {
"case",
"w:privative case",
"priv",
319822,
}
tags["prolative"] = {
"case",
"w:prolative case",
{"pro", "prol"},
952933,
}
tags["sociative"] = {
"case",
"w:sociative case",
"soc",
3773161,
}
tags["subjective"] = {
"case",
"w:subjective case",
{"subjv", "sbjv"}, -- "sub" and "subj" used for subjunctive, "sbj" for "subject"
131105, -- Same as nominative.
}
tags["sublative"] = {
"case",
"w:sublative case",
{"sbl", "subl"},
2120615,
}
tags["superessive"] = {
"case",
"w:superessive case",
{"spe", "supe"},
222355,
}
tags["temporal"] = {
"case",
"w:temporal case",
{"tem", "temp"},
3235219,
}
-- be careful not to clash with terminative aspect tag
tags["terminative case"] = {
"case",
"w:terminative case",
"ter",
747019,
display = "terminative",
}
tags["translative"] = {
"case",
"w:translative case",
{"tra", "tran"},
950170,
}
----------------------- State -----------------------
tags["independent genitive"] = {
"state",
WIKT,
"indgen",
}
tags["possessor"] = {
"state",
WIKT,
{"posr", "possr"},
}
tags["reflexive possessive"] = {
"state",
WIKT,
{"reflposs", "refl poss"},
}
tags["substantive"] = {
"state",
APPENDIX,
{"subs", "subst"},
}
tags["free state"] = {
"state",
APPENDIX,
{"free"},
}
tags["annexed state"] = {
"state",
APPENDIX,
{"annex", "annexed"},
}
----------------------- Degrees of comparison -----------------------
tags["absolute superlative degree"] = {
"comparison",
"wikt:absolute superlative",
{"asupd", "absolute superlative"},
}
tags["relative superlative degree"] = {
"comparison",
"wikt:relative superlative",
{"rsupd", "relative superlative"},
}
tags["elative degree"] = {
"comparison",
"elative",
"elad", -- Can't use "elative" as shortcut because that's already used for the elative case
1555419,
}
-- be careful not to clash with equative case tag
tags["equative degree"] = {
"comparison",
"w:equative",
"equd",
5384239,
}
tags["excessive degree"] = {
"comparison",
nil,
"excd",
}
----------------------- Register -----------------------
tags["familiar"] = {
"register",
"w:T–V distinction",
"fam",
}
tags["polite"] = {
"register",
"w:T–V distinction",
"pol",
}
tags["intimate"] = {
"register",
-- "intimate" is also a possible formality level in the sociolinguistic register sense.
"w:T–V distinction",
"intim",
}
tags["formal"] = {
"register",
"w:register (sociolinguistics)",
}
tags["informal"] = {
"register",
"w:register (sociolinguistics)",
"inform",
}
tags["colloquial"] = {
"register",
"w:colloquialism",
"colloq",
}
tags["slang"] = {
"register",
WP,
}
tags["contemporary"] = {
"register",
WIKT,
"conty",
}
tags["literary"] = {
"register",
"w:literary language",
"lit",
}
tags["dated"] = {
"register",
WIKT,
}
tags["archaic"] = {
"register",
"w:archaism",
"arch",
}
tags["obsolete"] = {
"register",
WIKT,
"obs",
}
tags["emphatic"] = {
"register",
WIKT,
"emph",
}
----------------------- Deixis -----------------------
tags["proximal"] = {
"deixis",
"w:deixis",
{"prox", "prxl"},
}
tags["medial"] = {
"deixis",
"w:deixis",
"medl",
}
tags["distal"] = {
"deixis",
"w:deixis",
"dstl",
}
----------------------- Clusivity -----------------------
tags["inclusive"] = {
"clusivity",
"w:clusivity",
"incl",
}
tags["exclusive"] = {
"clusivity",
"w:clusivity",
"excl",
}
tags["obviative"] = {
"clusivity",
"w:clusivity",
"obv",
}
----------------------- Inflectional class -----------------------
tags["absolute"] = {
"grammar",
WIKT,
"abs",
}
tags["conjunct"] = {
"grammar",
WP,
"conjt",
}
tags["deuterotonic"] = {
"grammar",
"w:dependent and independent verb forms",
"deut",
}
tags["prototonic"] = {
"grammar",
"w:dependent and independent verb forms",
"prot",
}
----------------------- Attitude -----------------------
tags["endearing"] = {
"attitude",
-- FIXME! No good glossary entry for this; the entry for "hypocoristic" refers specifically to proper names.
"w:hypocoristic",
"end",
1130279, -- entry for "hypocorism"
}
tags["moderative"] = {
"attitude",
WIKT,
"moder",
}
----------------------- Sound changes -----------------------
tags["alliterative"] = {
"sound change",
"w:alliteration",
nil,
484495,
}
tags["back"] = {
"sound change",
"w:back vowel",
nil,
853589,
}
tags["front"] = {
"sound change",
"w:front vowel",
nil,
5505949,
}
tags["rounded"] = {
"sound change",
"w:roundedness",
"round",
}
tags["sigmatic"] = {
"sound change",
WIKT,
"sigm",
}
tags["unrounded"] = {
"sound change",
"w:roundedness",
"unround",
}
tags["vowel harmonic"] = {
"sound change",
"w:vowel harmony",
"vharm",
147137,
}
----------------------- Misc grammar -----------------------
tags["relative"] = {
"grammar",
WIKT,
"rel",
}
tags["direct relative"] = {
"grammar",
"w:relative_clause#Celtic_languages",
"dirrel",
}
tags["indirect relative"] = {
"grammar",
"w:relative_clause#Celtic_languages",
"indrel",
}
tags["synthetic"] = {
"grammar",
WIKT,
"synth",
}
tags["analytic"] = {
"grammar",
WIKT,
{"anal", "analytical"},
}
tags["periphrastic"] = {
"grammar",
WIKT,
"peri",
}
tags["affirmative"] = {
"grammar",
"w:affirmation and negation",
"aff",
}
tags["possessed"] = {
"grammar",
"w:possessive affix",
{"possd", "possed"}, -- posd = positive degree
804020, -- for possessive affix
}
tags["non-possessed"] = {
"grammar",
"w:possessive affix",
{"npossd", "npossed", "nonpossessed"},
}
tags["complement"] = {
"grammar",
"w:complement (linguistics)",
"comp", -- formerly used for comparative, which has been split into comparative case (comc) and comparative degree (comd)
1051175,
}
tags["possessive affix"] = {
"grammar",
WP,
{"posaf", "possaf"},
804020,
}
tags["possessive suffix"] = {
"grammar",
"w:possessive affix",
"possuf",
804020,
}
tags["possessive prefix"] = {
"grammar",
"w:possessive affix",
{"pospref", "posspref"},
804020,
}
tags["prefix"] = {
"grammar",
APPENDIX,
"pref", -- pre = prepositional
134830,
}
tags["prefixal"] = {
"grammar",
WIKT,
"prefl", -- pre = prepositional
134830,
}
tags["suffix"] = {
"grammar",
APPENDIX,
{"suf", "suff"},
102047,
}
tags["suffixal"] = {
"grammar",
WIKT,
{"sufl", "suffl"},
102047,
}
tags["affix"] = {
"grammar",
WP,
"af", -- aff = affirmative
62155,
}
tags["affixal"] = {
"grammar",
WIKT,
"afl", -- aff = affirmative
62155,
}
tags["circumfix"] = {
"grammar",
WP,
{"circ", "cirf", "circf"},
124939,
}
tags["circumfixal"] = {
"grammar",
WIKT,
{"circl", "cirfl", "circfl"},
124939,
}
tags["infix"] = {
"grammar",
WP,
"infx",
201322,
}
tags["infixal"] = {
"grammar",
WIKT,
"infxl",
201322,
}
tags["nonfinite"] = {
"grammar",
APPENDIX,
"nonfin",
1050494, -- entry for "non-finite verb"
}
tags["tenseless"] = {
"grammar",
WIKT,
}
tags["aspect"] = {
"grammar",
APPENDIX,
"asp",
208084,
}
----------------------- Other tags -----------------------
tags["–"] = { -- Unicode en-dash
"other",
no_space_on_left = true,
no_space_on_right = true,
}
tags["—"] = { -- Unicode em-dash
"other",
no_space_on_left = true,
no_space_on_right = true,
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
6pap6v5bqqh6ko6z0t7ellximx7umfa
88552
88551
2026-07-30T10:34:45Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/data/2]]
88551
Scribunto
text/plain
--[=[
This module lists the less common recognized inflection tags, in the same format as for [[Module:form of/data/1]] (which
contains the more common tags). We split the tags this way to save memory, so we avoid loading the less common tags in
the majority of cases.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Person -----------------------
tags["fourth-person"] = {
"person",
"wikt:fourth person",
"4",
3348541,
}
tags["second-person-object form"] = {
"person",
APPENDIX,
"2o",
}
----------------------- Number -----------------------
tags["associative plural"] = {
"number",
WIKT,
{"ass p", "ass pl", "assoc p", "assoc pl"},
}
tags["collective"] = {
"number",
"collective number",
"col",
694268,
}
tags["collective-possession"] = {
"number",
"collective number",
{"cpos", "colpos"},
}
-- same as "count form" below, but included for backwards-compatibility with uses of "count|form"
tags["count"] = {
"number",
"count form",
nil,
12273953,
}
tags["count form"] = {
"number",
WIKT,
nil,
12273953,
}
tags["distributive paucal"] = {
"number",
WIKT,
"dpau",
}
tags["paucal"] = {
"number",
WIKT,
"pau",
489410,
}
tags["singulative"] = {
"number",
"singulative number",
"sgl",
1450795,
}
tags["transnumeral"] = {
"number",
APPENDIX,
"trn",
113631596,
display = "singular or plural",
}
tags["trial"] = {
"number",
"trial number",
"tri",
2142560,
}
----------------------- Gender -----------------------
tags["natural feminine"] = {
"gender",
"gender",
"natf",
}
tags["virile"] = {
"gender",
APPENDIX,
"vr",
}
----------------------- Animacy -----------------------
----------------------- Tense/aspect -----------------------
tags["abtemporal"] = {
"tense-aspect",
WIKT,
"abtemp",
}
tags["anterior"] = {
"tense-aspect",
"w:relative and absolute tense",
"ant",
}
tags["cessative"] = {
"tense-aspect",
WP,
"cess",
17027342,
}
-- Aspect in Tagalog; presumably similar to the perfect tense/aspect but not necessarily similar enough to use the same
-- Wikidata ID
tags["complete"] = {
"tense-aspect",
"w:Tagalog grammar#Aspect",
"compl",
}
tags["concomitant"] = {
"tense-aspect",
WIKT,
"concom",
}
tags["confirmative"] = {
"tense-aspect",
WIKT,
"conf",
}
-- Aspect in Tagalog
tags["contemplative"] = {
"tense-aspect",
"w:Tagalog grammar#Aspect",
"contem",
}
tags["contemporal"] = {
"tense-aspect",
WIKT,
"contemp",
}
tags["continuative"] = {
"tense-aspect",
WP,
nil,
28130104,
}
tags["continuous"] = {
"tense-aspect",
"w:continuous aspect",
"cont",
12721117,
}
tags["delimitative"] = {
"tense-aspect",
"w:delimitative aspect",
"delim",
5316270,
}
tags["durative"] = {
"tense-aspect",
WP,
"dur",
}
tags["futuritive"] = {
"tense-aspect",
WP,
{"futv", "futrv"},
}
tags["frequentative"] = {
"tense-aspect",
WP,
{"freq", "frequentive"},
467562,
}
tags["habitual"] = {
"tense-aspect",
"w:habitual aspect",
"hab",
5636904,
}
-- same as the habitual; used in Mongolian linguistics
tags["habitive"] = {
"tense-aspect",
WP,
"habv",
}
-- same as the habitual; used in Celtic linguistics
tags["consuetudinal"] = {
"tense-aspect",
WIKT,
"consu",
}
tags["immediative"] = {
"tense-aspect",
WIKT,
{"imm", "immed"},
}
tags["incidental"] = {
"tense-aspect",
WIKT,
"incid",
}
tags["iterative"] = {
"tense-aspect",
"w:iterative aspect",
"iter",
2866772,
}
tags["momentane"] = {
"tense-aspect",
WP,
nil,
6897160,
}
tags["momentaneous"] = {
"tense-aspect",
WIKT,
"mom",
115110791,
}
tags["posterior"] = {
"tense-aspect",
"w:relative and absolute tense",
"post",
}
tags["preconditional"] = {
"tense-aspect",
WIKT,
"precond",
}
-- Type of participle in Hindi; also called agentive or agentive-prospective
tags["prospective"] = {
"tense-aspect",
"w:prospective aspect",
"pros",
}
tags["purposive"] = {
"tense-aspect",
WIKT,
"purp",
}
-- Aspect in Tagalog; presumably similar to the perfect tense/aspect but not necessarily similar enough to use the same
-- Wikidata ID
tags["recently complete"] = {
"tense-aspect",
"w:Tagalog grammar#Aspect",
"rcompl",
}
tags["resultative"] = {
"tense-aspect",
WP,
{"res", "resultive"},
7316356,
}
tags["semelfactive"] = {
"tense-aspect",
WP,
"semf",
7449203,
}
tags["serial"] = {
"tense-aspect",
WIKT,
"ser",
}
tags["successive"] = {
"tense-aspect",
WIKT,
"succ",
}
-- be careful not to clash with terminative case tag
tags["terminative aspect"] = {
"tense-aspect",
"w:cessative aspect",
"term",
display = "terminative",
}
----------------------- Mood -----------------------
tags["benedictive"] = {
"mood",
WP,
"bened",
4887358,
}
tags["cohortative"] = {
"mood",
"w:cohortative mood",
{"coho", "cohort"},
}
tags["concessive"] = {
"mood",
WIKT,
"conc",
}
tags["contrafactual"] = {
"mood",
WIKT,
"cfact",
110323459,
}
-- Same as the contrafactual, but terminology depends on language.
tags["counterfactual"] = {
"mood",
WP,
"counterf",
1783264, -- for "counterfactual conditional"
}
tags["desiderative"] = {
"mood",
WP,
{"des", "desid"},
1200631,
}
tags["dubitative"] = {
"mood",
"w:dubitative mood",
"dub",
1263049,
}
tags["energetic"] = {
"mood",
"w:energetic mood",
"ener",
}
tags["inferential"] = {
"mood",
"w:inferential mood",
{"infer", "infr"},
-- Per [[w:inferential mood]], also called "renarrative mood" or (in Estonian) "oblique mood" (but
-- "renarrative mood" may be different, see its entry).
3332616,
}
-- It's not clear that this is exactly a mood, but I'm not sure where
-- else to group it
tags["intensive"] = {
"mood",
WP,
{"inten", "intens"}, -- FIXME: "inten" is too ambiguous (e.g. with "intentional")
10965321, -- for "intensive word form"
}
tags["intentional"] = {
"mood",
WIKT,
"intent",
}
tags["injunctive"] = {
"mood",
APPENDIX,
{"inj", "injunc"},
1431843,
}
tags["interrogative"] = {
"mood",
WP,
{"interr", "interrog"},
12021746,
}
tags["necessitative"] = {
"mood",
WIKT,
{"nec", "necessitive"},
}
tags["permissive"] = {
"mood",
"w:permissive mood",
"perm",
4351483,
}
tags["potential"] = {
"mood",
"w:potential mood",
"potn",
2296856,
}
tags["precative"] = {
"mood",
WIKT,
"prec",
}
tags["prescriptive"] = {
"mood",
WIKT,
"prescr",
}
tags["presumptive"] = {
"mood",
"w:presumptive mood",
"presump",
25463575,
}
-- Exists at least in Estonian
tags["quotative"] = {
"mood",
"w:quotative evidential mood",
"quot",
-- 7272884, -- this is for "quotative" morphemes, not the same
}
tags["renarrative"] = {
"mood",
"w:renarrative mood",
"renarr",
-- Per [[w:inferential mood]], renarrative and inferential mood are the same; but per
-- [[w:Bulgarian verbs#Evidentials]], they are different, and Bulgarian has both.
3332616,
}
tags["volitive"] = {
"mood",
"w:volitive mood",
"voli",
10716592,
}
tags["voluntative"] = {
"mood",
WIKT,
{"voln", "volun"},
}
----------------------- Voice/valence -----------------------
tags["antipassive"] = {
"voice-valence",
"w:antipassive voice",
{"apass", "apasv", "apsv"},
287232,
}
tags["applicative"] = {
"voice-valence",
"w:applicative voice",
"appl",
621634,
}
tags["cooperative"] = { -- ("all together") used in Mongolian
"voice-valence",
"wikt:cooperative voice",
"coop",
114033228,
}
tags["pluritative"] = { -- ("many together") used in Mongolian
"voice-valence",
"wikt:pluritative voice",
"plur",
114033289,
}
tags["reciprocal"] = {
"voice-valence",
"w:reciprocal (grammar)",
{"recp", "recip"},
1964083,
}
-- Specific to Modern Irish, similar to impersonal
tags["autonomous"] = {
"voice-valence",
WIKT,
"auton",
}
----------------------- Non-finite -----------------------
-- be careful not to clash with agentive case tag
tags["agentive"] = {
"non-finite",
"w:agent noun",
{"ag", "agent"},
}
-- Latin etc.
tags["gerundive"] = {
"non-finite",
WP,
"gerv",
731298, -- Wikidata claims this is a grammatical mood, which is not really correct
}
-- Old Irish etc.
tags["verbal of necessity"] = {
"non-finite",
"w:gerundive",
"verbnec",
731298, -- gerundive
}
tags["l-participle"] = {
"non-finite",
"participle",
{"l-ptcp", "lptcp"},
814722, -- "participle"
}
-- Finnish agent participle
tags["agent participle"] = {
"non-finite",
"w:Finnish grammar#Agent participle",
"agentpart",
}
-- Hungarian participle
tags["verbal participle"] = {
"non-finite",
WIKT,
nil,
2361676, -- attributive verb, aka verbal participle
}
tags["converb"] = {
"non-finite",
WP,
"conv",
149761,
}
tags["connegative"] = {
"non-finite",
APPENDIX,
{"conn", "conneg"},
5161718,
}
-- Occurs in Hindi as a type of participle used to conjoin two clauses; similarly occurs in Japanese as the "te-form"
tags["conjunctive"] = {
"non-finite",
"w:serial verb construction", -- FIXME! No good link for "conjunctive"; another possibility is "converb"
"conj",
}
tags["absolutive verb form"] = {
"non-finite",
"wikt:absolutive#Noun",
"absvf",
display = "absolutive",
}
-- FIXME! Should this be a mood?
tags["debitive"] = {
"non-finite",
WP,
"deb",
17119041,
}
----------------------- Case -----------------------
tags["abessive"] = {
"case",
"w:abessive case",
"abe",
319822,
}
tags["absolutive"] = {
"case",
"w:absolutive case",
"absv", -- FIXME, find uses of "abs" = absolutive
332734,
}
tags["adessive"] = {
"case",
"w:adessive case",
"ade",
281954,
}
-- be careful not to clash with adverbial grammar tag
tags["adverbial case"] = {
"case",
WP,
"advc",
display = "adverbial",
}
-- be careful not to clash with agentive non-finite tag
tags["agentive case"] = {
"case",
WP,
"agc",
display = "agentive",
}
tags["allative"] = {
"case",
"wikt:allative case",
"all",
655020,
}
--No evidence of the existence of this case on the web, and the shortcuts are better used elsewhere.
--tags["anterior"] = {
-- "case",
-- nil,
-- {"ant"},
--}
tags["associative"] = {
"case",
"w:associative case",
{"ass", "assoc"},
15948746,
}
tags["benefactive"] = {
"case",
"w:benefactive case",
{"ben", "bene"},
664905,
}
tags["causal"] = {
"case",
"w:causal case",
{"cauc", "causc"},
2943136,
}
tags["causal-final"] = {
"case",
"w:causal-final case",
{"cfi", "cfin"},
18012653,
}
tags["comitative"] = {
"case",
"w:comitative case",
"com",
838581,
}
-- be careful not to clash with comparative degree
tags["comparative case"] = {
"case",
WP,
"comc",
5155633,
display = "comparative",
}
tags["delative"] = {
"case",
"w:delative case",
"del",
1183901,
}
tags["direct"] = {
"case",
"w:direct case",
"dir",
1751855,
}
tags["directive"] = {
"case",
"wikt:directive case",
"dirc",
56526905,
}
tags["distributive"] = {
"case",
"w:distributive case",
{"dis", "dist", "distr"},
492457,
}
tags["elative"] = {
"case",
"elative case",
"ela",
394253,
}
tags["ergative"] = {
"case",
"ergative case",
"erg",
324305,
}
-- be careful not to clash with equative degree tag
tags["equative"] = {
"case",
"w:equative case",
"equc",
3177653,
}
tags["essive-formal"] = {
"case",
"w:essive-formal case",
{"esf", "efor"},
3827688,
}
tags["essive-modal"] = {
"case",
"w:essive-modal case",
{"esm", "emod"},
3827703,
}
tags["essive"] = {
"case",
"w:essive case",
"ess",
148465,
}
--No evidence of the existence of this case on the web, and the shortcuts are better used elsewhere.
--tags["exclusive"] = {
-- "case",
-- nil,
-- {"exc", "excl"},
--}
tags["illative"] = {
"case",
"w:illative case",
"ill",
474668,
}
tags["indirect"] = {
"case",
"w:direct case",
"indir",
1233197, -- Same as oblique.
}
tags["inessive"] = {
"case",
"w:inessive case",
"ine",
282031,
}
tags["instructive"] = {
"case",
"w:instructive case",
"ist",
1665275,
}
tags["lative"] = {
"case",
"w:lative case",
"lat",
260425,
}
tags["limitative"] = {
"case",
"w:list of grammatical cases",
{"lim", "limitive"},
35870079,
}
tags["locative-qualitative"] = {
"case",
"locative-qualitative case",
{"lqu", "lqua", "locative-qualitive"},
}
tags["objective"] = {
"case",
"objective case",
"objv", -- obj used for "object"
1233197, -- Same as oblique.
}
tags["oblique"] = {
"case",
"oblique case",
"obl",
1233197,
}
tags["partitive"] = {
"case",
"w:partitive case",
{"ptv", "par"},
857325,
}
--certain languages use this term for the abessive
tags["privative"] = {
"case",
"w:privative case",
"priv",
319822,
}
tags["prolative"] = {
"case",
"w:prolative case",
{"pro", "prol"},
952933,
}
tags["sociative"] = {
"case",
"w:sociative case",
"soc",
3773161,
}
tags["subjective"] = {
"case",
"w:subjective case",
{"subjv", "sbjv"}, -- "sub" and "subj" used for subjunctive, "sbj" for "subject"
131105, -- Same as nominative.
}
tags["sublative"] = {
"case",
"w:sublative case",
{"sbl", "subl"},
2120615,
}
tags["superessive"] = {
"case",
"w:superessive case",
{"spe", "supe"},
222355,
}
tags["temporal"] = {
"case",
"w:temporal case",
{"tem", "temp"},
3235219,
}
-- be careful not to clash with terminative aspect tag
tags["terminative case"] = {
"case",
"w:terminative case",
"ter",
747019,
display = "terminative",
}
tags["translative"] = {
"case",
"w:translative case",
{"tra", "tran"},
950170,
}
----------------------- State -----------------------
tags["independent genitive"] = {
"state",
WIKT,
"indgen",
}
tags["possessor"] = {
"state",
WIKT,
{"posr", "possr"},
}
tags["reflexive possessive"] = {
"state",
WIKT,
{"reflposs", "refl poss"},
}
tags["substantive"] = {
"state",
APPENDIX,
{"subs", "subst"},
}
tags["free state"] = {
"state",
APPENDIX,
{"free"},
}
tags["annexed state"] = {
"state",
APPENDIX,
{"annex", "annexed"},
}
----------------------- Degrees of comparison -----------------------
tags["absolute superlative degree"] = {
"comparison",
"wikt:absolute superlative",
{"asupd", "absolute superlative"},
}
tags["relative superlative degree"] = {
"comparison",
"wikt:relative superlative",
{"rsupd", "relative superlative"},
}
tags["elative degree"] = {
"comparison",
"elative",
"elad", -- Can't use "elative" as shortcut because that's already used for the elative case
1555419,
}
-- be careful not to clash with equative case tag
tags["equative degree"] = {
"comparison",
"w:equative",
"equd",
5384239,
}
tags["excessive degree"] = {
"comparison",
nil,
"excd",
}
----------------------- Register -----------------------
tags["familiar"] = {
"register",
"w:T–V distinction",
"fam",
}
tags["polite"] = {
"register",
"w:T–V distinction",
"pol",
}
tags["intimate"] = {
"register",
-- "intimate" is also a possible formality level in the sociolinguistic register sense.
"w:T–V distinction",
"intim",
}
tags["formal"] = {
"register",
"w:register (sociolinguistics)",
}
tags["informal"] = {
"register",
"w:register (sociolinguistics)",
"inform",
}
tags["colloquial"] = {
"register",
"w:colloquialism",
"colloq",
}
tags["slang"] = {
"register",
WP,
}
tags["contemporary"] = {
"register",
WIKT,
"conty",
}
tags["literary"] = {
"register",
"w:literary language",
"lit",
}
tags["dated"] = {
"register",
WIKT,
}
tags["archaic"] = {
"register",
"w:archaism",
"arch",
}
tags["obsolete"] = {
"register",
WIKT,
"obs",
}
tags["emphatic"] = {
"register",
WIKT,
"emph",
}
----------------------- Deixis -----------------------
tags["proximal"] = {
"deixis",
"w:deixis",
{"prox", "prxl"},
}
tags["medial"] = {
"deixis",
"w:deixis",
"medl",
}
tags["distal"] = {
"deixis",
"w:deixis",
"dstl",
}
----------------------- Clusivity -----------------------
tags["inclusive"] = {
"clusivity",
"w:clusivity",
"incl",
}
tags["exclusive"] = {
"clusivity",
"w:clusivity",
"excl",
}
tags["obviative"] = {
"clusivity",
"w:clusivity",
"obv",
}
----------------------- Inflectional class -----------------------
tags["absolute"] = {
"grammar",
WIKT,
"abs",
}
tags["conjunct"] = {
"grammar",
WP,
"conjt",
}
tags["deuterotonic"] = {
"grammar",
"w:dependent and independent verb forms",
"deut",
}
tags["prototonic"] = {
"grammar",
"w:dependent and independent verb forms",
"prot",
}
----------------------- Attitude -----------------------
tags["endearing"] = {
"attitude",
-- FIXME! No good glossary entry for this; the entry for "hypocoristic" refers specifically to proper names.
"w:hypocoristic",
"end",
1130279, -- entry for "hypocorism"
}
tags["moderative"] = {
"attitude",
WIKT,
"moder",
}
----------------------- Sound changes -----------------------
tags["alliterative"] = {
"sound change",
"w:alliteration",
nil,
484495,
}
tags["back"] = {
"sound change",
"w:back vowel",
nil,
853589,
}
tags["front"] = {
"sound change",
"w:front vowel",
nil,
5505949,
}
tags["rounded"] = {
"sound change",
"w:roundedness",
"round",
}
tags["sigmatic"] = {
"sound change",
WIKT,
"sigm",
}
tags["unrounded"] = {
"sound change",
"w:roundedness",
"unround",
}
tags["vowel harmonic"] = {
"sound change",
"w:vowel harmony",
"vharm",
147137,
}
----------------------- Misc grammar -----------------------
tags["relative"] = {
"grammar",
WIKT,
"rel",
}
tags["direct relative"] = {
"grammar",
"w:relative_clause#Celtic_languages",
"dirrel",
}
tags["indirect relative"] = {
"grammar",
"w:relative_clause#Celtic_languages",
"indrel",
}
tags["synthetic"] = {
"grammar",
WIKT,
"synth",
}
tags["analytic"] = {
"grammar",
WIKT,
{"anal", "analytical"},
}
tags["periphrastic"] = {
"grammar",
WIKT,
"peri",
}
tags["affirmative"] = {
"grammar",
"w:affirmation and negation",
"aff",
}
tags["possessed"] = {
"grammar",
"w:possessive affix",
{"possd", "possed"}, -- posd = positive degree
804020, -- for possessive affix
}
tags["non-possessed"] = {
"grammar",
"w:possessive affix",
{"npossd", "npossed", "nonpossessed"},
}
tags["complement"] = {
"grammar",
"w:complement (linguistics)",
"comp", -- formerly used for comparative, which has been split into comparative case (comc) and comparative degree (comd)
1051175,
}
tags["possessive affix"] = {
"grammar",
WP,
{"posaf", "possaf"},
804020,
}
tags["possessive suffix"] = {
"grammar",
"w:possessive affix",
"possuf",
804020,
}
tags["possessive prefix"] = {
"grammar",
"w:possessive affix",
{"pospref", "posspref"},
804020,
}
tags["prefix"] = {
"grammar",
APPENDIX,
"pref", -- pre = prepositional
134830,
}
tags["prefixal"] = {
"grammar",
WIKT,
"prefl", -- pre = prepositional
134830,
}
tags["suffix"] = {
"grammar",
APPENDIX,
{"suf", "suff"},
102047,
}
tags["suffixal"] = {
"grammar",
WIKT,
{"sufl", "suffl"},
102047,
}
tags["affix"] = {
"grammar",
WP,
"af", -- aff = affirmative
62155,
}
tags["affixal"] = {
"grammar",
WIKT,
"afl", -- aff = affirmative
62155,
}
tags["circumfix"] = {
"grammar",
WP,
{"circ", "cirf", "circf"},
124939,
}
tags["circumfixal"] = {
"grammar",
WIKT,
{"circl", "cirfl", "circfl"},
124939,
}
tags["infix"] = {
"grammar",
WP,
"infx",
201322,
}
tags["infixal"] = {
"grammar",
WIKT,
"infxl",
201322,
}
tags["nonfinite"] = {
"grammar",
APPENDIX,
"nonfin",
1050494, -- entry for "non-finite verb"
}
tags["tenseless"] = {
"grammar",
WIKT,
}
tags["aspect"] = {
"grammar",
APPENDIX,
"asp",
208084,
}
----------------------- Other tags -----------------------
tags["–"] = { -- Unicode en-dash
"other",
no_space_on_left = true,
no_space_on_right = true,
}
tags["—"] = { -- Unicode em-dash
"other",
no_space_on_left = true,
no_space_on_right = true,
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
6pap6v5bqqh6ko6z0t7ellximx7umfa
Mòideal:form of/data/2/documentation
828
17792
88553
2024-12-17T00:17:57Z
en>Theknightwho
0
88553
wikitext
text/x-wiki
This module provides the less common tag data for [[Module:form of]] and the templates that use it. For the more common tag data, see [[Module:form of/data/1]].
<includeonly>
[[Category:Data modules]]
</includeonly>
fhz9dq9w6z9gunojtwavh9rvxpsxsiw
88554
88553
2026-07-30T10:34:56Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/data/2/documentation]]
88553
wikitext
text/x-wiki
This module provides the less common tag data for [[Module:form of]] and the templates that use it. For the more common tag data, see [[Module:form of/data/1]].
<includeonly>
[[Category:Data modules]]
</includeonly>
fhz9dq9w6z9gunojtwavh9rvxpsxsiw
Mòideal:form of/data/documentation
828
17793
88555
2024-12-17T03:25:11Z
en>Theknightwho
0
88555
wikitext
text/x-wiki
This module provides constants and data finalization for [[Module:form of]] and its data modules. For the tag data, see [[Module:form of/data/1]] (more common tags) and [[Module:form of/data/2]] (less common tags).
<includeonly>
[[Category:Data modules]]
</includeonly>
1l5av8iksnevwj1lkg0tv71gzjy47xb
88556
88555
2026-07-30T10:35:01Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/data/documentation]]
88555
wikitext
text/x-wiki
This module provides constants and data finalization for [[Module:form of]] and its data modules. For the tag data, see [[Module:form of/data/1]] (more common tags) and [[Module:form of/data/2]] (less common tags).
<includeonly>
[[Category:Data modules]]
</includeonly>
1l5av8iksnevwj1lkg0tv71gzjy47xb
Mòideal:form of/documentation
828
17794
88557
2024-05-29T04:54:50Z
en>Benwing2
0
remove duplicate outdated docs
88557
wikitext
text/x-wiki
{{module documentation}}
{{module cat|-|Form-of}}
81g6bzql6pglffrn3qs3gsgg2fr5qwi
88558
88557
2026-07-30T10:35:08Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/documentation]]
88557
wikitext
text/x-wiki
{{module documentation}}
{{module cat|-|Form-of}}
81g6bzql6pglffrn3qs3gsgg2fr5qwi
Mòideal:form of/functions
828
17795
88559
2023-12-11T04:48:06Z
en>Benwing2
0
minor cleanup of comments
88559
Scribunto
text/plain
--[=[
DISPLAY_HANDLERS is a list of one or more functions that provide special handling for multipart tags. Each function
takes formerly a single argument (the multipart tag), now temporarily two arguments (the multipart tag and the join
strategy, which can be nil to use the default), and should either return the formatted display text or nil to check the
next handler. If no handlers apply, there is a default handler that appropriately formats most multipart tags.
CAT_FUNCTIONS is a map from function names to functions of a single argument, as described in [[Module:form of/cats]].
There are two types of functions: condition handlers (which return true or false) and spec handlers (which return a
specification, as described in [[Module:form of/cats]]). We need to put the functions here rather than in
[[Module:form of/cats]] because that module is loaded using mw.loadData(), which can't directly handle functions.
]=]
local export = {}
function export.multipart_join_strategy()
-- Recognized values:
-- "and": Join with "and", using commas for 3 or more items
-- "en-dash": Join with – (en-dash)
-- "slash": Join with / (slash)
return "slash"
end
local function wrap_in_inflection_of_sep(text)
return '<span class="inflection-of-sep">' .. text .. '</span>'
end
-- This is a local version of serialCommaJoin from [[Module:table]] that
-- implements it a bit differently.
local function join_multiparts_with_serial_comma(seq)
local length = #seq
if length == 0 then
return ""
elseif length == 1 then
return seq[1] -- nothing to join
elseif length == 2 then
return seq[1] .. wrap_in_inflection_of_sep(" and ") .. seq[2]
else
local comma = '<span class="serial-comma">,</span>'
local conj = '<span class="serial-and"> and </span>'
return table.concat(seq, wrap_in_inflection_of_sep(", "), 1, length - 1) ..
wrap_in_inflection_of_sep(comma .. conj) .. seq[length]
end
end
function export.join_multiparts(parts, joiner)
-- Display the elements of a multipart tag. Currently we use "and",
-- with commas when then are three or more elements, of the form
-- "foo, bar, baz and bat"; but we are seriously considering switching
-- to en-dash, e.g. "foo–bar–baz–bat". Arguably,
-- dative–ablative masculine–feminine–neuter plural
-- looks better then
-- dative and ablative masculine, feminine and neuter plural
-- and
-- first–second–third-person singular present subjunctive
-- looks better than
-- first-, second- and third-person singular present subjunctive
local strategy = joiner or export.multipart_join_strategy()
local retval
if strategy == "and" then
retval = join_multiparts_with_serial_comma(parts)
elseif strategy == "en-dash" then
retval = table.concat(parts, wrap_in_inflection_of_sep("–"))
elseif strategy == "slash" then
retval = table.concat(parts, wrap_in_inflection_of_sep("/"))
else
error("Unrecognized multipart join strategy: " .. strategy)
end
return '<span class="inflection-of-conjoined">' .. retval .. '</span>'
end
export.cat_functions = {}
export.display_handlers = {}
-- Display handler to clean up display of multiple persons by omitting
-- redundant "person" in all but the last element. For example, the tag
-- "123" maps to "1//2//3", which in turn gets displayed as (approximately)
-- "first-, second- and third-person" (with appropriate glossary links, and
-- appropriate spans marking the serial comma).
table.insert(export.display_handlers,
function(tags, joiner)
local els = {}
local numtags = #tags
local strategy = joiner or export.multipart_join_strategy()
for i, tag in ipairs(tags) do
local suffix = i == numtags and "-person]]" or
strategy == "and" and "-]]" or "]]"
if tag == "first-person" then
table.insert(els, "[[Appendix:Glossary#first person|first" .. suffix)
elseif tag == "second-person" then
table.insert(els, "[[Appendix:Glossary#second person|second" .. suffix)
elseif tag == "third-person" then
table.insert(els, "[[Appendix:Glossary#third person|third" .. suffix)
else
return nil
end
end
return export.join_multiparts(els, joiner)
end
)
return export
2vjpws88qwen88nsixuztqzubyuzhu3
88560
88559
2026-07-30T10:35:13Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/functions]]
88559
Scribunto
text/plain
--[=[
DISPLAY_HANDLERS is a list of one or more functions that provide special handling for multipart tags. Each function
takes formerly a single argument (the multipart tag), now temporarily two arguments (the multipart tag and the join
strategy, which can be nil to use the default), and should either return the formatted display text or nil to check the
next handler. If no handlers apply, there is a default handler that appropriately formats most multipart tags.
CAT_FUNCTIONS is a map from function names to functions of a single argument, as described in [[Module:form of/cats]].
There are two types of functions: condition handlers (which return true or false) and spec handlers (which return a
specification, as described in [[Module:form of/cats]]). We need to put the functions here rather than in
[[Module:form of/cats]] because that module is loaded using mw.loadData(), which can't directly handle functions.
]=]
local export = {}
function export.multipart_join_strategy()
-- Recognized values:
-- "and": Join with "and", using commas for 3 or more items
-- "en-dash": Join with – (en-dash)
-- "slash": Join with / (slash)
return "slash"
end
local function wrap_in_inflection_of_sep(text)
return '<span class="inflection-of-sep">' .. text .. '</span>'
end
-- This is a local version of serialCommaJoin from [[Module:table]] that
-- implements it a bit differently.
local function join_multiparts_with_serial_comma(seq)
local length = #seq
if length == 0 then
return ""
elseif length == 1 then
return seq[1] -- nothing to join
elseif length == 2 then
return seq[1] .. wrap_in_inflection_of_sep(" and ") .. seq[2]
else
local comma = '<span class="serial-comma">,</span>'
local conj = '<span class="serial-and"> and </span>'
return table.concat(seq, wrap_in_inflection_of_sep(", "), 1, length - 1) ..
wrap_in_inflection_of_sep(comma .. conj) .. seq[length]
end
end
function export.join_multiparts(parts, joiner)
-- Display the elements of a multipart tag. Currently we use "and",
-- with commas when then are three or more elements, of the form
-- "foo, bar, baz and bat"; but we are seriously considering switching
-- to en-dash, e.g. "foo–bar–baz–bat". Arguably,
-- dative–ablative masculine–feminine–neuter plural
-- looks better then
-- dative and ablative masculine, feminine and neuter plural
-- and
-- first–second–third-person singular present subjunctive
-- looks better than
-- first-, second- and third-person singular present subjunctive
local strategy = joiner or export.multipart_join_strategy()
local retval
if strategy == "and" then
retval = join_multiparts_with_serial_comma(parts)
elseif strategy == "en-dash" then
retval = table.concat(parts, wrap_in_inflection_of_sep("–"))
elseif strategy == "slash" then
retval = table.concat(parts, wrap_in_inflection_of_sep("/"))
else
error("Unrecognized multipart join strategy: " .. strategy)
end
return '<span class="inflection-of-conjoined">' .. retval .. '</span>'
end
export.cat_functions = {}
export.display_handlers = {}
-- Display handler to clean up display of multiple persons by omitting
-- redundant "person" in all but the last element. For example, the tag
-- "123" maps to "1//2//3", which in turn gets displayed as (approximately)
-- "first-, second- and third-person" (with appropriate glossary links, and
-- appropriate spans marking the serial comma).
table.insert(export.display_handlers,
function(tags, joiner)
local els = {}
local numtags = #tags
local strategy = joiner or export.multipart_join_strategy()
for i, tag in ipairs(tags) do
local suffix = i == numtags and "-person]]" or
strategy == "and" and "-]]" or "]]"
if tag == "first-person" then
table.insert(els, "[[Appendix:Glossary#first person|first" .. suffix)
elseif tag == "second-person" then
table.insert(els, "[[Appendix:Glossary#second person|second" .. suffix)
elseif tag == "third-person" then
table.insert(els, "[[Appendix:Glossary#third person|third" .. suffix)
else
return nil
end
end
return export.join_multiparts(els, joiner)
end
)
return export
2vjpws88qwen88nsixuztqzubyuzhu3
Mòideal:form of/lang-data/en
828
17796
88561
2024-12-17T03:21:04Z
en>Theknightwho
0
88561
Scribunto
text/plain
--[=[
This module contains lang-specific tags for English.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
shortcuts["ed-form"] = {"spast", "and", "past", "part"}
shortcuts["ing-form"] = {"pres", "part", "and", "ger"}
shortcuts["s-verb-form"] = {"3", "s", "spres", "ind"}
shortcuts["st-form"] = {"2-st", "s", "spres", "ind"}
shortcuts["st-past-form"] = {"2-st", "s", "spast", "ind"}
shortcuts["th-form"] = {"3-th", "s", "spres", "ind"}
----------------------- Person -----------------------
-- These tags exist so we can add appropriate 'archaic FOO' labels in [[Module:form of/cats]].
tags["second-person (-st)"] = {
"person",
nil,
"2-st",
display = "[[Appendix:Glossary#second person|second-person]]",
}
tags["third-person (-th)"] = {
"person",
nil,
"3-th",
display = "[[Appendix:Glossary#third person|third-person]]",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
npdxdtkb0i13egap2p5f7qo9t4ws27o
88562
88561
2026-07-30T10:35:24Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/en]]
88561
Scribunto
text/plain
--[=[
This module contains lang-specific tags for English.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
shortcuts["ed-form"] = {"spast", "and", "past", "part"}
shortcuts["ing-form"] = {"pres", "part", "and", "ger"}
shortcuts["s-verb-form"] = {"3", "s", "spres", "ind"}
shortcuts["st-form"] = {"2-st", "s", "spres", "ind"}
shortcuts["st-past-form"] = {"2-st", "s", "spast", "ind"}
shortcuts["th-form"] = {"3-th", "s", "spres", "ind"}
----------------------- Person -----------------------
-- These tags exist so we can add appropriate 'archaic FOO' labels in [[Module:form of/cats]].
tags["second-person (-st)"] = {
"person",
nil,
"2-st",
display = "[[Appendix:Glossary#second person|second-person]]",
}
tags["third-person (-th)"] = {
"person",
nil,
"3-th",
display = "[[Appendix:Glossary#third person|third-person]]",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
npdxdtkb0i13egap2p5f7qo9t4ws27o
Mòideal:form of/lang-data/el
828
17797
88563
2024-12-17T03:21:24Z
en>Theknightwho
0
88563
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Greek.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "asup-of",
tags = {"asupd"},
},
{
param = "pass-of",
tags = {"pass"},
},
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
36tu41y0aldxjdxeqp52hxa5y6roku9
88564
88563
2026-07-30T10:35:26Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/el]]
88563
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Greek.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "asup-of",
tags = {"asupd"},
},
{
param = "pass-of",
tags = {"pass"},
},
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
36tu41y0aldxjdxeqp52hxa5y6roku9
Mòideal:form of/lang-data/en/functions
828
17798
88565
2026-07-14T20:58:32Z
en>Benwing2
0
use get_link_page() instead of get_plaintext(), which better handles lemmas with initial colons (e.g. for [[*bands]])
88565
Scribunto
text/plain
--[=[
This module contains lang-specific functions for English.
TODO:
* Handle alternative forms in umlaut more elegantly.
* Enable multiple categories (e.g. umlaut and plural in -n).
* Handle dobuled-consonants with Germanic plurals (e.g. "Yid" to "Yidden").
* Handle trivial consonant changes in umlaut plurals (e.g. "cow" to "kine").
]=]
local en_utilities_module = "Module:en-utilities"
local headword_data_module = "Module:headword/data"
local links_module = "Module:links"
local load_module = "Module:load"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local ipairs = ipairs
local require = require
local toNFD = mw.ustring.toNFD
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function get_fragment(...)
get_fragment = require(links_module).get_fragment
return get_fragment(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function is_regular_plural(...)
is_regular_plural = require(en_utilities_module).is_regular_plural
return is_regular_plural(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function remove_possessive(...)
remove_possessive = require(en_utilities_module).remove_possessive
return remove_possessive(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local diacritics
local function get_diacritics()
diacritics, get_diacritics = load_data(headword_data_module).page.comb_chars.diacritics_all .. "*", nil
return diacritics
end
local vowels
local function get_vowels()
vowels, get_vowels = require(en_utilities_module).vowels, nil
return vowels
end
----------------------- Category functions -----------------------
-- Double the final consonant of a term if preceded by a single vowel, which is common with Germanic suffixes.
local function double_final_consonant(term)
local stem, final = term:match("^(.*)([bcdfghjklmnpqrstvxz])$") -- Include "h" and "x" just in case.
if not stem then
return term
end
diacritics = diacritics or get_diacritics()
stem = umatch(ulower(toNFD(stem)), "^(.-)" .. diacritics .. "[" .. (vowels or get_vowels()) .. "]" .. diacritics .. "$")
if not stem then
return term
end
-- If not preceded by a vowel (treating "y" as a consonant if not preceded
-- by another consonant), then the final consonant is doubled.
if stem == "" or stem == "y" or umatch(stem, "[" .. vowels .. "]" .. diacritics .. "y$") or umatch(stem, "[^" .. vowels .. "]$") then
return term .. final
end
return term
end
local function check_germanic_suffix(pagename, lemma, stem)
-- Usually requires an epenthetic "e" (e.g. "foxen"), but not always
-- (e.g. "feathern").
if lemma == stem or lemma .. "e" == stem then
return true
end
-- Final -er sometimes becomes -ren (e.g. "sistren").
local reduced = lemma:match("^(.-)er$")
if reduced and (reduced .. "re") == stem then
return true
end
local doubled = double_final_consonant(lemma)
return doubled .. "e" == stem
end
-- List of umlaut plurals. Each entry is of the form {SINGULAR, PLURAL}, where any lemma ending in SINGULAR whose plural
-- ends in PLURAL are counted (hence [[dormouse]] plural [[dormice]] is counted). The entries are Lua patterns.
local umlaut_plurals = {
-- [[mouse]] -> [[mice]], [[louse]] -> [[lice]], jocular [[house]] -> [[hice]], [[spouse]] -> [[spice]]
{"ouse", "ice"},
-- [[goose]] -> [[geese]], [[swoose]] -> [[sweese]], jocular [[moose]] -> [[meese]]
{"oose", "eese"},
{"an", "en"},
{"ann", "enn"},
{"anne", "enne"},
{"oot", "eet"},
{"oote", "eete"},
{"ooth", "eeth"},
{"oof", "eef"},
{"other", "ethren"},
{"other", "ethern"},
{"other", "etheren"},
{"ow", "[iy]e?"},
{"ow", "[iy]ne"},
}
--[=[
The key `cat` must be specified and is the name of the category following the language name. Suffixes enclosed in
double angle brackets, e.g. <<-ata>>, are italicized (as if written e.g. {{m|en||-ata}}) in the displayed title, but
not in the category name itself. The description of the category comes from the `description` field; if omitted, it is
constructed from the category by adding "English irregular" to the beginning and appending the value of `desc_suffix`
(if given) to the end. Suffixes enclosed in double angle brackets are italicized, as described above, and template
calls are permitted.
The key `matches_plural` must be specified and is either a string or a function. If a string, the string is a Lua
pattern that should match the end of the pagename, and the remainder becomes the stem passed to `matches_lemma` (see
below). If a function, it should accept two arguments, the pagename and the lemma (or more precisely, the words in the
pagename and lemma that differ, if there are multiple words), and should return the stem of the pagename (minus the
ending) if the pagename matches the ending, otherwise nil.
The key `matches_lemma` must be specified and is either a string or a function. If a string, the string is a Lua
pattern that should match the lemma. If a function, it should accept three arguments, the pagename and lemma as in
`matches_plural`, and the stem returned by `matches_plural` or extracted from the pagename and ending. It should return
a boolean indicating whether the lemma matches.
The key `additional`, if given, is additional text to include in the category description as displayed on the page
itself, but not in the summary of the category as displayed on other pages. For further information, see the
`additional` field in [[Module:category tree/poscatboiler/data/documentation]].
The key `breadcrumb`, if given, is the breadcrumb text. See [[Module:category tree/poscatboiler/data/documentation]].
If omitted, the breadcrumb is constructed from the category name by remvoing "plurals in" from the beginning of the
category name.
The key `sort_key`, if given, specifies the sort key for the category in its parent category
[[:Category:English irregular plurals]]. By default it is derived from the breadcrumb by removing an initial hyphen.
If a plural doesn't match any of the entries, it goes into [[:Category:English miscellaneous irregular plurals]]. Note
that before checking these entries, plurals that are the same as the singular are excluded (i.e. not considered
irregular), as are plurals formed from the singular by adding [[-s]], [[-es]], [[-'s]] or [[-ses]] (if the singular ends
in '-s'; cf. [[bus]] -> 'busses', [[dis]] -> 'disses'), or by replacing final [[-y]] with [[-ies]].
]=]
local irregular_plurals = {
{ -- siphon off "women" plurals 'English plurals in -men with singular in -man'
cat = "plurals in <<-women>> with singular in <<-woman>>",
additional = "Plurals formed by replacing a final <<-man>> with a final <<-men>> are found in [[:Category:English plurals in -men with singular in -man|Category:English plurals in ''-men'' with singular in ''-man'']].",
matches_plural = "[Ww]omen",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. pagename:sub(-5, -3) .. "an"
end,
},
{ -- siphon off most of the "umlaut" plurals that will otherwise end up in 'English miscellaneous irregular plurals'
cat = "plurals in <<-men>> with singular in <<-man>>",
additional = "Plurals formed by replacing a final <<-woman>> with a final <<-women>> are found in [[:Category:English plurals in -women with singular in -woman|Category:English plurals in ''-women'' with singular in ''-woman'']].",
matches_plural = "[Mm]en",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. pagename:sub(-3, -3) .. "an"
end,
},
{
cat = "plurals with umlaut",
description = "{{{langname}}} irregular noun plurals that are formed via [[umlaut]], i.e. by changing the root vowel rather than adding a suffix.",
additional = [==[See also:
* Plurals formed by replacing a final <<-man>> with <<-men>> are found in [[:Category:English plurals in -men with singular in -man|Category:English plurals in ''-men'' with singular in ''-man'']]
* Plurals formed by replacing a final <<-woman>> with a final <<-women>> are found in [[:Category:English plurals in -women with singular in -woman|Category:English plurals in ''-women'' with singular in ''-woman'']]]==],
sort_key = "umlaut",
matches_plural = function(pagename, lemma)
for _, umlaut_plural in ipairs(umlaut_plurals) do
local stem = umatch(lemma, "^(.-)%f[" .. (vowels or get_vowels()) .. "]" .. umlaut_plural[1] .. "$")
if stem and (
umatch(pagename, "^" .. pattern_escape(stem) .. umlaut_plural[2] .. "$") or
-- FIXME: this is really hacky ("cow" to "kyne").
umatch(pagename, "^" .. pattern_escape(stem):gsub("c", "k") .. umlaut_plural[2] .. "$")
) then
return stem
end
end
end,
matches_lemma = function(pagename, lemma, stem)
-- All the work already done in matches_plural().
return true
end,
},
{
cat = "plurals in <<-tia>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin participles",
matches_plural = "tia",
matches_lemma = "s",
},
{
cat = "plurals in <<-ia>> with singular in <<-e>>",
desc_suffix = ", mostly originating from Latin neuter nouns",
matches_plural = "ia",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ia>> with singular in <<-i>> or <<-y>>",
desc_suffix = ", mostly originating from Greek neuter nouns",
matches_plural = "ia",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "i" or lemma == stem .. "y"
end,
},
{
cat = "plurals in <<-ina>> with singular in <<-en>>",
desc_suffix = ", mostly originating from Latin neuter nouns",
additional = [==[
* Plurals formed by replacing a final <<-inum>> with a final <<-ina>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-inon>> with a final <<-ina>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].]==],
matches_plural = "ina",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "en"
end,
},
{
cat = "plurals in <<-ra>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin neuter nouns",
additional = [==[Sometimes the preceding vowel changes; e.g. <<-us>> commonly changes to <<-era>> or <<-ora>> in the plural.
* Plurals formed by replacing a final <<-rum>> with a final <<-ra>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-ron>> with a final <<-ra>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].]==],
matches_plural = "ra",
matches_lemma = function(pagename, lemma, stem)
return lemma:find("s$")
end,
},
{
cat = "plurals in <<-ata>> with singular in <<-a>> or <<-e>>",
desc_suffix = ", mostly originating from Ancient Greek neuter nouns in {{m|grc|-μᾰ}}",
matches_plural = "ata",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ata>> with singular in <<-as>>",
desc_suffix = ", mostly originating from Ancient Greek neuter nouns",
matches_plural = "ata",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "as"
end,
},
{
cat = "plurals in <<-au>>",
desc_suffix = ", mostly originating from Welsh",
matches_plural = "au",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-a>> with singular in <<-an>>",
desc_suffix = ", mostly originating from Latin or Greek neuter nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-um>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-on>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "an"
end,
},
{
cat = "plurals in <<-a>> with singular in <<-on>>",
desc_suffix = ", mostly originating from Greek or Latin nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-um>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-an>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -an|Category:English plurals in ''-a'' with singular in ''-an'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "o" .. (diacritics or get_diacritics()) .. "n$")
end
},
{
cat = "plurals in <<-a>> with singular in <<-um>>",
desc_suffix = ", mostly originating from Latin nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-on>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].
* Plurals formed by replacing a final <<-an>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -an|Category:English plurals in ''-a'' with singular in ''-an'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "u" .. (diacritics or get_diacritics()) .. "m$")
end
},
{
cat = "plurals in <<-a>>",
desc_suffix = ", mostly originating from Greek or Latin nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-um>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-on>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].
* Plurals formed by replacing a final <<-an>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -an|Category:English plurals in ''-a'' with singular in ''-an'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-ae>> with singular in <<-a>>",
desc_suffix = ", mostly originating from Latin feminine nouns",
additional = "The <<-ae>> can also be written as a ligature <<-æ>>.",
matches_plural = function(pagename, lemma)
return pagename:match("^(.*)ae$") or pagename:match("^(.*)æ$")
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a"
end,
},
{
cat = "plurals in <<-ae>> with singular in <<-e>>",
desc_suffix = ", mostly originating from Greek feminine nouns",
additional = "The <<-ae>> can also be written as a ligature <<-æ>>.",
matches_plural = function(pagename, lemma)
return pagename:match("^(.*)ae$") or pagename:match("^(.*)æ$")
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ae>>",
desc_suffix = ", mostly originating from Latin and Greek feminine nouns",
additional = [==[The <<-ae>> can also be written as a ligature <<-æ>>. See also:
* [[:Category:English plurals in -ae with singular in -a|Category:English plurals in ''-ae'' with singular in ''-a'']]
* [[:Category:English plurals in -ae with singular in -e|Category:English plurals in ''-ae'' with singular in ''-e'']]]==],
matches_plural = function(pagename, lemma)
return pagename:match("^(.*)ae$") or pagename:match("^(.*)æ$")
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{ -- siphon off most of the "-people" plurals that will otherwise end up in 'English miscellaneous irregular plurals'
cat = "plurals in <<-people>> with singular in <<-person>>",
matches_plural = "people",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "person"
end,
},
{
cat = "plurals in <<-e>> with singular in <<-a>> or <<-ia>>",
desc_suffix = ", mostly originating from Italian feminine nouns",
matches_plural = "e",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or
lemma == stem .. "ia" or
(stem:match("[cg]h$") and lemma == stem:sub(1, -2) .. "a")
end,
},
{
cat = "plurals in <<-e>>",
desc_suffix = ", mostly originating from German masculine or neuter nouns",
additional = "These are formed by adding <<-e>>. See also [[:Category:English plurals in -e with singular in -a or -ia|Category:English plurals in ''-e'' with singular in ''-a'' or ''-ia'']].",
matches_plural = "e",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem or double_final_consonant(lemma) == stem
end,
},
{
cat = "plurals in <<-oth>>",
desc_suffix = ", mostly originating from Hebrew feminine nouns",
matches_plural = "oth",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-ai>> with singular in <<-a>> or <<-e>>",
desc_suffix = ", mostly originating from Greek feminine nouns",
matches_plural = "ai",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ai>> with singular in <<-es>> or <<-is>>",
desc_suffix = ", mostly originating from Greek masculine nouns",
matches_plural = "ai",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "es" or lemma == stem .. "is"
end,
},
{
cat = "plurals in <<-oi>> with singular in <<-os>>",
desc_suffix = ", mostly originating from Greek masculine nouns",
matches_plural = "oi",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "os"
end,
},
{
cat = "plurals in <<-i>> with singular in <<-os>>",
desc_suffix = ", mostly originating from Greek or Latin nouns",
additional = "Plurals formed by replacing a final <<-us>> with a final <<-i>> are found in [[:Category:English plurals in -i with singular in -us|Category:English plurals in ''-i'' with singular in ''-us'']].",
matches_plural = "i?i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "os" or (lemma == stem .. "ios" and stem .. "i" ~= pagename)
end,
},
{
cat = "plurals in <<-i>> with singular in <<-us>>",
desc_suffix = ", mostly originating from Latin nouns",
additional = "Plurals formed by replacing a final <<-os>> with a final <<-i>> are found in [[:Category:English plurals in -i with singular in -os|Category:English plurals in ''-i'' with singular in ''-os'']].",
matches_plural = "i?i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "us" or (lemma == stem .. "ius" and stem .. "i" ~= pagename)
end,
},
{
cat = "plurals in <<-i>> with singular in <<-a>> or <<-ia>>",
desc_suffix = ", mostly originating from Russian or Ukrainian masculine and feminine nouns or Italian masculine nouns",
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or
lemma == stem .. "ia" or
(stem:match("[cg]h$") and lemma == stem:sub(1, -2) .. "a")
end,
},
{
cat = "plurals in <<-i>> with singular in <<-e>>",
desc_suffix = ", mostly originating from Italian masculine nouns",
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-i>> with singular in <<-o>> or <<-io>>",
desc_suffix = ", mostly originating from Italian masculine nouns",
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o" or
lemma == stem .. "io" or
(stem:match("[cg]h$") and lemma == stem:sub(1, -2) .. "o")
end,
},
{
cat = "plurals in <<-i>>",
additional = [==[These are formed by adding <<i>>. See also:
* [[:Category:English plurals in -i with singular in -a or -ia|Category:English plurals in ''-i'' with singular in ''-a'' or ''-ia'']]
* [[:Category:English plurals in -i with singular in -e|Category:English plurals in ''-i'' with singular in ''-e'']]
* [[:Category:English plurals in -i with singular in -o or -io|Category:English plurals in ''-i'' with singular in ''-o'' or ''-io'']]
* [[:Category:English plurals in -i with singular in -os|Category:English plurals in ''-i'' with singular in ''-os'']]
* [[:Category:English plurals in -i with singular in -us|Category:English plurals in ''-i'' with singular in ''-us'']]]==],
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{ -- siphon off most of the "-sful" plurals that will otherwise end up in 'English miscellaneous irregular plurals'
cat = "plurals in <<-sful>> with singular in <<-ful>>",
additional = "This includes examples such as {{m|en|teaspoonful}}, plural {{m|en|teaspoonsful}}. Generally "
.. "these refer to specific measures. Note that not all nouns in <<-ful>> pluralize this way; e.g. the "
.. "plural of {{m|en|handful}} is normally {{m|en|handfuls}} (but {{m|en|handsful}} is possible, if rare).",
matches_plural = "sful",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "ful" or
-- [[boxesful]], [[brushesful]], [[busesful]], [[classesful]], [[dishesful]], [[glassesful]], etc.
stem:find("e$") and lemma == stem:gsub("e$", "") .. "ful" or
-- [[bakeriesful]], [[belliesful]], [[galleriesful]], [[librariesful]], [[pantriesful]], etc.
stem:find("ie$") and lemma == stem:gsub("ie$", "y") .. "ful"
end,
},
{
cat = "plurals in <<-im>>",
desc_suffix = ", mostly originating from Hebrew masculine nouns",
additional = "Generally these are formed by simply adding <<-im>>, or <<-m>> if the singular ends in <<-i>> ({{m|en|illui}} – {{m|en|illuim}}; but cf. {{m|en|goiim}}). Some changes that may occur are <<-e->> to <<-a->> or vice versa ({{m|en|heder}} – {{m|en|hadarim}}; {{m|en|gaon}} – {{m|en|geonim}}), <<-f>> to <<-v->> ({{m|en|ganef}} – {{m|en|ganevim}}), and <<-s>> to <<-t->> ({{m|en|balabos}} – {{m|en|balabatim}}).",
matches_plural = "im",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-children>> with singular in <<-child>>",
matches_plural = "[Cc]hildren",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. pagename:sub(-8, -4)
end,
},
{
cat = "plurals in <<-in>>",
desc_suffix = ", mostly originating from Hebrew and Arabic masculine nouns",
matches_plural = "in",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-n>>",
desc_suffix = ", mostly originating from Germanic nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-man>> with <<-men>> are found in [[:Category:English plurals in -men with singular in -man|Category:English plurals in ''-men'' with singular in ''-man'']]
* Plurals formed by replacing a final <<-woman>> with a final <<-women>> are found in [[:Category:English plurals in -women with singular in -woman|Category:English plurals in ''-women'' with singular in ''-woman'']]
* Plurals formed by replacing a final <<-child>> with <<-children>> are found in [[:Category:English plurals in -children with singular in -child|Category:English plurals in ''-children'' with singular in ''-child'']]]==],
matches_plural = "n",
matches_lemma = check_germanic_suffix,
},
{
cat = "plurals in <<-ar>>",
desc_suffix = ", mostly originating from North Germanic nouns",
matches_plural = "ar",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-ir>>",
desc_suffix = ", mostly originating from North Germanic nouns",
matches_plural = "ir",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-or>> with singular in <<-a>>",
desc_suffix = ", mostly originating from Swedish nouns",
matches_plural = "or",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a"
end,
},
{
cat = "plurals in <<-r>>",
desc_suffix = ", mostly originating from Germanic nouns",
matches_plural = "r",
matches_lemma = check_germanic_suffix,
},
{
cat = "plurals in <<-bes>> with singular in <<-bs>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "bes",
matches_lemma = "bs",
},
{
cat = "plurals in <<-ces>> with singular in <<-x>>",
desc_suffix = ", mostly originating from Latin masculine or feminine nouns",
additional = "Generally these are formed by changing a final <<-x>> into <<-ces>> or a final <<-ex>> into <<-ices>>.",
matches_plural = "ces",
matches_lemma = "x",
},
{
cat = "plurals in <<-des>> with singular in <<-d>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns, or Spanish feminine nouns",
matches_plural = "des",
matches_lemma = "d",
},
{
cat = "plurals in <<-des>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "des",
matches_lemma = "s",
},
{
cat = "plurals in <<-ges>> with singular in <<-x>>",
desc_suffix = ", mostly originating from Greek masculine or feminine nouns",
matches_plural = "ges",
matches_lemma = "x",
},
{
cat = "plurals in <<-ies>> with singular in <<-ey>>",
matches_plural = "ies",
matches_lemma = "ey",
},
{
cat = "plurals in <<-ies>> with singular in <<-i>>",
matches_plural = "ies",
matches_lemma = "i",
},
{
cat = "plurals in <<-kes>> with singular in <<-x>>",
desc_suffix = ", mostly originating from Greek masculine or feminine nouns",
matches_plural = "kes",
matches_lemma = "x",
},
{
cat = "plurals in <<-ines>> with singular in <<-o>>",
desc_suffix = ", mostly originating from Latin masculine or feminine nouns",
matches_plural = "ines",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o"
end,
},
{
cat = "plurals in <<-ones>> with singular in <<-o>>",
desc_suffix = ", mostly originating from Latin masculine or feminine nouns",
matches_plural = "ones",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o"
end,
},
{
-- cf. [[eikon]] pl. [[eikones]]
cat = "plurals in <<-ones>> with singular in <<-on>>",
desc_suffix = ", mostly originating from Greek or Spanish masculine nouns",
matches_plural = "ones",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "o" .. (diacritics or get_diacritics()) .. "n$")
end
},
{
cat = "plurals in <<-oes>> with singular in <<-o>>",
matches_plural = "oes",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o"
end,
},
{
-- cf. [[levator]] pl. [[levatores]]
cat = "plurals in <<-ores>> with singular in <<-or>>",
desc_suffix = ", mostly originating from Latin masculine nouns",
matches_plural = "ores",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "o" .. (diacritics or get_diacritics()) .. "r$")
end,
},
{
cat = "plurals in <<-pes>> with singular in <<-ps>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "pes",
matches_lemma = "ps",
},
{
cat = "plurals in <<-res>> with singular in <<-r>>",
desc_suffix = ", mostly originating from Greek, Latin, Portuguese, or Spanish masculine nouns",
additional = "See also [[:Category:English plurals in -ores with singular in -or|Category:English plurals in ''-ores'' with singular in ''-or'']].",
matches_plural = "res",
matches_lemma = "r",
},
{
cat = "plurals in <<-tes>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "tes",
matches_lemma = "s",
},
{
cat = "plurals in <<-ues>> with singular in <<-u>>",
matches_plural = "ues",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "u"
end,
},
{
cat = "plurals in <<-ūs>> or <<-ûs>> with singular in <<-us>>",
desc_suffix = ", originating from Latin masculine or feminine [[Appendix:Latin fourth declension|fourth-declension]] nouns",
matches_plural = "[ūû]s",
matches_lemma = "us",
},
{
cat = "plurals in <<-ves>> with singular in <<-f>> or <<-fe>>",
desc_suffix = ", mostly originating from native English formations",
matches_plural = "ves",
matches_lemma = "fe?",
},
{
cat = "plurals with <<-xx->> instead of <<-x->>",
desc_suffix = ", which are typically neologisms",
matches_plural = "xxes",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "xes", lemma, "noun+")
end,
},
{
cat = "plurals in <<-es>> with singular in <<-is>>",
desc_suffix = ", mostly originating from Greek feminine nouns, or analogous formations",
matches_plural = "es",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "is"
end,
},
{
cat = "plurals in <<-es>> where <<-s>> is expected",
desc_suffix = ", which chiefly occur in Early Modern English",
matches_plural = "es",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "s", lemma, "noun+")
end,
},
{
cat = "plurals in <<-eis>> with singular in <<-is>>",
desc_suffix = ", mostly originating from Greek feminine nouns",
matches_plural = "eis",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "is"
end,
},
{
cat = "plurals in <<-s>> where <<-ies>> is expected",
desc_suffix = ", which chiefly occur on an ad hoc basis",
matches_plural = "ys",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "ies", lemma, "noun+")
end,
},
{
cat = "plurals in <<-'s>>",
desc_suffix = ", mostly used where plurals ending in <<-s>> would appear strange or cause confusion",
matches_plural = function(pagename, lemma)
local stem = remove_possessive(pagename)
return stem ~= pagename and stem or nil
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-s>> where <<-es>> is expected",
desc_suffix = ", which chiefly occur on an ad hoc basis",
matches_plural = "s",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "es", lemma, "noun+")
end,
},
{
cat = "plurals in <<-ot>>",
desc_suffix = ", mostly originating from Hebrew feminine nouns",
matches_plural = "ot",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-x>> with singular in <<-c>>, <<-ck>> or <<-k>>",
desc_suffix = ", mostly as slang forms of plurals ending in <<-s>>",
matches_plural = "x",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "c" or lemma == stem .. "ck" or lemma == stem .. "k"
end,
},
{
cat = "plurals in <<-x>>",
desc_suffix = ", mostly originating from French masculine nouns",
additional = "Generally these are formed by adding <<-x>> to a noun ending in <<-u>>; changing final <<-al>> or <<-ail>> to <<-aux>>; or changing final <<-el>> to <<-eaux>>.",
matches_plural = "x",
matches_lemma = "[lu]",
},
{
cat = "plurals in <<-y>> with singular in <<-a>>",
desc_suffix = ", mostly originating from Czech or Polish feminine nouns or Russian or Ukrainian masculine and feminine nouns",
matches_plural = "y",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a"
end,
},
{
cat = "plurals in <<-y>>",
desc_suffix = ", mostly originating from Polish feminine nouns, Russian or Ukrainian masculine and feminine nouns, or Czech masculine nouns",
additional = "The stem may be reduced (e.g. {{m|en|khokhol}} – {{m|en|khokhly}}). Plurals formed by replacing a final <<-a>> with <<-y>> are found in [[:Category:English plurals in -y with singular in -a|Category:English plurals in ''-y'' with singular in ''-a'']].",
matches_plural = "y",
matches_lemma = function(pagename, lemma, stem)
if lemma == stem then
return true
end
-- Try again with vowel reduction in the lemma.
vowels = vowels or get_vowels()
diacritics = diacritics or get_diacritics()
lemma = ugsub(lemma, "([^" .. vowels .. "]" .. diacritics .. ")[" .. vowels .. "]" .. diacritics .. "([^" .. vowels .. "]+)$", "%1%2")
return lemma == stem
end,
},
{
cat = "plurals in <<-z>>",
desc_suffix = ", mostly as slang forms of plurals ending in <<-s>>",
matches_plural = "z",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
}
-- Check a given word. Increment `diff` if the pagename word is different and isn't possessive.
local function handle_word(pagename_word, lemma_word, categories, diff)
if pagename_word == lemma_word then
return diff
end
local pagename_nonposs, poss = remove_possessive(pagename_word)
if pagename_nonposs ~= pagename_word then
local lemma_nonposs = remove_possessive(lemma_word)
if lemma_nonposs ~= lemma_word then
poss, pagename_word, lemma_word = true, pagename_nonposs, lemma_nonposs
end
end
if diff == 1 and not poss then
return diff + 1
elseif is_regular_plural(pagename_word, lemma_word, "noun+") then
return diff + (poss and 0 or 1)
end
local is_match
for _, irreg_plural in ipairs(irregular_plurals) do
local matches_plural, stem = irreg_plural.matches_plural
if type(matches_plural) == "string" then
stem = umatch(pagename_word, "^(.-)" .. matches_plural .. "$")
else
stem = matches_plural(pagename_word, lemma_word)
end
if stem then
local matches_lemma = irreg_plural.matches_lemma
if type(matches_lemma) == "string" then
is_match = umatch(lemma_word, matches_lemma .. "$")
else
is_match = matches_lemma(pagename_word, lemma_word, stem)
end
if is_match then
local cat = irreg_plural.cat:gsub("<<(.-)>>", "%1")
insert_if_not(categories, cat)
break
end
end
end
if not is_match then
insert_if_not(categories, "miscellaneous irregular plurals")
end
return diff + (poss and 0 or 1)
end
local function handle_lemma(lang, pagename, lemma, categories)
lemma = get_link_page(remove_links(lemma), lang)
if lemma == pagename then
return
end
local pagename_words, lemma_words = split(pagename, "([-%s])"), split(lemma, "([-%s])")
-- Different number of words.
if #pagename_words ~= #lemma_words then
return insert_if_not(categories, "miscellaneous irregular plurals")
end
local lemma_categories, diff = {}, 0
for i = 1, #pagename_words, 2 do
diff = handle_word(pagename_words[i], lemma_words[i], lemma_categories, diff)
-- If two (non-possessive) words differ, only add the miscellaneous category.
if diff == 2 then
for j = 2, #categories do
categories[j] = nil
end
categories[2] = "miscellaneous irregular plurals"
return
end
end
for _, cat in ipairs(lemma_categories) do
insert_if_not(categories, cat)
end
end
local function irregular_plural_categories(data)
if not (data.pagename and data.lemmas) then
return
end
local pagename, categories = data.pagename, {"multi"}
for _, lemma_obj in ipairs(data.lemmas) do
local term = lemma_obj.term
if term then
-- I don't know if it makes sense to check the lemma_obj for a lang object or if it's ever
-- different from `data.lang`, but it seems like defensive coding.
handle_lemma(lemma_obj.lang or data.lang, pagename, term, categories)
end
end
return categories
end
local cat_functions = {
-- This function is invoked for plurals by an entry in [[Module:form of/cats]].
["en-irregular-plural-categories"] = irregular_plural_categories,
}
-- We need to return the irreg_plurals structure so that the category handler in
-- [[Module:category tree/poscatboiler/data/lang-specific/en]] can access it.
return {cat_functions = cat_functions, irregular_plurals = irregular_plurals}
2o72zi9q216emcayh95en6ffyifqq0j
88566
88565
2026-07-30T10:35:32Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/en/functions]]
88565
Scribunto
text/plain
--[=[
This module contains lang-specific functions for English.
TODO:
* Handle alternative forms in umlaut more elegantly.
* Enable multiple categories (e.g. umlaut and plural in -n).
* Handle dobuled-consonants with Germanic plurals (e.g. "Yid" to "Yidden").
* Handle trivial consonant changes in umlaut plurals (e.g. "cow" to "kine").
]=]
local en_utilities_module = "Module:en-utilities"
local headword_data_module = "Module:headword/data"
local links_module = "Module:links"
local load_module = "Module:load"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local ipairs = ipairs
local require = require
local toNFD = mw.ustring.toNFD
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function get_fragment(...)
get_fragment = require(links_module).get_fragment
return get_fragment(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function is_regular_plural(...)
is_regular_plural = require(en_utilities_module).is_regular_plural
return is_regular_plural(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function remove_possessive(...)
remove_possessive = require(en_utilities_module).remove_possessive
return remove_possessive(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local diacritics
local function get_diacritics()
diacritics, get_diacritics = load_data(headword_data_module).page.comb_chars.diacritics_all .. "*", nil
return diacritics
end
local vowels
local function get_vowels()
vowels, get_vowels = require(en_utilities_module).vowels, nil
return vowels
end
----------------------- Category functions -----------------------
-- Double the final consonant of a term if preceded by a single vowel, which is common with Germanic suffixes.
local function double_final_consonant(term)
local stem, final = term:match("^(.*)([bcdfghjklmnpqrstvxz])$") -- Include "h" and "x" just in case.
if not stem then
return term
end
diacritics = diacritics or get_diacritics()
stem = umatch(ulower(toNFD(stem)), "^(.-)" .. diacritics .. "[" .. (vowels or get_vowels()) .. "]" .. diacritics .. "$")
if not stem then
return term
end
-- If not preceded by a vowel (treating "y" as a consonant if not preceded
-- by another consonant), then the final consonant is doubled.
if stem == "" or stem == "y" or umatch(stem, "[" .. vowels .. "]" .. diacritics .. "y$") or umatch(stem, "[^" .. vowels .. "]$") then
return term .. final
end
return term
end
local function check_germanic_suffix(pagename, lemma, stem)
-- Usually requires an epenthetic "e" (e.g. "foxen"), but not always
-- (e.g. "feathern").
if lemma == stem or lemma .. "e" == stem then
return true
end
-- Final -er sometimes becomes -ren (e.g. "sistren").
local reduced = lemma:match("^(.-)er$")
if reduced and (reduced .. "re") == stem then
return true
end
local doubled = double_final_consonant(lemma)
return doubled .. "e" == stem
end
-- List of umlaut plurals. Each entry is of the form {SINGULAR, PLURAL}, where any lemma ending in SINGULAR whose plural
-- ends in PLURAL are counted (hence [[dormouse]] plural [[dormice]] is counted). The entries are Lua patterns.
local umlaut_plurals = {
-- [[mouse]] -> [[mice]], [[louse]] -> [[lice]], jocular [[house]] -> [[hice]], [[spouse]] -> [[spice]]
{"ouse", "ice"},
-- [[goose]] -> [[geese]], [[swoose]] -> [[sweese]], jocular [[moose]] -> [[meese]]
{"oose", "eese"},
{"an", "en"},
{"ann", "enn"},
{"anne", "enne"},
{"oot", "eet"},
{"oote", "eete"},
{"ooth", "eeth"},
{"oof", "eef"},
{"other", "ethren"},
{"other", "ethern"},
{"other", "etheren"},
{"ow", "[iy]e?"},
{"ow", "[iy]ne"},
}
--[=[
The key `cat` must be specified and is the name of the category following the language name. Suffixes enclosed in
double angle brackets, e.g. <<-ata>>, are italicized (as if written e.g. {{m|en||-ata}}) in the displayed title, but
not in the category name itself. The description of the category comes from the `description` field; if omitted, it is
constructed from the category by adding "English irregular" to the beginning and appending the value of `desc_suffix`
(if given) to the end. Suffixes enclosed in double angle brackets are italicized, as described above, and template
calls are permitted.
The key `matches_plural` must be specified and is either a string or a function. If a string, the string is a Lua
pattern that should match the end of the pagename, and the remainder becomes the stem passed to `matches_lemma` (see
below). If a function, it should accept two arguments, the pagename and the lemma (or more precisely, the words in the
pagename and lemma that differ, if there are multiple words), and should return the stem of the pagename (minus the
ending) if the pagename matches the ending, otherwise nil.
The key `matches_lemma` must be specified and is either a string or a function. If a string, the string is a Lua
pattern that should match the lemma. If a function, it should accept three arguments, the pagename and lemma as in
`matches_plural`, and the stem returned by `matches_plural` or extracted from the pagename and ending. It should return
a boolean indicating whether the lemma matches.
The key `additional`, if given, is additional text to include in the category description as displayed on the page
itself, but not in the summary of the category as displayed on other pages. For further information, see the
`additional` field in [[Module:category tree/poscatboiler/data/documentation]].
The key `breadcrumb`, if given, is the breadcrumb text. See [[Module:category tree/poscatboiler/data/documentation]].
If omitted, the breadcrumb is constructed from the category name by remvoing "plurals in" from the beginning of the
category name.
The key `sort_key`, if given, specifies the sort key for the category in its parent category
[[:Category:English irregular plurals]]. By default it is derived from the breadcrumb by removing an initial hyphen.
If a plural doesn't match any of the entries, it goes into [[:Category:English miscellaneous irregular plurals]]. Note
that before checking these entries, plurals that are the same as the singular are excluded (i.e. not considered
irregular), as are plurals formed from the singular by adding [[-s]], [[-es]], [[-'s]] or [[-ses]] (if the singular ends
in '-s'; cf. [[bus]] -> 'busses', [[dis]] -> 'disses'), or by replacing final [[-y]] with [[-ies]].
]=]
local irregular_plurals = {
{ -- siphon off "women" plurals 'English plurals in -men with singular in -man'
cat = "plurals in <<-women>> with singular in <<-woman>>",
additional = "Plurals formed by replacing a final <<-man>> with a final <<-men>> are found in [[:Category:English plurals in -men with singular in -man|Category:English plurals in ''-men'' with singular in ''-man'']].",
matches_plural = "[Ww]omen",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. pagename:sub(-5, -3) .. "an"
end,
},
{ -- siphon off most of the "umlaut" plurals that will otherwise end up in 'English miscellaneous irregular plurals'
cat = "plurals in <<-men>> with singular in <<-man>>",
additional = "Plurals formed by replacing a final <<-woman>> with a final <<-women>> are found in [[:Category:English plurals in -women with singular in -woman|Category:English plurals in ''-women'' with singular in ''-woman'']].",
matches_plural = "[Mm]en",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. pagename:sub(-3, -3) .. "an"
end,
},
{
cat = "plurals with umlaut",
description = "{{{langname}}} irregular noun plurals that are formed via [[umlaut]], i.e. by changing the root vowel rather than adding a suffix.",
additional = [==[See also:
* Plurals formed by replacing a final <<-man>> with <<-men>> are found in [[:Category:English plurals in -men with singular in -man|Category:English plurals in ''-men'' with singular in ''-man'']]
* Plurals formed by replacing a final <<-woman>> with a final <<-women>> are found in [[:Category:English plurals in -women with singular in -woman|Category:English plurals in ''-women'' with singular in ''-woman'']]]==],
sort_key = "umlaut",
matches_plural = function(pagename, lemma)
for _, umlaut_plural in ipairs(umlaut_plurals) do
local stem = umatch(lemma, "^(.-)%f[" .. (vowels or get_vowels()) .. "]" .. umlaut_plural[1] .. "$")
if stem and (
umatch(pagename, "^" .. pattern_escape(stem) .. umlaut_plural[2] .. "$") or
-- FIXME: this is really hacky ("cow" to "kyne").
umatch(pagename, "^" .. pattern_escape(stem):gsub("c", "k") .. umlaut_plural[2] .. "$")
) then
return stem
end
end
end,
matches_lemma = function(pagename, lemma, stem)
-- All the work already done in matches_plural().
return true
end,
},
{
cat = "plurals in <<-tia>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin participles",
matches_plural = "tia",
matches_lemma = "s",
},
{
cat = "plurals in <<-ia>> with singular in <<-e>>",
desc_suffix = ", mostly originating from Latin neuter nouns",
matches_plural = "ia",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ia>> with singular in <<-i>> or <<-y>>",
desc_suffix = ", mostly originating from Greek neuter nouns",
matches_plural = "ia",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "i" or lemma == stem .. "y"
end,
},
{
cat = "plurals in <<-ina>> with singular in <<-en>>",
desc_suffix = ", mostly originating from Latin neuter nouns",
additional = [==[
* Plurals formed by replacing a final <<-inum>> with a final <<-ina>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-inon>> with a final <<-ina>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].]==],
matches_plural = "ina",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "en"
end,
},
{
cat = "plurals in <<-ra>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin neuter nouns",
additional = [==[Sometimes the preceding vowel changes; e.g. <<-us>> commonly changes to <<-era>> or <<-ora>> in the plural.
* Plurals formed by replacing a final <<-rum>> with a final <<-ra>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-ron>> with a final <<-ra>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].]==],
matches_plural = "ra",
matches_lemma = function(pagename, lemma, stem)
return lemma:find("s$")
end,
},
{
cat = "plurals in <<-ata>> with singular in <<-a>> or <<-e>>",
desc_suffix = ", mostly originating from Ancient Greek neuter nouns in {{m|grc|-μᾰ}}",
matches_plural = "ata",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ata>> with singular in <<-as>>",
desc_suffix = ", mostly originating from Ancient Greek neuter nouns",
matches_plural = "ata",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "as"
end,
},
{
cat = "plurals in <<-au>>",
desc_suffix = ", mostly originating from Welsh",
matches_plural = "au",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-a>> with singular in <<-an>>",
desc_suffix = ", mostly originating from Latin or Greek neuter nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-um>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-on>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "an"
end,
},
{
cat = "plurals in <<-a>> with singular in <<-on>>",
desc_suffix = ", mostly originating from Greek or Latin nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-um>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-an>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -an|Category:English plurals in ''-a'' with singular in ''-an'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "o" .. (diacritics or get_diacritics()) .. "n$")
end
},
{
cat = "plurals in <<-a>> with singular in <<-um>>",
desc_suffix = ", mostly originating from Latin nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-on>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].
* Plurals formed by replacing a final <<-an>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -an|Category:English plurals in ''-a'' with singular in ''-an'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "u" .. (diacritics or get_diacritics()) .. "m$")
end
},
{
cat = "plurals in <<-a>>",
desc_suffix = ", mostly originating from Greek or Latin nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-um>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -um|Category:English plurals in ''-a'' with singular in ''-um'']].
* Plurals formed by replacing a final <<-on>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -on|Category:English plurals in ''-a'' with singular in ''-on'']].
* Plurals formed by replacing a final <<-an>> with a final <<-a>> are found in [[:Category:English plurals in -a with singular in -an|Category:English plurals in ''-a'' with singular in ''-an'']].]==],
matches_plural = "a",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-ae>> with singular in <<-a>>",
desc_suffix = ", mostly originating from Latin feminine nouns",
additional = "The <<-ae>> can also be written as a ligature <<-æ>>.",
matches_plural = function(pagename, lemma)
return pagename:match("^(.*)ae$") or pagename:match("^(.*)æ$")
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a"
end,
},
{
cat = "plurals in <<-ae>> with singular in <<-e>>",
desc_suffix = ", mostly originating from Greek feminine nouns",
additional = "The <<-ae>> can also be written as a ligature <<-æ>>.",
matches_plural = function(pagename, lemma)
return pagename:match("^(.*)ae$") or pagename:match("^(.*)æ$")
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ae>>",
desc_suffix = ", mostly originating from Latin and Greek feminine nouns",
additional = [==[The <<-ae>> can also be written as a ligature <<-æ>>. See also:
* [[:Category:English plurals in -ae with singular in -a|Category:English plurals in ''-ae'' with singular in ''-a'']]
* [[:Category:English plurals in -ae with singular in -e|Category:English plurals in ''-ae'' with singular in ''-e'']]]==],
matches_plural = function(pagename, lemma)
return pagename:match("^(.*)ae$") or pagename:match("^(.*)æ$")
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{ -- siphon off most of the "-people" plurals that will otherwise end up in 'English miscellaneous irregular plurals'
cat = "plurals in <<-people>> with singular in <<-person>>",
matches_plural = "people",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "person"
end,
},
{
cat = "plurals in <<-e>> with singular in <<-a>> or <<-ia>>",
desc_suffix = ", mostly originating from Italian feminine nouns",
matches_plural = "e",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or
lemma == stem .. "ia" or
(stem:match("[cg]h$") and lemma == stem:sub(1, -2) .. "a")
end,
},
{
cat = "plurals in <<-e>>",
desc_suffix = ", mostly originating from German masculine or neuter nouns",
additional = "These are formed by adding <<-e>>. See also [[:Category:English plurals in -e with singular in -a or -ia|Category:English plurals in ''-e'' with singular in ''-a'' or ''-ia'']].",
matches_plural = "e",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem or double_final_consonant(lemma) == stem
end,
},
{
cat = "plurals in <<-oth>>",
desc_suffix = ", mostly originating from Hebrew feminine nouns",
matches_plural = "oth",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-ai>> with singular in <<-a>> or <<-e>>",
desc_suffix = ", mostly originating from Greek feminine nouns",
matches_plural = "ai",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-ai>> with singular in <<-es>> or <<-is>>",
desc_suffix = ", mostly originating from Greek masculine nouns",
matches_plural = "ai",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "es" or lemma == stem .. "is"
end,
},
{
cat = "plurals in <<-oi>> with singular in <<-os>>",
desc_suffix = ", mostly originating from Greek masculine nouns",
matches_plural = "oi",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "os"
end,
},
{
cat = "plurals in <<-i>> with singular in <<-os>>",
desc_suffix = ", mostly originating from Greek or Latin nouns",
additional = "Plurals formed by replacing a final <<-us>> with a final <<-i>> are found in [[:Category:English plurals in -i with singular in -us|Category:English plurals in ''-i'' with singular in ''-us'']].",
matches_plural = "i?i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "os" or (lemma == stem .. "ios" and stem .. "i" ~= pagename)
end,
},
{
cat = "plurals in <<-i>> with singular in <<-us>>",
desc_suffix = ", mostly originating from Latin nouns",
additional = "Plurals formed by replacing a final <<-os>> with a final <<-i>> are found in [[:Category:English plurals in -i with singular in -os|Category:English plurals in ''-i'' with singular in ''-os'']].",
matches_plural = "i?i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "us" or (lemma == stem .. "ius" and stem .. "i" ~= pagename)
end,
},
{
cat = "plurals in <<-i>> with singular in <<-a>> or <<-ia>>",
desc_suffix = ", mostly originating from Russian or Ukrainian masculine and feminine nouns or Italian masculine nouns",
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a" or
lemma == stem .. "ia" or
(stem:match("[cg]h$") and lemma == stem:sub(1, -2) .. "a")
end,
},
{
cat = "plurals in <<-i>> with singular in <<-e>>",
desc_suffix = ", mostly originating from Italian masculine nouns",
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "e"
end,
},
{
cat = "plurals in <<-i>> with singular in <<-o>> or <<-io>>",
desc_suffix = ", mostly originating from Italian masculine nouns",
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o" or
lemma == stem .. "io" or
(stem:match("[cg]h$") and lemma == stem:sub(1, -2) .. "o")
end,
},
{
cat = "plurals in <<-i>>",
additional = [==[These are formed by adding <<i>>. See also:
* [[:Category:English plurals in -i with singular in -a or -ia|Category:English plurals in ''-i'' with singular in ''-a'' or ''-ia'']]
* [[:Category:English plurals in -i with singular in -e|Category:English plurals in ''-i'' with singular in ''-e'']]
* [[:Category:English plurals in -i with singular in -o or -io|Category:English plurals in ''-i'' with singular in ''-o'' or ''-io'']]
* [[:Category:English plurals in -i with singular in -os|Category:English plurals in ''-i'' with singular in ''-os'']]
* [[:Category:English plurals in -i with singular in -us|Category:English plurals in ''-i'' with singular in ''-us'']]]==],
matches_plural = "i",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{ -- siphon off most of the "-sful" plurals that will otherwise end up in 'English miscellaneous irregular plurals'
cat = "plurals in <<-sful>> with singular in <<-ful>>",
additional = "This includes examples such as {{m|en|teaspoonful}}, plural {{m|en|teaspoonsful}}. Generally "
.. "these refer to specific measures. Note that not all nouns in <<-ful>> pluralize this way; e.g. the "
.. "plural of {{m|en|handful}} is normally {{m|en|handfuls}} (but {{m|en|handsful}} is possible, if rare).",
matches_plural = "sful",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "ful" or
-- [[boxesful]], [[brushesful]], [[busesful]], [[classesful]], [[dishesful]], [[glassesful]], etc.
stem:find("e$") and lemma == stem:gsub("e$", "") .. "ful" or
-- [[bakeriesful]], [[belliesful]], [[galleriesful]], [[librariesful]], [[pantriesful]], etc.
stem:find("ie$") and lemma == stem:gsub("ie$", "y") .. "ful"
end,
},
{
cat = "plurals in <<-im>>",
desc_suffix = ", mostly originating from Hebrew masculine nouns",
additional = "Generally these are formed by simply adding <<-im>>, or <<-m>> if the singular ends in <<-i>> ({{m|en|illui}} – {{m|en|illuim}}; but cf. {{m|en|goiim}}). Some changes that may occur are <<-e->> to <<-a->> or vice versa ({{m|en|heder}} – {{m|en|hadarim}}; {{m|en|gaon}} – {{m|en|geonim}}), <<-f>> to <<-v->> ({{m|en|ganef}} – {{m|en|ganevim}}), and <<-s>> to <<-t->> ({{m|en|balabos}} – {{m|en|balabatim}}).",
matches_plural = "im",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-children>> with singular in <<-child>>",
matches_plural = "[Cc]hildren",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. pagename:sub(-8, -4)
end,
},
{
cat = "plurals in <<-in>>",
desc_suffix = ", mostly originating from Hebrew and Arabic masculine nouns",
matches_plural = "in",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-n>>",
desc_suffix = ", mostly originating from Germanic nouns",
additional = [==[See also:
* Plurals formed by replacing a final <<-man>> with <<-men>> are found in [[:Category:English plurals in -men with singular in -man|Category:English plurals in ''-men'' with singular in ''-man'']]
* Plurals formed by replacing a final <<-woman>> with a final <<-women>> are found in [[:Category:English plurals in -women with singular in -woman|Category:English plurals in ''-women'' with singular in ''-woman'']]
* Plurals formed by replacing a final <<-child>> with <<-children>> are found in [[:Category:English plurals in -children with singular in -child|Category:English plurals in ''-children'' with singular in ''-child'']]]==],
matches_plural = "n",
matches_lemma = check_germanic_suffix,
},
{
cat = "plurals in <<-ar>>",
desc_suffix = ", mostly originating from North Germanic nouns",
matches_plural = "ar",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-ir>>",
desc_suffix = ", mostly originating from North Germanic nouns",
matches_plural = "ir",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-or>> with singular in <<-a>>",
desc_suffix = ", mostly originating from Swedish nouns",
matches_plural = "or",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a"
end,
},
{
cat = "plurals in <<-r>>",
desc_suffix = ", mostly originating from Germanic nouns",
matches_plural = "r",
matches_lemma = check_germanic_suffix,
},
{
cat = "plurals in <<-bes>> with singular in <<-bs>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "bes",
matches_lemma = "bs",
},
{
cat = "plurals in <<-ces>> with singular in <<-x>>",
desc_suffix = ", mostly originating from Latin masculine or feminine nouns",
additional = "Generally these are formed by changing a final <<-x>> into <<-ces>> or a final <<-ex>> into <<-ices>>.",
matches_plural = "ces",
matches_lemma = "x",
},
{
cat = "plurals in <<-des>> with singular in <<-d>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns, or Spanish feminine nouns",
matches_plural = "des",
matches_lemma = "d",
},
{
cat = "plurals in <<-des>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "des",
matches_lemma = "s",
},
{
cat = "plurals in <<-ges>> with singular in <<-x>>",
desc_suffix = ", mostly originating from Greek masculine or feminine nouns",
matches_plural = "ges",
matches_lemma = "x",
},
{
cat = "plurals in <<-ies>> with singular in <<-ey>>",
matches_plural = "ies",
matches_lemma = "ey",
},
{
cat = "plurals in <<-ies>> with singular in <<-i>>",
matches_plural = "ies",
matches_lemma = "i",
},
{
cat = "plurals in <<-kes>> with singular in <<-x>>",
desc_suffix = ", mostly originating from Greek masculine or feminine nouns",
matches_plural = "kes",
matches_lemma = "x",
},
{
cat = "plurals in <<-ines>> with singular in <<-o>>",
desc_suffix = ", mostly originating from Latin masculine or feminine nouns",
matches_plural = "ines",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o"
end,
},
{
cat = "plurals in <<-ones>> with singular in <<-o>>",
desc_suffix = ", mostly originating from Latin masculine or feminine nouns",
matches_plural = "ones",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o"
end,
},
{
-- cf. [[eikon]] pl. [[eikones]]
cat = "plurals in <<-ones>> with singular in <<-on>>",
desc_suffix = ", mostly originating from Greek or Spanish masculine nouns",
matches_plural = "ones",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "o" .. (diacritics or get_diacritics()) .. "n$")
end
},
{
cat = "plurals in <<-oes>> with singular in <<-o>>",
matches_plural = "oes",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "o"
end,
},
{
-- cf. [[levator]] pl. [[levatores]]
cat = "plurals in <<-ores>> with singular in <<-or>>",
desc_suffix = ", mostly originating from Latin masculine nouns",
matches_plural = "ores",
matches_lemma = function(pagename, lemma, stem)
return umatch(toNFD(lemma), "^" .. pattern_escape(toNFD(stem)) .. "o" .. (diacritics or get_diacritics()) .. "r$")
end,
},
{
cat = "plurals in <<-pes>> with singular in <<-ps>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "pes",
matches_lemma = "ps",
},
{
cat = "plurals in <<-res>> with singular in <<-r>>",
desc_suffix = ", mostly originating from Greek, Latin, Portuguese, or Spanish masculine nouns",
additional = "See also [[:Category:English plurals in -ores with singular in -or|Category:English plurals in ''-ores'' with singular in ''-or'']].",
matches_plural = "res",
matches_lemma = "r",
},
{
cat = "plurals in <<-tes>> with singular in <<-s>>",
desc_suffix = ", mostly originating from Latin or Greek masculine or feminine nouns",
matches_plural = "tes",
matches_lemma = "s",
},
{
cat = "plurals in <<-ues>> with singular in <<-u>>",
matches_plural = "ues",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "u"
end,
},
{
cat = "plurals in <<-ūs>> or <<-ûs>> with singular in <<-us>>",
desc_suffix = ", originating from Latin masculine or feminine [[Appendix:Latin fourth declension|fourth-declension]] nouns",
matches_plural = "[ūû]s",
matches_lemma = "us",
},
{
cat = "plurals in <<-ves>> with singular in <<-f>> or <<-fe>>",
desc_suffix = ", mostly originating from native English formations",
matches_plural = "ves",
matches_lemma = "fe?",
},
{
cat = "plurals with <<-xx->> instead of <<-x->>",
desc_suffix = ", which are typically neologisms",
matches_plural = "xxes",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "xes", lemma, "noun+")
end,
},
{
cat = "plurals in <<-es>> with singular in <<-is>>",
desc_suffix = ", mostly originating from Greek feminine nouns, or analogous formations",
matches_plural = "es",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "is"
end,
},
{
cat = "plurals in <<-es>> where <<-s>> is expected",
desc_suffix = ", which chiefly occur in Early Modern English",
matches_plural = "es",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "s", lemma, "noun+")
end,
},
{
cat = "plurals in <<-eis>> with singular in <<-is>>",
desc_suffix = ", mostly originating from Greek feminine nouns",
matches_plural = "eis",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "is"
end,
},
{
cat = "plurals in <<-s>> where <<-ies>> is expected",
desc_suffix = ", which chiefly occur on an ad hoc basis",
matches_plural = "ys",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "ies", lemma, "noun+")
end,
},
{
cat = "plurals in <<-'s>>",
desc_suffix = ", mostly used where plurals ending in <<-s>> would appear strange or cause confusion",
matches_plural = function(pagename, lemma)
local stem = remove_possessive(pagename)
return stem ~= pagename and stem or nil
end,
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
{
cat = "plurals in <<-s>> where <<-es>> is expected",
desc_suffix = ", which chiefly occur on an ad hoc basis",
matches_plural = "s",
matches_lemma = function(pagename, lemma, stem)
return is_regular_plural(stem .. "es", lemma, "noun+")
end,
},
{
cat = "plurals in <<-ot>>",
desc_suffix = ", mostly originating from Hebrew feminine nouns",
matches_plural = "ot",
matches_lemma = function(pagename, lemma, stem)
return true
end,
},
{
cat = "plurals in <<-x>> with singular in <<-c>>, <<-ck>> or <<-k>>",
desc_suffix = ", mostly as slang forms of plurals ending in <<-s>>",
matches_plural = "x",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "c" or lemma == stem .. "ck" or lemma == stem .. "k"
end,
},
{
cat = "plurals in <<-x>>",
desc_suffix = ", mostly originating from French masculine nouns",
additional = "Generally these are formed by adding <<-x>> to a noun ending in <<-u>>; changing final <<-al>> or <<-ail>> to <<-aux>>; or changing final <<-el>> to <<-eaux>>.",
matches_plural = "x",
matches_lemma = "[lu]",
},
{
cat = "plurals in <<-y>> with singular in <<-a>>",
desc_suffix = ", mostly originating from Czech or Polish feminine nouns or Russian or Ukrainian masculine and feminine nouns",
matches_plural = "y",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem .. "a"
end,
},
{
cat = "plurals in <<-y>>",
desc_suffix = ", mostly originating from Polish feminine nouns, Russian or Ukrainian masculine and feminine nouns, or Czech masculine nouns",
additional = "The stem may be reduced (e.g. {{m|en|khokhol}} – {{m|en|khokhly}}). Plurals formed by replacing a final <<-a>> with <<-y>> are found in [[:Category:English plurals in -y with singular in -a|Category:English plurals in ''-y'' with singular in ''-a'']].",
matches_plural = "y",
matches_lemma = function(pagename, lemma, stem)
if lemma == stem then
return true
end
-- Try again with vowel reduction in the lemma.
vowels = vowels or get_vowels()
diacritics = diacritics or get_diacritics()
lemma = ugsub(lemma, "([^" .. vowels .. "]" .. diacritics .. ")[" .. vowels .. "]" .. diacritics .. "([^" .. vowels .. "]+)$", "%1%2")
return lemma == stem
end,
},
{
cat = "plurals in <<-z>>",
desc_suffix = ", mostly as slang forms of plurals ending in <<-s>>",
matches_plural = "z",
matches_lemma = function(pagename, lemma, stem)
return lemma == stem
end,
},
}
-- Check a given word. Increment `diff` if the pagename word is different and isn't possessive.
local function handle_word(pagename_word, lemma_word, categories, diff)
if pagename_word == lemma_word then
return diff
end
local pagename_nonposs, poss = remove_possessive(pagename_word)
if pagename_nonposs ~= pagename_word then
local lemma_nonposs = remove_possessive(lemma_word)
if lemma_nonposs ~= lemma_word then
poss, pagename_word, lemma_word = true, pagename_nonposs, lemma_nonposs
end
end
if diff == 1 and not poss then
return diff + 1
elseif is_regular_plural(pagename_word, lemma_word, "noun+") then
return diff + (poss and 0 or 1)
end
local is_match
for _, irreg_plural in ipairs(irregular_plurals) do
local matches_plural, stem = irreg_plural.matches_plural
if type(matches_plural) == "string" then
stem = umatch(pagename_word, "^(.-)" .. matches_plural .. "$")
else
stem = matches_plural(pagename_word, lemma_word)
end
if stem then
local matches_lemma = irreg_plural.matches_lemma
if type(matches_lemma) == "string" then
is_match = umatch(lemma_word, matches_lemma .. "$")
else
is_match = matches_lemma(pagename_word, lemma_word, stem)
end
if is_match then
local cat = irreg_plural.cat:gsub("<<(.-)>>", "%1")
insert_if_not(categories, cat)
break
end
end
end
if not is_match then
insert_if_not(categories, "miscellaneous irregular plurals")
end
return diff + (poss and 0 or 1)
end
local function handle_lemma(lang, pagename, lemma, categories)
lemma = get_link_page(remove_links(lemma), lang)
if lemma == pagename then
return
end
local pagename_words, lemma_words = split(pagename, "([-%s])"), split(lemma, "([-%s])")
-- Different number of words.
if #pagename_words ~= #lemma_words then
return insert_if_not(categories, "miscellaneous irregular plurals")
end
local lemma_categories, diff = {}, 0
for i = 1, #pagename_words, 2 do
diff = handle_word(pagename_words[i], lemma_words[i], lemma_categories, diff)
-- If two (non-possessive) words differ, only add the miscellaneous category.
if diff == 2 then
for j = 2, #categories do
categories[j] = nil
end
categories[2] = "miscellaneous irregular plurals"
return
end
end
for _, cat in ipairs(lemma_categories) do
insert_if_not(categories, cat)
end
end
local function irregular_plural_categories(data)
if not (data.pagename and data.lemmas) then
return
end
local pagename, categories = data.pagename, {"multi"}
for _, lemma_obj in ipairs(data.lemmas) do
local term = lemma_obj.term
if term then
-- I don't know if it makes sense to check the lemma_obj for a lang object or if it's ever
-- different from `data.lang`, but it seems like defensive coding.
handle_lemma(lemma_obj.lang or data.lang, pagename, term, categories)
end
end
return categories
end
local cat_functions = {
-- This function is invoked for plurals by an entry in [[Module:form of/cats]].
["en-irregular-plural-categories"] = irregular_plural_categories,
}
-- We need to return the irreg_plurals structure so that the category handler in
-- [[Module:category tree/poscatboiler/data/lang-specific/en]] can access it.
return {cat_functions = cat_functions, irregular_plurals = irregular_plurals}
2o72zi9q216emcayh95en6ffyifqq0j
Mòideal:form of/lang-data/es
828
17799
88567
2026-01-09T19:17:11Z
en>Surjection
0
Protected "[[Module:form of/lang-data/es]]": Highly visible template/module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
88567
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Spanish.
]=]
local m_form_of_data = require("Module:form of/data")
local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("es")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local function full_link(term)
return m_links.full_link{ lang = lang, term = term }
end
----------------------- Register -----------------------
tags["tuteo"] = {
"register",
nil,
display = ("''%s''"):format(full_link("tuteo"))
}
tags["voseo"] = {
"register",
nil,
display = ("''%s''"):format(full_link("voseo"))
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
5wfw19xgjrn0dzw1v4nxizykm25afeb
88568
88567
2026-07-30T10:35:39Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/es]]
88567
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Spanish.
]=]
local m_form_of_data = require("Module:form of/data")
local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("es")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local function full_link(term)
return m_links.full_link{ lang = lang, term = term }
end
----------------------- Register -----------------------
tags["tuteo"] = {
"register",
nil,
display = ("''%s''"):format(full_link("tuteo"))
}
tags["voseo"] = {
"register",
nil,
display = ("''%s''"):format(full_link("voseo"))
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
5wfw19xgjrn0dzw1v4nxizykm25afeb
Mòideal:form of/lang-data/fi
828
17800
88569
2026-03-08T20:53:54Z
en>Surjection
0
88569
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Finnish.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
tags["inf1"] = {
"non-finite",
nil,
nil,
display = "[[Appendix:Finnish verb forms#Infinitives|first infinitive]]"
}
tags["inf3 inessive"] = {
"non-finite",
nil,
"inf3 ine",
display = "inessive of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 elative"] = {
"non-finite",
nil,
"inf3 ela",
display = "elative of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 illative"] = {
"non-finite",
nil,
"inf3 ill",
display = "illative of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 adessive"] = {
"non-finite",
nil,
"inf3 ade",
display = "adessive of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 abessive"] = {
"non-finite",
nil,
"inf3 abe",
display = "abessive of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
-- Only for use with [[Template:+obj]] --
-- e.g. "kanssa" allows "kanssani", "minun kanssa", "minun kanssani"
-- but "näyttää" allows only "minun näyttävän", "näyttäväni", but not *"minun näyttäväni"
tags["genitive-or-possessive-or-both"] = {
"grammar",
nil,
"genposs",
display = "[[Appendix:Glossary#genitive case|genitive]] and/or [[Appendix:Finnish possessive suffixes|possessive form]]",
}
-- Only for use with the infl parameter in etymologies --
tags["inf3 stem"] = {
"grammar",
nil,
"ma-stem",
display = "[[Appendix:Finnish verb forms#Infinitives|third infinitive]] stem",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
s7behen3va3eudxi5eusrifv490s23d
88570
88569
2026-07-30T10:35:44Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/fi]]
88569
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Finnish.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
tags["inf1"] = {
"non-finite",
nil,
nil,
display = "[[Appendix:Finnish verb forms#Infinitives|first infinitive]]"
}
tags["inf3 inessive"] = {
"non-finite",
nil,
"inf3 ine",
display = "inessive of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 elative"] = {
"non-finite",
nil,
"inf3 ela",
display = "elative of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 illative"] = {
"non-finite",
nil,
"inf3 ill",
display = "illative of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 adessive"] = {
"non-finite",
nil,
"inf3 ade",
display = "adessive of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
tags["inf3 abessive"] = {
"non-finite",
nil,
"inf3 abe",
display = "abessive of [[Appendix:Finnish verb forms#Infinitives|third infinitive]]"
}
-- Only for use with [[Template:+obj]] --
-- e.g. "kanssa" allows "kanssani", "minun kanssa", "minun kanssani"
-- but "näyttää" allows only "minun näyttävän", "näyttäväni", but not *"minun näyttäväni"
tags["genitive-or-possessive-or-both"] = {
"grammar",
nil,
"genposs",
display = "[[Appendix:Glossary#genitive case|genitive]] and/or [[Appendix:Finnish possessive suffixes|possessive form]]",
}
-- Only for use with the infl parameter in etymologies --
tags["inf3 stem"] = {
"grammar",
nil,
"ma-stem",
display = "[[Appendix:Finnish verb forms#Infinitives|third infinitive]] stem",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
s7behen3va3eudxi5eusrifv490s23d
Mòideal:form of/lang-data/got
828
17801
88571
2024-12-17T03:22:40Z
en>Theknightwho
0
88571
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Gothic.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "sup-of",
tags = {"supd"},
},
{
param = "prespart-of",
tags = {"pres", "part"},
},
{
param = "pastpart-of",
tags = {"past", "part"},
},
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
5ceywybzk05pg7m70pu9o1tgxjnf7ib
88572
88571
2026-07-30T10:37:02Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/got]]
88571
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Gothic.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "sup-of",
tags = {"supd"},
},
{
param = "prespart-of",
tags = {"pres", "part"},
},
{
param = "pastpart-of",
tags = {"past", "part"},
},
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
5ceywybzk05pg7m70pu9o1tgxjnf7ib
Mòideal:form of/lang-data/lg
828
17802
88573
2024-12-27T16:14:45Z
en>Ahiise2
0
88573
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Luganda.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Inflectional class -----------------------
-- Class I
tags["class i"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_I",
"ci",
}
-- Class II
tags["class ii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_II",
"cii",
}
-- Class III
tags["class iii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_III",
"ciii",
}
-- Class IV
tags["class iv"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_IV",
"civ",
}
-- Class V
tags["class v"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_V",
"cv",
}
-- Class VI
tags["class vi"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_VI",
"cvi",
}
-- Class VII
tags["class vii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_VII",
"cvii",
}
-- Class VIII
tags["class viii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_VIII",
"cviii",
}
-- Class IX
tags["class ix"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_IX",
"cix",
}
-- Class X
tags["class x"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_X",
"cx",
}
-- Base state
tags["base state"] = {
"grammar",
"wikt:Appendix:Glossary#base_state",
"base",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
acg9vuh70lwhjw8pb3hp8nxywl2xxsm
88574
88573
2026-07-30T10:37:09Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/lg]]
88573
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Luganda.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Inflectional class -----------------------
-- Class I
tags["class i"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_I",
"ci",
}
-- Class II
tags["class ii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_II",
"cii",
}
-- Class III
tags["class iii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_III",
"ciii",
}
-- Class IV
tags["class iv"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_IV",
"civ",
}
-- Class V
tags["class v"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_V",
"cv",
}
-- Class VI
tags["class vi"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_VI",
"cvi",
}
-- Class VII
tags["class vii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_VII",
"cvii",
}
-- Class VIII
tags["class viii"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_VIII",
"cviii",
}
-- Class IX
tags["class ix"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_IX",
"cix",
}
-- Class X
tags["class x"] = {
"grammar",
"wikt:Appendix:Luganda_noun_classes#Class_X",
"cx",
}
-- Base state
tags["base state"] = {
"grammar",
"wikt:Appendix:Glossary#base_state",
"base",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
acg9vuh70lwhjw8pb3hp8nxywl2xxsm
Mòideal:form of/lang-data/lt
828
17803
88575
2024-12-17T03:22:57Z
en>Theknightwho
0
88575
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Lithuanian.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Non-finite -----------------------
tags["participle of necessity"] = {
"non-finite",
"w:gerundive",
"partnec",
731298, -- gerundive
}
-- Lithuanian-specific adverbial participle type; native term normally used in English
tags["būdinys"] = {
"non-finite",
WIKT,
"budinys",
}
-- Lithuanian-specific adverbial participle type; native term normally used in English
tags["padalyvis"] = {
"non-finite",
WIKT,
}
-- Lithuanian-specific adverbial participle type; native term normally used in English
tags["pusdalyvis"] = {
"non-finite",
WIKT,
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
oqj62bw3qumr79jmrwnw4aorsl4nyy4
88576
88575
2026-07-30T10:37:18Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/lt]]
88575
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Lithuanian.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Non-finite -----------------------
tags["participle of necessity"] = {
"non-finite",
"w:gerundive",
"partnec",
731298, -- gerundive
}
-- Lithuanian-specific adverbial participle type; native term normally used in English
tags["būdinys"] = {
"non-finite",
WIKT,
"budinys",
}
-- Lithuanian-specific adverbial participle type; native term normally used in English
tags["padalyvis"] = {
"non-finite",
WIKT,
}
-- Lithuanian-specific adverbial participle type; native term normally used in English
tags["pusdalyvis"] = {
"non-finite",
WIKT,
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
oqj62bw3qumr79jmrwnw4aorsl4nyy4
Mòideal:form of/lang-data/lv
828
17804
88577
2025-03-17T02:15:13Z
en>Benwing2
0
add base lemma params
88577
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Latvian.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Base lemma params -----------------------
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "sup-of",
tags = {"supd"},
},
{
param = "prespart-of",
tags = {"pres", "part"},
},
{
param = "pastpart-of",
tags = {"past", "part"},
},
}
----------------------- Non-finite -----------------------
-- Latvian adverbial participle types; I can't find any Wiktionary or Wikipedia glossary entries that are relevant
tags["object of perception"] = {
"non-finite",
nil,
"objper",
display = "object-of-perception",
}
tags["invariable"] = {
"non-finite",
nil,
"invar",
}
tags["variable"] = {
"non-finite",
nil,
"var",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
2979bjeratuf01pn9ee81tfhxzchaju
88578
88577
2026-07-30T10:37:22Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/lv]]
88577
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Latvian.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Base lemma params -----------------------
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "sup-of",
tags = {"supd"},
},
{
param = "prespart-of",
tags = {"pres", "part"},
},
{
param = "pastpart-of",
tags = {"past", "part"},
},
}
----------------------- Non-finite -----------------------
-- Latvian adverbial participle types; I can't find any Wiktionary or Wikipedia glossary entries that are relevant
tags["object of perception"] = {
"non-finite",
nil,
"objper",
display = "object-of-perception",
}
tags["invariable"] = {
"non-finite",
nil,
"invar",
}
tags["variable"] = {
"non-finite",
nil,
"var",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
2979bjeratuf01pn9ee81tfhxzchaju
Mòideal:form of/lang-data/nl
828
17805
88579
2024-12-18T15:04:45Z
en>Stujul
0
Add shortcut for indefinite determiners
88579
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Dutch.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
-- adjective form shortcuts
shortcuts["infl"] = {"m//f", "s", "attr", ";", "def", "n", "s", "attr", ";", "p", "attr"}
shortcuts["infl-indef"] = {"indef", "m//f", "s", "attr", ";", "indef", "p", "attr"}
-- verb form shortcuts
shortcuts["2-inv"] = {"inv", "2", "s", "pres", "ind"}
shortcuts["bare-verb"] = {"1", "s", "pres", "ind", ";", "2-inv", ";", "imp"}
shortcuts["bare-ten-verb"] = {"1//2//3", "s", "pres", "ind", ";", "imp"}
shortcuts["pres-t"] = {"2//3", "s", "pres", "ind", ";", "p", "imp"}
shortcuts["pres-pl"] = {"p", "pres", "ind", ";", "p", "pres", "sub"}
shortcuts["past-sg"] = {"s", "past", "ind", ";", "s", "past", "sub"}
shortcuts["past-pl"] = {"p", "past", "ind", ";", "p", "past", "sub"}
shortcuts["dep-bare-verb"] = {"1", "s", "dep", "pres", "ind"}
shortcuts["dep-bare-ten-verb"] = {"1//2//3", "s", "dep", "pres", "ind"}
shortcuts["dep-pres-t"] = {"2//3", "s", "dep", "pres", "ind"}
shortcuts["dep-past-sg"] = {"s", "dep", "past", "ind", ";", "s", "dep", "past", "sub"}
shortcuts["dep-past-pl"] = {"p", "dep", "past", "ind", ";", "p", "dep", "past", "sub"}
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "sup-of",
tags = {"supd"},
},
{
param = "pastpart-of",
tags = {"past", "part"},
},
}
----------------------- Person -----------------------
tags["second-person (u)"] = {
"person",
nil,
"2-u",
display = "[[Appendix:Glossary#second person|second-person]] ([[u#Dutch|u]])",
}
tags["second-person (gij)"] = {
"person",
nil,
"2-gij",
display = "[[Appendix:Glossary#second person|second-person]] ([[gij#Dutch|gij]])",
}
----------------------- Attitude -----------------------
tags["diminutive"] = {
"attitude",
"wikt:Appendix:Dutch diminutives",
"dim",
108709,
}
----------------------- Misc grammar -----------------------
tags["dependent"] = {
"grammar",
nil,
"dep",
display = "[[Appendix:Dutch parts of speech#Separable verbs|dependent-clause]]",
}
tags["inversion"] = {
"grammar",
nil,
"inv",
display = "(in case of [[Appendix:Glossary#inversion|inversion]])",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
kivj4rhscwg6rvynh7x61k78a787vzt
88580
88579
2026-07-30T10:37:25Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/nl]]
88579
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Dutch.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
-- adjective form shortcuts
shortcuts["infl"] = {"m//f", "s", "attr", ";", "def", "n", "s", "attr", ";", "p", "attr"}
shortcuts["infl-indef"] = {"indef", "m//f", "s", "attr", ";", "indef", "p", "attr"}
-- verb form shortcuts
shortcuts["2-inv"] = {"inv", "2", "s", "pres", "ind"}
shortcuts["bare-verb"] = {"1", "s", "pres", "ind", ";", "2-inv", ";", "imp"}
shortcuts["bare-ten-verb"] = {"1//2//3", "s", "pres", "ind", ";", "imp"}
shortcuts["pres-t"] = {"2//3", "s", "pres", "ind", ";", "p", "imp"}
shortcuts["pres-pl"] = {"p", "pres", "ind", ";", "p", "pres", "sub"}
shortcuts["past-sg"] = {"s", "past", "ind", ";", "s", "past", "sub"}
shortcuts["past-pl"] = {"p", "past", "ind", ";", "p", "past", "sub"}
shortcuts["dep-bare-verb"] = {"1", "s", "dep", "pres", "ind"}
shortcuts["dep-bare-ten-verb"] = {"1//2//3", "s", "dep", "pres", "ind"}
shortcuts["dep-pres-t"] = {"2//3", "s", "dep", "pres", "ind"}
shortcuts["dep-past-sg"] = {"s", "dep", "past", "ind", ";", "s", "dep", "past", "sub"}
shortcuts["dep-past-pl"] = {"p", "dep", "past", "ind", ";", "p", "dep", "past", "sub"}
local base_lemma_params = {
{
param = "comp-of",
tags = {"comd"},
},
{
param = "sup-of",
tags = {"supd"},
},
{
param = "pastpart-of",
tags = {"past", "part"},
},
}
----------------------- Person -----------------------
tags["second-person (u)"] = {
"person",
nil,
"2-u",
display = "[[Appendix:Glossary#second person|second-person]] ([[u#Dutch|u]])",
}
tags["second-person (gij)"] = {
"person",
nil,
"2-gij",
display = "[[Appendix:Glossary#second person|second-person]] ([[gij#Dutch|gij]])",
}
----------------------- Attitude -----------------------
tags["diminutive"] = {
"attitude",
"wikt:Appendix:Dutch diminutives",
"dim",
108709,
}
----------------------- Misc grammar -----------------------
tags["dependent"] = {
"grammar",
nil,
"dep",
display = "[[Appendix:Dutch parts of speech#Separable verbs|dependent-clause]]",
}
tags["inversion"] = {
"grammar",
nil,
"inv",
display = "(in case of [[Appendix:Glossary#inversion|inversion]])",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
kivj4rhscwg6rvynh7x61k78a787vzt
Mòideal:form of/lang-data/pi
828
17806
88581
2024-12-17T03:22:03Z
en>Theknightwho
0
88581
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Pali.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local base_lemma_params = {
{
param = "caus-of",
tags = {"caus"},
},
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
p6hq2d4yorx7o6j087footxxhqp2rmq
88582
88581
2026-07-30T10:37:28Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/pi]]
88581
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Pali.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
local base_lemma_params = {
{
param = "caus-of",
tags = {"caus"},
},
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts, base_lemma_params = base_lemma_params}
p6hq2d4yorx7o6j087footxxhqp2rmq
Mòideal:form of/lang-data/sw
828
17807
88583
2026-03-11T00:25:25Z
en>Einstein2
0
88583
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Swahili.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Tense/aspect -----------------------
tags["gnomic"] = {
"tense-aspect",
"w:gnomic aspect",
}
tags["consecutive"] = {
"tense-aspect",
"w:Swahili grammar#Consecutive",
}
tags["situational"] = {
"tense-aspect",
"w:Swahili grammar#Situational",
}
----------------------- Inflectional class -----------------------
-- swahili m-wa class (class 1/2)
tags["m-wa class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-wa_class",
"m-wa",
}
-- swahili m-mi class (class 3/4)
tags["m-mi class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-mi_class",
"m-mi",
}
-- swahili ji-ma class (class 5/6)
tags["ji-ma class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ji-ma_class",
"ji-ma",
}
-- swahili ki-vi class (class 7/8)
tags["ki-vi class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ki-vi_class",
"ki-vi",
}
-- swahili n-n class (class 9/10)
tags["n class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#N_class",
"n-n",
}
-- swahili u-n/u-u class (class 11/14)
tags["u class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#U_class",
{"u-n", "u-u"},
}
-- swahili ku class (class 15)
tags["ku class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_class",
"ku",
}
-- swahili pa locative class (class 16)
tags["pa locative class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Pa_locative_class",
"pa",
}
-- swahili ku locative class (class 17)
tags["ku locative class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_locative_class",
"ku-loc",
}
-- swahili mu locative class (class 18)
tags["mu locative class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Mu_locative_class",
"mu",
}
-- swahili m-wa class (class 1/2)
tags["m-wa class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-wa_class",
"m-wa_obj",
}
-- swahili m-mi class (class 3/4)
tags["m-mi class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-mi_class",
"m-mi_obj",
}
-- swahili ji-ma class (class 5/6)
tags["ji-ma class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ji-ma_class",
"ji-ma_obj",
}
-- swahili ki-vi class (class 7/8)
tags["ki-vi class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ki-vi_class",
"ki-vi_obj",
}
-- swahili n-n class (class 9/10)
tags["n class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#N_class",
"n-n_obj",
}
-- swahili u-n/u-u class (class 11/14)
tags["u class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#U_class",
{"u-n_obj", "u-u_obj"},
}
-- swahili ku class (class 15)
tags["ku class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_class",
"ku_obj",
}
-- swahili pa locative class (class 16)
tags["pa locative class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Pa_locative_class",
"pa_obj",
}
-- swahili ku locative class (class 17)
tags["ku locative class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_locative_class",
"ku-loc_obj",
}
-- swahili mu locative class (class 18)
tags["mu locative class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Mu_locative_class",
"mu_obj",
}
-- swahili m-wa class (class 1/2)
tags["m-wa class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-wa_class",
"m-wa_rel",
}
-- swahili m-mi class (class 3/4)
tags["m-mi class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-mi_class",
"m-mi_rel",
}
-- swahili ji-ma class (class 5/6)
tags["ji-ma class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ji-ma_class",
"ji-ma_rel",
}
-- swahili ki-vi class (class 7/8)
tags["ki-vi class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ki-vi_class",
"ki-vi_rel",
}
-- swahili n-n class (class 9/10)
tags["n class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#N_class",
"n-n_rel",
}
-- swahili u-n/u-u class (class 11/14)
tags["u class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#U_class",
{"u-n_rel", "u-u_rel"},
}
-- swahili ku class (class 15)
tags["ku class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_class",
"ku_rel",
}
-- swahili pa locative class (class 16)
tags["pa locative class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Pa_locative_class",
"pa_rel",
}
-- swahili ku locative class (class 17)
tags["ku locative class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_locative_class",
"ku-loc_rel",
}
-- swahili mu locative class (class 18)
tags["mu locative class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Mu_locative_class",
"mu_rel",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
josabb4acqu87b0p3x75ut6gy6lmq44
88584
88583
2026-07-30T10:37:31Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/sw]]
88583
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Swahili.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Tense/aspect -----------------------
tags["gnomic"] = {
"tense-aspect",
"w:gnomic aspect",
}
tags["consecutive"] = {
"tense-aspect",
"w:Swahili grammar#Consecutive",
}
tags["situational"] = {
"tense-aspect",
"w:Swahili grammar#Situational",
}
----------------------- Inflectional class -----------------------
-- swahili m-wa class (class 1/2)
tags["m-wa class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-wa_class",
"m-wa",
}
-- swahili m-mi class (class 3/4)
tags["m-mi class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-mi_class",
"m-mi",
}
-- swahili ji-ma class (class 5/6)
tags["ji-ma class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ji-ma_class",
"ji-ma",
}
-- swahili ki-vi class (class 7/8)
tags["ki-vi class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ki-vi_class",
"ki-vi",
}
-- swahili n-n class (class 9/10)
tags["n class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#N_class",
"n-n",
}
-- swahili u-n/u-u class (class 11/14)
tags["u class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#U_class",
{"u-n", "u-u"},
}
-- swahili ku class (class 15)
tags["ku class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_class",
"ku",
}
-- swahili pa locative class (class 16)
tags["pa locative class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Pa_locative_class",
"pa",
}
-- swahili ku locative class (class 17)
tags["ku locative class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_locative_class",
"ku-loc",
}
-- swahili mu locative class (class 18)
tags["mu locative class subject inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Mu_locative_class",
"mu",
}
-- swahili m-wa class (class 1/2)
tags["m-wa class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-wa_class",
"m-wa_obj",
}
-- swahili m-mi class (class 3/4)
tags["m-mi class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-mi_class",
"m-mi_obj",
}
-- swahili ji-ma class (class 5/6)
tags["ji-ma class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ji-ma_class",
"ji-ma_obj",
}
-- swahili ki-vi class (class 7/8)
tags["ki-vi class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ki-vi_class",
"ki-vi_obj",
}
-- swahili n-n class (class 9/10)
tags["n class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#N_class",
"n-n_obj",
}
-- swahili u-n/u-u class (class 11/14)
tags["u class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#U_class",
{"u-n_obj", "u-u_obj"},
}
-- swahili ku class (class 15)
tags["ku class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_class",
"ku_obj",
}
-- swahili pa locative class (class 16)
tags["pa locative class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Pa_locative_class",
"pa_obj",
}
-- swahili ku locative class (class 17)
tags["ku locative class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_locative_class",
"ku-loc_obj",
}
-- swahili mu locative class (class 18)
tags["mu locative class object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Mu_locative_class",
"mu_obj",
}
-- swahili m-wa class (class 1/2)
tags["m-wa class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-wa_class",
"m-wa_rel",
}
-- swahili m-mi class (class 3/4)
tags["m-mi class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#M-mi_class",
"m-mi_rel",
}
-- swahili ji-ma class (class 5/6)
tags["ji-ma class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ji-ma_class",
"ji-ma_rel",
}
-- swahili ki-vi class (class 7/8)
tags["ki-vi class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ki-vi_class",
"ki-vi_rel",
}
-- swahili n-n class (class 9/10)
tags["n class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#N_class",
"n-n_rel",
}
-- swahili u-n/u-u class (class 11/14)
tags["u class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#U_class",
{"u-n_rel", "u-u_rel"},
}
-- swahili ku class (class 15)
tags["ku class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_class",
"ku_rel",
}
-- swahili pa locative class (class 16)
tags["pa locative class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Pa_locative_class",
"pa_rel",
}
-- swahili ku locative class (class 17)
tags["ku locative class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Ku_locative_class",
"ku-loc_rel",
}
-- swahili mu locative class (class 18)
tags["mu locative class relative object inflected"] = {
"grammar",
"wikt:Appendix:Swahili_noun_classes#Mu_locative_class",
"mu_rel",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
josabb4acqu87b0p3x75ut6gy6lmq44
Mòideal:form of/lang-data/ttj
828
17808
88585
2025-07-28T10:03:24Z
en>Ahiise2
0
88585
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Tooro.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Inflectional class -----------------------
-- Class 1
tags["class 1"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_1 form",
"c1",
}
-- Class 2
tags["class 2"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_2",
"c2",
}
-- Class 3
tags["class 3"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_3",
"c3",
}
-- Class 4
tags["class 4"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_4",
"c4",
}
-- Class 5
tags["class 5"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_5",
"c5",
}
-- Class 6
tags["class 6"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_6",
"c6",
}
-- Class 7
tags["class 7"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_7",
"c7",
}
-- Class 8
tags["class 8"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_8",
"c8",
}
-- Class 9
tags["class 9"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_9",
"c9",
}
-- Class 10
tags["class 10"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_10",
"c10",
}
-- Class 11
tags["class 11"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_11",
"c11",
}
-- Class 12
tags["class 12"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_12",
"c12",
}
-- Class 13
tags["class 13"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_13",
"c13",
}
-- Class 14
tags["class 14"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_14",
"c14",
}
-- Class 15
tags["class 15"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_15",
"c15",
}
-- Class 16
tags["class 16"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_16",
"c16",
}
-- Class 17
tags["class 17"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_17",
"c17",
}
-- Class 18
tags["class 18"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_18",
"c18",
}
----------------------- Other inflections -----------------------
-- Augmentless
tags["augmentless"] = {
"grammar",
"wikt:Appendix:Glossary#augmentless",
"augless",
}
-- virtual present
tags["virtual present"] = {
"tense-aspect",
"w:Tooro_language#Verb_conjugations",
"virt",
}
-- hypothetical
tags["hypothetical"] = {
"tense-aspect",
"w:Hypothetical_mood",
"hyp",
}
-- experiential
tags["experiential"] = {
"tense-aspect",
"w:Tooro_language#Verb_conjugations",
"exp",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
nj4ihhqk5r4l7slnlkzmg6vwn5gcbz1
88586
88585
2026-07-30T10:37:34Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/ttj]]
88585
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Tooro.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
----------------------- Inflectional class -----------------------
-- Class 1
tags["class 1"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_1 form",
"c1",
}
-- Class 2
tags["class 2"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_2",
"c2",
}
-- Class 3
tags["class 3"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_3",
"c3",
}
-- Class 4
tags["class 4"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_4",
"c4",
}
-- Class 5
tags["class 5"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_5",
"c5",
}
-- Class 6
tags["class 6"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_6",
"c6",
}
-- Class 7
tags["class 7"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_7",
"c7",
}
-- Class 8
tags["class 8"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_8",
"c8",
}
-- Class 9
tags["class 9"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_9",
"c9",
}
-- Class 10
tags["class 10"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_10",
"c10",
}
-- Class 11
tags["class 11"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_11",
"c11",
}
-- Class 12
tags["class 12"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_12",
"c12",
}
-- Class 13
tags["class 13"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_13",
"c13",
}
-- Class 14
tags["class 14"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_14",
"c14",
}
-- Class 15
tags["class 15"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_15",
"c15",
}
-- Class 16
tags["class 16"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_16",
"c16",
}
-- Class 17
tags["class 17"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_17",
"c17",
}
-- Class 18
tags["class 18"] = {
"grammar",
"wikt:Appendix:Tooro_noun_classes#Class_18",
"c18",
}
----------------------- Other inflections -----------------------
-- Augmentless
tags["augmentless"] = {
"grammar",
"wikt:Appendix:Glossary#augmentless",
"augless",
}
-- virtual present
tags["virtual present"] = {
"tense-aspect",
"w:Tooro_language#Verb_conjugations",
"virt",
}
-- hypothetical
tags["hypothetical"] = {
"tense-aspect",
"w:Hypothetical_mood",
"hyp",
}
-- experiential
tags["experiential"] = {
"tense-aspect",
"w:Tooro_language#Verb_conjugations",
"exp",
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
nj4ihhqk5r4l7slnlkzmg6vwn5gcbz1
Mòideal:form of/lang-data/vot
828
17809
88587
2026-02-21T18:25:24Z
en>Surjection
0
Protected "[[Module:form of/lang-data/vot]]": Highly visible template/module ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
88587
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Votic.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
tags["inf1"] = {
"non-finite",
nil,
nil,
display = "first infinitive"
}
tags["inf2 inessive"] = {
"non-finite",
nil,
"inf2 ine",
display = "inessive of second infinitive"
}
tags["inf2 elative"] = {
"non-finite",
nil,
"inf2 ela",
display = "elative of second infinitive"
}
tags["inf2 illative"] = {
"non-finite",
nil,
"inf2 ill",
display = "illative of second infinitive"
}
tags["inf2 abessive"] = {
"non-finite",
nil,
"inf2 abe",
display = "abessive of second infinitive"
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
eppsd4w92p6973idcqke6557r1mazb6
88588
88587
2026-07-30T10:37:36Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/lang-data/vot]]
88587
Scribunto
text/plain
--[=[
This module contains lang-specific tags for Votic.
]=]
local m_form_of_data = require("Module:form of/data")
local APPENDIX = m_form_of_data.APPENDIX
local WP = m_form_of_data.WP
local WIKT = m_form_of_data.WIKT
local tags = {}
local shortcuts = {}
tags["inf1"] = {
"non-finite",
nil,
nil,
display = "first infinitive"
}
tags["inf2 inessive"] = {
"non-finite",
nil,
"inf2 ine",
display = "inessive of second infinitive"
}
tags["inf2 elative"] = {
"non-finite",
nil,
"inf2 ela",
display = "elative of second infinitive"
}
tags["inf2 illative"] = {
"non-finite",
nil,
"inf2 ill",
display = "illative of second infinitive"
}
tags["inf2 abessive"] = {
"non-finite",
nil,
"inf2 abe",
display = "abessive of second infinitive"
}
----------------------- Create the shortcuts list -----------------------
m_form_of_data.finalize(tags, shortcuts)
return {tags = tags, shortcuts = shortcuts}
eppsd4w92p6973idcqke6557r1mazb6
Mòideal:form of/templates/inline
828
17810
88589
2024-12-17T21:27:11Z
en>Theknightwho
0
split_tags_into_tag_sets() in [[Module:form of]] renamed to split_tag_set().
88589
Scribunto
text/plain
local export = {}
local m_form_of = require("Module:form of")
local m_languages = require("Module:languages")
function export.inflection_inline_t(frame)
local params = {
[1] = {required = true, default = "und"},
[2] = {required = true, list = true},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = m_languages.getByCode(args[1], 1)
local tags = args[2]
if #tags == 0 and mw.title.getCurrentTitle().nsText == "Template" then
tags = {"m", "acc", "s"}
end
local outputs = {}
local tag_sets = m_form_of.split_tag_set(tags)
-- Set nocat = true so we don't generate any categories; {{qinfl}} is used to generate qualifier tags and any
-- associated categories may or may not apply to the page as a whole.
for _, tag_set in ipairs(tag_sets) do
table.insert(outputs, m_form_of.tagged_inflections({ tags = tag_set, lang = lang, nocat = true }))
end
return table.concat(outputs, "; ")
end
return export
r72rcxgsox8650lc5w7ut5w062urliw
88590
88589
2026-07-30T10:37:43Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/templates/inline]]
88589
Scribunto
text/plain
local export = {}
local m_form_of = require("Module:form of")
local m_languages = require("Module:languages")
function export.inflection_inline_t(frame)
local params = {
[1] = {required = true, default = "und"},
[2] = {required = true, list = true},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = m_languages.getByCode(args[1], 1)
local tags = args[2]
if #tags == 0 and mw.title.getCurrentTitle().nsText == "Template" then
tags = {"m", "acc", "s"}
end
local outputs = {}
local tag_sets = m_form_of.split_tag_set(tags)
-- Set nocat = true so we don't generate any categories; {{qinfl}} is used to generate qualifier tags and any
-- associated categories may or may not apply to the page as a whole.
for _, tag_set in ipairs(tag_sets) do
table.insert(outputs, m_form_of.tagged_inflections({ tags = tag_set, lang = lang, nocat = true }))
end
return table.concat(outputs, "; ")
end
return export
r72rcxgsox8650lc5w7ut5w062urliw
Mòideal:form of/templates/documentation
828
17811
88591
2024-05-29T08:54:15Z
en>Benwing2
0
use {{module documentation}}, {{module cat}}
88591
wikitext
text/x-wiki
{{module documentation}}
{{module cat|-|Form-of,Template interface}}
0fjgb4x88tnfa87xor36ty56h6d3pru
88592
88591
2026-07-30T10:37:48Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:form_of/templates/documentation]]
88591
wikitext
text/x-wiki
{{module documentation}}
{{module cat|-|Form-of,Template interface}}
0fjgb4x88tnfa87xor36ty56h6d3pru
Teamplaid:paramref
10
17812
88593
2026-04-15T19:09:45Z
en>Surjection
0
Changed protection settings for "[[Template:paramref]]" ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88593
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#invoke:template parser/templates|parameter_t}}</includeonly><noinclude>{{documentation}}</noinclude>
s8myp2l5pg12i4h1xuqrgfwf0r5f0hl
88594
88593
2026-07-30T10:38:18Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:paramref]]
88593
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#invoke:template parser/templates|parameter_t}}</includeonly><noinclude>{{documentation}}</noinclude>
s8myp2l5pg12i4h1xuqrgfwf0r5f0hl
Teamplaid:paramref/documentation
10
17813
88595
2024-09-04T04:07:48Z
en>Theknightwho
0
88595
wikitext
text/x-wiki
{{documentation subpage}}
This template displays a parameter name surrounded by {{paramref|triple braces}}, as one would see in MediaWiki template code. Note that this is useful when discussing the ''coding'' of templates (e.g., on template talk pages), but not so much when discussing ''how to use'' templates (e.g., in template documentation or on entry talk pages). For the latter usage, please see {{temp|para}}.
==Usage==
This template may be added anywhere ''outside'' of the [[WT:NS|main (dictionary) namespace]] to display a parameter as it would appear inside template code.
===Parameters===
This template uses one or two unnamed (positional) parameters:
* {{para|1|req=1}} The parameter name to be shown. This can be empty, but must be given.
* {{para|2|opt=1}} The text that appears after the parameter name and a pipe. This can be empty.
==Examples==
* {{temp|paramref|1}} returns:
*: {{paramref|1}}
* {{temp|paramref|foo}} returns:
*: {{paramref|foo}}
* {{temp|paramref|bar|}} returns:
*: {{paramref|bar|}}
* {{temp|paramref|salt|pepper}} returns:
*: {{paramref|salt|pepper}}
* {{temp|paramref||Tweedle-dee}} returns:
*: {{paramref||Tweedle-dee}}
==See also==
* {{temp|para}}
* {{temp|temp}}
* {{temp|category}}
<includeonly>
[[Category:Discussion templates]]
</includeonly>
ojciy18cz8yefjuihpz71c00bpby9a2
88596
88595
2026-07-30T10:38:28Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:paramref/documentation]]
88595
wikitext
text/x-wiki
{{documentation subpage}}
This template displays a parameter name surrounded by {{paramref|triple braces}}, as one would see in MediaWiki template code. Note that this is useful when discussing the ''coding'' of templates (e.g., on template talk pages), but not so much when discussing ''how to use'' templates (e.g., in template documentation or on entry talk pages). For the latter usage, please see {{temp|para}}.
==Usage==
This template may be added anywhere ''outside'' of the [[WT:NS|main (dictionary) namespace]] to display a parameter as it would appear inside template code.
===Parameters===
This template uses one or two unnamed (positional) parameters:
* {{para|1|req=1}} The parameter name to be shown. This can be empty, but must be given.
* {{para|2|opt=1}} The text that appears after the parameter name and a pipe. This can be empty.
==Examples==
* {{temp|paramref|1}} returns:
*: {{paramref|1}}
* {{temp|paramref|foo}} returns:
*: {{paramref|foo}}
* {{temp|paramref|bar|}} returns:
*: {{paramref|bar|}}
* {{temp|paramref|salt|pepper}} returns:
*: {{paramref|salt|pepper}}
* {{temp|paramref||Tweedle-dee}} returns:
*: {{paramref||Tweedle-dee}}
==See also==
* {{temp|para}}
* {{temp|temp}}
* {{temp|category}}
<includeonly>
[[Category:Discussion templates]]
</includeonly>
ojciy18cz8yefjuihpz71c00bpby9a2
Teamplaid:documentation subpage
10
17814
88597
2025-11-11T10:58:05Z
en>Theknightwho
0
88597
wikitext
text/x-wiki
<includeonly><!-- if not on a /documentation subpage, do nothing -->{{#ifeq:{{FULLPAGENAME}}|Template:documentation|<nowiki/><!--Prevents a newline.-->|{{#ifeq:{{SUBPAGENAME}}|documentation|</includeonly><!--
-->{{maintenance box|grey
| documentation
| title = Documentation for [[{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]. <sup class="plainlinks">[[{{fullurl:{{SUBJECTSPACE}}:{{BASEPAGENAME}}|action=edit}} edit]]</sup>
| image = [[File:Codex icon articles.svg|40px|alt=Documentation|class=skin-invert-image|link=]]
| text = This page contains [[Help:Documenting templates and modules|usage information]], [[WT:Categorization|categories]], [[Help:Interwiki linking|interwiki links]] and other content describing the {{#switch:{{NAMESPACE}}|Module=module|#default=template}}.
}}<!--
--><includeonly><!--
-->{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}|[[Category:Documentation subpages]]|[[Category:Orphaned documentation subpages]]}}<!--
-->|<{{lc:}}!-- Dummy comment to prevent a newline from appearing -->}}}}</includeonly><noinclude>{{documentation}}</noinclude>
hafjyyr83l34zj1phuy3esgh4pbqlzu
88598
88597
2026-07-30T10:38:39Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:documentation_subpage]]
88597
wikitext
text/x-wiki
<includeonly><!-- if not on a /documentation subpage, do nothing -->{{#ifeq:{{FULLPAGENAME}}|Template:documentation|<nowiki/><!--Prevents a newline.-->|{{#ifeq:{{SUBPAGENAME}}|documentation|</includeonly><!--
-->{{maintenance box|grey
| documentation
| title = Documentation for [[{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]. <sup class="plainlinks">[[{{fullurl:{{SUBJECTSPACE}}:{{BASEPAGENAME}}|action=edit}} edit]]</sup>
| image = [[File:Codex icon articles.svg|40px|alt=Documentation|class=skin-invert-image|link=]]
| text = This page contains [[Help:Documenting templates and modules|usage information]], [[WT:Categorization|categories]], [[Help:Interwiki linking|interwiki links]] and other content describing the {{#switch:{{NAMESPACE}}|Module=module|#default=template}}.
}}<!--
--><includeonly><!--
-->{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}|[[Category:Documentation subpages]]|[[Category:Orphaned documentation subpages]]}}<!--
-->|<{{lc:}}!-- Dummy comment to prevent a newline from appearing -->}}}}</includeonly><noinclude>{{documentation}}</noinclude>
hafjyyr83l34zj1phuy3esgh4pbqlzu
Teamplaid:maintenance box
10
17815
88599
2025-10-09T09:07:54Z
en>Juwan
0
88599
wikitext
text/x-wiki
<templatestyles src="Module:message box/styles.css" /><div class="noprint maintenance-box maintenance-box-{{{1|blue}}}">
{|
| rowspan="2" class="maintenance-box-image-cell" | {{{image|[[File:Codex icon Notice blue.svg|40px|alt=Notice]]}}}
! style="text-align: left;" | {{{title|}}}
|-
| {{{text|}}}
|}</div><noinclude>{{documentation}}</noinclude>
pn4fc374opf897cbzurxrblzw75otms
88600
88599
2026-07-30T10:39:04Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:maintenance_box]]
88599
wikitext
text/x-wiki
<templatestyles src="Module:message box/styles.css" /><div class="noprint maintenance-box maintenance-box-{{{1|blue}}}">
{|
| rowspan="2" class="maintenance-box-image-cell" | {{{image|[[File:Codex icon Notice blue.svg|40px|alt=Notice]]}}}
! style="text-align: left;" | {{{title|}}}
|-
| {{{text|}}}
|}</div><noinclude>{{documentation}}</noinclude>
pn4fc374opf897cbzurxrblzw75otms
Mòideal:message box
828
17816
88601
2024-09-14T20:19:23Z
en>Theknightwho
0
Use [[Module:TemplateStyles]].
88601
Scribunto
text/plain
local html_create = mw.html.create
local tostring = tostring
local export = {}
local function make_box(tag, rows, image, header, text)
tag = tag:addClass("noprint")
:tag("table")
:tag("tr")
:tag("td")
if rows > 1 then
tag:attr("rowspan", rows)
end
tag = tag:wikitext(image)
:done()
if header then
tag = tag:node(header)
:done()
:tag("tr")
end
return tostring(tag:tag("td")
:wikitext(text)
:allDone()) ..
require("Module:TemplateStyles")("Module:message box/styles.css")
end
function export.maintenance(color, image, title, text)
local div = html_create("div")
:addClass("maintenance-box")
:addClass("maintenance-box-" .. color)
local header = html_create("th")
:css("text-align", "left")
:wikitext(title)
return make_box(div, 2, image, header, text)
end
function export.request(image, text)
local div = html_create("div")
:addClass("request-box")
return make_box(div, 1, image, nil, text)
end
return export
0njvtu4cuuvz98uci9fdhcz9qzscuod
88602
88601
2026-07-30T10:39:17Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:message_box]]
88601
Scribunto
text/plain
local html_create = mw.html.create
local tostring = tostring
local export = {}
local function make_box(tag, rows, image, header, text)
tag = tag:addClass("noprint")
:tag("table")
:tag("tr")
:tag("td")
if rows > 1 then
tag:attr("rowspan", rows)
end
tag = tag:wikitext(image)
:done()
if header then
tag = tag:node(header)
:done()
:tag("tr")
end
return tostring(tag:tag("td")
:wikitext(text)
:allDone()) ..
require("Module:TemplateStyles")("Module:message box/styles.css")
end
function export.maintenance(color, image, title, text)
local div = html_create("div")
:addClass("maintenance-box")
:addClass("maintenance-box-" .. color)
local header = html_create("th")
:css("text-align", "left")
:wikitext(title)
return make_box(div, 2, image, header, text)
end
function export.request(image, text)
local div = html_create("div")
:addClass("request-box")
return make_box(div, 1, image, nil, text)
end
return export
0njvtu4cuuvz98uci9fdhcz9qzscuod
Mòideal:message box/styles.css
828
17817
88603
2025-10-17T18:00:35Z
en>Surjection
0
88603
sanitized-css
text/css
.maintenance-box {
width: 90%;
margin: 0.75em auto;
border-width: 1px;
border-style: dashed;
padding: 0.25em;
}
body.skin-vector-2022 .maintenance-box > table td p:last-of-type {
/* remove extraneous bottom margin from bottom edge of maintenance box if it has multiple lines/paragraphs */
margin-bottom: 0.25em;
}
.maintenance-box-image-cell {
padding: 0 0.5em;
}
.request-box {
/* width: fit-content added as inline style */
margin: 0.75em 1em 0.75em 1em;
border: 1px dashed var(--border-color-base, #999999);
padding: 0.25em;
background: var(--background-color-base, #FFFFFF);
}
body.skin-minerva .request-box table {
margin-top: 0.25em;
margin-bottom: 0.25em;
}
/* Colors */
.maintenance-box-blue {
background-color: var(--wikt-palette-indigo-2, #E6E6FF);
border: 1px dashed var(--wikt-palette-indigo-9, #000061);
}
.maintenance-box-red {
background-color: var(--wikt-palette-red-2, #FFE6E6);
border: 1px dashed var(--wikt-palette-red-9, #610000);
}
.maintenance-box-yellow {
background-color: var(--wikt-palette-yellow-2, #FFFFE6);
border: 1px dashed var(--wikt-palette-yellow-9, #616100);
}
.maintenance-box-grey {
background-color: var(--wikt-palette-grey-2, #F2F2F2);
border: 1px dashed var(--wikt-palette-grey-9, #303030);
}
.maintenance-box-orange {
background-color: var(--wikt-palette-orange-2, #FFF2E6);
border: 1px dashed var(--wikt-palette-orange-9, #612F00);
}
94apw72wdbw2yvw3hygvo1l8sbdhyi8
88604
88603
2026-07-30T10:39:25Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:message_box/styles.css]]
88603
sanitized-css
text/css
.maintenance-box {
width: 90%;
margin: 0.75em auto;
border-width: 1px;
border-style: dashed;
padding: 0.25em;
}
body.skin-vector-2022 .maintenance-box > table td p:last-of-type {
/* remove extraneous bottom margin from bottom edge of maintenance box if it has multiple lines/paragraphs */
margin-bottom: 0.25em;
}
.maintenance-box-image-cell {
padding: 0 0.5em;
}
.request-box {
/* width: fit-content added as inline style */
margin: 0.75em 1em 0.75em 1em;
border: 1px dashed var(--border-color-base, #999999);
padding: 0.25em;
background: var(--background-color-base, #FFFFFF);
}
body.skin-minerva .request-box table {
margin-top: 0.25em;
margin-bottom: 0.25em;
}
/* Colors */
.maintenance-box-blue {
background-color: var(--wikt-palette-indigo-2, #E6E6FF);
border: 1px dashed var(--wikt-palette-indigo-9, #000061);
}
.maintenance-box-red {
background-color: var(--wikt-palette-red-2, #FFE6E6);
border: 1px dashed var(--wikt-palette-red-9, #610000);
}
.maintenance-box-yellow {
background-color: var(--wikt-palette-yellow-2, #FFFFE6);
border: 1px dashed var(--wikt-palette-yellow-9, #616100);
}
.maintenance-box-grey {
background-color: var(--wikt-palette-grey-2, #F2F2F2);
border: 1px dashed var(--wikt-palette-grey-9, #303030);
}
.maintenance-box-orange {
background-color: var(--wikt-palette-orange-2, #FFF2E6);
border: 1px dashed var(--wikt-palette-orange-9, #612F00);
}
94apw72wdbw2yvw3hygvo1l8sbdhyi8
Teamplaid:glossary
10
17818
88605
2024-11-09T20:41:30Z
en>Surjection
0
Changed protection settings for "[[Template:glossary]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88605
wikitext
text/x-wiki
{{#invoke:glossary|link}}<!--
--><noinclude>
{{documentation}}
</noinclude>
2gfc2bdgt00us8bb4kn5xfj7lxil6dj
88606
88605
2026-07-30T10:40:56Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:glossary]]
88605
wikitext
text/x-wiki
{{#invoke:glossary|link}}<!--
--><noinclude>
{{documentation}}
</noinclude>
2gfc2bdgt00us8bb4kn5xfj7lxil6dj
Mòideal:glossary
828
17819
88607
2025-10-24T17:51:21Z
en>Theknightwho
0
88607
Scribunto
text/plain
local export = {}
local anchors_module = "Module:anchors"
local glossary_data_module = "Module:glossary/data"
local parameters_module = "Module:parameters"
local string_nowiki_module = "Module:string/nowiki"
local anchor_encode = mw.uri.anchorEncode
local require = require
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function normalize_anchor(...)
normalize_anchor = require(anchors_module).normalize_anchor
return normalize_anchor(...)
end
local function nowiki(...)
nowiki = require(string_nowiki_module)
return nowiki(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local data
local function get_data()
data, get_data = mw.loadData(glossary_data_module), nil
return data
end
function export.def(frame)
local required_default_ = {required = true, default = ""}
local args = process_params(frame:getParent().args, {
[1] = required_default_,
[2] = required_default_,
})
local term = args[1]
return "; <span id=\"" .. anchor_encode(term) .. "\">" .. term .. "</span>\n: " .. args[2]
end
local function get_link(formatted_anchor, text, anchor)
return "[[Appendix:Glossary#" .. nowiki(formatted_anchor) .. "|" .. (text or anchor) .. "]]"
end
-- TODO: make this externally-callable.
function export.link(frame)
local args = process_params(frame:getParent().args, {
[1] = {required = true, default = ""},
[2] = true,
})
local anchor, text = args[1], args[2]
local formatted_anchor = normalize_anchor(anchor)
if (data or get_data())[formatted_anchor] then
return get_link(formatted_anchor, text, anchor)
end
local lower_anchor = anchor:ulower()
formatted_anchor = normalize_anchor(lower_anchor)
local link = get_link(formatted_anchor, text, anchor)
if data[formatted_anchor] or formatted_anchor == "" then
return link
end
mw.log("The anchor " .. lower_anchor
.. (lower_anchor ~= anchor and " or " .. anchor or "")
.. " does not exist in Appendix:Glossary.")
return link
.. "[[Category:Pages linking to anchors not found in Appendix:Glossary|"
.. lower_anchor .. "]]"
end
return export
08kgb6yt06e00j6kl77b3kn5idr7nal
88608
88607
2026-07-30T10:41:05Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:glossary]]
88607
Scribunto
text/plain
local export = {}
local anchors_module = "Module:anchors"
local glossary_data_module = "Module:glossary/data"
local parameters_module = "Module:parameters"
local string_nowiki_module = "Module:string/nowiki"
local anchor_encode = mw.uri.anchorEncode
local require = require
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function normalize_anchor(...)
normalize_anchor = require(anchors_module).normalize_anchor
return normalize_anchor(...)
end
local function nowiki(...)
nowiki = require(string_nowiki_module)
return nowiki(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local data
local function get_data()
data, get_data = mw.loadData(glossary_data_module), nil
return data
end
function export.def(frame)
local required_default_ = {required = true, default = ""}
local args = process_params(frame:getParent().args, {
[1] = required_default_,
[2] = required_default_,
})
local term = args[1]
return "; <span id=\"" .. anchor_encode(term) .. "\">" .. term .. "</span>\n: " .. args[2]
end
local function get_link(formatted_anchor, text, anchor)
return "[[Appendix:Glossary#" .. nowiki(formatted_anchor) .. "|" .. (text or anchor) .. "]]"
end
-- TODO: make this externally-callable.
function export.link(frame)
local args = process_params(frame:getParent().args, {
[1] = {required = true, default = ""},
[2] = true,
})
local anchor, text = args[1], args[2]
local formatted_anchor = normalize_anchor(anchor)
if (data or get_data())[formatted_anchor] then
return get_link(formatted_anchor, text, anchor)
end
local lower_anchor = anchor:ulower()
formatted_anchor = normalize_anchor(lower_anchor)
local link = get_link(formatted_anchor, text, anchor)
if data[formatted_anchor] or formatted_anchor == "" then
return link
end
mw.log("The anchor " .. lower_anchor
.. (lower_anchor ~= anchor and " or " .. anchor or "")
.. " does not exist in Appendix:Glossary.")
return link
.. "[[Category:Pages linking to anchors not found in Appendix:Glossary|"
.. lower_anchor .. "]]"
end
return export
08kgb6yt06e00j6kl77b3kn5idr7nal
Mòideal:anchors
828
17820
88609
2026-04-30T07:11:27Z
en>Fenakhay
0
88609
Scribunto
text/plain
local export = {}
local string_utilities_module = "Module:string utilities"
local anchor_encode = mw.uri.anchorEncode
local concat = table.concat
local insert = table.insert
local language_anchor -- Defined below.
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
-- Returns the anchor text to be used as the fragment of a link to a language section.
function export.language_anchor(lang, id)
return anchor_encode(lang:getFullName() .. ": " .. id)
end
language_anchor = export.language_anchor
-- Normalizes input text (removes formatting etc.), which can then be used as an anchor in an `id=` field.
function export.normalize_anchor(str)
return decode_entities(anchor_encode(str))
end
function export.make_anchors(ids)
local anchors = {}
for i = 1, #ids do
local id = ids[i]
local el = mw.html.create("span")
:addClass("template-anchor")
:attr("id", anchor_encode(id))
:attr("data-id", id)
insert(anchors, tostring(el))
end
return concat(anchors)
end
function export.senseid(lang, id, tag_name)
-- The following tag is opened but never closed, where is it supposed to be closed?
-- with <li> it doesn't matter, as it is closed automatically.
-- with <p> it is a problem
-- Cannot use mw.html here as it always closes tags
return "<" .. tag_name .. " class=\"senseid\" id=\"" .. language_anchor(lang, id) .. "\" data-lang=\"" .. lang:getCode() .. "\" data-id=\"" .. encode_entities(id) .. "\">"
end
function export.etymid(lang, id)
-- Use a <ul> tag to ensure spacing doesn't get messed up.
local el = mw.html.create("ul")
:addClass("etymid")
:attr("id", language_anchor(lang, id))
:attr("data-lang", lang:getCode())
:attr("data-id", id)
return tostring(el)
end
function export.etymonid(lang, id, opts)
opts = opts or {}
-- Use a <ul> tag to ensure spacing doesn't get messed up.
local el = mw.html.create("ul")
:addClass("etymonid")
:attr("data-lang", lang:getCode())
if id then
el:attr("id", language_anchor(lang, id))
el:attr("data-id", id)
end
if opts.no_tree then
el:attr("data-no-tree", "1")
end
if opts.title then
el:attr("data-title", opts.title)
end
if opts.empty_tree then
el:attr("data-empty-tree", "1")
end
if opts.ety_tree_json then
el:attr("data-ety-tree-json", opts.ety_tree_json)
end
return tostring(el)
end
return export
2o0jqln8y0bxvpfhe66eogs2k88qkap
88610
88609
2026-07-30T10:41:17Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:anchors]]
88609
Scribunto
text/plain
local export = {}
local string_utilities_module = "Module:string utilities"
local anchor_encode = mw.uri.anchorEncode
local concat = table.concat
local insert = table.insert
local language_anchor -- Defined below.
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
-- Returns the anchor text to be used as the fragment of a link to a language section.
function export.language_anchor(lang, id)
return anchor_encode(lang:getFullName() .. ": " .. id)
end
language_anchor = export.language_anchor
-- Normalizes input text (removes formatting etc.), which can then be used as an anchor in an `id=` field.
function export.normalize_anchor(str)
return decode_entities(anchor_encode(str))
end
function export.make_anchors(ids)
local anchors = {}
for i = 1, #ids do
local id = ids[i]
local el = mw.html.create("span")
:addClass("template-anchor")
:attr("id", anchor_encode(id))
:attr("data-id", id)
insert(anchors, tostring(el))
end
return concat(anchors)
end
function export.senseid(lang, id, tag_name)
-- The following tag is opened but never closed, where is it supposed to be closed?
-- with <li> it doesn't matter, as it is closed automatically.
-- with <p> it is a problem
-- Cannot use mw.html here as it always closes tags
return "<" .. tag_name .. " class=\"senseid\" id=\"" .. language_anchor(lang, id) .. "\" data-lang=\"" .. lang:getCode() .. "\" data-id=\"" .. encode_entities(id) .. "\">"
end
function export.etymid(lang, id)
-- Use a <ul> tag to ensure spacing doesn't get messed up.
local el = mw.html.create("ul")
:addClass("etymid")
:attr("id", language_anchor(lang, id))
:attr("data-lang", lang:getCode())
:attr("data-id", id)
return tostring(el)
end
function export.etymonid(lang, id, opts)
opts = opts or {}
-- Use a <ul> tag to ensure spacing doesn't get messed up.
local el = mw.html.create("ul")
:addClass("etymonid")
:attr("data-lang", lang:getCode())
if id then
el:attr("id", language_anchor(lang, id))
el:attr("data-id", id)
end
if opts.no_tree then
el:attr("data-no-tree", "1")
end
if opts.title then
el:attr("data-title", opts.title)
end
if opts.empty_tree then
el:attr("data-empty-tree", "1")
end
if opts.ety_tree_json then
el:attr("data-ety-tree-json", opts.ety_tree_json)
end
return tostring(el)
end
return export
2o0jqln8y0bxvpfhe66eogs2k88qkap
Teamplaid:sga-conj-attá
10
17821
88611
2026-06-17T19:54:19Z
en>Mahagaja
0
88611
wikitext
text/x-wiki
{{inflection-box-top|palette=yellow|title=Irregular}}
{{inflection-table-top|class=very-narrow wide|palette=yellow|title= }}
! rowspan=2 |
! colspan=2 | 1st sing.
! colspan=2 | 2d sing.
! colspan=2 | 3d sing.
! rowspan=2 colspan=2 | Impersonal
|-
! colspan=2 | 1st pl.
! colspan=2 | 2d pl.
! colspan=2 | 3d pl.
|-
! rowspan=3 | {{tooltip|Present indicative progressive|Pres.​indic.​prog.}}*
| <!-- 1st sg --> rowspan=2 | {{l|sga|at·tó}}
| rowspan=2 | {{l|sga|·tó}}
| <!-- 2d sg --> rowspan=2 | {{l|sga|[[at·taí]], [[a·taí]]}}
| rowspan=2 | {{l|sga|·taí}}
| <!-- 3d sg --> | {{lang|sga|'''at·tá'''}}, {{l|sga|[[atá|a]]([[adtá|d]])[[atá|·tá]]}}, {{l|sga|[[atáa|a]]([[attáa|t]])[[atáa|·táa]]}} || {{l|sga|·tá}}
| <!-- impersonal --> rowspan=3 | —
| rowspan=3 |{{l|sga|·táthar}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|[[fil]]([[file|e]])}}, {{l|sga|feil}}, {{l|sga|fail}} {{small|{{q|relative}}}}<br/>{{l|sga|daas}} {{small|{{q|relative; found only in {{m|sga|[[cid]] [[daas]]}}, {{m|sga|indaas}}, {{m|sga|oldaas}}}}}}
|-
| <!-- 1st pl --> {{l|sga|at·taam}} || {{l|sga|·taam}}
| <!-- 2d pl --> {{l|sga|at·taïd}} || {{l|sga|·taïd}}
| <!-- 3d pl --> {{l|sga|[[ataat|a]]([[attaat|t]])[[ataat|·taat]]}} || {{l|sga|·taat}}
|-
! rowspan=4 | {{tooltip|Present indicative habitual|Pres.​indic.​hab.}}
| <!-- 1st sg --> rowspan=2 | {{l|sga|bíuu}}
| rowspan=2 | {{l|sga|·bíu}}
| <!-- 2d sg --> rowspan=2 | —
| rowspan=2 | {{l|sga|·bí}}
| <!-- 3d sg --> | {{l|sga|bíid}}; {{l|sga|ro·bí}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bí}}; {{l|sga|·rubai}} {{small|{{q|''ro''-form}}}}
| <!-- impersonal --> rowspan=4 | {{l|sga|bíthir}}; {{l|sga|ro·bíther}} {{small|{{q|''ro''-form}}}}
| rowspan=2 | {{l|sga|·bíther}}; {{l|sga|·rubther}} {{small|{{q|''ro''-form}}}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|bís}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> {{l|sga|bímmi}} || {{l|sga|·biam}}
| <!-- 2d pl --> rowspan=2 | —
| rowspan=2 | —
| <!-- 3d pl --> {{l|sga|bíit}}; {{l|sga|ro·bïat}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bïat}}; {{l|sga|·rubat}} {{small|{{q|''ro''-form}}}}
| <!-- imps rel --> rowspan=2 | {{l|sga|bíther}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl rel --> colspan=2 | {{l|sga|bímme}} {{small|{{q|relative}}}}
| <!-- 3d pl rel --> colspan=2 | {{l|sga|bíte}} {{small|{{q|relative}}}}
|-
! rowspan=2 | Imperfect indicative
| <!-- 1st sg --> colspan=2 | {{l|sga|·bíinn}}
| <!-- 2d sg --> colspan=2 | —
| <!-- 3d sg --> colspan=2 | {{l|sga|·bíth}}
| <!-- passive --> rowspan=2 colspan=2 | {{l|sga|·bíthe}}
|-
| <!-- 1st pl --> colspan=2 | {{l|sga|·bímmis}}
| <!-- 2d pl --> colspan=2 | —
| <!-- 3d pl --> colspan=2 | {{l|sga|·bítis}}
|-
! rowspan=4 | Preterite
| <!-- 1st sg --> rowspan=2 | {{l|sga|bá}}
| rowspan=2 | {{l|sga|·bá}}
| <!-- 2d sg --> rowspan=2 | —
| rowspan=2 | {{l|sga|·bá}}
| <!-- 3d sg --> {{l|sga|boí}} || {{l|sga|·boí}}
| <!-- passive --> rowspan=4 | {{l|sga|bothae}}
| rowspan=4 | {{l|sga|·both}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|boíe}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> rowspan=2 | {{l|sga|bámmar}}
| rowspan=2 | {{l|sga|·bámmar}}
| <!-- 2d pl --> rowspan=2 | —
| rowspan=2 | {{l|sga|·baid}}
| <!-- 3d pl --> | {{l|sga|bátar}} || {{l|sga|·bátar}}
|-
| <!-- 3d pl rel --> colspan=2 | {{l|sga|bátar}} {{small|{{q|relative}}}}
|-
! rowspan=2 | Perfect
| <!-- 1st sg --> {{l|sga|ro·bá}} || {{l|sga|·roba}}
| <!-- 2d sg --> {{l|sga|ro·bá}} || —
| <!-- 3d sg --> {{l|sga|ro·boí}} || {{l|sga|·robae}}, {{l|sga|·robæ}}, {{l|sga|·robe}}
| <!-- impersonal --> rowspan=2 | {{l|sga|ro·both}}
| rowspan=2 | {{l|sga|·rabad}}
|-
| <!-- 1st pl --> {{l|sga|ro·bámmar}} || {{l|sga|·robammar}}
| <!-- 2d pl --> {{l|sga|ro·baid}} || {{l|sga|·robaid}}
| <!-- 3d pl --> {{l|sga|ro·bátar}} || {{l|sga|·robatar}}
|-
! rowspan=4 | Future
| <!-- 1st sg --> rowspan=2 | {{l|sga|bia}}
| rowspan=2 | —
| <!-- 2d sg --> rowspan=2 | {{l|sga|bie}}
| rowspan=2 | —
| <!-- 3d sg --> {{l|sga|bieid}} || {{l|sga|·bia}}
| <!-- impersonal --> rowspan=4 | {{l|sga|bethir}}
| rowspan=4 |{{l|sga|·bether}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|bias}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> rowspan=2 | {{l|sga|beimmi}}
| rowspan=2 | {{l|sga|·biam}}
| <!-- 2d pl --> rowspan=2 | {{l|sga|bethe}}
| rowspan=2 | {{l|sga|·bieid}}
| <!-- 3d pl --> {{l|sga|bieit}} || {{l|sga|·bïat}}
|-
| <!-- 3d pl rel --> colspan=2 | {{l|sga|beite}} {{small|{{q|relative}}}}
|-
! rowspan=2 | Conditional
| <!-- 1st sg --> colspan=2 | {{l|sga|·beinn}}
| <!-- 2d sg --> colspan=2 | —
| <!-- 3d sg --> colspan=2 | {{l|sga|·biad}}
| <!-- impersonal --> rowspan=2 colspan=2 |
|-
| <!-- 1st pl --> colspan=2 | {{l|sga|·bemmis}}
| <!-- 2d pl --> colspan=2 | —
| <!-- 3d pl --> colspan=2 | {{l|sga|·betis}}
|-
! rowspan=3 | Present subjunctive
| <!-- 1st sg --> rowspan=2 | {{l|sga|béo}}
| rowspan=2 | {{l|sga|·béo}}
| <!-- 2d sg --> rowspan=2 | {{l|sga|bee}}; {{l|sga|ro·bé}} {{small|{{q|''ro''-form}}}}
| rowspan=2 | {{l|sga|·bé}}
| <!-- 3d sg --> {{l|sga|beid}}, {{l|sga|beith}}; {{l|sga|ro·bé}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bé}}; {{l|sga|·roib}} {{small|{{q|''ro''-form}}}}
| <!-- impersonal --> rowspan=2 | {{l|sga|bethir}}
| rowspan=2 | {{l|sga|·bether}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|bess}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> | {{l|sga|beimmi}}; {{l|sga|ro·bem}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bem}}; {{l|sga|·robam}} {{small|{{q|''ro''-form}}}}
| <!-- 2d pl --> | {{l|sga|beithe}}; {{l|sga|ro·beid}} {{small|{{q|''ro''-form}}}} || {{l|sga|·beid}}; {{l|sga|·robith}} {{small|{{q|''ro''-form}}}}
| <!-- 3d pl --> | {{l|sga|beit}}; {{l|sga|ro·bet}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bet}}; {{l|sga|·robat}} {{small|{{q|''ro''-form}}}}
| <!-- imps rel--> colspan=2 | {{l|sga|bether}} {{small|{{q|relative}}}}
|-
! rowspan=4 | Past subjunctive
| <!-- 1st sg --> colspan=2 rowspan=2 | {{l|sga|·beinn}}
| <!-- 2d sg --> colspan=2 rowspan=2 | {{l|sga|·betha}}
| <!-- 3d sg --> colspan=2 | {{l|sga|·beth}}
| <!-- impersonal --> rowspan=4 colspan=2 | {{l|sga|·bethe}}
|-
| {{l|sga|ro·beth}} {{small|{{q|''ro''-form}}}} || {{l|sga|·robad}}, {{l|sga|·rabad}} {{small|{{q|''ro''-form}}}}
|-
| <!-- 1st pl --> colspan=2 rowspan=2 | {{l|sga|·bemmis}}
| <!-- 2d pl --> colspan=2 rowspan=2 | {{l|sga|·bethe}}
| <!-- 3d pl --> colspan=2 | {{l|sga|·betis}}
|-
| {{l|sga|ro·betis}} {{small|{{q|''ro''-form}}}} || {{l|sga|·roibtis}} {{small|{{q|''ro''-form}}}}
|-
! rowspan=2 | Imperative
| <!-- 1st sg --> colspan=2 |
| <!-- 2d sg --> colspan=2 | {{l|sga|bí}}
| <!-- 3d sg --> colspan=2 | {{l|sga|bíid}}, {{l|sga|bíth}}
| <!-- passive --> rowspan=2 colspan=2 |
|-
| <!-- 1st pl --> colspan=2 | —
| <!-- 2d pl --> colspan=2 | {{l|sga|bíid}}, {{l|sga|bíth}}
| <!-- 3d pl --> colspan=2 | {{l|sga|bïat}}
|-
| class="separator" colspan="2" |
| class="blank-end-row" colspan="999" rowspan="999" |
|-
! verbal noun
| {{l|sga|buith}}, {{l|sga|buid}}
|-
! past participle
| –
|-
! verbal of necessity
| {{l|sga|buithi}}, {{l|sga|buthi}}
{{inflection-table-bottom|notes=*Certain conjunct forms of the present progressive are formed with {{m|sga|fil}}, taking an [[Appendix:Old Irish affixed pronouns|infixed object pronoun]] as the logical subject, e.g. {{m|sga|ní·ḟil}} "it is not", {{m|sga|ní-n·fil}} "we are not", {{m|sga|ní-s·fil}} "they are not" etc.}}
{{inflection-table-top|title=Third-person forms with [[Appendix:Old Irish affixed pronouns|affixed pronouns]] expressing 'to have'|min-width=100%|palette=yellow}}
! rowspan="3" | Person of<br/>{{tooltip|affixed pronoun|aff.​pron.}}→
! colspan="4" | singular
! colspan="3" | plural
|-
! rowspan="2" | first
! rowspan="2" | second
! colspan="2" | third
! rowspan="2" | first
! rowspan="2" | second
! rowspan="2" | third
|-
! {{g|m}}
! {{g|f}}
|-
! {{tooltip|Present indicative|Pres.​ind.}}
| {{l|sga|táthum}}, {{l|sga|nom·thá}}<br/>{{l|sga|rod·mbí}} {{small|{{q|relative, habitual, ''ro''-form}}}}<br/>{{l|sga|ním·tha}} {{small|{{q|negative}}}}<br/>{{l|sga|ním·that}} {{small|{{q|negative; plural subject}}}}
| {{l|sga|táthut}} || {{l|sga|táithi}} || {{l|sga|táthus}} || {{l|sga|táthunn}}, {{l|sga|táithiunn}}<br/>{{l|sga|nín·tá}} {{small|{{q|negative}}}} || {{l|sga|táthuib}}, {{l|sga|nob·tá}} || {{l|sga|nís·ta}} {{small|{{q|negative}}}}
|-
! Preterite
| — || — || {{l|sga|nís·mboí}} {{small|{{q|negative}}}} || — || — || — || —
|-
! Perfect
| — || — || {{l|sga|ro·mbaí}} || — || — || — || —
|-
! Future
| {{l|sga|rom·bia}} {{small|{{q|''ro''-form}}}} || — || — || — || — || {{l|sga|bethib}} || {{l|sga|bethus}} <br/>{{l|sga|ros·mbia}} {{small|{{q|''ro''-form}}}}
|-
! Conditional
| — || — || — || — || — || — || {{l|sga|ronda·biad}} {{small|{{q|relative, ''ro''-form}}}}
|-
! {{tooltip|Present subjunctive|Pres.​subj.}}
| {{l|sga|rom·bé}} || {{l|sga|rot·bé}} || — || — || — || — || —
{{inflection-table-bottom|notes=The person of the affixed pronoun corresponds to the subject of 'have' in English; the number of the verb form corresponds to the number of the direct object of ‘have’ in English. All forms in the table above have a singular subject unless otherwise indicated.}}
{{inflection-table-top|title=Combinations expressing ‘than’ with {{m|sga|al|t=beyond}}, {{m|sga|ind|t=for which}}, {{m|sga|a|t=which}}|min-width=100%|palette=yellow}}
! rowspan=2 |
! colspan="3" | singular
! colspan="3" | plural
|-
! first
! second
! third
! first
! second
! third
|-
! {{tooltip|Present indicative progressive|Pres.​indic.​prog.}}
| <!-- 1st sg --> {{l|sga|ol·dáu}}, {{l|sga|ol·dó}}<br/>{{l|sga|a·doa}}
| <!-- 2d sg --> {{l|sga|ol·daí}}, {{l|sga|ol·taí}}<br/>{{l|sga|in·daí}}<br/>{{l|sga|a·taí}}
| <!-- 3d sg --> | {{l|sga|ol·daas}}, {{l|sga|ol·doas}}<br/>{{l|sga|in·daas}}, {{l|sga|[[indás|in·dá]]([[indáas|a]])[[indás|s]]}}
| <!-- 1st pl --> —
| <!-- 2d pl --> —
| <!-- 3d pl --> {{l|sga|[[oldáte|ol·dát]]([[oldátae|a]])[[oldáte|e]]}}, {{l|sga|oldáta}}<br/>{{l|sga|[[indáte|in·dát]]([[indátae|a]])[[indáte|e]]}}
|-
! {{tooltip|Present indicative habitual|Pres.​indic.​hab.}}
| <!-- 1st sg --> | —
| <!-- 2d sg --> | {{l|sga|ol·mbí}}
| <!-- 3d sg --> | —
| <!-- 1st pl --> —
| <!-- 2d pl --> —
| <!-- 3d pl --> —
|-
! Preterite
| <!-- 1st sg --> —
| <!-- 2d sg --> —
| <!-- 3d sg --> {{l|sga|ol·mboí}}<br/>{{l|sga|i·mboí}}
| <!-- 1st pl --> —
| <!-- 2d pl --> —
| <!-- 3d pl --> {{l|sga|ol·mbátar}}
|-
! Future
| <!-- 1st sg --> —
| <!-- 2d sg --> —
| <!-- 3d sg --> —
| <!-- 1st pl --> —
| <!-- 2d pl --> {{l|sga|ola·mbieid}}
| <!-- 3d pl --> —
|}
{{inflection-box-bottom}}<noinclude>
{{tcat|conj:atta}}</noinclude>
sndieh59hkj5d4jwo77vi691m2sx935
88612
88611
2026-07-30T10:46:17Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:sga-conj-attá]]
88611
wikitext
text/x-wiki
{{inflection-box-top|palette=yellow|title=Irregular}}
{{inflection-table-top|class=very-narrow wide|palette=yellow|title= }}
! rowspan=2 |
! colspan=2 | 1st sing.
! colspan=2 | 2d sing.
! colspan=2 | 3d sing.
! rowspan=2 colspan=2 | Impersonal
|-
! colspan=2 | 1st pl.
! colspan=2 | 2d pl.
! colspan=2 | 3d pl.
|-
! rowspan=3 | {{tooltip|Present indicative progressive|Pres.​indic.​prog.}}*
| <!-- 1st sg --> rowspan=2 | {{l|sga|at·tó}}
| rowspan=2 | {{l|sga|·tó}}
| <!-- 2d sg --> rowspan=2 | {{l|sga|[[at·taí]], [[a·taí]]}}
| rowspan=2 | {{l|sga|·taí}}
| <!-- 3d sg --> | {{lang|sga|'''at·tá'''}}, {{l|sga|[[atá|a]]([[adtá|d]])[[atá|·tá]]}}, {{l|sga|[[atáa|a]]([[attáa|t]])[[atáa|·táa]]}} || {{l|sga|·tá}}
| <!-- impersonal --> rowspan=3 | —
| rowspan=3 |{{l|sga|·táthar}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|[[fil]]([[file|e]])}}, {{l|sga|feil}}, {{l|sga|fail}} {{small|{{q|relative}}}}<br/>{{l|sga|daas}} {{small|{{q|relative; found only in {{m|sga|[[cid]] [[daas]]}}, {{m|sga|indaas}}, {{m|sga|oldaas}}}}}}
|-
| <!-- 1st pl --> {{l|sga|at·taam}} || {{l|sga|·taam}}
| <!-- 2d pl --> {{l|sga|at·taïd}} || {{l|sga|·taïd}}
| <!-- 3d pl --> {{l|sga|[[ataat|a]]([[attaat|t]])[[ataat|·taat]]}} || {{l|sga|·taat}}
|-
! rowspan=4 | {{tooltip|Present indicative habitual|Pres.​indic.​hab.}}
| <!-- 1st sg --> rowspan=2 | {{l|sga|bíuu}}
| rowspan=2 | {{l|sga|·bíu}}
| <!-- 2d sg --> rowspan=2 | —
| rowspan=2 | {{l|sga|·bí}}
| <!-- 3d sg --> | {{l|sga|bíid}}; {{l|sga|ro·bí}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bí}}; {{l|sga|·rubai}} {{small|{{q|''ro''-form}}}}
| <!-- impersonal --> rowspan=4 | {{l|sga|bíthir}}; {{l|sga|ro·bíther}} {{small|{{q|''ro''-form}}}}
| rowspan=2 | {{l|sga|·bíther}}; {{l|sga|·rubther}} {{small|{{q|''ro''-form}}}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|bís}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> {{l|sga|bímmi}} || {{l|sga|·biam}}
| <!-- 2d pl --> rowspan=2 | —
| rowspan=2 | —
| <!-- 3d pl --> {{l|sga|bíit}}; {{l|sga|ro·bïat}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bïat}}; {{l|sga|·rubat}} {{small|{{q|''ro''-form}}}}
| <!-- imps rel --> rowspan=2 | {{l|sga|bíther}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl rel --> colspan=2 | {{l|sga|bímme}} {{small|{{q|relative}}}}
| <!-- 3d pl rel --> colspan=2 | {{l|sga|bíte}} {{small|{{q|relative}}}}
|-
! rowspan=2 | Imperfect indicative
| <!-- 1st sg --> colspan=2 | {{l|sga|·bíinn}}
| <!-- 2d sg --> colspan=2 | —
| <!-- 3d sg --> colspan=2 | {{l|sga|·bíth}}
| <!-- passive --> rowspan=2 colspan=2 | {{l|sga|·bíthe}}
|-
| <!-- 1st pl --> colspan=2 | {{l|sga|·bímmis}}
| <!-- 2d pl --> colspan=2 | —
| <!-- 3d pl --> colspan=2 | {{l|sga|·bítis}}
|-
! rowspan=4 | Preterite
| <!-- 1st sg --> rowspan=2 | {{l|sga|bá}}
| rowspan=2 | {{l|sga|·bá}}
| <!-- 2d sg --> rowspan=2 | —
| rowspan=2 | {{l|sga|·bá}}
| <!-- 3d sg --> {{l|sga|boí}} || {{l|sga|·boí}}
| <!-- passive --> rowspan=4 | {{l|sga|bothae}}
| rowspan=4 | {{l|sga|·both}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|boíe}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> rowspan=2 | {{l|sga|bámmar}}
| rowspan=2 | {{l|sga|·bámmar}}
| <!-- 2d pl --> rowspan=2 | —
| rowspan=2 | {{l|sga|·baid}}
| <!-- 3d pl --> | {{l|sga|bátar}} || {{l|sga|·bátar}}
|-
| <!-- 3d pl rel --> colspan=2 | {{l|sga|bátar}} {{small|{{q|relative}}}}
|-
! rowspan=2 | Perfect
| <!-- 1st sg --> {{l|sga|ro·bá}} || {{l|sga|·roba}}
| <!-- 2d sg --> {{l|sga|ro·bá}} || —
| <!-- 3d sg --> {{l|sga|ro·boí}} || {{l|sga|·robae}}, {{l|sga|·robæ}}, {{l|sga|·robe}}
| <!-- impersonal --> rowspan=2 | {{l|sga|ro·both}}
| rowspan=2 | {{l|sga|·rabad}}
|-
| <!-- 1st pl --> {{l|sga|ro·bámmar}} || {{l|sga|·robammar}}
| <!-- 2d pl --> {{l|sga|ro·baid}} || {{l|sga|·robaid}}
| <!-- 3d pl --> {{l|sga|ro·bátar}} || {{l|sga|·robatar}}
|-
! rowspan=4 | Future
| <!-- 1st sg --> rowspan=2 | {{l|sga|bia}}
| rowspan=2 | —
| <!-- 2d sg --> rowspan=2 | {{l|sga|bie}}
| rowspan=2 | —
| <!-- 3d sg --> {{l|sga|bieid}} || {{l|sga|·bia}}
| <!-- impersonal --> rowspan=4 | {{l|sga|bethir}}
| rowspan=4 |{{l|sga|·bether}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|bias}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> rowspan=2 | {{l|sga|beimmi}}
| rowspan=2 | {{l|sga|·biam}}
| <!-- 2d pl --> rowspan=2 | {{l|sga|bethe}}
| rowspan=2 | {{l|sga|·bieid}}
| <!-- 3d pl --> {{l|sga|bieit}} || {{l|sga|·bïat}}
|-
| <!-- 3d pl rel --> colspan=2 | {{l|sga|beite}} {{small|{{q|relative}}}}
|-
! rowspan=2 | Conditional
| <!-- 1st sg --> colspan=2 | {{l|sga|·beinn}}
| <!-- 2d sg --> colspan=2 | —
| <!-- 3d sg --> colspan=2 | {{l|sga|·biad}}
| <!-- impersonal --> rowspan=2 colspan=2 |
|-
| <!-- 1st pl --> colspan=2 | {{l|sga|·bemmis}}
| <!-- 2d pl --> colspan=2 | —
| <!-- 3d pl --> colspan=2 | {{l|sga|·betis}}
|-
! rowspan=3 | Present subjunctive
| <!-- 1st sg --> rowspan=2 | {{l|sga|béo}}
| rowspan=2 | {{l|sga|·béo}}
| <!-- 2d sg --> rowspan=2 | {{l|sga|bee}}; {{l|sga|ro·bé}} {{small|{{q|''ro''-form}}}}
| rowspan=2 | {{l|sga|·bé}}
| <!-- 3d sg --> {{l|sga|beid}}, {{l|sga|beith}}; {{l|sga|ro·bé}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bé}}; {{l|sga|·roib}} {{small|{{q|''ro''-form}}}}
| <!-- impersonal --> rowspan=2 | {{l|sga|bethir}}
| rowspan=2 | {{l|sga|·bether}}
|-
| <!-- 3d sg rel --> colspan=2 | {{l|sga|bess}} {{small|{{q|relative}}}}
|-
| <!-- 1st pl --> | {{l|sga|beimmi}}; {{l|sga|ro·bem}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bem}}; {{l|sga|·robam}} {{small|{{q|''ro''-form}}}}
| <!-- 2d pl --> | {{l|sga|beithe}}; {{l|sga|ro·beid}} {{small|{{q|''ro''-form}}}} || {{l|sga|·beid}}; {{l|sga|·robith}} {{small|{{q|''ro''-form}}}}
| <!-- 3d pl --> | {{l|sga|beit}}; {{l|sga|ro·bet}} {{small|{{q|''ro''-form}}}} || {{l|sga|·bet}}; {{l|sga|·robat}} {{small|{{q|''ro''-form}}}}
| <!-- imps rel--> colspan=2 | {{l|sga|bether}} {{small|{{q|relative}}}}
|-
! rowspan=4 | Past subjunctive
| <!-- 1st sg --> colspan=2 rowspan=2 | {{l|sga|·beinn}}
| <!-- 2d sg --> colspan=2 rowspan=2 | {{l|sga|·betha}}
| <!-- 3d sg --> colspan=2 | {{l|sga|·beth}}
| <!-- impersonal --> rowspan=4 colspan=2 | {{l|sga|·bethe}}
|-
| {{l|sga|ro·beth}} {{small|{{q|''ro''-form}}}} || {{l|sga|·robad}}, {{l|sga|·rabad}} {{small|{{q|''ro''-form}}}}
|-
| <!-- 1st pl --> colspan=2 rowspan=2 | {{l|sga|·bemmis}}
| <!-- 2d pl --> colspan=2 rowspan=2 | {{l|sga|·bethe}}
| <!-- 3d pl --> colspan=2 | {{l|sga|·betis}}
|-
| {{l|sga|ro·betis}} {{small|{{q|''ro''-form}}}} || {{l|sga|·roibtis}} {{small|{{q|''ro''-form}}}}
|-
! rowspan=2 | Imperative
| <!-- 1st sg --> colspan=2 |
| <!-- 2d sg --> colspan=2 | {{l|sga|bí}}
| <!-- 3d sg --> colspan=2 | {{l|sga|bíid}}, {{l|sga|bíth}}
| <!-- passive --> rowspan=2 colspan=2 |
|-
| <!-- 1st pl --> colspan=2 | —
| <!-- 2d pl --> colspan=2 | {{l|sga|bíid}}, {{l|sga|bíth}}
| <!-- 3d pl --> colspan=2 | {{l|sga|bïat}}
|-
| class="separator" colspan="2" |
| class="blank-end-row" colspan="999" rowspan="999" |
|-
! verbal noun
| {{l|sga|buith}}, {{l|sga|buid}}
|-
! past participle
| –
|-
! verbal of necessity
| {{l|sga|buithi}}, {{l|sga|buthi}}
{{inflection-table-bottom|notes=*Certain conjunct forms of the present progressive are formed with {{m|sga|fil}}, taking an [[Appendix:Old Irish affixed pronouns|infixed object pronoun]] as the logical subject, e.g. {{m|sga|ní·ḟil}} "it is not", {{m|sga|ní-n·fil}} "we are not", {{m|sga|ní-s·fil}} "they are not" etc.}}
{{inflection-table-top|title=Third-person forms with [[Appendix:Old Irish affixed pronouns|affixed pronouns]] expressing 'to have'|min-width=100%|palette=yellow}}
! rowspan="3" | Person of<br/>{{tooltip|affixed pronoun|aff.​pron.}}→
! colspan="4" | singular
! colspan="3" | plural
|-
! rowspan="2" | first
! rowspan="2" | second
! colspan="2" | third
! rowspan="2" | first
! rowspan="2" | second
! rowspan="2" | third
|-
! {{g|m}}
! {{g|f}}
|-
! {{tooltip|Present indicative|Pres.​ind.}}
| {{l|sga|táthum}}, {{l|sga|nom·thá}}<br/>{{l|sga|rod·mbí}} {{small|{{q|relative, habitual, ''ro''-form}}}}<br/>{{l|sga|ním·tha}} {{small|{{q|negative}}}}<br/>{{l|sga|ním·that}} {{small|{{q|negative; plural subject}}}}
| {{l|sga|táthut}} || {{l|sga|táithi}} || {{l|sga|táthus}} || {{l|sga|táthunn}}, {{l|sga|táithiunn}}<br/>{{l|sga|nín·tá}} {{small|{{q|negative}}}} || {{l|sga|táthuib}}, {{l|sga|nob·tá}} || {{l|sga|nís·ta}} {{small|{{q|negative}}}}
|-
! Preterite
| — || — || {{l|sga|nís·mboí}} {{small|{{q|negative}}}} || — || — || — || —
|-
! Perfect
| — || — || {{l|sga|ro·mbaí}} || — || — || — || —
|-
! Future
| {{l|sga|rom·bia}} {{small|{{q|''ro''-form}}}} || — || — || — || — || {{l|sga|bethib}} || {{l|sga|bethus}} <br/>{{l|sga|ros·mbia}} {{small|{{q|''ro''-form}}}}
|-
! Conditional
| — || — || — || — || — || — || {{l|sga|ronda·biad}} {{small|{{q|relative, ''ro''-form}}}}
|-
! {{tooltip|Present subjunctive|Pres.​subj.}}
| {{l|sga|rom·bé}} || {{l|sga|rot·bé}} || — || — || — || — || —
{{inflection-table-bottom|notes=The person of the affixed pronoun corresponds to the subject of 'have' in English; the number of the verb form corresponds to the number of the direct object of ‘have’ in English. All forms in the table above have a singular subject unless otherwise indicated.}}
{{inflection-table-top|title=Combinations expressing ‘than’ with {{m|sga|al|t=beyond}}, {{m|sga|ind|t=for which}}, {{m|sga|a|t=which}}|min-width=100%|palette=yellow}}
! rowspan=2 |
! colspan="3" | singular
! colspan="3" | plural
|-
! first
! second
! third
! first
! second
! third
|-
! {{tooltip|Present indicative progressive|Pres.​indic.​prog.}}
| <!-- 1st sg --> {{l|sga|ol·dáu}}, {{l|sga|ol·dó}}<br/>{{l|sga|a·doa}}
| <!-- 2d sg --> {{l|sga|ol·daí}}, {{l|sga|ol·taí}}<br/>{{l|sga|in·daí}}<br/>{{l|sga|a·taí}}
| <!-- 3d sg --> | {{l|sga|ol·daas}}, {{l|sga|ol·doas}}<br/>{{l|sga|in·daas}}, {{l|sga|[[indás|in·dá]]([[indáas|a]])[[indás|s]]}}
| <!-- 1st pl --> —
| <!-- 2d pl --> —
| <!-- 3d pl --> {{l|sga|[[oldáte|ol·dát]]([[oldátae|a]])[[oldáte|e]]}}, {{l|sga|oldáta}}<br/>{{l|sga|[[indáte|in·dát]]([[indátae|a]])[[indáte|e]]}}
|-
! {{tooltip|Present indicative habitual|Pres.​indic.​hab.}}
| <!-- 1st sg --> | —
| <!-- 2d sg --> | {{l|sga|ol·mbí}}
| <!-- 3d sg --> | —
| <!-- 1st pl --> —
| <!-- 2d pl --> —
| <!-- 3d pl --> —
|-
! Preterite
| <!-- 1st sg --> —
| <!-- 2d sg --> —
| <!-- 3d sg --> {{l|sga|ol·mboí}}<br/>{{l|sga|i·mboí}}
| <!-- 1st pl --> —
| <!-- 2d pl --> —
| <!-- 3d pl --> {{l|sga|ol·mbátar}}
|-
! Future
| <!-- 1st sg --> —
| <!-- 2d sg --> —
| <!-- 3d sg --> —
| <!-- 1st pl --> —
| <!-- 2d pl --> {{l|sga|ola·mbieid}}
| <!-- 3d pl --> —
|}
{{inflection-box-bottom}}<noinclude>
{{tcat|conj:atta}}</noinclude>
sndieh59hkj5d4jwo77vi691m2sx935
Teamplaid:desctree
10
17822
88613
2026-04-15T03:41:46Z
en>Chuck Entz
0
Changed protection settings for "[[Template:desctree]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88613
wikitext
text/x-wiki
#REDIRECT [[Template:descendants tree]]
b11sln24gbntbu621khvtp67ff4tuv0
88614
88613
2026-07-30T10:55:41Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:desctree]]
88613
wikitext
text/x-wiki
#REDIRECT [[Template:descendants tree]]
b11sln24gbntbu621khvtp67ff4tuv0
Teamplaid:descendants tree
10
17823
88615
2026-04-15T03:41:25Z
en>Chuck Entz
0
Changed protection settings for "[[Template:descendants tree]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88615
wikitext
text/x-wiki
{{#invoke:etymology/templates/descendant|descendants_tree}}<noinclude>{{documentation}}</noinclude>
jextvnsqr4try0jwxxcgzfnuubngjor
88616
88615
2026-07-30T10:55:53Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:descendants_tree]]
88615
wikitext
text/x-wiki
{{#invoke:etymology/templates/descendant|descendants_tree}}<noinclude>{{documentation}}</noinclude>
jextvnsqr4try0jwxxcgzfnuubngjor
Mòideal:descendants tree
828
17824
88617
2026-07-15T17:57:55Z
en>Benwing2
0
[[User:Mahagaja]] fix for descendants not found on large pages
88617
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_remove_comments_module = "Module:string/removeComments"
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function track(page)
--[[Special:WhatLinksHere/Wiktionary:Tracking/descendants tree/PAGE]]
return debug_track("descendants tree/" .. page)
end
local function preview_error(what, entry_name, language_name, reason)
mw.log("Could not retrieve " .. what .. " for " .. language_name .. " in the entry [["
.. entry_name .. "]]: " .. reason .. ".")
track(what .. " error")
end
local function get_content_after_senseid(content, entry_name, lang, id)
local code = lang:getFullCode()
local t_start, t_end
-- UGH. We need to set `not_transcluded` to true otherwise the template parser won't find all the templates
-- on large pages. We should probably default `not_transcluded` to true in general.
for template in require("Module:template parser").find_templates(content, true) do
local name = template:get_name()
if name == "senseid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
end
elseif name == "etymid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
elseif t_start ~= nil and t_end == nil then
t_end = template.index
end
elseif name == "head" or name == "etymon" then
local args = template:get_arguments()
local id_arg = args.id
if args[1] == code and id_arg == id then
t_start = template.index
elseif id_arg ~= nil and t_start ~= nil and t_end == nil then
t_end = template.index
end
end
end
if t_start == nil then
error("Could not find the correct senseid template in the entry [["
.. entry_name .. "]] (with language " .. code .. " and id '" .. id .. "')")
end
if t_end == nil then
-- terminate on L2 or another "Etymology ..." header
-- match L2 and remove it and everything after it
content = string.gsub(content:sub(t_start), "\n==[^=].+$", "")
-- match Etymology header and remove it and everything after it
content = string.gsub(content, "\n===+%s*Etymology.+$", "")
return content
end
return content:sub(t_start, t_end)
end
function export.get_alternative_forms(lang, entry_name, id, default_separator)
local page = mw.title.new(entry_name)
local content = page:getContent()
local function alt_form_error(reason)
preview_error("alternative forms", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
alt_form_error("nonexistent page")
track("alts-nonexistent-page")
return ""
end
local _, index = string.find(content,
"==[ \t]*" .. pattern_escape(lang:getFullName()) .. "[ \t]*==")
if not index then
-- FIXME, should be an error
alt_form_error("L2 header for language not found")
track("alts-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====?=?)[ \t]*Alternative forms[ \t]*%1", index, false)
if not index then
_, index = string.find(content, "\n(====?=?)[ \t]*Alternative reconstructions[ \t]*%1", index, false)
end
if not index then
-- FIXME, should be an error
alt_form_error("'Alternative forms' section for language not found")
track("alts-section-not-found")
return ""
end
local langCodeRegex = pattern_escape(lang:getFullCode())
index = string.find(content, "{{alt[ei]?r?|" .. langCodeRegex .. "|[^|}]+", index)
if (not index) or (next_lang and next_lang < index) then
-- FIXME, should be an error
alt_form_error("no 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-alter-not-found")
return ""
end
local next_section = string.find(content, "\n(=+)[^=]+%1", index)
local alternative_forms_section = string.sub(content, index, next_section)
local terms_list = {}
local altforms = require("Module:alternative forms")
for template in require("Module:template parser").find_templates(alternative_forms_section) do
if template:get_name() == "alter" then
local args = template:get_arguments()
if args[1] == lang:getFullCode() then
saw_alter = true
local formatted_altforms = altforms.display_alternative_forms(args, entry_name, "allow self link", default_separator)
table.insert(terms_list, formatted_altforms)
end
end
end
if #terms_list == 0 then
-- FIXME, should be an error
alt_form_error("no terms in 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-no-terms-in-alter")
return ""
end
return table.concat(terms_list, default_separator or ", ")
end
function export.get_descendants(lang, entry_name, id, noerror)
local page = mw.title.new(entry_name)
local content = page:getContent()
local namespace = mw.title.getCurrentTitle().nsText
local function desc_error(reason)
preview_error("descendants", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
desc_error("nonexistent page")
track("desctree-nonexistent-page")
return ""
end
-- Ignore HTML comments, columns and blank lines.
content = remove_comments(content)
:gsub("{{top%d}}%s", "")
:gsub("{{mid%d}}%s", "")
:gsub("{{bottom}}%s", "")
:gsub("\n?{{(desc?%-%l+)|?[^}]*}}",
function (template_name)
if template_name == "desc-top" or template_name == "desc-bottom" or template_name == "des-top" or template_name == "des-mid" or template_name == "des-bottom" then
return ""
end
end)
:gsub("\n%s*\n", "\n")
local _, index = string.find(content,
"%f[^\n%z]==[ \t]*" .. lang:getFullName() .. "[ \t]*==", nil, true)
if not index then
_, index = string.find(content, "%f[^\n%z]==[ \t]*"
.. pattern_escape(lang:getFullName())
.. "[ \t]*==", nil, false)
end
if not index then
desc_error("L2 header for language not found")
-- FIXME, should be an error
track("desctree-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====*)[ \t]*Descendants[ \t]*%1", index, false)
local function desctree_no_descendants(with_lang_in_error)
if noerror and (namespace == "" or namespace == "Reconstruction") then
track("desctree-no-descendants")
return "<small class=\"error previewonly\">(" ..
"Please either change this template to {{desc}} " ..
"or insert a ====Descendants==== section in [[" ..
entry_name .. "#" .. lang:getFullName() .. "]])</small>" ..
"[[Category:" .. lang:getFullName() .. " descendants to be fixed in desctree]]"
else
error(("No Descendants section was found in the entry [[%s]]%s"):format(entry_name,
with_lang_in_error and (" under the header for %s"):format(lang:getFullName()) or ""))
end
end
if not index then
return desctree_no_descendants()
elseif next_lang and next_lang < index then
return desctree_no_descendants("with lang in error")
end
-- Skip past final equals sign.
index = index + 1
-- Skip past spaces or tabs.
while true do
local new_index = string.match(content, "^[ \t]+()", index)
if not new_index then
break
end
index = new_index
end
local items = require("Module:array")()
local frame = mw.getCurrentFrame()
local previous_list_markers = ""
-- Skip paragraphs at beginning of Descendants section.
while true do
local new_index = content:match("^\n[^%*:=][^\n]*()", index)
if not new_index then
break
else
index = new_index
end
end
previous_index = 1
-- Find a consecutive series of list items that begins directly after the
-- Descendants header.
-- start_index and previous_index are used to check that list items are
-- consecutive.
for start_index, list_markers, item, index in string.gmatch(content:sub(index), "()\n([%*:]+) *([^\n]+)()") do
if start_index ~= previous_index then
break
end
-- Preprocess, but replace recursive calls to avoid template loop errors
item = string.gsub(item, "{{desctree|", "{{#invoke:etymology/templates/descendant|descendants_tree|")
item = frame:preprocess(item)
local difference = #list_markers - #previous_list_markers
if difference > 0 then
for i = #previous_list_markers + 1, #list_markers do
items:insert(list_markers:sub(i, i) == "*" and "<ul>" or "<dl>")
end
else
if difference < 0 then
for i = #previous_list_markers, #list_markers + 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
else
items:insert(previous_list_markers:sub(-1, -1) == "*" and "</li>" or "</dd>")
end
if previous_list_markers:sub(#list_markers, #list_markers) ~= list_markers:sub(-1, -1) then
items:insert(list_markers:sub(-1, -1) == "*" and "</dl><ul>" or "</ul><dl>")
end
end
items:insert(list_markers:sub(-1, -1) == "*" and "<li>" or "<dd>")
items:insert(item)
previous_list_markers = list_markers
previous_index = index
end
for i = #previous_list_markers, 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
return items:concat()
end
return export
pqx7k3asjvcuripstqlhxn72h8o44nv
88618
88617
2026-07-30T10:56:06Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:descendants_tree]]
88617
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_remove_comments_module = "Module:string/removeComments"
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function track(page)
--[[Special:WhatLinksHere/Wiktionary:Tracking/descendants tree/PAGE]]
return debug_track("descendants tree/" .. page)
end
local function preview_error(what, entry_name, language_name, reason)
mw.log("Could not retrieve " .. what .. " for " .. language_name .. " in the entry [["
.. entry_name .. "]]: " .. reason .. ".")
track(what .. " error")
end
local function get_content_after_senseid(content, entry_name, lang, id)
local code = lang:getFullCode()
local t_start, t_end
-- UGH. We need to set `not_transcluded` to true otherwise the template parser won't find all the templates
-- on large pages. We should probably default `not_transcluded` to true in general.
for template in require("Module:template parser").find_templates(content, true) do
local name = template:get_name()
if name == "senseid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
end
elseif name == "etymid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
elseif t_start ~= nil and t_end == nil then
t_end = template.index
end
elseif name == "head" or name == "etymon" then
local args = template:get_arguments()
local id_arg = args.id
if args[1] == code and id_arg == id then
t_start = template.index
elseif id_arg ~= nil and t_start ~= nil and t_end == nil then
t_end = template.index
end
end
end
if t_start == nil then
error("Could not find the correct senseid template in the entry [["
.. entry_name .. "]] (with language " .. code .. " and id '" .. id .. "')")
end
if t_end == nil then
-- terminate on L2 or another "Etymology ..." header
-- match L2 and remove it and everything after it
content = string.gsub(content:sub(t_start), "\n==[^=].+$", "")
-- match Etymology header and remove it and everything after it
content = string.gsub(content, "\n===+%s*Etymology.+$", "")
return content
end
return content:sub(t_start, t_end)
end
function export.get_alternative_forms(lang, entry_name, id, default_separator)
local page = mw.title.new(entry_name)
local content = page:getContent()
local function alt_form_error(reason)
preview_error("alternative forms", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
alt_form_error("nonexistent page")
track("alts-nonexistent-page")
return ""
end
local _, index = string.find(content,
"==[ \t]*" .. pattern_escape(lang:getFullName()) .. "[ \t]*==")
if not index then
-- FIXME, should be an error
alt_form_error("L2 header for language not found")
track("alts-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====?=?)[ \t]*Alternative forms[ \t]*%1", index, false)
if not index then
_, index = string.find(content, "\n(====?=?)[ \t]*Alternative reconstructions[ \t]*%1", index, false)
end
if not index then
-- FIXME, should be an error
alt_form_error("'Alternative forms' section for language not found")
track("alts-section-not-found")
return ""
end
local langCodeRegex = pattern_escape(lang:getFullCode())
index = string.find(content, "{{alt[ei]?r?|" .. langCodeRegex .. "|[^|}]+", index)
if (not index) or (next_lang and next_lang < index) then
-- FIXME, should be an error
alt_form_error("no 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-alter-not-found")
return ""
end
local next_section = string.find(content, "\n(=+)[^=]+%1", index)
local alternative_forms_section = string.sub(content, index, next_section)
local terms_list = {}
local altforms = require("Module:alternative forms")
for template in require("Module:template parser").find_templates(alternative_forms_section) do
if template:get_name() == "alter" then
local args = template:get_arguments()
if args[1] == lang:getFullCode() then
saw_alter = true
local formatted_altforms = altforms.display_alternative_forms(args, entry_name, "allow self link", default_separator)
table.insert(terms_list, formatted_altforms)
end
end
end
if #terms_list == 0 then
-- FIXME, should be an error
alt_form_error("no terms in 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-no-terms-in-alter")
return ""
end
return table.concat(terms_list, default_separator or ", ")
end
function export.get_descendants(lang, entry_name, id, noerror)
local page = mw.title.new(entry_name)
local content = page:getContent()
local namespace = mw.title.getCurrentTitle().nsText
local function desc_error(reason)
preview_error("descendants", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
desc_error("nonexistent page")
track("desctree-nonexistent-page")
return ""
end
-- Ignore HTML comments, columns and blank lines.
content = remove_comments(content)
:gsub("{{top%d}}%s", "")
:gsub("{{mid%d}}%s", "")
:gsub("{{bottom}}%s", "")
:gsub("\n?{{(desc?%-%l+)|?[^}]*}}",
function (template_name)
if template_name == "desc-top" or template_name == "desc-bottom" or template_name == "des-top" or template_name == "des-mid" or template_name == "des-bottom" then
return ""
end
end)
:gsub("\n%s*\n", "\n")
local _, index = string.find(content,
"%f[^\n%z]==[ \t]*" .. lang:getFullName() .. "[ \t]*==", nil, true)
if not index then
_, index = string.find(content, "%f[^\n%z]==[ \t]*"
.. pattern_escape(lang:getFullName())
.. "[ \t]*==", nil, false)
end
if not index then
desc_error("L2 header for language not found")
-- FIXME, should be an error
track("desctree-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====*)[ \t]*Descendants[ \t]*%1", index, false)
local function desctree_no_descendants(with_lang_in_error)
if noerror and (namespace == "" or namespace == "Reconstruction") then
track("desctree-no-descendants")
return "<small class=\"error previewonly\">(" ..
"Please either change this template to {{desc}} " ..
"or insert a ====Descendants==== section in [[" ..
entry_name .. "#" .. lang:getFullName() .. "]])</small>" ..
"[[Category:" .. lang:getFullName() .. " descendants to be fixed in desctree]]"
else
error(("No Descendants section was found in the entry [[%s]]%s"):format(entry_name,
with_lang_in_error and (" under the header for %s"):format(lang:getFullName()) or ""))
end
end
if not index then
return desctree_no_descendants()
elseif next_lang and next_lang < index then
return desctree_no_descendants("with lang in error")
end
-- Skip past final equals sign.
index = index + 1
-- Skip past spaces or tabs.
while true do
local new_index = string.match(content, "^[ \t]+()", index)
if not new_index then
break
end
index = new_index
end
local items = require("Module:array")()
local frame = mw.getCurrentFrame()
local previous_list_markers = ""
-- Skip paragraphs at beginning of Descendants section.
while true do
local new_index = content:match("^\n[^%*:=][^\n]*()", index)
if not new_index then
break
else
index = new_index
end
end
previous_index = 1
-- Find a consecutive series of list items that begins directly after the
-- Descendants header.
-- start_index and previous_index are used to check that list items are
-- consecutive.
for start_index, list_markers, item, index in string.gmatch(content:sub(index), "()\n([%*:]+) *([^\n]+)()") do
if start_index ~= previous_index then
break
end
-- Preprocess, but replace recursive calls to avoid template loop errors
item = string.gsub(item, "{{desctree|", "{{#invoke:etymology/templates/descendant|descendants_tree|")
item = frame:preprocess(item)
local difference = #list_markers - #previous_list_markers
if difference > 0 then
for i = #previous_list_markers + 1, #list_markers do
items:insert(list_markers:sub(i, i) == "*" and "<ul>" or "<dl>")
end
else
if difference < 0 then
for i = #previous_list_markers, #list_markers + 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
else
items:insert(previous_list_markers:sub(-1, -1) == "*" and "</li>" or "</dd>")
end
if previous_list_markers:sub(#list_markers, #list_markers) ~= list_markers:sub(-1, -1) then
items:insert(list_markers:sub(-1, -1) == "*" and "</dl><ul>" or "</ul><dl>")
end
end
items:insert(list_markers:sub(-1, -1) == "*" and "<li>" or "<dd>")
items:insert(item)
previous_list_markers = list_markers
previous_index = index
end
for i = #previous_list_markers, 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
return items:concat()
end
return export
pqx7k3asjvcuripstqlhxn72h8o44nv
88670
88618
2026-07-30T11:30:53Z
Altronic
4137
change text
88670
Scribunto
text/plain
local export = {}
local debug_track_module = "Module:debug/track"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_remove_comments_module = "Module:string/removeComments"
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function track(page)
--[[Special:WhatLinksHere/Wiktionary:Tracking/descendants tree/PAGE]]
return debug_track("descendants tree/" .. page)
end
local function preview_error(what, entry_name, language_name, reason)
mw.log("Could not retrieve " .. what .. " for " .. language_name .. " in the entry [["
.. entry_name .. "]]: " .. reason .. ".")
track(what .. " error")
end
local function get_content_after_senseid(content, entry_name, lang, id)
local code = lang:getFullCode()
local t_start, t_end
-- UGH. We need to set `not_transcluded` to true otherwise the template parser won't find all the templates
-- on large pages. We should probably default `not_transcluded` to true in general.
for template in require("Module:template parser").find_templates(content, true) do
local name = template:get_name()
if name == "senseid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
end
elseif name == "etymid" then
local args = template:get_arguments()
if args[1] == code and args[2] == id then
t_start = template.index
elseif t_start ~= nil and t_end == nil then
t_end = template.index
end
elseif name == "head" or name == "etymon" then
local args = template:get_arguments()
local id_arg = args.id
if args[1] == code and id_arg == id then
t_start = template.index
elseif id_arg ~= nil and t_start ~= nil and t_end == nil then
t_end = template.index
end
end
end
if t_start == nil then
error("Could not find the correct senseid template in the entry [["
.. entry_name .. "]] (with language " .. code .. " and id '" .. id .. "')")
end
if t_end == nil then
-- terminate on L2 or another "Etymology ..." header
-- match L2 and remove it and everything after it
content = string.gsub(content:sub(t_start), "\n==[^=].+$", "")
-- match Etymology header and remove it and everything after it
content = string.gsub(content, "\n===+%s*Freumhachadh.+$", "")
return content
end
return content:sub(t_start, t_end)
end
function export.get_alternative_forms(lang, entry_name, id, default_separator)
local page = mw.title.new(entry_name)
local content = page:getContent()
local function alt_form_error(reason)
preview_error("alternative forms", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
alt_form_error("nonexistent page")
track("alts-nonexistent-page")
return ""
end
local _, index = string.find(content,
"==[ \t]*" .. pattern_escape(lang:getFullName()) .. "[ \t]*==")
if not index then
-- FIXME, should be an error
alt_form_error("L2 header for language not found")
track("alts-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====?=?)[ \t]*Cruthan eile[ \t]*%1", index, false)
if not index then
_, index = string.find(content, "\n(====?=?)[ \t]*Alternative reconstructions[ \t]*%1", index, false)
end
if not index then
-- FIXME, should be an error
alt_form_error("'Alternative forms' section for language not found")
track("alts-section-not-found")
return ""
end
local langCodeRegex = pattern_escape(lang:getFullCode())
index = string.find(content, "{{alt[ei]?r?|" .. langCodeRegex .. "|[^|}]+", index)
if (not index) or (next_lang and next_lang < index) then
-- FIXME, should be an error
alt_form_error("no 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-alter-not-found")
return ""
end
local next_section = string.find(content, "\n(=+)[^=]+%1", index)
local alternative_forms_section = string.sub(content, index, next_section)
local terms_list = {}
local altforms = require("Module:alternative forms")
for template in require("Module:template parser").find_templates(alternative_forms_section) do
if template:get_name() == "alter" then
local args = template:get_arguments()
if args[1] == lang:getFullCode() then
saw_alter = true
local formatted_altforms = altforms.display_alternative_forms(args, entry_name, "allow self link", default_separator)
table.insert(terms_list, formatted_altforms)
end
end
end
if #terms_list == 0 then
-- FIXME, should be an error
alt_form_error("no terms in 'alt' or 'alter' template in 'Alternative forms' section for language")
track("alts-no-terms-in-alter")
return ""
end
return table.concat(terms_list, default_separator or ", ")
end
function export.get_descendants(lang, entry_name, id, noerror)
local page = mw.title.new(entry_name)
local content = page:getContent()
local namespace = mw.title.getCurrentTitle().nsText
local function desc_error(reason)
preview_error("descendants", entry_name, lang:getFullName(), reason)
end
if not content then
-- FIXME, should be an error
desc_error("nonexistent page")
track("desctree-nonexistent-page")
return ""
end
-- Ignore HTML comments, columns and blank lines.
content = remove_comments(content)
:gsub("{{top%d}}%s", "")
:gsub("{{mid%d}}%s", "")
:gsub("{{bottom}}%s", "")
:gsub("\n?{{(desc?%-%l+)|?[^}]*}}",
function (template_name)
if template_name == "desc-top" or template_name == "desc-bottom" or template_name == "des-top" or template_name == "des-mid" or template_name == "des-bottom" then
return ""
end
end)
:gsub("\n%s*\n", "\n")
local _, index = string.find(content,
"%f[^\n%z]==[ \t]*" .. lang:getFullName() .. "[ \t]*==", nil, true)
if not index then
_, index = string.find(content, "%f[^\n%z]==[ \t]*"
.. pattern_escape(lang:getFullName())
.. "[ \t]*==", nil, false)
end
if not index then
desc_error("L2 header for language not found")
-- FIXME, should be an error
track("desctree-lang-not-found")
return ""
end
if id then
content = get_content_after_senseid(content, entry_name, lang, id)
index = 0
end
local _, next_lang = string.find(content, "\n==[^=\n]+==", index, false)
local _, index = string.find(content, "\n(====*)[ \t]*Sliochdan[ \t]*%1", index, false)
local function desctree_no_descendants(with_lang_in_error)
if noerror and (namespace == "" or namespace == "Reconstruction") then
track("desctree-no-descendants")
return "<small class=\"error previewonly\">(" ..
"Please either change this template to {{desc}} " ..
"or insert a ====Sliochdan==== section in [[" ..
entry_name .. "#" .. lang:getFullName() .. "]])</small>" ..
"[[Category:" .. lang:getFullName() .. " descendants to be fixed in desctree]]"
else
error(("No Descendants section was found in the entry [[%s]]%s"):format(entry_name,
with_lang_in_error and (" under the header for %s"):format(lang:getFullName()) or ""))
end
end
if not index then
return desctree_no_descendants()
elseif next_lang and next_lang < index then
return desctree_no_descendants("with lang in error")
end
-- Skip past final equals sign.
index = index + 1
-- Skip past spaces or tabs.
while true do
local new_index = string.match(content, "^[ \t]+()", index)
if not new_index then
break
end
index = new_index
end
local items = require("Module:array")()
local frame = mw.getCurrentFrame()
local previous_list_markers = ""
-- Skip paragraphs at beginning of Descendants section.
while true do
local new_index = content:match("^\n[^%*:=][^\n]*()", index)
if not new_index then
break
else
index = new_index
end
end
previous_index = 1
-- Find a consecutive series of list items that begins directly after the
-- Descendants header.
-- start_index and previous_index are used to check that list items are
-- consecutive.
for start_index, list_markers, item, index in string.gmatch(content:sub(index), "()\n([%*:]+) *([^\n]+)()") do
if start_index ~= previous_index then
break
end
-- Preprocess, but replace recursive calls to avoid template loop errors
item = string.gsub(item, "{{desctree|", "{{#invoke:etymology/templates/descendant|descendants_tree|")
item = frame:preprocess(item)
local difference = #list_markers - #previous_list_markers
if difference > 0 then
for i = #previous_list_markers + 1, #list_markers do
items:insert(list_markers:sub(i, i) == "*" and "<ul>" or "<dl>")
end
else
if difference < 0 then
for i = #previous_list_markers, #list_markers + 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
else
items:insert(previous_list_markers:sub(-1, -1) == "*" and "</li>" or "</dd>")
end
if previous_list_markers:sub(#list_markers, #list_markers) ~= list_markers:sub(-1, -1) then
items:insert(list_markers:sub(-1, -1) == "*" and "</dl><ul>" or "</ul><dl>")
end
end
items:insert(list_markers:sub(-1, -1) == "*" and "<li>" or "<dd>")
items:insert(item)
previous_list_markers = list_markers
previous_index = index
end
for i = #previous_list_markers, 1, -1 do
items:insert(previous_list_markers:sub(i, i) == "*" and "</li></ul>" or "</dd></dl>")
end
return items:concat()
end
return export
b8c1v9022337ofimq824swq7g1wk58i
Teamplaid:senseid
10
17825
88619
2025-04-05T22:14:19Z
en>Theknightwho
0
88619
wikitext
text/x-wiki
<includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:anchors/templates|senseid_t}}</onlyinclude></includeonly><!--
-->{{documentation}}
kpbxoaulx0robyzaq7w3fuxu7wl5lyw
88620
88619
2026-07-30T10:56:35Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:senseid]]
88619
wikitext
text/x-wiki
<includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:anchors/templates|senseid_t}}</onlyinclude></includeonly><!--
-->{{documentation}}
kpbxoaulx0robyzaq7w3fuxu7wl5lyw
Teamplaid:inflection-box-top
10
17826
88621
2025-09-18T11:38:50Z
en>Fenakhay
0
88621
wikitext
text/x-wiki
<includeonly><!-- special wrapper to prevent substitution of this template -->{{ safesubst:<noinclude/>#ifeq:{{ safesubst:<noinclude/>NAMESPACE}}|{{NAMESPACE}}|
<templatestyles src="Template:inflection-table-top/style.css" />
<div class="inflection-table-wrapper inflection-box inflection-table-narrow inflection-table-collapsible inflection-table-collapsed no-vc {{#ifeq:{{{flow|}}}|vertical|flow-vertical}} tr-alongside" style="width: fit-content" data-toggle-category="{{{category|inflection}}}">
{{{!}} class="inflection-box-content" <!-- {{!}} is used in place of | due to the special safesubst: wrapper -->
{{!}}+ class="inflection-table-title" {{!}} {{{title|Inflection of ''{{PAGENAME}}''}}}
{{!}}-
{{!}}
|{{color||Do not substitute this template}}}}
</includeonly><noinclude>{{documentation}}</noinclude>
gci3wpc12n495ulmienhcm37smgmkep
88622
88621
2026-07-30T11:00:32Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:inflection-box-top]]
88621
wikitext
text/x-wiki
<includeonly><!-- special wrapper to prevent substitution of this template -->{{ safesubst:<noinclude/>#ifeq:{{ safesubst:<noinclude/>NAMESPACE}}|{{NAMESPACE}}|
<templatestyles src="Template:inflection-table-top/style.css" />
<div class="inflection-table-wrapper inflection-box inflection-table-narrow inflection-table-collapsible inflection-table-collapsed no-vc {{#ifeq:{{{flow|}}}|vertical|flow-vertical}} tr-alongside" style="width: fit-content" data-toggle-category="{{{category|inflection}}}">
{{{!}} class="inflection-box-content" <!-- {{!}} is used in place of | due to the special safesubst: wrapper -->
{{!}}+ class="inflection-table-title" {{!}} {{{title|Inflection of ''{{PAGENAME}}''}}}
{{!}}-
{{!}}
|{{color||Do not substitute this template}}}}
</includeonly><noinclude>{{documentation}}</noinclude>
gci3wpc12n495ulmienhcm37smgmkep
Teamplaid:inflection-box-bottom
10
17827
88623
2024-11-22T17:27:27Z
en>Surjection
0
Protected "[[Template:inflection-box-bottom]]": Highly visible template/module ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88623
wikitext
text/x-wiki
#REDIRECT [[template:inflection-table-bottom]]
5uv17rkt254vuit84z10z4ejjzx4lwj
88624
88623
2026-07-30T11:00:35Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:inflection-box-bottom]]
88623
wikitext
text/x-wiki
#REDIRECT [[template:inflection-table-bottom]]
5uv17rkt254vuit84z10z4ejjzx4lwj
Teamplaid:tooltip
10
17828
88625
2026-04-15T19:40:04Z
en>Surjection
0
Changed protection settings for "[[Template:tooltip]]" ([Edit=Allow only autopatrollers] (indefinite) [Move=Allow only autopatrollers] (indefinite))
88625
wikitext
text/x-wiki
<span style="cursor:help;{{#if:{{{und|}}}|border-bottom: 1px dotted currentcolor}}" title="{{#tag:nowiki|{{#invoke:string/templates|replace|{{{1|Example tool tip}}}|"|"}}}}">{{{2|Mouse over to see example tooltip}}}</span><noinclude>
{{documentation}}
</noinclude>
c2pfu40khv90z0292j3i0zb4wyyl6qt
88626
88625
2026-07-30T11:00:40Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:tooltip]]
88625
wikitext
text/x-wiki
<span style="cursor:help;{{#if:{{{und|}}}|border-bottom: 1px dotted currentcolor}}" title="{{#tag:nowiki|{{#invoke:string/templates|replace|{{{1|Example tool tip}}}|"|"}}}}">{{{2|Mouse over to see example tooltip}}}</span><noinclude>
{{documentation}}
</noinclude>
c2pfu40khv90z0292j3i0zb4wyyl6qt
Teamplaid:small
10
17829
88627
2026-06-07T08:26:24Z
en>Theknightwho
0
Changed protection settings for "[[Template:small]]": Highly visible template/module ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88627
wikitext
text/x-wiki
<span style="font-size:85%;">{{{1}}}</span><noinclude>{{documentation}}</noinclude>
8lmtlcusz1ztepug981hci6qt1dw98y
88628
88627
2026-07-30T11:00:59Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:small]]
88627
wikitext
text/x-wiki
<span style="font-size:85%;">{{{1}}}</span><noinclude>{{documentation}}</noinclude>
8lmtlcusz1ztepug981hci6qt1dw98y
Teamplaid:root
10
17830
88629
2026-04-15T08:34:04Z
en>Surjection
0
Changed protection settings for "[[Template:root]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88629
wikitext
text/x-wiki
<includeonly>{{#invoke:root|show}}</includeonly><!--
--><noinclude>{{documentation}}</noinclude>
3jzymtwa35yz59i51l95nztd643hbt9
88630
88629
2026-07-30T11:13:41Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:root]]
88629
wikitext
text/x-wiki
<includeonly>{{#invoke:root|show}}</includeonly><!--
--><noinclude>{{documentation}}</noinclude>
3jzymtwa35yz59i51l95nztd643hbt9
Mòideal:sga-IPA
828
17831
88631
2025-12-13T03:24:29Z
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)
88631
Scribunto
text/plain
local export = {}
local m_IPA = require("Module:IPA")
local m_str_utils = require("Module:string utilities")
local m_a = require("Module:accent qualifier")
local m_table = require("Module:table")
local lang = require("Module:languages").getByCode("sga")
local gsub = m_str_utils.gsub
local len = m_str_utils.len
local match = m_str_utils.match
local sub = m_str_utils.sub
local find = m_str_utils.find
local char = m_str_utils.char
local upper = m_str_utils.upper
local lower = m_str_utils.lower
local function format_accent(qual)
return m_a.format_qualifiers(lang, {qual})
end
local function squareb(text)
return "[" .. text .. "]"
end
local function gsub_rep(text, p, repl)
while text ~= gsub(text, p, repl) do
text = gsub(text, p, repl)
end
return text
end
local function IPA(text, pflag)
local ipa = text
-- Basic conversions
ipa = lower(ipa)
ipa = gsub(ipa, "ph", "ɸ")
ipa = gsub(ipa, "ch", "x")
ipa = gsub(ipa, "th", "θ")
ipa = gsub(ipa, "^g([^h])", "ɡ%1")
ipa = gsub(ipa, "^c", "k")
ipa = gsub(ipa, "([srl])c", "%1k")
ipa = gsub(ipa, "f", "ɸ")
ipa = gsub(ipa, "ss", "s")
ipa = gsub(ipa, "^n%-", "n")
ipa = gsub(ipa, "ai([bcdɸgklmnprstθx][bcdɸghklmnprstθx]?[bcdɸghklmnprstθx]?[aouáóú])", "œ%1")
-- Auslaut/intervocalic obstruent letters
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][cgrlndθ]?)b([aeiouáéíóúdɸθsgxlmnr])", "%1β%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][rlnd]?)b%f[%A]", "%1β")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][mcgx]?m?)d([aeiouáéíóúbβɸxglmnr])", "%1ð%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])d%f[%A]", "%1ð")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][mθrl]?m?)g([aeiouáéíóúbdɸθðslmnr])", "%1ɣ%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])g([ʲw]?)%f[%A]", "%1ɣ%2")
ipa = gsub(ipa, "([rlð])g%f[%A]", "%1ɡ")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])p([aeiouáéíóúbdɸglmnr])", "%1b%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])p%f[%A]", "%1b")
ipa = gsub_rep(ipa, "([aeiïoœuüáéíóú0ym])t([aeiouáéíóúbdɸglmnr])", "%1d%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])t%f[%A]", "%1d")
ipa = gsub(ipa, "([aeiïoœuüáéíóúm])c([aeiouáéíóúbβdθðɸglmnrs])", "%1ɡ%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])c%f[%A]", "%1ɡ")
-- Special hacks for Param 1 to insert idiosyncratic values
ipa = gsub(ipa, "pp", "p")
ipa = gsub(ipa, "bb", "b")
ipa = gsub(ipa, "bh", "β")
ipa = gsub(ipa, "tt", "t")
ipa = gsub(ipa, "dd", "d")
ipa = gsub(ipa, "dh", "ð")
ipa = gsub(ipa, "cc", "k")
ipa = gsub(ipa, "gg", "ɡ")
ipa = gsub(ipa, "gh", "ɣ")
ipa = gsub(ipa, "sh", "h")
ipa = gsub(ipa, "rh", "ɾ")
-- Sonorants
ipa = gsub(ipa, "([aeiïoœuüáéíóú0ybβdðɸɡgɣkxlmnpsθt̃])r([aeiouáéíóúɸβbpθðkxɡɣm])", "%1ɾ%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])r%f[%A]", "%1ɾ")
ipa = gsub(ipa, "rr", "r")
ipa = gsub(ipa, "^l([^hl])", "L%1")
ipa = gsub(ipa, "ll", "L")
ipa = gsub(ipa, "l([tdrɾns])", "L%1")
ipa = gsub(ipa, "([srn])l", "%1L")
ipa = gsub(ipa, "lh", "l") -- not an actual digraph, but analogical to Ch digraphs to mark lenited forms
ipa = gsub(ipa, "^n([^gh])", "N%1")
ipa = gsub(ipa, "nn", "N")
ipa = gsub(ipa, "n([tdrɾls])", "N%1")
ipa = gsub(ipa, "ng([^h])", "ŋɡ%1")
ipa = gsub(ipa, "ng%f[%A]", "ŋɡ")
ipa = gsub(ipa, "rŋɡ", "ɾŋɡ")
ipa = gsub(ipa, "([srL])n", "%1N")
ipa = gsub(ipa, "nh", "n") -- not an actual digraph, but analogical to Ch digraphs to mark lenited forms
ipa = gsub(ipa, "([aeiïoœuüáéíóú0yθɣ])m([aeiouáéíóúɸθdðɡkxɣslnrɾβ])", "%1β̃%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])m%f[%A]", "%1β̃")
ipa = gsub(ipa, "mm", "m")
ipa = gsub(ipa, "mh", "β̃")
-- Palatalized consonants
ipa = gsub(ipa, "([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])([eëiéïí])", "%1ʲ%2")
ipa = gsub(ipa, "([iïy])([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])", "%1%2ʲ")
ipa = gsub(ipa, "ʲ([pbβɸdðɡɣŋkxlmnrɾsθt̃LN]*[aouáóú])", "%1") -- abort palatalization if A or O appears after the consonant(s)
ipa = gsub(ipa, "[0y]", "") -- allow arbitrary forced non-palatalization or palatalization; delete these escapes after they have served their purpose
ipa = gsub_rep(ipa, "([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])([^ʲ]ʲ)", "%1ʲ%2") -- spread palatalization across a consonant cluster; this one regressively
ipa = gsub(ipa, "(.ʲ)([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])", "%1%2ʲ") -- spread palatalization progressively
ipa = gsub_rep(ipa, "ʲʲ", "ʲ") -- remove duplicate palatalization marks
ipa = gsub(ipa, "βʲ̃ʲ", "β̃ʲ")
-- Vowels.
-- First, stressed and final vowels are shielded by dummies to avoid being affected by the schwa reduction process.
-- Second, the leftover unshielded vowels are converted to schwas except for /u/.
-- Third, the results of steps 1 and 2 are cleaned up and the shielded vowels are restored.
-- Vowel shielding:
-- Shield the diphthongs first
if not pflag then
ipa = gsub(ipa, "([áéíó])u", "%1w")
ipa = gsub(ipa, "([áó])e", "%1j")
ipa = gsub(ipa, "[aou]í", {["aí"] = "áj", ["oí"] = "ój", ["uí"] = "új",})
ipa = gsub(ipa, "éo", "éw")
ipa = gsub(ipa, "ía", "η")
ipa = gsub(ipa, "úa", "ω")
-- Shield hiatuses
ipa = gsub(ipa, "i([aeiáéó])", "ι%1") -- i-initial hiatuses
ipa = gsub(ipa, "u([aeuáéó])", "υ%1") -- u-initial hiatuses
ipa = gsub(ipa, "o([aeuáéó])", "ö%1") -- o-initial hiatuses
ipa = gsub(ipa, "aa", "äa")
-- Shield unreduced short vowels
ipa = gsub(ipa, "^([smnNŋ]?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθt]?̃?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθth]?̃?ʲ?)([aeio])", "%1一%2") -- word-initially
ipa = gsub(ipa, "([%s%p][smnNŋ]?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθt]?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθth]?[̃q]?ʲ?)([aeio])", "%1一%2") -- across word boundaries in multi-word terms
ipa = gsub(ipa, "([aeio])%f[%A]", "一%1") -- word-finally
ipa = gsub(ipa, "一[aeio]", {
["一a"] = "あ",
["一e"] = "え",
["一i"] = "い",
["一o"] = "お",
})
-- Convert leftover short vowel letters to schwa
ipa = gsub(ipa, "[aei]", "ə")
ipa = gsub(ipa, "o", "u")
-- Restores shielded vowels
ipa = gsub(ipa, "[あえいお]", {
["あ"] = "a",
["え"] = "e",
["い"] = "i",
["お"] = "o",
})
ipa = gsub(ipa, "ə?([aeiouáéíóúə])ə?", "%1") -- remove schwa clusters
-- Resolve hiatuses
ipa = gsub(ipa, "ι(.)", "i.%1") -- restore shielded i-hiatuses
ipa = gsub(ipa, "iu", "i.u") -- siur "sister" etc.
ipa = gsub(ipa, "υ(.)", "u.%1") -- u-initial hiatuses
ipa = gsub(ipa, "ö(.)", "o.%1") -- o-initial hiatuses
ipa = gsub(ipa, "ë(.)", "e.%1")
-- leftover i-final hiatuses
ipa = gsub(ipa, "ï%f[%A]", ".i")
ipa = gsub(ipa, "ï", ".ə")
ipa = gsub(ipa, "ü", ".u")
ipa = gsub(ipa, "ä(.)", "a.%1")
ipa = gsub(ipa, "一", "") -- for some reason in monosyllabic open-syllable strings the shield fails to be gsubbed out; forcibly remove it in this case
end
-- Convert long vowels and diphthongs
ipa = gsub(ipa, "[áéíóúωηwj]", {
["á"] = "aː",
["é"] = "eː",
["í"] = "iː",
["ó"] = "oː",
["ú"] = "uː",
["w"] = "u̯",
["j"] = "i̯",
["η"] = "iːa̯",
["ω"] = "uːa̯",
})
ipa = gsub(ipa, "([au]̯)ə", "%1") -- remove extraneous schwa after these diphthongs
ipa = gsub(ipa, "([aeio])u", "%1u̯") -- u-affection diphthongs
-- Assign stress
if not pflag then
if find(ipa, "%s") then
ipa = "ˌ" .. ipa
ipa = gsub(ipa, "(%s)(%w-)$", "%1ˈ%2")
ipa = gsub(ipa, "(%s)([βɸðɣŋɾθ].-)$", "%1ˈ%2")
else
ipa = "ˈ" .. ipa
end
end
-- Syllabify things:
-- Split VRRV > VR.RV
ipa = gsub_rep(ipa, "([a̯eioœuəː][rɾlLnN]ʲ?)([rɾlLnN]ʲ?[a̯eioœuəː])", "%1.%2")
-- Split RT[LN] > RT.[LN]
ipa = gsub(ipa, "([a̯eioœuəː][rLN]ʲ?[td]ʲ?)([nNLl])", "%1.%2")
-- Before intervocalic consonants, and VC(R)V > V.C(R)V
ipa = gsub_rep(ipa, "([a̯eioœuəː])([pbβɸdðɡɣŋkxLlmNnrɾsθt][̃]?ʲ?[Llrɾ]?ʲ?[aeiouə])", "%1.%2")
-- For longer medial consonant clusters VCC(R)V > VC.C(R)V
ipa = gsub_rep(ipa, "([a̯eioœuəː][pbβɸdðɡɣŋkxLlmNnrɾθst][̃]?ʲ?)([smNŋ]?ʲ?[pbβɸdðɡɣŋkxLlmNnrɾsθth][̃]?ʲ?[lLNnrɾ]?ʲ?[aeiouə])", "%1.%2")
-- For VRCC(R)V > VRC.CRV
ipa = gsub_rep(ipa, "([a̯eioœuəː][LlNnɾr]?ʲ?[pbβɸdðɡɣŋkxLlmNnrɾθst][̃]?ʲ?)([sŋ]?ʲ?[pbβɸdðɡɣŋkxLlmNnrɾsθth][̃]?ʲ?[lLmNnrɾ]?ʲ?[aeiouə])", "%1.%2")
-- Convert unlenited coronals to dentals
ipa = gsub(ipa, "([td])(ʲ?)", "%1̪%2") -- dental diacritic obscured in 3rd gsub argument
ipa = gsub(ipa, "([LN])(ʲ?)", "%1̪%2") -- dental diacritic obscured in 3rd gsub argument
ipa = gsub(ipa, "[LN]", {["L"] = "l", ["N"] = "n"})
ipa = gsub(ipa, "([tdln])̪ʲ", "%1̠ʲ")
-- Fix bug where attempting to retract L and N next to a retracted stop somehow causes them to lenite instead
ipa = gsub(ipa, "([ln])([td]̪)", "%1̪%2")
ipa = gsub(ipa, "([ln])ʲ([td]̠ʲ)", "%1̠ʲ%2")
-- Return errors when certain malformed criteria are met
if find(ipa, "[cg]") then error("Unconverted c and/or g; replace the offending letter(s) with cc for /k/, gg for /ɡ/, or gh for /ɣ/") end
return ipa
end
local preverbs = {
["ad"] = "að", ["con"] = "kon", ["fo"] = "ɸo", ["fu"] = "ɸo", ["før"] = "ɸoɾ", ["as"] = "as", ["ar"] = "aɾ",
["do"] = "d̪o", ["du"] = "d̪o",
["etar"] = "ed̪aɾ",
["in"] = "in", ["imm"] = "im", ["ro"] = "ro", ["ru"] = "ro", ["fris"] = "ɸʲɾʲis",
["remi"] = "rʲeβ̃i",
["íarmi"] = "iːa̯ɾ.mi",
["mí-"] = "ˈmʲiː",
}
local function preverb(text)
-- Disambiguate fo and for
text = gsub(text, "^for", "før")
-- Splits a complex verb into detected first prefix and post-prefix material
for preverb, IPA in pairs(preverbs) do
if find(text, "^" .. preverb) then
local prefix = gsub(preverb, ".*", preverbs)
local main = sub(text, len(preverb)+1, -1)
return prefix, main
end
end
if not prefix then error("No prefix has been detected.") end
end
local function procliticize(text)
text = IPA(text, true)
text = gsub(text, "u", "o") -- these two vowels merged in pretonic syllables
-- Depalatalize non-initial consonants
text = gsub(text, "([tdln])̠", "%1̪")
text = gsub(text, "^([tdln])̪(ʲ[ei])", "%1̠%2") -- repalatalize initial coronals
text = gsub_rep(text, "([aeiou][^aeiouʲ]*)ʲ?", "%1")
text = gsub(text, "([aou])i([^̯])", "%1%2")
return text
end
function export.show(frame)
local parent_args = frame:getParent().args
local params = {
[1] = {},
[2] = {},
}
local args = require("Module:parameters").process(parent_args, params)
local title = mw.loadData("Module:headword/data").pagename
local input = args[1] or title
local input2 = args[2] or title
local ipa
if args[1] == "d" then
local preverb, main = preverb(input2)
ipa = preverb .. IPA(main)
ipa = gsub(ipa, "([aeiou])ˈ([aeiouáéíóú])", "%1ˈh%2")
elseif input == "c" then
ipa = procliticize(input2)
elseif find(input, "[%+%.#_]") then
local word1, word2
if find(input, "[%+%.#]$") then
word1 = sub(input, 1, -2)
word2 = sub(title, len(input), -1)
else
word1, word2 = match(input, "(.*)[%+%.#_](.*)")
end
if find(input, "%.") then word1 = procliticize(word1) else word1 = IPA(word1) end
word2 = IPA(word2)
if find(input, "%+") then word2 = gsub(word2, "ˈ", "ˌ") end
if find(input, "_") then word2 = gsub(word2, "ˈ", " ") end
ipa = word1 .. word2
if find(ipa, "ˈ$") then ipa = gsub(ipa, "ˈ$", "") end
else
ipa = IPA(input)
end
phonemic = "/" .. ipa .. "/"
local blasse = gsub(ipa, "ə(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?ʲ)", "ɪ%1")
blasse = gsub(blasse, "ʲə", "ʲe")
blasse = gsub(blasse, "ə", "a")
local blasse_out = "[" .. blasse .. "]"
local griffith = gsub_rep(ipa, "(%..*)u(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?)", "%1ø%2")
griffith = gsub(griffith, "ø(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?ʲ)", "ʉ%1")
griffith = gsub(griffith, "ə(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?ʲ)", "ɨ%1")
local griffith_out = "[" .. griffith .. "]"
local phonemic_data = {lang = lang, items = {{pron = phonemic}}}
phonemic_out = m_IPA.format_IPA_full(phonemic_data)
blasse_out = m_IPA.format_IPA_multiple(lang, {{pron = blasse_out, q = {"Blasse"}}})
griffith_out = m_IPA.format_IPA_multiple(lang, {{pron = griffith_out, q = {"Griffith"}}})
local output = phonemic_out
if find(phonemic, "ə") or griffith ~= ipa then
output = output .. "\n** " .. blasse_out .. "\n** " .. griffith_out
end
return output
end
return export
ljmb7aqb7peuzf237o1wvv2pxmq6tn0
88632
88631
2026-07-30T11:16:37Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:sga-IPA]]
88631
Scribunto
text/plain
local export = {}
local m_IPA = require("Module:IPA")
local m_str_utils = require("Module:string utilities")
local m_a = require("Module:accent qualifier")
local m_table = require("Module:table")
local lang = require("Module:languages").getByCode("sga")
local gsub = m_str_utils.gsub
local len = m_str_utils.len
local match = m_str_utils.match
local sub = m_str_utils.sub
local find = m_str_utils.find
local char = m_str_utils.char
local upper = m_str_utils.upper
local lower = m_str_utils.lower
local function format_accent(qual)
return m_a.format_qualifiers(lang, {qual})
end
local function squareb(text)
return "[" .. text .. "]"
end
local function gsub_rep(text, p, repl)
while text ~= gsub(text, p, repl) do
text = gsub(text, p, repl)
end
return text
end
local function IPA(text, pflag)
local ipa = text
-- Basic conversions
ipa = lower(ipa)
ipa = gsub(ipa, "ph", "ɸ")
ipa = gsub(ipa, "ch", "x")
ipa = gsub(ipa, "th", "θ")
ipa = gsub(ipa, "^g([^h])", "ɡ%1")
ipa = gsub(ipa, "^c", "k")
ipa = gsub(ipa, "([srl])c", "%1k")
ipa = gsub(ipa, "f", "ɸ")
ipa = gsub(ipa, "ss", "s")
ipa = gsub(ipa, "^n%-", "n")
ipa = gsub(ipa, "ai([bcdɸgklmnprstθx][bcdɸghklmnprstθx]?[bcdɸghklmnprstθx]?[aouáóú])", "œ%1")
-- Auslaut/intervocalic obstruent letters
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][cgrlndθ]?)b([aeiouáéíóúdɸθsgxlmnr])", "%1β%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][rlnd]?)b%f[%A]", "%1β")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][mcgx]?m?)d([aeiouáéíóúbβɸxglmnr])", "%1ð%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])d%f[%A]", "%1ð")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y][mθrl]?m?)g([aeiouáéíóúbdɸθðslmnr])", "%1ɣ%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])g([ʲw]?)%f[%A]", "%1ɣ%2")
ipa = gsub(ipa, "([rlð])g%f[%A]", "%1ɡ")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])p([aeiouáéíóúbdɸglmnr])", "%1b%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])p%f[%A]", "%1b")
ipa = gsub_rep(ipa, "([aeiïoœuüáéíóú0ym])t([aeiouáéíóúbdɸglmnr])", "%1d%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])t%f[%A]", "%1d")
ipa = gsub(ipa, "([aeiïoœuüáéíóúm])c([aeiouáéíóúbβdθðɸglmnrs])", "%1ɡ%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])c%f[%A]", "%1ɡ")
-- Special hacks for Param 1 to insert idiosyncratic values
ipa = gsub(ipa, "pp", "p")
ipa = gsub(ipa, "bb", "b")
ipa = gsub(ipa, "bh", "β")
ipa = gsub(ipa, "tt", "t")
ipa = gsub(ipa, "dd", "d")
ipa = gsub(ipa, "dh", "ð")
ipa = gsub(ipa, "cc", "k")
ipa = gsub(ipa, "gg", "ɡ")
ipa = gsub(ipa, "gh", "ɣ")
ipa = gsub(ipa, "sh", "h")
ipa = gsub(ipa, "rh", "ɾ")
-- Sonorants
ipa = gsub(ipa, "([aeiïoœuüáéíóú0ybβdðɸɡgɣkxlmnpsθt̃])r([aeiouáéíóúɸβbpθðkxɡɣm])", "%1ɾ%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])r%f[%A]", "%1ɾ")
ipa = gsub(ipa, "rr", "r")
ipa = gsub(ipa, "^l([^hl])", "L%1")
ipa = gsub(ipa, "ll", "L")
ipa = gsub(ipa, "l([tdrɾns])", "L%1")
ipa = gsub(ipa, "([srn])l", "%1L")
ipa = gsub(ipa, "lh", "l") -- not an actual digraph, but analogical to Ch digraphs to mark lenited forms
ipa = gsub(ipa, "^n([^gh])", "N%1")
ipa = gsub(ipa, "nn", "N")
ipa = gsub(ipa, "n([tdrɾls])", "N%1")
ipa = gsub(ipa, "ng([^h])", "ŋɡ%1")
ipa = gsub(ipa, "ng%f[%A]", "ŋɡ")
ipa = gsub(ipa, "rŋɡ", "ɾŋɡ")
ipa = gsub(ipa, "([srL])n", "%1N")
ipa = gsub(ipa, "nh", "n") -- not an actual digraph, but analogical to Ch digraphs to mark lenited forms
ipa = gsub(ipa, "([aeiïoœuüáéíóú0yθɣ])m([aeiouáéíóúɸθdðɡkxɣslnrɾβ])", "%1β̃%2")
ipa = gsub(ipa, "([aeiïoœuüáéíóú0y])m%f[%A]", "%1β̃")
ipa = gsub(ipa, "mm", "m")
ipa = gsub(ipa, "mh", "β̃")
-- Palatalized consonants
ipa = gsub(ipa, "([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])([eëiéïí])", "%1ʲ%2")
ipa = gsub(ipa, "([iïy])([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])", "%1%2ʲ")
ipa = gsub(ipa, "ʲ([pbβɸdðɡɣŋkxlmnrɾsθt̃LN]*[aouáóú])", "%1") -- abort palatalization if A or O appears after the consonant(s)
ipa = gsub(ipa, "[0y]", "") -- allow arbitrary forced non-palatalization or palatalization; delete these escapes after they have served their purpose
ipa = gsub_rep(ipa, "([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])([^ʲ]ʲ)", "%1ʲ%2") -- spread palatalization across a consonant cluster; this one regressively
ipa = gsub(ipa, "(.ʲ)([pbβɸdðɡɣŋkxlmnrɾsθt̃LN])", "%1%2ʲ") -- spread palatalization progressively
ipa = gsub_rep(ipa, "ʲʲ", "ʲ") -- remove duplicate palatalization marks
ipa = gsub(ipa, "βʲ̃ʲ", "β̃ʲ")
-- Vowels.
-- First, stressed and final vowels are shielded by dummies to avoid being affected by the schwa reduction process.
-- Second, the leftover unshielded vowels are converted to schwas except for /u/.
-- Third, the results of steps 1 and 2 are cleaned up and the shielded vowels are restored.
-- Vowel shielding:
-- Shield the diphthongs first
if not pflag then
ipa = gsub(ipa, "([áéíó])u", "%1w")
ipa = gsub(ipa, "([áó])e", "%1j")
ipa = gsub(ipa, "[aou]í", {["aí"] = "áj", ["oí"] = "ój", ["uí"] = "új",})
ipa = gsub(ipa, "éo", "éw")
ipa = gsub(ipa, "ía", "η")
ipa = gsub(ipa, "úa", "ω")
-- Shield hiatuses
ipa = gsub(ipa, "i([aeiáéó])", "ι%1") -- i-initial hiatuses
ipa = gsub(ipa, "u([aeuáéó])", "υ%1") -- u-initial hiatuses
ipa = gsub(ipa, "o([aeuáéó])", "ö%1") -- o-initial hiatuses
ipa = gsub(ipa, "aa", "äa")
-- Shield unreduced short vowels
ipa = gsub(ipa, "^([smnNŋ]?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθt]?̃?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθth]?̃?ʲ?)([aeio])", "%1一%2") -- word-initially
ipa = gsub(ipa, "([%s%p][smnNŋ]?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθt]?ʲ?[pbβɸdðɡɣŋkxlLmnNrɾsθth]?[̃q]?ʲ?)([aeio])", "%1一%2") -- across word boundaries in multi-word terms
ipa = gsub(ipa, "([aeio])%f[%A]", "一%1") -- word-finally
ipa = gsub(ipa, "一[aeio]", {
["一a"] = "あ",
["一e"] = "え",
["一i"] = "い",
["一o"] = "お",
})
-- Convert leftover short vowel letters to schwa
ipa = gsub(ipa, "[aei]", "ə")
ipa = gsub(ipa, "o", "u")
-- Restores shielded vowels
ipa = gsub(ipa, "[あえいお]", {
["あ"] = "a",
["え"] = "e",
["い"] = "i",
["お"] = "o",
})
ipa = gsub(ipa, "ə?([aeiouáéíóúə])ə?", "%1") -- remove schwa clusters
-- Resolve hiatuses
ipa = gsub(ipa, "ι(.)", "i.%1") -- restore shielded i-hiatuses
ipa = gsub(ipa, "iu", "i.u") -- siur "sister" etc.
ipa = gsub(ipa, "υ(.)", "u.%1") -- u-initial hiatuses
ipa = gsub(ipa, "ö(.)", "o.%1") -- o-initial hiatuses
ipa = gsub(ipa, "ë(.)", "e.%1")
-- leftover i-final hiatuses
ipa = gsub(ipa, "ï%f[%A]", ".i")
ipa = gsub(ipa, "ï", ".ə")
ipa = gsub(ipa, "ü", ".u")
ipa = gsub(ipa, "ä(.)", "a.%1")
ipa = gsub(ipa, "一", "") -- for some reason in monosyllabic open-syllable strings the shield fails to be gsubbed out; forcibly remove it in this case
end
-- Convert long vowels and diphthongs
ipa = gsub(ipa, "[áéíóúωηwj]", {
["á"] = "aː",
["é"] = "eː",
["í"] = "iː",
["ó"] = "oː",
["ú"] = "uː",
["w"] = "u̯",
["j"] = "i̯",
["η"] = "iːa̯",
["ω"] = "uːa̯",
})
ipa = gsub(ipa, "([au]̯)ə", "%1") -- remove extraneous schwa after these diphthongs
ipa = gsub(ipa, "([aeio])u", "%1u̯") -- u-affection diphthongs
-- Assign stress
if not pflag then
if find(ipa, "%s") then
ipa = "ˌ" .. ipa
ipa = gsub(ipa, "(%s)(%w-)$", "%1ˈ%2")
ipa = gsub(ipa, "(%s)([βɸðɣŋɾθ].-)$", "%1ˈ%2")
else
ipa = "ˈ" .. ipa
end
end
-- Syllabify things:
-- Split VRRV > VR.RV
ipa = gsub_rep(ipa, "([a̯eioœuəː][rɾlLnN]ʲ?)([rɾlLnN]ʲ?[a̯eioœuəː])", "%1.%2")
-- Split RT[LN] > RT.[LN]
ipa = gsub(ipa, "([a̯eioœuəː][rLN]ʲ?[td]ʲ?)([nNLl])", "%1.%2")
-- Before intervocalic consonants, and VC(R)V > V.C(R)V
ipa = gsub_rep(ipa, "([a̯eioœuəː])([pbβɸdðɡɣŋkxLlmNnrɾsθt][̃]?ʲ?[Llrɾ]?ʲ?[aeiouə])", "%1.%2")
-- For longer medial consonant clusters VCC(R)V > VC.C(R)V
ipa = gsub_rep(ipa, "([a̯eioœuəː][pbβɸdðɡɣŋkxLlmNnrɾθst][̃]?ʲ?)([smNŋ]?ʲ?[pbβɸdðɡɣŋkxLlmNnrɾsθth][̃]?ʲ?[lLNnrɾ]?ʲ?[aeiouə])", "%1.%2")
-- For VRCC(R)V > VRC.CRV
ipa = gsub_rep(ipa, "([a̯eioœuəː][LlNnɾr]?ʲ?[pbβɸdðɡɣŋkxLlmNnrɾθst][̃]?ʲ?)([sŋ]?ʲ?[pbβɸdðɡɣŋkxLlmNnrɾsθth][̃]?ʲ?[lLmNnrɾ]?ʲ?[aeiouə])", "%1.%2")
-- Convert unlenited coronals to dentals
ipa = gsub(ipa, "([td])(ʲ?)", "%1̪%2") -- dental diacritic obscured in 3rd gsub argument
ipa = gsub(ipa, "([LN])(ʲ?)", "%1̪%2") -- dental diacritic obscured in 3rd gsub argument
ipa = gsub(ipa, "[LN]", {["L"] = "l", ["N"] = "n"})
ipa = gsub(ipa, "([tdln])̪ʲ", "%1̠ʲ")
-- Fix bug where attempting to retract L and N next to a retracted stop somehow causes them to lenite instead
ipa = gsub(ipa, "([ln])([td]̪)", "%1̪%2")
ipa = gsub(ipa, "([ln])ʲ([td]̠ʲ)", "%1̠ʲ%2")
-- Return errors when certain malformed criteria are met
if find(ipa, "[cg]") then error("Unconverted c and/or g; replace the offending letter(s) with cc for /k/, gg for /ɡ/, or gh for /ɣ/") end
return ipa
end
local preverbs = {
["ad"] = "að", ["con"] = "kon", ["fo"] = "ɸo", ["fu"] = "ɸo", ["før"] = "ɸoɾ", ["as"] = "as", ["ar"] = "aɾ",
["do"] = "d̪o", ["du"] = "d̪o",
["etar"] = "ed̪aɾ",
["in"] = "in", ["imm"] = "im", ["ro"] = "ro", ["ru"] = "ro", ["fris"] = "ɸʲɾʲis",
["remi"] = "rʲeβ̃i",
["íarmi"] = "iːa̯ɾ.mi",
["mí-"] = "ˈmʲiː",
}
local function preverb(text)
-- Disambiguate fo and for
text = gsub(text, "^for", "før")
-- Splits a complex verb into detected first prefix and post-prefix material
for preverb, IPA in pairs(preverbs) do
if find(text, "^" .. preverb) then
local prefix = gsub(preverb, ".*", preverbs)
local main = sub(text, len(preverb)+1, -1)
return prefix, main
end
end
if not prefix then error("No prefix has been detected.") end
end
local function procliticize(text)
text = IPA(text, true)
text = gsub(text, "u", "o") -- these two vowels merged in pretonic syllables
-- Depalatalize non-initial consonants
text = gsub(text, "([tdln])̠", "%1̪")
text = gsub(text, "^([tdln])̪(ʲ[ei])", "%1̠%2") -- repalatalize initial coronals
text = gsub_rep(text, "([aeiou][^aeiouʲ]*)ʲ?", "%1")
text = gsub(text, "([aou])i([^̯])", "%1%2")
return text
end
function export.show(frame)
local parent_args = frame:getParent().args
local params = {
[1] = {},
[2] = {},
}
local args = require("Module:parameters").process(parent_args, params)
local title = mw.loadData("Module:headword/data").pagename
local input = args[1] or title
local input2 = args[2] or title
local ipa
if args[1] == "d" then
local preverb, main = preverb(input2)
ipa = preverb .. IPA(main)
ipa = gsub(ipa, "([aeiou])ˈ([aeiouáéíóú])", "%1ˈh%2")
elseif input == "c" then
ipa = procliticize(input2)
elseif find(input, "[%+%.#_]") then
local word1, word2
if find(input, "[%+%.#]$") then
word1 = sub(input, 1, -2)
word2 = sub(title, len(input), -1)
else
word1, word2 = match(input, "(.*)[%+%.#_](.*)")
end
if find(input, "%.") then word1 = procliticize(word1) else word1 = IPA(word1) end
word2 = IPA(word2)
if find(input, "%+") then word2 = gsub(word2, "ˈ", "ˌ") end
if find(input, "_") then word2 = gsub(word2, "ˈ", " ") end
ipa = word1 .. word2
if find(ipa, "ˈ$") then ipa = gsub(ipa, "ˈ$", "") end
else
ipa = IPA(input)
end
phonemic = "/" .. ipa .. "/"
local blasse = gsub(ipa, "ə(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?ʲ)", "ɪ%1")
blasse = gsub(blasse, "ʲə", "ʲe")
blasse = gsub(blasse, "ə", "a")
local blasse_out = "[" .. blasse .. "]"
local griffith = gsub_rep(ipa, "(%..*)u(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?)", "%1ø%2")
griffith = gsub(griffith, "ø(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?ʲ)", "ʉ%1")
griffith = gsub(griffith, "ə(%.?[pbβɸdðɡɣŋkxlmnrɾsθt][̠̪̃]?ʲ)", "ɨ%1")
local griffith_out = "[" .. griffith .. "]"
local phonemic_data = {lang = lang, items = {{pron = phonemic}}}
phonemic_out = m_IPA.format_IPA_full(phonemic_data)
blasse_out = m_IPA.format_IPA_multiple(lang, {{pron = blasse_out, q = {"Blasse"}}})
griffith_out = m_IPA.format_IPA_multiple(lang, {{pron = griffith_out, q = {"Griffith"}}})
local output = phonemic_out
if find(phonemic, "ə") or griffith ~= ipa then
output = output .. "\n** " .. blasse_out .. "\n** " .. griffith_out
end
return output
end
return export
ljmb7aqb7peuzf237o1wvv2pxmq6tn0
Mòideal:root
828
17832
88633
2026-04-15T08:34:42Z
en>Surjection
0
Changed protection settings for "[[Module:root]]" ([Edit=Allow only template editors and administrators] (indefinite) [Move=Allow only template editors and administrators] (indefinite))
88633
Scribunto
text/plain
local export = {}
local force_cat = false -- for debugging
function export.categorize(lang, source, roots, ids, sort_key)
local categories = {}
if lang:getCode() ~= source:getCode() then
table.insert(categories,
lang:getFullName() .. " terms derived from " .. source:getCanonicalName())
end
for index, root in ipairs(roots) do
if lang:getCode() == source:getCode() then
table.insert(categories,
lang:getFullName() .. " terms belonging to the root " .. root .. (ids[index] and " (" .. ids[index] .. ")" or ""))
else
table.insert(categories,
lang:getFullName() .. " terms derived from the " .. source:getCanonicalName() ..
" root " .. root .. (ids[index] and " (" .. ids[index] .. ")" or ""))
end
end
return require("Module:utilities").format_categories(categories, lang, sort_key, nil, force_cat)
end
function export.show(frame)
local params = {
[1] = { required = true, type = "language" },
[2] = { required = true, type = "language" },
[3] = { required = true, list = true },
["id"] = { list = true, allow_holes = true },
["sort"] = {},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
return export.categorize(args[1], args[2], args[3], args.id, args.sort)
end
return export
7jqrz6qw6b6zec3zoea8d5izp0z8123
88634
88633
2026-07-30T11:16:45Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:root]]
88633
Scribunto
text/plain
local export = {}
local force_cat = false -- for debugging
function export.categorize(lang, source, roots, ids, sort_key)
local categories = {}
if lang:getCode() ~= source:getCode() then
table.insert(categories,
lang:getFullName() .. " terms derived from " .. source:getCanonicalName())
end
for index, root in ipairs(roots) do
if lang:getCode() == source:getCode() then
table.insert(categories,
lang:getFullName() .. " terms belonging to the root " .. root .. (ids[index] and " (" .. ids[index] .. ")" or ""))
else
table.insert(categories,
lang:getFullName() .. " terms derived from the " .. source:getCanonicalName() ..
" root " .. root .. (ids[index] and " (" .. ids[index] .. ")" or ""))
end
end
return require("Module:utilities").format_categories(categories, lang, sort_key, nil, force_cat)
end
function export.show(frame)
local params = {
[1] = { required = true, type = "language" },
[2] = { required = true, type = "language" },
[3] = { required = true, list = true },
["id"] = { list = true, allow_holes = true },
["sort"] = {},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
return export.categorize(args[1], args[2], args[3], args.id, args.sort)
end
return export
7jqrz6qw6b6zec3zoea8d5izp0z8123
Teamplaid:affix
10
17833
88635
2023-07-14T00:59:24Z
en>WingerBot
0
[[Module:compound]] and dependencies renamed to [[Module:affix]] (manually assisted)
88635
wikitext
text/x-wiki
{{#invoke:affix/templates|affix}}<!--
--><noinclude>{{documentation}}</noinclude>
2ditreijugicoj37x0i645nlvy0iu8g
88636
88635
2026-07-30T11:17:06Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:affix]]
88635
wikitext
text/x-wiki
{{#invoke:affix/templates|affix}}<!--
--><noinclude>{{documentation}}</noinclude>
2ditreijugicoj37x0i645nlvy0iu8g
Teamplaid:prefix
10
17834
88637
2023-07-14T00:59:36Z
en>WingerBot
0
[[Module:compound]] and dependencies renamed to [[Module:affix]] (manually assisted)
88637
wikitext
text/x-wiki
{{#invoke:affix/templates|prefix}}<noinclude>{{documentation}}</noinclude>
mmebbul72q1n89syvgj9nybin6h6y1m
88638
88637
2026-07-30T11:17:12Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:prefix]]
88637
wikitext
text/x-wiki
{{#invoke:affix/templates|prefix}}<noinclude>{{documentation}}</noinclude>
mmebbul72q1n89syvgj9nybin6h6y1m
Teamplaid:suffix
10
17835
88639
2023-07-14T00:59:37Z
en>WingerBot
0
[[Module:compound]] and dependencies renamed to [[Module:affix]] (manually assisted)
88639
wikitext
text/x-wiki
{{#invoke:affix/templates|suffix}}<noinclude>{{documentation}}</noinclude>
l65if0gwy08r1csqszerts76arr4ypu
88640
88639
2026-07-30T11:17:16Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:suffix]]
88639
wikitext
text/x-wiki
{{#invoke:affix/templates|suffix}}<noinclude>{{documentation}}</noinclude>
l65if0gwy08r1csqszerts76arr4ypu
Mòideal:affix
828
17836
88641
2026-03-18T13:01:43Z
en>Theknightwho
0
Allow [[T:surface analysis]] to work with just one part; e.g. [[υπ' ατμόν]]: Univerbation of υπ' (apocopic form of υπό ("under")) + ατμόν (archaic accusative singular of ατμός ("steam; vapour")). By surface analysis, υπό ατμό ("under steam [power]").
88641
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local rsub = m_str_utils.gsub
local usub = m_str_utils.sub
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "term"
--[==[ intro:
===About different types of hyphens ("template", "display" and "lookup"):===
* The "template hyphen" is the per-script hyphen character that is used in template calls to indicate that a term is an
affix. This is always a single Unicode char, but there may be multiple possible hyphens for a given script. Normally
this is just the regular hyphen character "-", but for some non-Latin-script languages (currently only right-to-left
languages), it is different.
* The "display hyphen" is the string (which might be an empty string) that is added onto a term as displayed and linked,
to indicate that a term is an affix. Currently this is always either the same as the template hyphen or an empty
string, but the code below is written generally enough to handle arbitrary display hyphens. Specifically:
*# For East Asian languages, the display hyphen is always blank.
*# For Arabic-script languages, either tatweel (ـ) or ZWNJ (zero-width non-joiner) are allowed as template hyphens,
where ZWNJ is supported primarily for Farsi, because some suffixes have non-joining behavior. The display hyphen
corresponding to tatweel is also tatweel, but the display hyphen corresponding to ZWNJ is blank (tatweel is also
the default display hyphen, for calls to {{tl|prefix}}/{{tl|suffix}}/etc. that don't include an explicit hyphen).
* The "lookup hyphen" is the hyphen that is used when looking up language-specific affix mappings. (These mappings are
discussed in more detail below when discussing link affixes.) It depends only on the script of the affix in question.
Most scripts (including East Asian scripts) use a regular hyphen "-" as the lookup hyphen, but Hebrew and Arabic
have their own lookup hyphens (respectively maqqef and tatweel). Note that for Arabic in particular, there are
three possible template hyphens that are recognized (tatweel, ZWNJ and regular hyphen), but mappings must use tatweel.
===About different types of affixes ("template", "display", "link", "lookup" and "category"):===
* A "template affix" is an affix in its source form as it appears in a template call. Generally, a template affix has an
attached template hyphen (see above) to indicate that it is an affix and indicate what type of affix it is (prefix,
suffix, interfix or circumfix), but some of the older-style templates such as {{tl|suffix}}, {{tl|prefix}},
{{tl|confix}}, etc. have "positional" affixes where the presence of the affix in a certain position (e.g. the second
or third parameter) indicates that it is a certain type of affix, whether or not it has an attached template hyphen.
* A "display affix" is the corresponding affix as it is actually displayed to the user. The display affix may differ
from the template affix for various reasons:
*# The display affix may be specified explicitly using the {{para|alt<var>N</var>}} parameter, the `<alt:...>` inline
modifier or a piped link of the form e.g. `<nowiki>[[-kas|-käs]]</nowiki>` (here indicating that the affix should
display as `-käs` but be linked as `-kas`). Here, the template affix is arguably the entire piped link, while the
display affix is `-käs`.
*# Even in the absence of {{para|alt<var>N</var>}} parameters, `<alt:...>` inline modifiers and piped links, certain
languages have differences between the "template hyphen" specified in the template (which always needs to be
specified somehow or other in templates like {{tl|affix}}, to indicate that the term is an affix and what type of
affix it is) and the display hyphen (see above), with corresponding differences between template and display
affixes.
* A (regular) "link affix" is the affix that is linked to when the affix is shown to the user. The link affix is usually
the same as the display affix, but will differ in one of three circumstances:
*# The display and link affixes are explicitly made different using {{para|alt<var>N</var>}} parameters, `<alt:...>`
inline modifiers or piped links, as described above under "display affix".
*# For certain languages, certain affixes are mapped to canonical form using language-specific mappings. For example,
in Finnish, the adjective-forming suffix {{m|fi|-kas}} appears as {{m|fi|-käs}} after front vowels, but logically
both forms are the same suffix and should be linked and categorized the same. Similarly, in Latin, the negative and
intensive prefixes spelled {{m|la|in-}} (etymologically two distinct prefixes) appear variously as {{m|la|il-}},
{{m|la|im-}} or {{m|la|ir-}} before certain consonants. Mappings are supplied in [[Module:affix/lang-data/LANGCODE]]
to convert Finnish {{m|fi|-käs}} to {{m|fi|-kas}} for linking and categorization purposes. Note that the affixes in
the mappings use "lookup hyphens" to indicate the different types of affixes, which is usually the same as the
template hyphen but differs for Arabic scripts, because there are multiple possible template hyphens recognized but
only one lookup hyphen (tatweel). The form of the affix as used to look up in the mapping tables is called the
"lookup affix"; see below.
* A "stripped link affix" is a link affix that has been passed through the language's `stripDiacritics()` function, which
may strip certain diacritics: e.g. macrons in Latin and Old English (indicating length); acute and grave accents in
Russian and various other Slavic languages (indicating stress); vowel diacritics in most Arabic-script languages; and
also tatweel in some Arabic-script languages (currently, for example, Persian, Arabic and Urdu strip tatweel, but
Ottoman Turkish does not). Stripped link affixes are currently what are used in category names.
* A "lookup affix" is the form of the affix as it is looked up in the language-specific lookup mappings described above
under link affixes. There are actually two lookup stages:
*# First, the affix is looked up in a modified display form (specifically, the same as the display affix but using
lookup hyphens). Note that this lookup does not occur if an explicit display form is given using
{{para|alt<var>N</var>}} or an `<alt:...>` inline modifier, or if the template affix contains a piped or embedded
link.
*# If no entry is found, the affix is then looked up in a modified link form (specifically, the modified display
form passed through the language's `stripDiacritics()` function, which strips out certain diacritics, but with the
lookup hyphen re-added if it was stripped out, as in the case of tatweel in many Arabic-script languages).
The reason for this double lookup procedure is to allow for mappings that are sensitive to the extra diacritics, but
also allow for mappings that are not sensitive in this fashion (e.g. Russian {{m|ru|-ливый}} occurs both stressed and
unstressed, but is the same prefix either way).
* A "category affix" is the affix as it appears in categories such as [[:Category:Finnish terms suffixed with -kas|
Category:Finnish terms suffixed with ''-kas'']]. The category affix is currently always the same as the stripped link
affix. This means that for Arabic-script languages, it may or may not have a tatweel, even if the correponding display
affix and regular link affix have a tatweel. As mentioned above, stripDiacritics() strips tatweel for Arabic, Persian
and Urdu, but not for Ottoman Turkish. Hence affix categories for Arabic, Persian and Urdu will be missing the
tatweel, but affix categories for Ottoman Turkish will have it. An additional complication is that if the template
affix contains a ZWNJ, the display (and hence the link and category affixes) will have no hyphen attached in any case.
]==]
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
--[=[
Per-script template hyphens. The template hyphen is what appears in the {{affix}}/{{prefix}}/{{suffix}}/etc. template
(in the wikicode). See above.
They key below is a script code, after removing a hyphen and anything preceding. Hence, script codes like 'fa-Arab'
and 'ur-Arab' will match 'Arab'.
The value below is a string consisting of one or more hyphen characters. If there is more than one character, the
default hyphen must come last and a non-default function must be specified for the script in display_hyphens[] so
the correct display hyphen will be specified when no template hyphen is given (in {{suffix}}/{{prefix}}/etc.).
Script detection is normally done when linking, but we need to do it earlier. However, under most circumstances we
don't need to do script detection. Specifically, we only need to do script detection for a given language if
(a) the language has multiple scripts; and
(b) at least one of those scripts is listed below or in display_hyphens.
]=]
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
-- This covers all Arabic scripts. See above.
["Arab"] = "ـ" .. ZWNJ .. "-", -- tatweel + zero-width non-joiner + regular hyphen
["Hebr"] = "־", -- Hebrew-specific hyphen termed "maqqef"
["Mong"] = "᠊",
-- FIXME! What about the following right-to-left scripts?
-- Adlm (Adlam)
-- Armi (Imperial Aramaic)
-- Avst (Avestan)
-- Cprt (Cypriot)
-- Khar (Kharoshthi)
-- Mand (Mandaic/Mandaean)
-- Mani (Manichaean)
-- Mend (Mende/Mende Kikakui)
-- Narb (Old North Arabian)
-- Nbat (Nabataean/Nabatean)
-- Nkoo (N'Ko)
-- Orkh (Orkhon runes)
-- Phli (Inscriptional Pahlavi)
-- Phlp (Psalter Pahlavi)
-- Phlv (Book Pahlavi)
-- Phnx (Phoenician)
-- Prti (Inscriptional Parthian)
-- Rohg (Hanifi Rohingya)
-- Samr (Samaritan)
-- Sarb (Old South Arabian)
-- Sogd (Sogdian)
-- Sogo (Old Sogdian)
-- Syrc (Syriac)
-- Thaa (Thaana)
}
-- Hyphens used when looking up an affix in a lang-specific affix mapping. Defaults to regular hyphen (-). The keys
-- are script codes, after removing a hyphen and anything preceding. Hence, script codes like 'fa-Arab' and 'ur-Arab'
-- will match 'Arab'. The value should be a single character.
local lookup_hyphens = {
["Hebr"] = "־",
-- This covers all Arabic scripts. See above.
["Arab"] = "ـ",
}
-- Default display-hyphen function.
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(script, hyph)
return ""
end
-- Per-script function to return the correct display hyphen given the script and template hyphen. The function should
-- also handle the case where the passed-in template hyphen is nil, corresponding to the situation in
-- {{prefix}}/{{suffix}}/etc. where no template hyphen is specified. The key is the script code after removing a hyphen
-- and anything preceding, so 'fa-Arab', 'ur-Arab' etc. will match 'Arab'.
local display_hyphens = {
-- This covers all Arabic scripts. See above.
["Arab"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
-- The following is a mixture of several scripts. Hopefully the specs here are correct!
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Appendix:Glossary#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext) .. " compound",
cat = typ .. " compounds",
}
end
-- Make a compound type entry with a simple rather than glossary link.
-- These should be replaced with a glossary link when the entry in the glossary
-- is created.
local function make_non_glossary_compound_type(typ, alttext)
local link = alttext and "[[" .. typ .. "|" .. alttext .. "]]" or "[[" .. typ .. "]]"
return {
text = link .. " compound",
cat = typ .. " compounds",
}
end
local function make_raw_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
cat = pluralize(typ),
}
end
local function make_borrowing_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
borrowing_type = pluralize(typ),
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Internal error: Unrecognized type '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " of"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat)
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
-- Iterate an array up to the greatest integer index found.
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
while i < max_index do
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
--[==[
Join formatted parts (in `parts_formatted`) together with any overall {{para|lit}} spec (in `lit`) plus categories,
which are formatted by prepending the language name as found in `lang`. The value of an entry in `categories` can be
either a string (which is formatted using `sort_key`) or a table of the form `{ {cat=<var>category</var>,
sort_key=<var>sort_key</var>, sort_base=<var>sort_base</var>}`, specifying the sort key and sort base to use when
formatting the category. If `nocat` is given, no categories are added; otherwise, `force_cat` causes categories to be
added even on userspace pages.
]==]
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories(lang:getFullName() .. " " .. cat.cat,
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories(lang:getFullName() .. " " .. cat, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", literally " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function pluralize(pos)
if pos ~= "nouns" and usub(pos, -5) ~= "verbs" and usub(pos, -4) ~= "ives" then
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
end
return pos
end
-- Remove links and call lang:stripDiacritics(term).
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
--[=[
Convert a raw part as passed into an entry point into a part ready for linking. `lang` and `sc` are the overall
language and script objects. This uses the overall language and script objects as defaults for the part and parses off
any fragment from the term. We need to do the latter so that fragments don't end up in categories and so that we
correctly do affix mapping even in the presence of fragments.
]=]
local function canonicalize_part(part, lang, sc)
if not part then
return
end
-- Save the original (user-specified, part-specific) value of `lang`. If such a value is specified, we don't insert
-- a '*fixed with' category, and we format the part using format_derived() in [[Module:etymology]] rather than
-- full_link() in [[Module:links]].
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
--[==[
Construct a single linked part based on the information in `part`, for use by `show_affix()` and other entry points.
This should be called after `canonicalize_part()` is called on the part. This is a thin wrapper around `full_link()` in
[[Module:links]] unless `part.part_lang` is specified (indicating that a part-specific language was given), in which
case `format_derived()` in [[Module:etymology]] is called to display a term in a language other than the language of
the overall term (specified in `data.lang`). `data` contains the entire object passed into the entry point and is used
to access information for constructing the categories added by `format_derived()`.
]==]
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
lang = data.lang,
terms = {part},
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "term", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
-- Convert fa-Arab, ur-Arab etc. to Arab.
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
-- Figure out the appropriate script for the given affix and language (unless the script is explicitly passed in), and
-- return the values of template_hyphens[], display_hyphens[] and lookup_hyphens[] for that script, substituting
-- default values as appropriate. Four values are returned:
-- DETECTED_SCRIPT, TEMPLATE_HYPHEN, DISPLAY_HYPHEN, LOOKUP_HYPHEN
local function detect_script_and_hyphens(text, lang, sc)
local scode
-- 1. If the script is explicitly passed in, use it.
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
-- YUCK! `possible_script_codes` comes from loadData() so #possible_scripts doesn't work (always returns 0).
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
-- This shouldn't happen; if the language has no script codes,
-- the list {"None"} should be returned.
error("Something is majorly wrong! Language " .. lang:getCanonicalName() .. " has no script codes.")
end
if num_possible_script_codes == 1 then
-- 2. If the language has only one possible script, use it.
scode = possible_script_codes[1]
else
-- 3. Check if any of the possible scripts for the language have non-default values for template_hyphens[]
-- or display_hyphens[]. If so, we need to do script detection on the text. If not, just use "Latn",
-- which may not be technically correct but produces the right results because Latn has all default
-- values for template_hyphens[] and display_hyphens[].
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
--[=[
Given a template affix `term` and an affix type `affix_type`, change the relevant template hyphen(s) in the affix to
the display or lookup hyphen specified in `new_hyphen`, or add them if they are missing. `new_hyphen` can be a string,
specifying a fixed hyphen, or a function of two arguments (the script code `scode` and the discovered template hyphen,
or nil of no relevant template hyphen is present). `thyph_re` is a Lua pattern (which must be enclosed in parens) that
matches the possible template hyphens. Note that not all template hyphens present in the affix are changed, but only
the "relevant" ones (e.g. for a prefix, a relevant template hyphen is one coming at the end of the affix).
]=]
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "circumfix" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
-- Unlike with other types of affixes, don't try to add hyphens in the middle of the term to convert it to
-- a circumfix. Also, if the term is just hyphen + space + hyphen, return it.
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "infix" or affix_type == "interfix" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
-- If the term is just a hyphen, return it.
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "prefix" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
-- If the term is just a hyphen, return it.
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "suffix" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
-- If the term is just a hyphen, return it.
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Internal error: Unrecognized affix type '%s'"):format(affix_type))
end
end
--[=[
Look up a mapping from a given affix variant to the canonical form used in categories and links. The lookup tables are
language-specific according to `lang`, and may be ID-specific according to `affix_id`. The affixes as they appear in the
lookup tables (both the variant and the canonical form) are in "lookup affix" format (approximately speaking, they use a
regular hyphen for most scripts, but a tatweel for Arabic-script entries and a maqqef for Hebrew-script entries), but
the passed-in `affix` param is in "template affix" format (which differs from the lookup affix for Arabic-script
entries, because more types of hyphens are allowed in template affixes; see the comments at the top of the file). The
remaining parameters to this function are used to convert from template affixes to lookup affixes; see the
reconstruct_term_per_hyphens() function above.
If the affix contains brackets, no lookup is done. Otherwise, a two-stage process is used, first looking up the affix
directly and then stripping diacritics and looking it up again. The reason for this is documented above in the comments
at the top of the file (specifically, the comments describing lookup affixes).
The value of a mapping can either be a string (do the mapping regardless of affix ID) or a table indexed by affix ID
(where the special value `false` indicates no affix ID). The values of entries in this table can also be strings, or
tables with keys `affix` and `id` (again, use `false` to indicate no ID). This allows an affix mapping to map from one
ID to another (for example, this is used in English to map the [[an-]] prefix with no ID to the [[a-]] prefix with the
ID 'not').
The Given a template affix `term` and an affix type `affix_type`, change the relevant template hyphen(s) in the affix to
the display or lookup hyphen specified in `new_hyphen`, or add them if they are missing. `new_hyphen` can be a string,
specifying a fixed hyphen, or a function of two arguments (the script code `scode` and the discovered template hyphen,
or nil of no relevant template hyphen is present). `thyph_re` is a Lua pattern (which must be enclosed in parens) that
matches the possible template hyphens. Note that not all template hyphens present in the affix are changed, but only
the "relevant" ones (e.g. for a prefix, a relevant template hyphen is one coming at the end of the affix).
]=]
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(affix)
-- Ensure that the affix uses lookup hyphens regardless of whether it used a different type of hyphens before
-- or no hyphens.
local lookup_affix = reconstruct_term_per_hyphens(affix, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
-- If `lang` is an etymology-only language, look for a mapping both for it and its full parent.
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
--[==[
For a given template term in a given language (see the definition of "template affix" near the top of the file),
possibly in an explicitly specified script `sc` (but usually nil), return the term's affix type ({"prefix"},
{"interfix"}, {"suffix"}, {"circumfix"} or {"non-affix"}) along with the corresponding link and display affixes
(see definitions near the top of the file); also the corresponding lookup affix (if `return_lookup_affix` is specified).
The term passed in should already have any fragment (after the # sign) parsed off of it. Four values are returned:
`affix_type`, `link_term`, `display_term` and `lookup_term`. The affix type can be passed in instead of autodetected; in
this case, the template term need not have any attached hyphens, and the appropriate hyphens will be added in the
appropriate places. If `do_affix_mapping` is specified, look up the affix in the lang-specific affix mappings, as
described in the comment at the top of the file; otherwise, the link and display terms will always be the same. (They
will be the same in any case if the template term has a bracketed link in it or is not an affix.) If
`return_lookup_affix` is given, the fourth return value contains the term with appropriate lookup hyphens in the
appropriate places; otherwise, it is the same as the display term. (This functionality is used in
[[Module:category tree/affixes and compounds]] to convert link affixes into lookup affixes so that they can be looked up
in the affix mapping tables.)
]==]
local function parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
-- Indicates a null term to emulate the behavior of {{suffix|foo||bar}}.
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
-- HACK! ^ at the beginning of Korean languages has a special meaning, triggering capitalization of the
-- transliteration. Don't interpret it as "force non-affix" for those languages.
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
-- Formerly we allowed ^ to force non-affix type; this is now handled using an inline modifier
-- <naf>, <root>, etc. Throw an error for the moment when the old way is encountered.
error("Use of ^ to force non-affix status is no longer supported; use an inline modifier <naf> or <root> " ..
"after the component")
end
end
-- Remove an asterisk if the morpheme is reconstructed and add it back at the end.
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "circumfix"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "interfix"
elseif has_ending_hyphen then
affix_type = "prefix"
elseif has_beginning_hyphen then
affix_type = "suffix"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
-- The return value of lookup_affix_mapping() may be an affix mapping with lookup hyphens if a mapping
-- was found, otherwise nil if a mapping was not found. We need to convert to display hyphens in
-- either case, but in the latter case we can reuse the display term, which has already been converted.
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
--[==[
Add a hyphen to a term in the appropriate place, based on the specified affix type, stripping off any existing hyphens
in that place. For example, if `affix_type` == {"prefix"}, we'll add a hyphen onto the end if it's not already there (or
is of the wrong type). Three values are returned: the link term, display term and lookup term. This function is a thin
wrapper around `parse_term_for_affixes`; see the comments above that function for more information. Note that this
function is exposed externally because it is called by [[Module:category tree/affixes and compounds]]; see the comment
in `parse_term_for_affixes` for more information.
]==]
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "prefix" or affix_type == "suffix" or affix_type == "circumfix" or affix_type == "infix" or
affix_type == "interfix" or affix_type == "non-affix") then
error("Internal error: Invalid affix type " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
--[==[
Core categorization logic for affixes. This is shared between show_affix(), show_compound_like() and
get_affix_categories_only(). Returns the categories array and other metadata needed for formatting.
]==]
local function generate_affix_categories(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0)
data.borrowing_type = borrowing_type
-- Process each part
local whole_words = 0
local is_affix_or_compound = false
-- Canonicalize and generate links for all the parts first; then do categorization in a separate step, because when
-- processing the first part for categorization, we may access the second part and need it already canonicalized.
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
-- Determine affix type and get link and display terms (see text at top of file). Store them in the part
-- (in fields that won't clash with fields used by full_link() in [[Module:links]] or link_term()), so they
-- can be used in the loop below when categorizing.
part.affix_type, part.affix_link_term, part.affix_display_term = parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
-- If link_term is an empty string, either a bare ^ was specified or an empty term was used along with inline
-- modifiers. The intention in either case is not to link the term.
part.term = ine(part.affix_link_term)
-- If part.alt would be the same as part.term, make it nil, so that it isn't erroneously tracked as being
-- redundant alt text.
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
-- Now do categorization.
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
-- Make a sort key. For the first part, use the second part as the sort key; the intention is that if the
-- term has a prefix, sorting by the prefix won't be very useful so we sort by what follows, which is
-- presumably the root.
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
-- If the second-part link term is empty, the user requested an unlinked term; avoid a wikitext error
-- by using the alt value if available.
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "patronymics", sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "terms" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = "diminutive " .. data.pos, sort_key = part_sort,
sort_base = part_sort_base})
end
-- Don't add a '*fixed with' category if the link term is empty or is in a different language.
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = data.pos .. " " .. affix_type .. "ed with " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, "compound " .. data.pos)
end
end
end
-- Make sure there was either an affix or a compound (two or more non-affix terms).
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("The parameters did not include any affixes, and the term is not a compound. Please provide at least one affix.")
end
end
return text_sections, categories, borrowing_type
end
--[==[
Implementation of {{tl|affix}} and {{tl|surface analysis}}. `data` contains all the information describing the affixes to
be displayed, and contains the following:
* `.lang` ('''required'''): Overall language object. Different from term-specific language objects (see `.parts` below).
* `.sc`: Overall script object (usually omitted). Different from term-specific script objects.
* `.parts` ('''required'''): List of objects describing the affixes to show. The general format of each object is as would
be passed to `full_link()`, except that the `.lang` field should be missing unless the term is of a language
different from the overall `.lang` value (in such a case, the language name is shown along with the term and
an additional "derived from" category is added). '''WARNING''': The data in `.parts` will be destructively
modified.
* `.pos`: Overall part of speech (used in categories, defaults to {"terms"}). Different from term-specific part of speech.
* `.sort_key`: Overall sort key. Normally omitted except e.g. in Japanese.
* `.type`: Type of compound, if the parts in `.parts` describe a compound. Strictly optional, and if supplied, the
compound type is displayed before the parts (normally capitalized, unless `.nocap` is given).
* `.nocap`: Don't capitalize the first letter of text displayed before the parts (relevant only if `.type` or
`.surface_analysis` is given).
* `.notext`: Don't display any text before the parts (relevant only if `.type` or `.surface_analysis` is given).
* `.nocat`: Disable all categorization.
* `.noaffixcat`: Disable affix (and compound) categorization. Relevant for e.g. blends, which may otherwise
be incorrectly categorized as compound terms.
* `.lit`: Overall literal definition. Different from term-specific literal definitions.
* `.force_cat`: Always display categories, even on userspace pages.
* `.surface_analysis`: Implement {{surface analysis}}; adds `By surface analysis, ` before the parts.
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.show_affix(data)
local text_sections, categories, borrowing_type = generate_affix_categories(data)
-- Process each part for display
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
-- Make a link for the part
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "by " .. glossary_link("surface analysis") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
--[==[
Get only the categories that would be generated by show_affix(), without any text output or formatting.
This is used by Module:etymon to get affix categorization.
Returns an array of category objects, where
each entry is either a string (simple category name) or a table with keys `cat`, `sort_key`,
and `sort_base` for more complex categorization.
`data` should have the same structure as passed to show_affix():
* `.lang` (required): Overall language object
* `.parts` (required): Array of affix part objects with `.term`, `.lang`, `.id`, etc.
* `.pos`: Part of speech (defaults to "terms")
* `.sort_key`: Overall sort key for categories
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.get_affix_categories_only(data)
local text_sections, categories, borrowing_type = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
--[==[
Implementation of {{tl|compound}}.
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.show_compound(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, "compound " .. data.pos)
-- Make links out of all the parts
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
-- Determine affix type and get link and display terms (see text at top of file).
local affix_type, link_term, display_term = parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
-- If the term is an interfix or the type was explicitly given, recognize it as such (which means e.g. that we
-- will display the term without hyphens for East Asian languages). Otherwise, ignore the fact that it looks
-- like an affix and display as specified in the template (but pay attention to the detected affix type for
-- certain tracking purposes).
if affix_type == "interfix" or (part.type and part.type ~= "non-affix") then
-- If link_term is an empty string, either a bare ^ was specified or an empty term was used along with
-- inline modifiers. The intention in either case is not to link the term. Don't add a '*fixed with'
-- category in this case, or if the term is in a different language.
-- If part.alt would be the same as part.term, make it nil, so that it isn't erroneously tracked as being
-- redundant alt text.
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = data.pos .. " " .. affix_type .. "ed with " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
-- If `data.lang` is an etymology-only language, track both using its code and its full parent's code.
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
--[==[
Implementation of {{tl|blend}}, {{tl|univerbation}} and similar "compound-like" templates.
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, borrowing_type = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat)
end
-- Process each part for display
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
-- Make a link for the part
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
--[==[
Make `part` (a structure holding information on an affix part) into an affix of type `affix_type`, and apply any
relevant affix mappings. For example, if the desired affix type is "suffix", this will (in general) add a hyphen onto
the beginning of the term, alt, tr and ts components of the part if not already present. The hyphen that's added is the
"display hyphen" (see above) and may be script-specific. (In the case of East Asian scripts, the display hyphen is an
empty string whereas the template hyphen is the regular hyphen, meaning that any regular hyphen at the beginning of the
part will be effectively removed.) `lang` and `sc` hold overall language and script objects.
Note that this also applies any language-specific affix mappings, so that e.g. if the language is Finnish and the user
specified [[-käs]] in the affix and didn't specify an `.alt` value, `part.term` will contain [[-kas]] and `part.alt` will
contain [[-käs]].
This function is used by the "legacy" templates ({{tl|prefix}}, {{tl|suffix}}, {{tl|confix}}, etc.) where the nature of
the affix is specified by the template itself rather than auto-determined from the affix, as is the case with
{{tl|affix}}.
'''WARNING''': This destructively modifies `part`.
]==]
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
-- When we don't specify `do_affix_mapping` to make_affix(), link and display terms (first and second retvals of
-- make_affix()) are the same.
-- If part.alt would be the same as part.term, make it nil, so that it isn't erroneously tracked as being
-- redundant alt text.
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
-- If `part.lang` is an etymology-only language, track both using its code and its full parent's code.
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base)
-- Don't add a '*fixed with' category if the link term is empty or is in a different language.
if part.term and not part.part_lang then
local cat = pos .. " " .. affix_type .. "ed with " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
--[==[
Implementation of {{tl|circumfix}}.
'''WARNING''': This destructively modifies both `data` and `.prefix`, `.base` and `.suffix`.
]==]
function export.show_circumfix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
make_part_into_affix(data.prefix, data.lang, data.sc, "prefix")
make_part_into_affix(data.suffix, data.lang, data.sc, "suffix")
track_wrong_affix_type("circumfix", data.prefix, "prefix")
track_wrong_affix_type("circumfix", data.base, nil)
track_wrong_affix_type("circumfix", data.suffix, "suffix")
-- Create circumfix term.
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
-- Make links out of all the parts.
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
-- Insert the categories, but don't add a '*fixed with' category if the link term is in a different language.
if not data.prefix.part_lang then
table.insert(categories, {cat=data.pos .. " circumfixed with " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|confix}}.
'''WARNING''': This destructively modifies both `data` and `.prefix`, `.base` and `.suffix`.
]==]
function export.show_confix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
make_part_into_affix(data.prefix, data.lang, data.sc, "prefix")
make_part_into_affix(data.suffix, data.lang, data.sc, "suffix")
track_wrong_affix_type("confix", data.prefix, "prefix")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "suffix")
-- Make links out of all the parts.
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
-- Insert the categories and parts.
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "prefix", data.prefix, data.sort_key, prefix_sort_base)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
-- FIXME, should we be specifying a sort base here?
insert_affix_category(categories, data.pos, "suffix", data.suffix)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|infix}}.
'''WARNING''': This destructively modifies both `data` and `.base` and `.infix`.
]==]
function export.show_infix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
make_part_into_affix(data.infix, data.lang, data.sc, "infix")
track_wrong_affix_type("infix", data.base, nil)
track_wrong_affix_type("infix", data.infix, "infix")
-- Make links out of all the parts.
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
-- Insert the categories.
-- FIXME, should we be specifying a sort base here?
insert_affix_category(categories, data.pos, "infix", data.infix)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|prefix}}.
'''WARNING''': This destructively modifies both `data` and the structures within `.prefixes`, as well as `.base`.
]==]
function export.show_prefix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "prefix")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("prefix", prefix, "prefix")
end
track_wrong_affix_type("prefix", data.base, nil)
-- Make links out of all the parts.
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "prefix", prefix, data.sort_key, i == 1 and first_sort_base or nil)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|suffix}}.
'''WARNING''': This destructively modifies both `data` and the structures within `.suffixes`, as well as `.base`.
]==]
function export.show_suffix(data)
local categories = {}
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "suffix")
end
track_wrong_affix_type("suffix", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("suffix", suffix, "suffix")
end
-- Make links out of all the parts.
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
-- Insert the categories.
for i, suffix in ipairs(data.suffixes) do
-- FIXME, should we be specifying a sort base here?
insert_affix_category(categories, data.pos, "suffix", suffix)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "patronymics")
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
mdstvxnr2kw23xqtqvre3ecwzj3cjlv
88642
88641
2026-07-30T11:17:44Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix]]
88641
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- if set to true, always display categories even on userspace pages
local m_links = require("Module:links")
local m_str_utils = require("Module:string utilities")
local m_table = require("Module:table")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local utilities_module = "Module:utilities"
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.affix_lang_data_module_prefix = "Module:affix/lang-data/"
local rsub = m_str_utils.gsub
local usub = m_str_utils.sub
local ulen = m_str_utils.len
local rfind = m_str_utils.find
local rmatch = m_str_utils.match
local pluralize = require(en_utilities_module).pluralize
local u = m_str_utils.char
local ucfirst = m_str_utils.ucfirst
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
function export.affix_variants(canonical, variants)
local mappings = {}
for _, variant in ipairs(variants) do
mappings[variant] = canonical
end
return mappings
end
function export.id_mapping(default, ids)
local mapping = { default = default }
if ids then
for id, target in pairs(ids) do
mapping[id] = target
end
end
return mapping
end
function export.id_mapping_with_affix_variants(base, id_variants)
local mappings = {}
for id, variants in pairs(id_variants) do
for _, variant in ipairs(variants) do
mappings[variant] = export.id_mapping(base, {[id] = base})
end
end
return mappings
end
function export.merge_tables(...)
local result = {}
for i = 1, select('#', ...) do
local t = select(i, ...)
if t then
for k, v in pairs(t) do
result[k] = v
end
end
end
return result
end
-- Export this so the category code in [[Module:category tree/etymology]] can access it.
export.langs_with_lang_specific_data = {
["az"] = true,
["fi"] = true,
["fr"] = true,
["izh"] = true,
["la"] = true,
["sah"] = true,
["tr"] = true,
["trk-pro"] = true,
}
local default_pos = "term"
--[==[ intro:
===About different types of hyphens ("template", "display" and "lookup"):===
* The "template hyphen" is the per-script hyphen character that is used in template calls to indicate that a term is an
affix. This is always a single Unicode char, but there may be multiple possible hyphens for a given script. Normally
this is just the regular hyphen character "-", but for some non-Latin-script languages (currently only right-to-left
languages), it is different.
* The "display hyphen" is the string (which might be an empty string) that is added onto a term as displayed and linked,
to indicate that a term is an affix. Currently this is always either the same as the template hyphen or an empty
string, but the code below is written generally enough to handle arbitrary display hyphens. Specifically:
*# For East Asian languages, the display hyphen is always blank.
*# For Arabic-script languages, either tatweel (ـ) or ZWNJ (zero-width non-joiner) are allowed as template hyphens,
where ZWNJ is supported primarily for Farsi, because some suffixes have non-joining behavior. The display hyphen
corresponding to tatweel is also tatweel, but the display hyphen corresponding to ZWNJ is blank (tatweel is also
the default display hyphen, for calls to {{tl|prefix}}/{{tl|suffix}}/etc. that don't include an explicit hyphen).
* The "lookup hyphen" is the hyphen that is used when looking up language-specific affix mappings. (These mappings are
discussed in more detail below when discussing link affixes.) It depends only on the script of the affix in question.
Most scripts (including East Asian scripts) use a regular hyphen "-" as the lookup hyphen, but Hebrew and Arabic
have their own lookup hyphens (respectively maqqef and tatweel). Note that for Arabic in particular, there are
three possible template hyphens that are recognized (tatweel, ZWNJ and regular hyphen), but mappings must use tatweel.
===About different types of affixes ("template", "display", "link", "lookup" and "category"):===
* A "template affix" is an affix in its source form as it appears in a template call. Generally, a template affix has an
attached template hyphen (see above) to indicate that it is an affix and indicate what type of affix it is (prefix,
suffix, interfix or circumfix), but some of the older-style templates such as {{tl|suffix}}, {{tl|prefix}},
{{tl|confix}}, etc. have "positional" affixes where the presence of the affix in a certain position (e.g. the second
or third parameter) indicates that it is a certain type of affix, whether or not it has an attached template hyphen.
* A "display affix" is the corresponding affix as it is actually displayed to the user. The display affix may differ
from the template affix for various reasons:
*# The display affix may be specified explicitly using the {{para|alt<var>N</var>}} parameter, the `<alt:...>` inline
modifier or a piped link of the form e.g. `<nowiki>[[-kas|-käs]]</nowiki>` (here indicating that the affix should
display as `-käs` but be linked as `-kas`). Here, the template affix is arguably the entire piped link, while the
display affix is `-käs`.
*# Even in the absence of {{para|alt<var>N</var>}} parameters, `<alt:...>` inline modifiers and piped links, certain
languages have differences between the "template hyphen" specified in the template (which always needs to be
specified somehow or other in templates like {{tl|affix}}, to indicate that the term is an affix and what type of
affix it is) and the display hyphen (see above), with corresponding differences between template and display
affixes.
* A (regular) "link affix" is the affix that is linked to when the affix is shown to the user. The link affix is usually
the same as the display affix, but will differ in one of three circumstances:
*# The display and link affixes are explicitly made different using {{para|alt<var>N</var>}} parameters, `<alt:...>`
inline modifiers or piped links, as described above under "display affix".
*# For certain languages, certain affixes are mapped to canonical form using language-specific mappings. For example,
in Finnish, the adjective-forming suffix {{m|fi|-kas}} appears as {{m|fi|-käs}} after front vowels, but logically
both forms are the same suffix and should be linked and categorized the same. Similarly, in Latin, the negative and
intensive prefixes spelled {{m|la|in-}} (etymologically two distinct prefixes) appear variously as {{m|la|il-}},
{{m|la|im-}} or {{m|la|ir-}} before certain consonants. Mappings are supplied in [[Module:affix/lang-data/LANGCODE]]
to convert Finnish {{m|fi|-käs}} to {{m|fi|-kas}} for linking and categorization purposes. Note that the affixes in
the mappings use "lookup hyphens" to indicate the different types of affixes, which is usually the same as the
template hyphen but differs for Arabic scripts, because there are multiple possible template hyphens recognized but
only one lookup hyphen (tatweel). The form of the affix as used to look up in the mapping tables is called the
"lookup affix"; see below.
* A "stripped link affix" is a link affix that has been passed through the language's `stripDiacritics()` function, which
may strip certain diacritics: e.g. macrons in Latin and Old English (indicating length); acute and grave accents in
Russian and various other Slavic languages (indicating stress); vowel diacritics in most Arabic-script languages; and
also tatweel in some Arabic-script languages (currently, for example, Persian, Arabic and Urdu strip tatweel, but
Ottoman Turkish does not). Stripped link affixes are currently what are used in category names.
* A "lookup affix" is the form of the affix as it is looked up in the language-specific lookup mappings described above
under link affixes. There are actually two lookup stages:
*# First, the affix is looked up in a modified display form (specifically, the same as the display affix but using
lookup hyphens). Note that this lookup does not occur if an explicit display form is given using
{{para|alt<var>N</var>}} or an `<alt:...>` inline modifier, or if the template affix contains a piped or embedded
link.
*# If no entry is found, the affix is then looked up in a modified link form (specifically, the modified display
form passed through the language's `stripDiacritics()` function, which strips out certain diacritics, but with the
lookup hyphen re-added if it was stripped out, as in the case of tatweel in many Arabic-script languages).
The reason for this double lookup procedure is to allow for mappings that are sensitive to the extra diacritics, but
also allow for mappings that are not sensitive in this fashion (e.g. Russian {{m|ru|-ливый}} occurs both stressed and
unstressed, but is the same prefix either way).
* A "category affix" is the affix as it appears in categories such as [[:Category:Finnish terms suffixed with -kas|
Category:Finnish terms suffixed with ''-kas'']]. The category affix is currently always the same as the stripped link
affix. This means that for Arabic-script languages, it may or may not have a tatweel, even if the correponding display
affix and regular link affix have a tatweel. As mentioned above, stripDiacritics() strips tatweel for Arabic, Persian
and Urdu, but not for Ottoman Turkish. Hence affix categories for Arabic, Persian and Urdu will be missing the
tatweel, but affix categories for Ottoman Turkish will have it. An additional complication is that if the template
affix contains a ZWNJ, the display (and hence the link and category affixes) will have no hyphen attached in any case.
]==]
-----------------------------------------------------------------------------------------
-- Template and display hyphens --
-----------------------------------------------------------------------------------------
--[=[
Per-script template hyphens. The template hyphen is what appears in the {{affix}}/{{prefix}}/{{suffix}}/etc. template
(in the wikicode). See above.
They key below is a script code, after removing a hyphen and anything preceding. Hence, script codes like 'fa-Arab'
and 'ur-Arab' will match 'Arab'.
The value below is a string consisting of one or more hyphen characters. If there is more than one character, the
default hyphen must come last and a non-default function must be specified for the script in display_hyphens[] so
the correct display hyphen will be specified when no template hyphen is given (in {{suffix}}/{{prefix}}/etc.).
Script detection is normally done when linking, but we need to do it earlier. However, under most circumstances we
don't need to do script detection. Specifically, we only need to do script detection for a given language if
(a) the language has multiple scripts; and
(b) at least one of those scripts is listed below or in display_hyphens.
]=]
local ZWNJ = u(0x200C) -- zero-width non-joiner
local template_hyphens = {
-- This covers all Arabic scripts. See above.
["Arab"] = "ـ" .. ZWNJ .. "-", -- tatweel + zero-width non-joiner + regular hyphen
["Hebr"] = "־", -- Hebrew-specific hyphen termed "maqqef"
["Mong"] = "᠊",
-- FIXME! What about the following right-to-left scripts?
-- Adlm (Adlam)
-- Armi (Imperial Aramaic)
-- Avst (Avestan)
-- Cprt (Cypriot)
-- Khar (Kharoshthi)
-- Mand (Mandaic/Mandaean)
-- Mani (Manichaean)
-- Mend (Mende/Mende Kikakui)
-- Narb (Old North Arabian)
-- Nbat (Nabataean/Nabatean)
-- Nkoo (N'Ko)
-- Orkh (Orkhon runes)
-- Phli (Inscriptional Pahlavi)
-- Phlp (Psalter Pahlavi)
-- Phlv (Book Pahlavi)
-- Phnx (Phoenician)
-- Prti (Inscriptional Parthian)
-- Rohg (Hanifi Rohingya)
-- Samr (Samaritan)
-- Sarb (Old South Arabian)
-- Sogd (Sogdian)
-- Sogo (Old Sogdian)
-- Syrc (Syriac)
-- Thaa (Thaana)
}
-- Hyphens used when looking up an affix in a lang-specific affix mapping. Defaults to regular hyphen (-). The keys
-- are script codes, after removing a hyphen and anything preceding. Hence, script codes like 'fa-Arab' and 'ur-Arab'
-- will match 'Arab'. The value should be a single character.
local lookup_hyphens = {
["Hebr"] = "־",
-- This covers all Arabic scripts. See above.
["Arab"] = "ـ",
}
-- Default display-hyphen function.
local function default_display_hyphen(script, hyph)
if not hyph then
return template_hyphens[script] or "-"
end
return hyph
end
local function arab_get_display_hyphen(script, hyph)
if not hyph then
return "ـ" -- tatweel
elseif hyph == ZWNJ then
return ""
else
return hyph
end
end
local function no_display_hyphen(script, hyph)
return ""
end
-- Per-script function to return the correct display hyphen given the script and template hyphen. The function should
-- also handle the case where the passed-in template hyphen is nil, corresponding to the situation in
-- {{prefix}}/{{suffix}}/etc. where no template hyphen is specified. The key is the script code after removing a hyphen
-- and anything preceding, so 'fa-Arab', 'ur-Arab' etc. will match 'Arab'.
local display_hyphens = {
-- This covers all Arabic scripts. See above.
["Arab"] = arab_get_display_hyphen,
["Bopo"] = no_display_hyphen,
["Hani"] = no_display_hyphen,
["Hans"] = no_display_hyphen,
["Hant"] = no_display_hyphen,
-- The following is a mixture of several scripts. Hopefully the specs here are correct!
["Jpan"] = no_display_hyphen,
["Jurc"] = no_display_hyphen,
["Kitl"] = no_display_hyphen,
["Kits"] = no_display_hyphen,
["Laoo"] = no_display_hyphen,
["Nshu"] = no_display_hyphen,
["Shui"] = no_display_hyphen,
["Tang"] = no_display_hyphen,
["Thaa"] = no_display_hyphen,
["Thai"] = no_display_hyphen,
["Tibt"] = no_display_hyphen,
}
-----------------------------------------------------------------------------------------
-- Basic Utility functions --
-----------------------------------------------------------------------------------------
local function glossary_link(entry, text)
text = text or entry
return "[[Appendix:Glossary#" .. entry .. "|" .. text .. "]]"
end
local function track(page)
if type(page) == "table" then
for i, pg in ipairs(page) do
page[i] = "affix/" .. pg
end
else
page = "affix/" .. page
end
require("Module:debug/track")(page)
end
local function ine(val)
return val ~= "" and val or nil
end
-----------------------------------------------------------------------------------------
-- Compound types --
-----------------------------------------------------------------------------------------
local function make_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext) .. " compound",
cat = typ .. " compounds",
}
end
-- Make a compound type entry with a simple rather than glossary link.
-- These should be replaced with a glossary link when the entry in the glossary
-- is created.
local function make_non_glossary_compound_type(typ, alttext)
local link = alttext and "[[" .. typ .. "|" .. alttext .. "]]" or "[[" .. typ .. "]]"
return {
text = link .. " compound",
cat = typ .. " compounds",
}
end
local function make_raw_compound_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
cat = pluralize(typ),
}
end
local function make_borrowing_type(typ, alttext)
return {
text = glossary_link(typ, alttext),
borrowing_type = pluralize(typ),
}
end
export.etymology_types = {
["adapted borrowing"] = make_borrowing_type("adapted borrowing"),
["adap"] = "adapted borrowing",
["abor"] = "adapted borrowing",
["alliterative"] = make_non_glossary_compound_type("alliterative"),
["allit"] = "alliterative",
["antonymous"] = make_non_glossary_compound_type("antonymous"),
["ant"] = "antonymous",
["bahuvrihi"] = make_compound_type("bahuvrihi", "bahuvrīhi"),
["bahu"] = "bahuvrihi",
["bv"] = "bahuvrihi",
["coordinative"] = make_compound_type("coordinative"),
["coord"] = "coordinative",
["descriptive"] = make_compound_type("descriptive"),
["desc"] = "descriptive",
["determinative"] = make_compound_type("determinative"),
["det"] = "determinative",
["dvandva"] = make_compound_type("dvandva"),
["dva"] = "dvandva",
["dvigu"] = make_compound_type("dvigu"),
["dvi"] = "dvigu",
["endocentric"] = make_compound_type("endocentric"),
["endo"] = "endocentric",
["exocentric"] = make_compound_type("exocentric"),
["exo"] = "exocentric",
["izafet I"] = make_compound_type("izafet I"),
["iz1"] = "izafet I",
["izafet II"] = make_compound_type("izafet II"),
["iz2"] = "izafet II",
["izafet III"] = make_compound_type("izafet III"),
["iz3"] = "izafet III",
["karmadharaya"] = make_compound_type("karmadharaya", "karmadhāraya"),
["karma"] = "karmadharaya",
["kd"] = "karmadharaya",
["kenning"] = make_raw_compound_type("kenning"),
["ken"] = "kenning",
["rhyming"] = make_non_glossary_compound_type("rhyming"),
["rhy"] = "rhyming",
["synonymous"] = make_non_glossary_compound_type("synonymous"),
["syn"] = "synonymous",
["tatpurusa"] = make_compound_type("tatpurusa", "tatpuruṣa"),
["tat"] = "tatpurusa",
["tp"] = "tatpurusa",
}
local function process_etymology_type(typ, nocap, notext, has_parts)
local text_sections = {}
local categories = {}
local borrowing_type
if typ then
local typdata = export.etymology_types[typ]
if type(typdata) == "string" then
typdata = export.etymology_types[typdata]
end
if not typdata then
error("Internal error: Unrecognized type '" .. typ .. "'")
end
local text = typdata.text
if not nocap then
text = ucfirst(text)
end
local cat = typdata.cat
borrowing_type = typdata.borrowing_type
local oftext = typdata.oftext or " of"
if not notext then
table.insert(text_sections, text)
if has_parts then
table.insert(text_sections, oftext)
table.insert(text_sections, " ")
end
end
if cat then
table.insert(categories, cat)
end
end
return text_sections, categories, borrowing_type
end
-----------------------------------------------------------------------------------------
-- Utility functions --
-----------------------------------------------------------------------------------------
-- Iterate an array up to the greatest integer index found.
local function ipairs_with_gaps(t)
local indices = m_table.numKeys(t)
local max_index = #indices > 0 and math.max(unpack(indices)) or 0
local i = 0
return function()
while i < max_index do
i = i + 1
return i, t[i]
end
end
end
export.ipairs_with_gaps = ipairs_with_gaps
--[==[
Join formatted parts (in `parts_formatted`) together with any overall {{para|lit}} spec (in `lit`) plus categories,
which are formatted by prepending the language name as found in `lang`. The value of an entry in `categories` can be
either a string (which is formatted using `sort_key`) or a table of the form `{ {cat=<var>category</var>,
sort_key=<var>sort_key</var>, sort_base=<var>sort_base</var>}`, specifying the sort key and sort base to use when
formatting the category. If `nocat` is given, no categories are added; otherwise, `force_cat` causes categories to be
added even on userspace pages.
]==]
function export.join_formatted_parts(data)
local cattext
local lang = data.data.lang
local force_cat = data.data.force_cat or debug_force_cat
if data.data.nocat then
cattext = ""
else
for i, cat in ipairs(data.categories) do
if type(cat) == "table" then
data.categories[i] = require(utilities_module).format_categories(lang:getFullName() .. " " .. cat.cat,
lang, cat.sort_key, cat.sort_base, force_cat)
else
data.categories[i] = require(utilities_module).format_categories(lang:getFullName() .. " " .. cat, lang,
data.data.sort_key, nil, force_cat)
end
end
cattext = table.concat(data.categories)
end
local result = table.concat(data.parts_formatted, not data.separator_already_added and " +‎ " or nil) ..
(data.data.lit and ", literally " .. m_links.mark(data.data.lit, "gloss") or "")
local q = data.data.q
local qq = data.data.qq
local l = data.data.l
local ll = data.data.ll
local infl = data.data.infl
if q and q[1] or qq and qq[1] or l and l[1] or ll and ll[1] or infl and infl[1] then
result = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = result,
q = q,
qq = qq,
l = l,
ll = ll,
infl = infl,
}
end
return result .. cattext
end
local function pluralize(pos)
if pos ~= "nouns" and usub(pos, -5) ~= "verbs" and usub(pos, -4) ~= "ives" then
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
end
return pos
end
-- Remove links and call lang:stripDiacritics(term).
local function strip_diacritics_no_links(lang, term)
return lang:stripDiacritics(m_links.remove_links(term))
end
--[=[
Convert a raw part as passed into an entry point into a part ready for linking. `lang` and `sc` are the overall
language and script objects. This uses the overall language and script objects as defaults for the part and parses off
any fragment from the term. We need to do the latter so that fragments don't end up in categories and so that we
correctly do affix mapping even in the presence of fragments.
]=]
local function canonicalize_part(part, lang, sc)
if not part then
return
end
-- Save the original (user-specified, part-specific) value of `lang`. If such a value is specified, we don't insert
-- a '*fixed with' category, and we format the part using format_derived() in [[Module:etymology]] rather than
-- full_link() in [[Module:links]].
part.part_lang = part.lang
part.lang = part.lang or lang
part.sc = part.sc or sc
local term = part.term
if not term then
return
elseif not part.fragment then
part.term, part.fragment = m_links.get_fragment(term)
else
part.term = m_links.get_fragment(term)
end
end
--[==[
Construct a single linked part based on the information in `part`, for use by `show_affix()` and other entry points.
This should be called after `canonicalize_part()` is called on the part. This is a thin wrapper around `full_link()` in
[[Module:links]] unless `part.part_lang` is specified (indicating that a part-specific language was given), in which
case `format_derived()` in [[Module:etymology]] is called to display a term in a language other than the language of
the overall term (specified in `data.lang`). `data` contains the entire object passed into the entry point and is used
to access information for constructing the categories added by `format_derived()`.
]==]
function export.link_term(part, data, include_separator)
local result
if part.part_lang then
result = require(etymology_module).format_derived {
lang = data.lang,
terms = {part},
sources = {part.lang},
sort_key = data.sort_key,
nocat = data.nocat,
template_name = "affix",
qualifiers_labels_on_outside = true,
borrowing_type = data.borrowing_type,
force_cat = data.force_cat or debug_force_cat,
}
else
result = m_links.full_link(part, "term", nil, "show qualifiers")
end
if include_separator and part.separator then
return part.separator .. result
else
return result
end
end
local function canonicalize_script_code(scode)
-- Convert fa-Arab, ur-Arab etc. to Arab.
return (scode:gsub("^.*%-", ""))
end
-----------------------------------------------------------------------------------------
-- Affix-handling functions --
-----------------------------------------------------------------------------------------
-- Figure out the appropriate script for the given affix and language (unless the script is explicitly passed in), and
-- return the values of template_hyphens[], display_hyphens[] and lookup_hyphens[] for that script, substituting
-- default values as appropriate. Four values are returned:
-- DETECTED_SCRIPT, TEMPLATE_HYPHEN, DISPLAY_HYPHEN, LOOKUP_HYPHEN
local function detect_script_and_hyphens(text, lang, sc)
local scode
-- 1. If the script is explicitly passed in, use it.
if sc then
scode = sc:getCode()
else
local possible_script_codes = lang:getScriptCodes()
-- YUCK! `possible_script_codes` comes from loadData() so #possible_scripts doesn't work (always returns 0).
local num_possible_script_codes = m_table.length(possible_script_codes)
if num_possible_script_codes == 0 then
-- This shouldn't happen; if the language has no script codes,
-- the list {"None"} should be returned.
error("Something is majorly wrong! Language " .. lang:getCanonicalName() .. " has no script codes.")
end
if num_possible_script_codes == 1 then
-- 2. If the language has only one possible script, use it.
scode = possible_script_codes[1]
else
-- 3. Check if any of the possible scripts for the language have non-default values for template_hyphens[]
-- or display_hyphens[]. If so, we need to do script detection on the text. If not, just use "Latn",
-- which may not be technically correct but produces the right results because Latn has all default
-- values for template_hyphens[] and display_hyphens[].
local may_have_nondefault_hyphen = false
for _, script_code in ipairs(possible_script_codes) do
script_code = canonicalize_script_code(script_code)
if template_hyphens[script_code] or display_hyphens[script_code] then
may_have_nondefault_hyphen = true
break
end
end
if not may_have_nondefault_hyphen then
scode = "Latn"
else
scode = lang:findBestScript(text):getCode()
end
end
end
scode = canonicalize_script_code(scode)
local template_hyphen = template_hyphens[scode] or "-"
local lookup_hyphen = lookup_hyphens[scode] or "-"
local display_hyphen = display_hyphens[scode] or default_display_hyphen
return scode, template_hyphen, display_hyphen, lookup_hyphen
end
--[=[
Given a template affix `term` and an affix type `affix_type`, change the relevant template hyphen(s) in the affix to
the display or lookup hyphen specified in `new_hyphen`, or add them if they are missing. `new_hyphen` can be a string,
specifying a fixed hyphen, or a function of two arguments (the script code `scode` and the discovered template hyphen,
or nil of no relevant template hyphen is present). `thyph_re` is a Lua pattern (which must be enclosed in parens) that
matches the possible template hyphens. Note that not all template hyphens present in the affix are changed, but only
the "relevant" ones (e.g. for a prefix, a relevant template hyphen is one coming at the end of the affix).
]=]
local function reconstruct_term_per_hyphens(term, affix_type, scode, thyph_re, new_hyphen)
local function get_hyphen(hyph)
if type(new_hyphen) == "string" then
return new_hyphen
end
return new_hyphen(scode, hyph)
end
if affix_type == "non-affix" then
return term
elseif affix_type == "circumfix" then
local before, before_hyphen, after_hyphen, after = rmatch(term, "^(.*)" .. thyph_re .. " " .. thyph_re
.. "(.*)$")
if not before or ulen(term) <= 3 then
-- Unlike with other types of affixes, don't try to add hyphens in the middle of the term to convert it to
-- a circumfix. Also, if the term is just hyphen + space + hyphen, return it.
return term
end
return before .. get_hyphen(before_hyphen) .. " " .. get_hyphen(after_hyphen) .. after
elseif affix_type == "infix" or affix_type == "interfix" then
local before_hyphen, middle, after_hyphen = rmatch(term, "^" .. thyph_re .. "(.*)" .. thyph_re .. "$")
if before_hyphen and ulen(term) <= 1 then
-- If the term is just a hyphen, return it.
return term
end
return get_hyphen(before_hyphen) .. (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "prefix" then
local middle, after_hyphen = rmatch(term, "^(.*)" .. thyph_re .. "$")
if middle and ulen(term) <= 1 then
-- If the term is just a hyphen, return it.
return term
end
return (middle or term) .. get_hyphen(after_hyphen)
elseif affix_type == "suffix" then
local before_hyphen, middle = rmatch(term, "^" .. thyph_re .. "(.*)$")
if before_hyphen and ulen(term) <= 1 then
-- If the term is just a hyphen, return it.
return term
end
return get_hyphen(before_hyphen) .. (middle or term)
else
error(("Internal error: Unrecognized affix type '%s'"):format(affix_type))
end
end
--[=[
Look up a mapping from a given affix variant to the canonical form used in categories and links. The lookup tables are
language-specific according to `lang`, and may be ID-specific according to `affix_id`. The affixes as they appear in the
lookup tables (both the variant and the canonical form) are in "lookup affix" format (approximately speaking, they use a
regular hyphen for most scripts, but a tatweel for Arabic-script entries and a maqqef for Hebrew-script entries), but
the passed-in `affix` param is in "template affix" format (which differs from the lookup affix for Arabic-script
entries, because more types of hyphens are allowed in template affixes; see the comments at the top of the file). The
remaining parameters to this function are used to convert from template affixes to lookup affixes; see the
reconstruct_term_per_hyphens() function above.
If the affix contains brackets, no lookup is done. Otherwise, a two-stage process is used, first looking up the affix
directly and then stripping diacritics and looking it up again. The reason for this is documented above in the comments
at the top of the file (specifically, the comments describing lookup affixes).
The value of a mapping can either be a string (do the mapping regardless of affix ID) or a table indexed by affix ID
(where the special value `false` indicates no affix ID). The values of entries in this table can also be strings, or
tables with keys `affix` and `id` (again, use `false` to indicate no ID). This allows an affix mapping to map from one
ID to another (for example, this is used in English to map the [[an-]] prefix with no ID to the [[a-]] prefix with the
ID 'not').
The Given a template affix `term` and an affix type `affix_type`, change the relevant template hyphen(s) in the affix to
the display or lookup hyphen specified in `new_hyphen`, or add them if they are missing. `new_hyphen` can be a string,
specifying a fixed hyphen, or a function of two arguments (the script code `scode` and the discovered template hyphen,
or nil of no relevant template hyphen is present). `thyph_re` is a Lua pattern (which must be enclosed in parens) that
matches the possible template hyphens. Note that not all template hyphens present in the affix are changed, but only
the "relevant" ones (e.g. for a prefix, a relevant template hyphen is one coming at the end of the affix).
]=]
local function lookup_affix_mapping(affix, affix_type, lang, scode, thyph_re, lookup_hyph, affix_id)
local function do_lookup(affix)
-- Ensure that the affix uses lookup hyphens regardless of whether it used a different type of hyphens before
-- or no hyphens.
local lookup_affix = reconstruct_term_per_hyphens(affix, affix_type, scode, thyph_re, lookup_hyph)
local function do_lookup_for_langcode(langcode)
if export.langs_with_lang_specific_data[langcode] then
local langdata = mw.loadData(export.affix_lang_data_module_prefix .. langcode)
if langdata.affix_mappings then
local mapping = langdata.affix_mappings[lookup_affix]
if mapping then
if type(mapping) == "table" then
mapping = mapping[affix_id] or mapping.default or mapping[affix_id or false]
if mapping then
return mapping
end
else
return mapping
end
end
end
end
end
-- If `lang` is an etymology-only language, look for a mapping both for it and its full parent.
local langcode = lang:getCode()
local mapping = do_lookup_for_langcode(langcode)
if mapping then
return mapping
end
local full_langcode = lang:getFullCode()
if full_langcode ~= langcode then
mapping = do_lookup_for_langcode(full_langcode)
if mapping then
return mapping
end
end
return nil
end
if affix:find("%[%[") then
return nil
end
return do_lookup(affix) or do_lookup(lang:stripDiacritics(affix)) or nil
end
--[==[
For a given template term in a given language (see the definition of "template affix" near the top of the file),
possibly in an explicitly specified script `sc` (but usually nil), return the term's affix type ({"prefix"},
{"interfix"}, {"suffix"}, {"circumfix"} or {"non-affix"}) along with the corresponding link and display affixes
(see definitions near the top of the file); also the corresponding lookup affix (if `return_lookup_affix` is specified).
The term passed in should already have any fragment (after the # sign) parsed off of it. Four values are returned:
`affix_type`, `link_term`, `display_term` and `lookup_term`. The affix type can be passed in instead of autodetected; in
this case, the template term need not have any attached hyphens, and the appropriate hyphens will be added in the
appropriate places. If `do_affix_mapping` is specified, look up the affix in the lang-specific affix mappings, as
described in the comment at the top of the file; otherwise, the link and display terms will always be the same. (They
will be the same in any case if the template term has a bracketed link in it or is not an affix.) If
`return_lookup_affix` is given, the fourth return value contains the term with appropriate lookup hyphens in the
appropriate places; otherwise, it is the same as the display term. (This functionality is used in
[[Module:category tree/affixes and compounds]] to convert link affixes into lookup affixes so that they can be looked up
in the affix mapping tables.)
]==]
local function parse_term_for_affixes(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not term then
return "non-affix", nil, nil, nil
end
if term == "^" then
-- Indicates a null term to emulate the behavior of {{suffix|foo||bar}}.
term = ""
return "non-affix", term, term, term
end
if term:find("^%^") then
-- HACK! ^ at the beginning of Korean languages has a special meaning, triggering capitalization of the
-- transliteration. Don't interpret it as "force non-affix" for those languages.
local langcode = lang:getCode()
if langcode ~= "ko" and langcode ~= "okm" and langcode ~= "jje" then
-- Formerly we allowed ^ to force non-affix type; this is now handled using an inline modifier
-- <naf>, <root>, etc. Throw an error for the moment when the old way is encountered.
error("Use of ^ to force non-affix status is no longer supported; use an inline modifier <naf> or <root> " ..
"after the component")
end
end
-- Remove an asterisk if the morpheme is reconstructed and add it back at the end.
local reconstructed = ""
if term:find("^%*") then
reconstructed = "*"
term = term:gsub("^%*", "")
end
local scode, thyph, dhyph, lhyph = detect_script_and_hyphens(term, lang, sc)
thyph = "([" .. thyph .. "])"
if not affix_type then
if rfind(term, thyph .. " " .. thyph) then
affix_type = "circumfix"
else
local has_beginning_hyphen = rfind(term, "^" .. thyph)
local has_ending_hyphen = rfind(term, thyph .. "$")
if has_beginning_hyphen and has_ending_hyphen then
affix_type = "interfix"
elseif has_ending_hyphen then
affix_type = "prefix"
elseif has_beginning_hyphen then
affix_type = "suffix"
else
affix_type = "non-affix"
end
end
end
local link_term, display_term, lookup_term
if affix_type == "non-affix" then
link_term = term
display_term = term
lookup_term = term
else
display_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, dhyph)
if do_affix_mapping then
link_term = lookup_affix_mapping(term, affix_type, lang, scode, thyph, lhyph, affix_id)
-- The return value of lookup_affix_mapping() may be an affix mapping with lookup hyphens if a mapping
-- was found, otherwise nil if a mapping was not found. We need to convert to display hyphens in
-- either case, but in the latter case we can reuse the display term, which has already been converted.
if link_term then
link_term = reconstruct_term_per_hyphens(link_term, affix_type, scode, thyph, dhyph)
else
link_term = display_term
end
else
link_term = display_term
end
if return_lookup_affix then
lookup_term = reconstruct_term_per_hyphens(term, affix_type, scode, thyph, lhyph)
else
lookup_term = display_term
end
end
link_term = reconstructed .. link_term
display_term = reconstructed .. display_term
lookup_term = reconstructed .. lookup_term
return affix_type, link_term, display_term, lookup_term
end
--[==[
Add a hyphen to a term in the appropriate place, based on the specified affix type, stripping off any existing hyphens
in that place. For example, if `affix_type` == {"prefix"}, we'll add a hyphen onto the end if it's not already there (or
is of the wrong type). Three values are returned: the link term, display term and lookup term. This function is a thin
wrapper around `parse_term_for_affixes`; see the comments above that function for more information. Note that this
function is exposed externally because it is called by [[Module:category tree/affixes and compounds]]; see the comment
in `parse_term_for_affixes` for more information.
]==]
function export.make_affix(term, lang, sc, affix_type, do_affix_mapping, return_lookup_affix, affix_id)
if not (affix_type == "prefix" or affix_type == "suffix" or affix_type == "circumfix" or affix_type == "infix" or
affix_type == "interfix" or affix_type == "non-affix") then
error("Internal error: Invalid affix type " .. (affix_type or "(nil)"))
end
local _, link_term, display_term, lookup_term = parse_term_for_affixes(term, lang, sc, affix_type,
do_affix_mapping, return_lookup_affix, affix_id)
return link_term, display_term, lookup_term
end
-----------------------------------------------------------------------------------------
-- Main entry points --
-----------------------------------------------------------------------------------------
--[==[
Core categorization logic for affixes. This is shared between show_affix(), show_compound_like() and
get_affix_categories_only(). Returns the categories array and other metadata needed for formatting.
]==]
local function generate_affix_categories(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.surface_analysis or data.nocap, data.notext, #data.parts > 0)
data.borrowing_type = borrowing_type
-- Process each part
local whole_words = 0
local is_affix_or_compound = false
-- Canonicalize and generate links for all the parts first; then do categorization in a separate step, because when
-- processing the first part for categorization, we may access the second part and need it already canonicalized.
for i, part in ipairs_with_gaps(data.parts) do
part = part or {}
data.parts[i] = part
canonicalize_part(part, data.lang, data.sc)
-- Determine affix type and get link and display terms (see text at top of file). Store them in the part
-- (in fields that won't clash with fields used by full_link() in [[Module:links]] or link_term()), so they
-- can be used in the loop below when categorizing.
part.affix_type, part.affix_link_term, part.affix_display_term = parse_term_for_affixes(part.term,
part.lang, part.sc, part.type, not part.alt, nil, part.id)
-- If link_term is an empty string, either a bare ^ was specified or an empty term was used along with inline
-- modifiers. The intention in either case is not to link the term.
part.term = ine(part.affix_link_term)
-- If part.alt would be the same as part.term, make it nil, so that it isn't erroneously tracked as being
-- redundant alt text.
part.alt = part.alt or (part.affix_display_term ~= part.affix_link_term and part.affix_display_term) or nil
end
if not data.noaffixcat then
-- Now do categorization.
for i, part in ipairs_with_gaps(data.parts) do
local affix_type = part.affix_type
if affix_type ~= "non-affix" then
is_affix_or_compound = true
-- Make a sort key. For the first part, use the second part as the sort key; the intention is that if the
-- term has a prefix, sorting by the prefix won't be very useful so we sort by what follows, which is
-- presumably the root.
local part_sort_base = nil
local part_sort = part.sort or data.sort_key
if i == 1 and data.parts[2] and data.parts[2].term then
local part2 = data.parts[2]
-- If the second-part link term is empty, the user requested an unlinked term; avoid a wikitext error
-- by using the alt value if available.
part_sort_base = ine(part2.affix_link_term) or ine(part2.alt)
if part_sort_base then
part_sort_base = strip_diacritics_no_links(part2.lang, part_sort_base)
end
end
if part.pos and rfind(part.pos, "patronym") then
table.insert(categories, {cat = "patronymics", sort_key = part_sort, sort_base = part_sort_base})
end
if data.pos ~= "terms" and part.pos and rfind(part.pos, "diminutive") then
table.insert(categories, {cat = "diminutive " .. data.pos, sort_key = part_sort,
sort_base = part_sort_base})
end
-- Don't add a '*fixed with' category if the link term is empty or is in a different language.
if ine(part.affix_link_term) and not part.part_lang then
table.insert(categories, {cat = data.pos .. " " .. affix_type .. "ed with " ..
strip_diacritics_no_links(part.lang, part.affix_link_term) ..
(part.id and " (" .. part.id .. ")" or ""),
sort_key = part_sort, sort_base = part_sort_base})
end
else
whole_words = whole_words + 1
if whole_words == 2 then
is_affix_or_compound = true
table.insert(categories, "compound " .. data.pos)
end
end
end
-- Make sure there was either an affix or a compound (two or more non-affix terms).
if not is_affix_or_compound and not data.allow_no_affixes_or_compounds then
error("The parameters did not include any affixes, and the term is not a compound. Please provide at least one affix.")
end
end
return text_sections, categories, borrowing_type
end
--[==[
Implementation of {{tl|affix}} and {{tl|surface analysis}}. `data` contains all the information describing the affixes to
be displayed, and contains the following:
* `.lang` ('''required'''): Overall language object. Different from term-specific language objects (see `.parts` below).
* `.sc`: Overall script object (usually omitted). Different from term-specific script objects.
* `.parts` ('''required'''): List of objects describing the affixes to show. The general format of each object is as would
be passed to `full_link()`, except that the `.lang` field should be missing unless the term is of a language
different from the overall `.lang` value (in such a case, the language name is shown along with the term and
an additional "derived from" category is added). '''WARNING''': The data in `.parts` will be destructively
modified.
* `.pos`: Overall part of speech (used in categories, defaults to {"terms"}). Different from term-specific part of speech.
* `.sort_key`: Overall sort key. Normally omitted except e.g. in Japanese.
* `.type`: Type of compound, if the parts in `.parts` describe a compound. Strictly optional, and if supplied, the
compound type is displayed before the parts (normally capitalized, unless `.nocap` is given).
* `.nocap`: Don't capitalize the first letter of text displayed before the parts (relevant only if `.type` or
`.surface_analysis` is given).
* `.notext`: Don't display any text before the parts (relevant only if `.type` or `.surface_analysis` is given).
* `.nocat`: Disable all categorization.
* `.noaffixcat`: Disable affix (and compound) categorization. Relevant for e.g. blends, which may otherwise
be incorrectly categorized as compound terms.
* `.lit`: Overall literal definition. Different from term-specific literal definitions.
* `.force_cat`: Always display categories, even on userspace pages.
* `.surface_analysis`: Implement {{surface analysis}}; adds `By surface analysis, ` before the parts.
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.show_affix(data)
local text_sections, categories, borrowing_type = generate_affix_categories(data)
-- Process each part for display
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
-- Make a link for the part
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if data.surface_analysis then
local text = "by " .. glossary_link("surface analysis") .. ", "
if not data.nocap then
text = ucfirst(text)
end
table.insert(text_sections, 1, text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
--[==[
Get only the categories that would be generated by show_affix(), without any text output or formatting.
This is used by Module:etymon to get affix categorization.
Returns an array of category objects, where
each entry is either a string (simple category name) or a table with keys `cat`, `sort_key`,
and `sort_base` for more complex categorization.
`data` should have the same structure as passed to show_affix():
* `.lang` (required): Overall language object
* `.parts` (required): Array of affix part objects with `.term`, `.lang`, `.id`, etc.
* `.pos`: Part of speech (defaults to "terms")
* `.sort_key`: Overall sort key for categories
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.get_affix_categories_only(data)
local text_sections, categories, borrowing_type = generate_affix_categories(data)
return categories
end
function export.show_surface_analysis(data)
data.surface_analysis = true
data.allow_no_affixes_or_compounds = true
return export.show_affix(data)
end
--[==[
Implementation of {{tl|compound}}.
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.show_compound(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
local text_sections, categories, borrowing_type =
process_etymology_type(data.type, data.nocap, data.notext, #data.parts > 0)
data.borrowing_type = borrowing_type
local parts_formatted = {}
table.insert(categories, "compound " .. data.pos)
-- Make links out of all the parts
local whole_words = 0
for i, part in ipairs(data.parts) do
canonicalize_part(part, data.lang, data.sc)
-- Determine affix type and get link and display terms (see text at top of file).
local affix_type, link_term, display_term = parse_term_for_affixes(part.term, part.lang, part.sc,
part.type, not part.alt, nil, part.id)
-- If the term is an interfix or the type was explicitly given, recognize it as such (which means e.g. that we
-- will display the term without hyphens for East Asian languages). Otherwise, ignore the fact that it looks
-- like an affix and display as specified in the template (but pay attention to the detected affix type for
-- certain tracking purposes).
if affix_type == "interfix" or (part.type and part.type ~= "non-affix") then
-- If link_term is an empty string, either a bare ^ was specified or an empty term was used along with
-- inline modifiers. The intention in either case is not to link the term. Don't add a '*fixed with'
-- category in this case, or if the term is in a different language.
-- If part.alt would be the same as part.term, make it nil, so that it isn't erroneously tracked as being
-- redundant alt text.
if link_term and link_term ~= "" and not part.part_lang then
table.insert(categories, {cat = data.pos .. " " .. affix_type .. "ed with " ..
strip_diacritics_no_links(part.lang, link_term), sort_key = part.sort or data.sort_key})
end
part.term = link_term ~= "" and link_term or nil
part.alt = part.alt or (display_term ~= link_term and display_term) or nil
else
if affix_type ~= "non-affix" then
local langcode = data.lang:getCode()
-- If `data.lang` is an etymology-only language, track both using its code and its full parent's code.
track { affix_type, affix_type .. "/lang/" .. langcode }
local full_langcode = data.lang:getFullCode()
if langcode ~= full_langcode then
track(affix_type .. "/lang/" .. full_langcode)
end
else
whole_words = whole_words + 1
end
end
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if whole_words == 1 then
track("one whole word")
elseif whole_words == 0 then
track("looks like confix")
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
--[==[
Implementation of {{tl|blend}}, {{tl|univerbation}} and similar "compound-like" templates.
'''WARNING''': This destructively modifies both `data` and the individual structures within `.parts`.
]==]
function export.show_compound_like(data)
data.allow_no_affixes_or_compounds = true
local text_sections, categories, borrowing_type = generate_affix_categories(data)
if data.cat then
table.insert(categories, data.cat)
end
-- Process each part for display
local parts_formatted = {}
for i, part in ipairs_with_gaps(data.parts) do
-- Make a link for the part
table.insert(parts_formatted, export.link_term(part, data, "include_separator"))
end
if #data.parts > 0 and data.oftext then
table.insert(text_sections, 1, " " .. data.oftext .. " ")
end
if data.text then
table.insert(text_sections, 1, data.text)
end
table.insert(text_sections, export.join_formatted_parts { data = data, parts_formatted = parts_formatted,
categories = categories, separator_already_added = true })
return table.concat(text_sections)
end
--[==[
Make `part` (a structure holding information on an affix part) into an affix of type `affix_type`, and apply any
relevant affix mappings. For example, if the desired affix type is "suffix", this will (in general) add a hyphen onto
the beginning of the term, alt, tr and ts components of the part if not already present. The hyphen that's added is the
"display hyphen" (see above) and may be script-specific. (In the case of East Asian scripts, the display hyphen is an
empty string whereas the template hyphen is the regular hyphen, meaning that any regular hyphen at the beginning of the
part will be effectively removed.) `lang` and `sc` hold overall language and script objects.
Note that this also applies any language-specific affix mappings, so that e.g. if the language is Finnish and the user
specified [[-käs]] in the affix and didn't specify an `.alt` value, `part.term` will contain [[-kas]] and `part.alt` will
contain [[-käs]].
This function is used by the "legacy" templates ({{tl|prefix}}, {{tl|suffix}}, {{tl|confix}}, etc.) where the nature of
the affix is specified by the template itself rather than auto-determined from the affix, as is the case with
{{tl|affix}}.
'''WARNING''': This destructively modifies `part`.
]==]
local function make_part_into_affix(part, lang, sc, affix_type)
canonicalize_part(part, lang, sc)
local link_term, display_term = export.make_affix(part.term, part.lang, part.sc, affix_type, not part.alt, nil, part.id)
part.term = link_term
-- When we don't specify `do_affix_mapping` to make_affix(), link and display terms (first and second retvals of
-- make_affix()) are the same.
-- If part.alt would be the same as part.term, make it nil, so that it isn't erroneously tracked as being
-- redundant alt text.
part.alt = part.alt and export.make_affix(part.alt, part.lang, part.sc, affix_type) or (display_term ~= link_term and display_term) or nil
local Latn = require(scripts_module).getByCode("Latn")
part.tr = export.make_affix(part.tr, part.lang, Latn, affix_type)
part.ts = export.make_affix(part.ts, part.lang, Latn, affix_type)
end
local function track_wrong_affix_type(template, part, expected_affix_type)
if part and not part.type then
local affix_type = parse_term_for_affixes(part.term, part.lang, part.sc)
if affix_type ~= expected_affix_type then
local part_name = expected_affix_type or "base"
local langcode = part.lang:getCode()
local full_langcode = part.lang:getFullCode()
require("Module:debug/track") {
template,
template .. "/" .. part_name,
template .. "/" .. part_name .. "/" .. (affix_type or "none"),
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. langcode
}
-- If `part.lang` is an etymology-only language, track both using its code and its full parent's code.
if full_langcode ~= langcode then
require("Module:debug/track")(
template .. "/" .. part_name .. "/" .. (affix_type or "none") .. "/lang/" .. full_langcode
)
end
end
end
end
local function insert_affix_category(categories, pos, affix_type, part, sort_key, sort_base)
-- Don't add a '*fixed with' category if the link term is empty or is in a different language.
if part.term and not part.part_lang then
local cat = pos .. " " .. affix_type .. "ed with " .. strip_diacritics_no_links(part.lang, part.term) ..
(part.id and " (" .. part.id .. ")" or "")
if sort_key or sort_base then
table.insert(categories, {cat = cat, sort_key = sort_key, sort_base = sort_base})
else
table.insert(categories, cat)
end
end
end
--[==[
Implementation of {{tl|circumfix}}.
'''WARNING''': This destructively modifies both `data` and `.prefix`, `.base` and `.suffix`.
]==]
function export.show_circumfix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
make_part_into_affix(data.prefix, data.lang, data.sc, "prefix")
make_part_into_affix(data.suffix, data.lang, data.sc, "suffix")
track_wrong_affix_type("circumfix", data.prefix, "prefix")
track_wrong_affix_type("circumfix", data.base, nil)
track_wrong_affix_type("circumfix", data.suffix, "suffix")
-- Create circumfix term.
local circumfix = nil
if data.prefix.term and data.suffix.term then
circumfix = data.prefix.term .. " " .. data.suffix.term
data.prefix.alt = data.prefix.alt or data.prefix.term
data.suffix.alt = data.suffix.alt or data.suffix.term
data.prefix.term = circumfix
data.suffix.term = circumfix
end
-- Make links out of all the parts.
local parts_formatted = {}
local categories = {}
local sort_base
if data.base.term then
sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
end
table.insert(parts_formatted, export.link_term(data.prefix, data))
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.suffix, data))
-- Insert the categories, but don't add a '*fixed with' category if the link term is in a different language.
if not data.prefix.part_lang then
table.insert(categories, {cat=data.pos .. " circumfixed with " .. strip_diacritics_no_links(data.prefix.lang,
circumfix), sort_key=data.sort_key, sort_base=sort_base})
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|confix}}.
'''WARNING''': This destructively modifies both `data` and `.prefix`, `.base` and `.suffix`.
]==]
function export.show_confix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
make_part_into_affix(data.prefix, data.lang, data.sc, "prefix")
make_part_into_affix(data.suffix, data.lang, data.sc, "suffix")
track_wrong_affix_type("confix", data.prefix, "prefix")
track_wrong_affix_type("confix", data.base, nil)
track_wrong_affix_type("confix", data.suffix, "suffix")
-- Make links out of all the parts.
local parts_formatted = {}
local prefix_sort_base
if data.base and data.base.term then
prefix_sort_base = strip_diacritics_no_links(data.base.lang, data.base.term)
elseif data.suffix.term then
prefix_sort_base = strip_diacritics_no_links(data.suffix.lang, data.suffix.term)
end
-- Insert the categories and parts.
local categories = {}
table.insert(parts_formatted, export.link_term(data.prefix, data))
insert_affix_category(categories, data.pos, "prefix", data.prefix, data.sort_key, prefix_sort_base)
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
end
table.insert(parts_formatted, export.link_term(data.suffix, data))
-- FIXME, should we be specifying a sort base here?
insert_affix_category(categories, data.pos, "suffix", data.suffix)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|infix}}.
'''WARNING''': This destructively modifies both `data` and `.base` and `.infix`.
]==]
function export.show_infix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
make_part_into_affix(data.infix, data.lang, data.sc, "infix")
track_wrong_affix_type("infix", data.base, nil)
track_wrong_affix_type("infix", data.infix, "infix")
-- Make links out of all the parts.
local parts_formatted = {}
local categories = {}
table.insert(parts_formatted, export.link_term(data.base, data))
table.insert(parts_formatted, export.link_term(data.infix, data))
-- Insert the categories.
-- FIXME, should we be specifying a sort base here?
insert_affix_category(categories, data.pos, "infix", data.infix)
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|prefix}}.
'''WARNING''': This destructively modifies both `data` and the structures within `.prefixes`, as well as `.base`.
]==]
function export.show_prefix(data)
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
for i, prefix in ipairs(data.prefixes) do
make_part_into_affix(prefix, data.lang, data.sc, "prefix")
end
for i, prefix in ipairs(data.prefixes) do
track_wrong_affix_type("prefix", prefix, "prefix")
end
track_wrong_affix_type("prefix", data.base, nil)
-- Make links out of all the parts.
local parts_formatted = {}
local first_sort_base = nil
local categories = {}
if data.prefixes[2] then
first_sort_base = ine(data.prefixes[2].term) or ine(data.prefixes[2].alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.prefixes[2].lang, first_sort_base)
end
elseif data.base then
first_sort_base = ine(data.base.term) or ine(data.base.alt)
if first_sort_base then
first_sort_base = strip_diacritics_no_links(data.base.lang, first_sort_base)
end
end
for i, prefix in ipairs(data.prefixes) do
table.insert(parts_formatted, export.link_term(prefix, data))
insert_affix_category(categories, data.pos, "prefix", prefix, data.sort_key, i == 1 and first_sort_base or nil)
end
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
--[==[
Implementation of {{tl|suffix}}.
'''WARNING''': This destructively modifies both `data` and the structures within `.suffixes`, as well as `.base`.
]==]
function export.show_suffix(data)
local categories = {}
data.pos = data.pos or default_pos
data.pos = pluralize(data.pos)
canonicalize_part(data.base, data.lang, data.sc)
-- Hyphenate the affixes and apply any affix mappings.
for i, suffix in ipairs(data.suffixes) do
make_part_into_affix(suffix, data.lang, data.sc, "suffix")
end
track_wrong_affix_type("suffix", data.base, nil)
for i, suffix in ipairs(data.suffixes) do
track_wrong_affix_type("suffix", suffix, "suffix")
end
-- Make links out of all the parts.
local parts_formatted = {}
if data.base then
table.insert(parts_formatted, export.link_term(data.base, data))
else
table.insert(parts_formatted, "")
end
for i, suffix in ipairs(data.suffixes) do
table.insert(parts_formatted, export.link_term(suffix, data))
end
-- Insert the categories.
for i, suffix in ipairs(data.suffixes) do
-- FIXME, should we be specifying a sort base here?
insert_affix_category(categories, data.pos, "suffix", suffix)
if suffix.pos and rfind(suffix.pos, "patronym") then
table.insert(categories, "patronymics")
end
end
return export.join_formatted_parts { data = data, parts_formatted = parts_formatted, categories = categories }
end
return export
mdstvxnr2kw23xqtqvre3ecwzj3cjlv
Mòideal:affix/templates
828
17837
88643
2026-03-08T10:32:15Z
en>Surjection
0
Undid revision [[Special:Diff/89784222|89784222]] by [[Special:Contributions/Surjection|Surjection]] ([[User talk:Surjection|talk]])
88643
Scribunto
text/plain
local export = {}
local m_affix = require("Module:affix")
local m_utilities = require("Module:utilities")
local en_utilities_module = "Module:en-utilities"
local parameter_utilities_module = "Module:parameter utilities"
local pseudo_loan_module = "Module:affix/pseudo-loan"
local insert = table.insert
local boolean_param = {type = "boolean"}
local function is_property_key(k)
return require(parameter_utilities_module).item_key_is_property(k)
end
local recognized_affix_types = {
prefix = "prefix",
pre = "prefix",
suffix = "suffix",
suf = "suffix",
interfix = "interfix",
inter = "interfix",
infix = "infix",
["in"] = "infix",
circumfix = "circumfix",
circum = "circumfix",
["non-affix"] = "non-affix",
naf = "non-affix",
root = "non-affix",
}
local function pre_normalize_affix_type(data)
local modtext = data.modtext
modtext = modtext:match("^<(.*)>$")
if not modtext then
error(("Internal error: Passed-in modifier isn't surrounded by angle brackets: %s"):format(data.modtext))
end
if recognized_affix_types[modtext] then
modtext = "type:" .. modtext
end
return "<" .. modtext .. ">"
end
-- Parse raw arguments. A single parameter `data` is passed in, with the following fields:
-- * `raw_args`: The raw arguments to parse, normally taken from `frame:getParent().args`.
-- * `extra_params`: An optional function of one argument that is called on the `params` structure before parsing; its
-- purpose is to specify additional allowed parameters or possibly disable parameters.
-- * `has_source`: There is a source-language parameter following 1= (which becomes the "destination" language
-- parameter) and preceding the terms. This is currently used for {{pseudo-loan}}.
-- * `ilang`: If given, it is a language object that serves as the default for the language. If specified, there is no
-- language code specified in 1=; instead the term parameters start directly at 1= (or at 2= if `has_source` is
-- given).
-- * `require_index_for_pos`: There is no separate |pos= parameter distinct from |pos1=, |pos2=, etc. Instead,
-- specifying |pos= results in an error.
-- * `dont_require_index`: Allow |foo= to be specified as a synonym for |foo1= (except for |lit=, which remains
-- distinct).
-- * `allow_type`: Allow |type1=, |type2=, etc. or inline <type:...> for the affix type, and allow a separate |type=
-- parameter for the etymology type (FIXME: this may be confusing; consider changing the etymology type to |etype=).
-- * `allow_semicolon_separator`: Allow semicolon as a separator, displaying as " or ". This requires changes in the
-- display of the output, to not always put a + between the items.
--
-- Note that all language parameters are allowed to be etymology-only languages.
--
-- Return five values ARGS, ITEMS, LANG_OBJ, SCRIPT_OBJ, SOURCE_LANG_OBJ where ARGS is a table of the parsed arguments;
-- ITEMS is the list of parsed items; LANG_OBJ is the language object corresponding to the language code specified in 1=
-- (or taken from `ilang` if given); SCRIPT_OBJ is the script object corresponding to sc= (if given, otherwise nil); and
-- SOURCE_LANG_OBJ is the language object corresponding to the source-language code specified in 2= (or 1= if `ilang` is
-- given) if `has_source` is specified (otherwise nil).
local function parse_args(data)
local raw_args = data.raw_args
local has_source = data.has_source
local ilang = data.ilang
if raw_args.lang then
error("The |lang= parameter is not used by this template. Place the language code in parameter 1 instead.")
end
local term_index = (ilang and 1 or 2) + (has_source and 1 or 0)
local params = {
[term_index] = {list = true, allow_holes = true},
["sort"] = {},
["nocap"] = boolean_param, -- always allow this even if not used, for use with {{surf}}, which adds it
}
if not ilang then
params[1] = {required = true, type = "language", default = "und"}
end
local source_index
if has_source then
source_index = term_index - 1
params[source_index] = {required = true, type = "language", default = "und"}
end
local m_param_utils = require(parameter_utilities_module)
local param_mod_source = {}
if not data.dont_require_index then
insert(param_mod_source,
-- We want to require an index for all params (or use separate_no_index, which also requires an index for the
-- param corresponding to the first item).
{default = true, require_index = true}
)
end
insert(param_mod_source, {group = {"link", "ref", "lang", "q", "l", "infl"}})
-- Override lit= to be separate from lit1=.
insert(param_mod_source, {param = "lit", separate_no_index = true})
if not data.dont_require_index and not data.require_index_for_pos then
-- Override pos= to be separate from pos1=.
insert(param_mod_source, {param = "pos", separate_no_index = true})
end
if data.allow_type then
insert(param_mod_source, {param = "type", separate_no_index = true})
end
local param_mods = m_param_utils.construct_param_mods(param_mod_source)
if data.extra_params then
data.extra_params(params)
end
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = raw_args,
termarg = term_index,
parse_lang_prefix = true,
track_module = "homophones",
-- the inclusion of ‎ is what [[Module:affix]] has always done
default_separator = data.allow_semicolon_separator and " +‎ " or nil,
special_separators = data.allow_semicolon_separator and {[";"] = " or "} or nil,
disallow_custom_separators = not data.allow_semicolon_separator,
-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do
-- {{suffix|lang||foo}} to generate "+ -foo".
dont_skip_items = true,
-- Allow e.g. <infix> to be specified in place of <type:infix>.
pre_normalize_modifiers = pre_normalize_affix_type,
-- Don't pass in `lang` or `sc`, as they will be used as defaults to initialize the items, which we don't want
-- (particularly for `lang`), as the code in [[Module:affix]] uses the presence of `lang` as an indicator that
-- a part-specific language was explicitly given.
}
local lang = ilang or args[1]
local source
if has_source then
source = args[source_index]
end
-- For compatibility with the prior code, we need to convert items without term or properties to nil.
for i = 1, #items do
local item = items[i]
local saw_item_property = item.term
if not saw_item_property then
for k, v in pairs(item) do
if is_property_key(k) then
saw_item_property = true
break
end
end
end
if not saw_item_property then
items[i] = nil
elseif item.type then
-- Validate and canonicalize affix types.
if not recognized_affix_types[item.type] then
local valid_types = {}
for k in pairs(recognized_affix_types) do
insert(valid_types, ("'%s'"):format(k))
end
table.sort(recognized_affix_types)
error(("Unrecognized affix type '%s' in item %s; valid values are %s"):format(
item.type, item.itemno, table.concat(valid_types, ", ")))
else
item.type = recognized_affix_types[item.type]
end
end
end
if args.type and args.type.default and not m_affix.etymology_types[args.type.default] then
error("Unrecognized etymology type: '" .. args.type.default .. "'")
end
return args, items, lang, args.sc.default, source
end
local function augment_affix_data(data, args, lang, sc)
data.lang = lang
data.sc = sc
data.pos = args.pos and args.pos.default
data.lit = args.lit and args.lit.default
data.sort_key = args.sort
data.type = args.type and args.type.default
data.nocap = args.nocap
data.notext = args.notext
data.nocat = args.nocat
data.force_cat = args.force_cat
data.l = args.l.default
data.ll = args.ll.default
data.q = args.q.default
data.qq = args.qq.default
data.infl = args.infl.default
return data
end
function export.affix(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "prefix-"}, {term = "base"}, {term = "-suffix"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_affix(augment_affix_data({ parts = parts }, args, lang, sc))
end
function export.compound(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "first"}, {separator = " +‎ ", term = "second"} }
else
error("You must provide at least one part of a compound.")
end
end
return m_affix.show_compound(augment_affix_data({ parts = parts }, args, lang, sc))
end
-- FIXME: Temporary for check in compound_like() below for old-style {{contraction}} parameters. Remove eventually.
local function ine(arg)
if arg == "" then
return nil
else
return arg
end
end
function export.compound_like(frame)
local iparams = {
["lang"] = {type = "language"},
["template"] = {},
["text"] = {},
["oftext"] = {},
["cat"] = {},
["noaffixcat"] = boolean_param,
["dont_require_index"] = boolean_param,
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local parent_args = frame:getParent().args
-- Error to catch most uses of old-style parameters for {{contraction}}. (FIXME: Remove eventually.)
local term_param = iargs.lang and 1 or 2
if ine(parent_args[term_param + 2]) and not ine(parent_args[term_param + 1]) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and not ine(parent_args.t2) and not ine(parent_args.gloss2) and not ine(parent_args.g2)
and not ine(parent_args.alt2) then
error(("You specified a term in %s= and not one in %s=. You probably meant to use t= to specify a gloss instead. "
.. "If you intended to specify two terms, put the second term in %s=."):format(term_param + 2, term_param + 1,
term_param + 1))
end
if not ine(parent_args[term_param + 1]) and not ine(parent_args.alt2) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and ine(parent_args.g2) then
error(("You specified a gender in g2= but no term in %s=. You were probably trying to specify two genders for "
.. "a single term. To do that, put both genders in g=, comma-separated."):format(term_param + 1))
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
ilang = iargs.lang,
dont_require_index = iargs.dont_require_index,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = not iargs.dont_require_index,
allow_semicolon_separator = true,
}
local template = iargs.template
local nocat = args.nocat
local notext = args.notext
local text = not notext and iargs.text
local oftext = not notext and (iargs.oftext or text and "of")
local cat = not nocat and iargs.cat
local noaffixcat = nocat or iargs.noaffixcat
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "first"}, {separator = " +‎ ", term = "second"} }
end
end
return m_affix.show_compound_like(augment_affix_data({ parts = parts, text = text, oftext = oftext, cat = cat, noaffixcat = noaffixcat },
args, lang, sc))
end
function export.surface_analysis(frame)
local function ine(arg)
-- Since we're operating before calling [[Module:parameters]], we need to imitate how that module processes
-- arguments, including trimming since numbered arguments don't have automatic whitespace trimming.
if not arg then
return arg
end
arg = mw.text.trim(arg)
if arg == "" then
arg = nil
end
return arg
end
local parent_args = frame:getParent().args
local etymtext
local arg1 = ine(parent_args[1])
if not arg1 then
-- Allow omitted first argument to just display "By surface analysis".
etymtext = ""
elseif arg1:find("^%+") then
-- If the first argument (normally a language code) is prefixed with a +, it's a template name.
local template_name = arg1:sub(2)
local new_args = {}
for i, v in pairs(parent_args) do
if type(i) == "number" then
if i > 1 then
new_args[i - 1] = v
end
else
new_args[i] = v
end
end
new_args.nocap = true
etymtext = ", " .. frame:expandTemplate { title = template_name, args = new_args }
end
if etymtext then
return (ine(parent_args.nocap) and "b" or "B") .. "y [[Appendix:Glossary#surface analysis|surface analysis]]" ..
etymtext
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "first"}, {separator = " +‎ ", term = "second"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_surface_analysis(augment_affix_data({ parts = parts }, args, lang, sc))
end
local function check_max_items(items, max_allowed)
if #items > max_allowed then
local bad_item = items[max_allowed + 1]
if bad_item.term then
error(("At most %s terms can be specified but saw a term specified for term #%s")
:format(max_allowed, max_allowed + 1))
else
for k, v in pairs(bad_item) do
if is_property_key(k) then
error(("At most %s terms can be specified but saw a value for property '%s' of term #%s")
:format(max_allowed, k, max_allowed + 1))
end
end
end
error(("Internal error: Something wrong, %s items generated when there should be at most %s, but item #%s doesn't have a term or any properties")
:format(#items, max_allowed, max_allowed + 1))
end
end
function export.circumfix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[2]
local suffix = parts[3]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and base and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "circumfix", alt = "prefix"}
base = {term = "base"}
suffix = {term = "circumfix", alt = "suffix"}
else
error("You must specify a prefix part, a base term and a suffix part.")
end
end
return m_affix.show_circumfix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.confix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[3] and parts[2] or nil
local suffix = parts[3] or parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "prefix"}
suffix = {term = "suffix"}
else
error("You must specify a prefix part, an optional base term and a suffix part.")
end
end
return m_affix.show_confix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.pseudo_loan(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc, source = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
has_source = true,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = true,
allow_semicolon_separator = true,
}
return require(pseudo_loan_module).show_pseudo_loan(
augment_affix_data({ source = source, parts = parts }, args, lang, sc))
end
function export.infix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local base = parts[1]
local infix = parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (base and infix) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "base"}
infix = {term = "infix"}
else
error("You must provide a base term and an infix.")
end
end
return m_affix.show_infix(augment_affix_data({ base = base, infix = infix }, args, lang, sc))
end
function export.prefix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local prefixes = parts
local base = nil
local max_prefix = 0
for k, v in pairs(prefixes) do
max_prefix = math.max(k, max_prefix)
end
if max_prefix >= 2 then
base = prefixes[max_prefix]
prefixes[max_prefix] = nil
end
-- Just to make sure someone didn't use the template in a silly way
if not next(prefixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "base"}
prefixes = { {term = "prefix"} }
else
error("You must provide at least one prefix.")
end
end
return m_affix.show_prefix(augment_affix_data({ prefixes = prefixes, base = base }, args, lang, sc))
end
function export.suffix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local base = parts[1]
local suffixes = {}
for k, v in pairs(parts) do
suffixes[k - 1] = v
end
-- Just to make sure someone didn't use the template in a silly way
if not next(suffixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "base"}
suffixes = { {term = "suffix"} }
else
error("You must provide at least one suffix.")
end
end
return m_affix.show_suffix(augment_affix_data({ base = base, suffixes = suffixes }, args, lang, sc))
end
function export.derivsee(frame)
local iargs = frame.args
local iparams = {
["derivtype"] = {},
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local params = {
["head"] = {},
["id"] = {},
["sc"] = {type = "script"},
["pos"] = {},
}
local derivtype = iargs.derivtype
params[1] = {required = "true", type = "language", default = "und"}
params[2] = {}
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = args[1]
local term = args[2] or args.head
local id = args.id
local sc = args.sc
local pos = require(en_utilities_module).pluralize(args.pos or "term")
if not term then
local SUBPAGE = mw.loadData("Module:headword/data").pagename
if lang:hasType("reconstructed") or mw.title.getCurrentTitle().nsText == "Reconstruction" then
term = "*" .. SUBPAGE
elseif lang:hasType("appendix-constructed") then
term = SUBPAGE
else
term = SUBPAGE
end
end
local category = nil
local langname = lang:getFullName()
if (derivtype == "compound" and pos == nil) then
category = langname .. " compounds with " .. term
elseif derivtype == "compound" and pos == "verbs" then
category = langname .. " compound " .. pos .. " formed with " .. term
elseif derivtype == "compound" then
category = langname .. " compound " .. pos .. " with " .. term
else
category = langname .. " " .. pos .. " " .. derivtype .. "ed with " .. term .. (id and " (" .. id .. ")" or "")
end
return require('Module:collapsible category tree').make{
lang = lang,
sc = sc,
category = category,
}
end
return export
701ci4kau9yagdq4na1uqxca6idigvq
88644
88643
2026-07-30T11:17:48Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/templates]]
88643
Scribunto
text/plain
local export = {}
local m_affix = require("Module:affix")
local m_utilities = require("Module:utilities")
local en_utilities_module = "Module:en-utilities"
local parameter_utilities_module = "Module:parameter utilities"
local pseudo_loan_module = "Module:affix/pseudo-loan"
local insert = table.insert
local boolean_param = {type = "boolean"}
local function is_property_key(k)
return require(parameter_utilities_module).item_key_is_property(k)
end
local recognized_affix_types = {
prefix = "prefix",
pre = "prefix",
suffix = "suffix",
suf = "suffix",
interfix = "interfix",
inter = "interfix",
infix = "infix",
["in"] = "infix",
circumfix = "circumfix",
circum = "circumfix",
["non-affix"] = "non-affix",
naf = "non-affix",
root = "non-affix",
}
local function pre_normalize_affix_type(data)
local modtext = data.modtext
modtext = modtext:match("^<(.*)>$")
if not modtext then
error(("Internal error: Passed-in modifier isn't surrounded by angle brackets: %s"):format(data.modtext))
end
if recognized_affix_types[modtext] then
modtext = "type:" .. modtext
end
return "<" .. modtext .. ">"
end
-- Parse raw arguments. A single parameter `data` is passed in, with the following fields:
-- * `raw_args`: The raw arguments to parse, normally taken from `frame:getParent().args`.
-- * `extra_params`: An optional function of one argument that is called on the `params` structure before parsing; its
-- purpose is to specify additional allowed parameters or possibly disable parameters.
-- * `has_source`: There is a source-language parameter following 1= (which becomes the "destination" language
-- parameter) and preceding the terms. This is currently used for {{pseudo-loan}}.
-- * `ilang`: If given, it is a language object that serves as the default for the language. If specified, there is no
-- language code specified in 1=; instead the term parameters start directly at 1= (or at 2= if `has_source` is
-- given).
-- * `require_index_for_pos`: There is no separate |pos= parameter distinct from |pos1=, |pos2=, etc. Instead,
-- specifying |pos= results in an error.
-- * `dont_require_index`: Allow |foo= to be specified as a synonym for |foo1= (except for |lit=, which remains
-- distinct).
-- * `allow_type`: Allow |type1=, |type2=, etc. or inline <type:...> for the affix type, and allow a separate |type=
-- parameter for the etymology type (FIXME: this may be confusing; consider changing the etymology type to |etype=).
-- * `allow_semicolon_separator`: Allow semicolon as a separator, displaying as " or ". This requires changes in the
-- display of the output, to not always put a + between the items.
--
-- Note that all language parameters are allowed to be etymology-only languages.
--
-- Return five values ARGS, ITEMS, LANG_OBJ, SCRIPT_OBJ, SOURCE_LANG_OBJ where ARGS is a table of the parsed arguments;
-- ITEMS is the list of parsed items; LANG_OBJ is the language object corresponding to the language code specified in 1=
-- (or taken from `ilang` if given); SCRIPT_OBJ is the script object corresponding to sc= (if given, otherwise nil); and
-- SOURCE_LANG_OBJ is the language object corresponding to the source-language code specified in 2= (or 1= if `ilang` is
-- given) if `has_source` is specified (otherwise nil).
local function parse_args(data)
local raw_args = data.raw_args
local has_source = data.has_source
local ilang = data.ilang
if raw_args.lang then
error("The |lang= parameter is not used by this template. Place the language code in parameter 1 instead.")
end
local term_index = (ilang and 1 or 2) + (has_source and 1 or 0)
local params = {
[term_index] = {list = true, allow_holes = true},
["sort"] = {},
["nocap"] = boolean_param, -- always allow this even if not used, for use with {{surf}}, which adds it
}
if not ilang then
params[1] = {required = true, type = "language", default = "und"}
end
local source_index
if has_source then
source_index = term_index - 1
params[source_index] = {required = true, type = "language", default = "und"}
end
local m_param_utils = require(parameter_utilities_module)
local param_mod_source = {}
if not data.dont_require_index then
insert(param_mod_source,
-- We want to require an index for all params (or use separate_no_index, which also requires an index for the
-- param corresponding to the first item).
{default = true, require_index = true}
)
end
insert(param_mod_source, {group = {"link", "ref", "lang", "q", "l", "infl"}})
-- Override lit= to be separate from lit1=.
insert(param_mod_source, {param = "lit", separate_no_index = true})
if not data.dont_require_index and not data.require_index_for_pos then
-- Override pos= to be separate from pos1=.
insert(param_mod_source, {param = "pos", separate_no_index = true})
end
if data.allow_type then
insert(param_mod_source, {param = "type", separate_no_index = true})
end
local param_mods = m_param_utils.construct_param_mods(param_mod_source)
if data.extra_params then
data.extra_params(params)
end
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = raw_args,
termarg = term_index,
parse_lang_prefix = true,
track_module = "homophones",
-- the inclusion of ‎ is what [[Module:affix]] has always done
default_separator = data.allow_semicolon_separator and " +‎ " or nil,
special_separators = data.allow_semicolon_separator and {[";"] = " or "} or nil,
disallow_custom_separators = not data.allow_semicolon_separator,
-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do
-- {{suffix|lang||foo}} to generate "+ -foo".
dont_skip_items = true,
-- Allow e.g. <infix> to be specified in place of <type:infix>.
pre_normalize_modifiers = pre_normalize_affix_type,
-- Don't pass in `lang` or `sc`, as they will be used as defaults to initialize the items, which we don't want
-- (particularly for `lang`), as the code in [[Module:affix]] uses the presence of `lang` as an indicator that
-- a part-specific language was explicitly given.
}
local lang = ilang or args[1]
local source
if has_source then
source = args[source_index]
end
-- For compatibility with the prior code, we need to convert items without term or properties to nil.
for i = 1, #items do
local item = items[i]
local saw_item_property = item.term
if not saw_item_property then
for k, v in pairs(item) do
if is_property_key(k) then
saw_item_property = true
break
end
end
end
if not saw_item_property then
items[i] = nil
elseif item.type then
-- Validate and canonicalize affix types.
if not recognized_affix_types[item.type] then
local valid_types = {}
for k in pairs(recognized_affix_types) do
insert(valid_types, ("'%s'"):format(k))
end
table.sort(recognized_affix_types)
error(("Unrecognized affix type '%s' in item %s; valid values are %s"):format(
item.type, item.itemno, table.concat(valid_types, ", ")))
else
item.type = recognized_affix_types[item.type]
end
end
end
if args.type and args.type.default and not m_affix.etymology_types[args.type.default] then
error("Unrecognized etymology type: '" .. args.type.default .. "'")
end
return args, items, lang, args.sc.default, source
end
local function augment_affix_data(data, args, lang, sc)
data.lang = lang
data.sc = sc
data.pos = args.pos and args.pos.default
data.lit = args.lit and args.lit.default
data.sort_key = args.sort
data.type = args.type and args.type.default
data.nocap = args.nocap
data.notext = args.notext
data.nocat = args.nocat
data.force_cat = args.force_cat
data.l = args.l.default
data.ll = args.ll.default
data.q = args.q.default
data.qq = args.qq.default
data.infl = args.infl.default
return data
end
function export.affix(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "prefix-"}, {term = "base"}, {term = "-suffix"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_affix(augment_affix_data({ parts = parts }, args, lang, sc))
end
function export.compound(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) and not args.type.default then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "first"}, {separator = " +‎ ", term = "second"} }
else
error("You must provide at least one part of a compound.")
end
end
return m_affix.show_compound(augment_affix_data({ parts = parts }, args, lang, sc))
end
-- FIXME: Temporary for check in compound_like() below for old-style {{contraction}} parameters. Remove eventually.
local function ine(arg)
if arg == "" then
return nil
else
return arg
end
end
function export.compound_like(frame)
local iparams = {
["lang"] = {type = "language"},
["template"] = {},
["text"] = {},
["oftext"] = {},
["cat"] = {},
["noaffixcat"] = boolean_param,
["dont_require_index"] = boolean_param,
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local parent_args = frame:getParent().args
-- Error to catch most uses of old-style parameters for {{contraction}}. (FIXME: Remove eventually.)
local term_param = iargs.lang and 1 or 2
if ine(parent_args[term_param + 2]) and not ine(parent_args[term_param + 1]) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and not ine(parent_args.t2) and not ine(parent_args.gloss2) and not ine(parent_args.g2)
and not ine(parent_args.alt2) then
error(("You specified a term in %s= and not one in %s=. You probably meant to use t= to specify a gloss instead. "
.. "If you intended to specify two terms, put the second term in %s=."):format(term_param + 2, term_param + 1,
term_param + 1))
end
if not ine(parent_args[term_param + 1]) and not ine(parent_args.alt2) and not ine(parent_args.tr2) and not ine(parent_args.ts2)
and ine(parent_args.g2) then
error(("You specified a gender in g2= but no term in %s=. You were probably trying to specify two genders for "
.. "a single term. To do that, put both genders in g=, comma-separated."):format(term_param + 1))
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
ilang = iargs.lang,
dont_require_index = iargs.dont_require_index,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = not iargs.dont_require_index,
allow_semicolon_separator = true,
}
local template = iargs.template
local nocat = args.nocat
local notext = args.notext
local text = not notext and iargs.text
local oftext = not notext and (iargs.oftext or text and "of")
local cat = not nocat and iargs.cat
local noaffixcat = nocat or iargs.noaffixcat
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "first"}, {separator = " +‎ ", term = "second"} }
end
end
return m_affix.show_compound_like(augment_affix_data({ parts = parts, text = text, oftext = oftext, cat = cat, noaffixcat = noaffixcat },
args, lang, sc))
end
function export.surface_analysis(frame)
local function ine(arg)
-- Since we're operating before calling [[Module:parameters]], we need to imitate how that module processes
-- arguments, including trimming since numbered arguments don't have automatic whitespace trimming.
if not arg then
return arg
end
arg = mw.text.trim(arg)
if arg == "" then
arg = nil
end
return arg
end
local parent_args = frame:getParent().args
local etymtext
local arg1 = ine(parent_args[1])
if not arg1 then
-- Allow omitted first argument to just display "By surface analysis".
etymtext = ""
elseif arg1:find("^%+") then
-- If the first argument (normally a language code) is prefixed with a +, it's a template name.
local template_name = arg1:sub(2)
local new_args = {}
for i, v in pairs(parent_args) do
if type(i) == "number" then
if i > 1 then
new_args[i - 1] = v
end
else
new_args[i] = v
end
end
new_args.nocap = true
etymtext = ", " .. frame:expandTemplate { title = template_name, args = new_args }
end
if etymtext then
return (ine(parent_args.nocap) and "b" or "B") .. "y [[Appendix:Glossary#surface analysis|surface analysis]]" ..
etymtext
end
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = parent_args,
extra_params = extra_params,
allow_type = true,
allow_semicolon_separator = true,
}
-- There must be at least one part to display. If there are gaps, a term
-- request will be shown.
if not next(parts) then
if mw.title.getCurrentTitle().nsText == "Template" then
parts = { {term = "first"}, {separator = " +‎ ", term = "second"} }
else
error("You must provide at least one part.")
end
end
return m_affix.show_surface_analysis(augment_affix_data({ parts = parts }, args, lang, sc))
end
local function check_max_items(items, max_allowed)
if #items > max_allowed then
local bad_item = items[max_allowed + 1]
if bad_item.term then
error(("At most %s terms can be specified but saw a term specified for term #%s")
:format(max_allowed, max_allowed + 1))
else
for k, v in pairs(bad_item) do
if is_property_key(k) then
error(("At most %s terms can be specified but saw a value for property '%s' of term #%s")
:format(max_allowed, k, max_allowed + 1))
end
end
end
error(("Internal error: Something wrong, %s items generated when there should be at most %s, but item #%s doesn't have a term or any properties")
:format(#items, max_allowed, max_allowed + 1))
end
end
function export.circumfix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[2]
local suffix = parts[3]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and base and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "circumfix", alt = "prefix"}
base = {term = "base"}
suffix = {term = "circumfix", alt = "suffix"}
else
error("You must specify a prefix part, a base term and a suffix part.")
end
end
return m_affix.show_circumfix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.confix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local prefix = parts[1]
local base = parts[3] and parts[2] or nil
local suffix = parts[3] or parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (prefix and suffix) then
if mw.title.getCurrentTitle().nsText == "Template" then
prefix = {term = "prefix"}
suffix = {term = "suffix"}
else
error("You must specify a prefix part, an optional base term and a suffix part.")
end
end
return m_affix.show_confix(augment_affix_data({ prefix = prefix, base = base, suffix = suffix }, args, lang, sc))
end
function export.pseudo_loan(frame)
local function extra_params(params)
params.notext = boolean_param
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc, source = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
has_source = true,
-- FIXME, why are we doing this? Formerly we had 'params.pos = nil' whose intention was to disable the overall
-- pos= while preserving posN=, which is equivalent to the following using the new syntax. But why is this
-- necessary?
require_index_for_pos = true,
allow_semicolon_separator = true,
}
return require(pseudo_loan_module).show_pseudo_loan(
augment_affix_data({ source = source, parts = parts }, args, lang, sc))
end
function export.infix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
check_max_items(parts, 3)
local base = parts[1]
local infix = parts[2]
-- Just to make sure someone didn't use the template in a silly way
if not (base and infix) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "base"}
infix = {term = "infix"}
else
error("You must provide a base term and an infix.")
end
end
return m_affix.show_infix(augment_affix_data({ base = base, infix = infix }, args, lang, sc))
end
function export.prefix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local prefixes = parts
local base = nil
local max_prefix = 0
for k, v in pairs(prefixes) do
max_prefix = math.max(k, max_prefix)
end
if max_prefix >= 2 then
base = prefixes[max_prefix]
prefixes[max_prefix] = nil
end
-- Just to make sure someone didn't use the template in a silly way
if not next(prefixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "base"}
prefixes = { {term = "prefix"} }
else
error("You must provide at least one prefix.")
end
end
return m_affix.show_prefix(augment_affix_data({ prefixes = prefixes, base = base }, args, lang, sc))
end
function export.suffix(frame)
local function extra_params(params)
params.nocat = boolean_param
params.force_cat = boolean_param
end
local args, parts, lang, sc = parse_args {
raw_args = frame:getParent().args,
extra_params = extra_params,
}
local base = parts[1]
local suffixes = {}
for k, v in pairs(parts) do
suffixes[k - 1] = v
end
-- Just to make sure someone didn't use the template in a silly way
if not next(suffixes) then
if mw.title.getCurrentTitle().nsText == "Template" then
base = {term = "base"}
suffixes = { {term = "suffix"} }
else
error("You must provide at least one suffix.")
end
end
return m_affix.show_suffix(augment_affix_data({ base = base, suffixes = suffixes }, args, lang, sc))
end
function export.derivsee(frame)
local iargs = frame.args
local iparams = {
["derivtype"] = {},
}
local iargs = require("Module:parameters").process(frame.args, iparams)
local params = {
["head"] = {},
["id"] = {},
["sc"] = {type = "script"},
["pos"] = {},
}
local derivtype = iargs.derivtype
params[1] = {required = "true", type = "language", default = "und"}
params[2] = {}
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = args[1]
local term = args[2] or args.head
local id = args.id
local sc = args.sc
local pos = require(en_utilities_module).pluralize(args.pos or "term")
if not term then
local SUBPAGE = mw.loadData("Module:headword/data").pagename
if lang:hasType("reconstructed") or mw.title.getCurrentTitle().nsText == "Reconstruction" then
term = "*" .. SUBPAGE
elseif lang:hasType("appendix-constructed") then
term = SUBPAGE
else
term = SUBPAGE
end
end
local category = nil
local langname = lang:getFullName()
if (derivtype == "compound" and pos == nil) then
category = langname .. " compounds with " .. term
elseif derivtype == "compound" and pos == "verbs" then
category = langname .. " compound " .. pos .. " formed with " .. term
elseif derivtype == "compound" then
category = langname .. " compound " .. pos .. " with " .. term
else
category = langname .. " " .. pos .. " " .. derivtype .. "ed with " .. term .. (id and " (" .. id .. ")" or "")
end
return require('Module:collapsible category tree').make{
lang = lang,
sc = sc,
category = category,
}
end
return export
701ci4kau9yagdq4na1uqxca6idigvq
Mòideal:affix/documentation
828
17838
88645
2025-12-04T22:09:42Z
en>Juwan
0
88645
wikitext
text/x-wiki
This module, accessed through [[Module:affix/templates]], powers most of the morphology templates, including {{temp|affix}}, {{temp|prefix}}, {{temp|suffix}}, {{temp|confix}}, {{temp|compound}}, {{temp|blend}}, {{temp|univerbation}} and various others, as well as {{temp|prefixsee}} and {{temp|suffixsee}}.
==Exported functions==
{{module documentation|section_level=3|identifier=^export}}
==Subpages==
{{subpages|Module:affix}}
{{module cat|-|Etymology}}
fktxb6r281hgatxfl3dpwmhkxqg89iu
88646
88645
2026-07-30T11:17:53Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/documentation]]
88645
wikitext
text/x-wiki
This module, accessed through [[Module:affix/templates]], powers most of the morphology templates, including {{temp|affix}}, {{temp|prefix}}, {{temp|suffix}}, {{temp|confix}}, {{temp|compound}}, {{temp|blend}}, {{temp|univerbation}} and various others, as well as {{temp|prefixsee}} and {{temp|suffixsee}}.
==Exported functions==
{{module documentation|section_level=3|identifier=^export}}
==Subpages==
{{subpages|Module:affix}}
{{module cat|-|Etymology}}
fktxb6r281hgatxfl3dpwmhkxqg89iu
Mòideal:affix/templates/documentation
828
17839
88647
2023-10-08T07:24:21Z
en>Catttte
0
remove deleted template
88647
wikitext
text/x-wiki
Handles {{temp|compound}}, {{temp|concomp}}, {{temp|affix}}, {{temp|prefix}}, {{temp|suffix}}, {{temp|confix}}, {{temp|circumfix}}, {{temp|infix}}, {{temp|blend}}, {{temp|univerbation}}, {{temp|compoundsee}}, {{temp|prefixsee}}, {{temp|suffixsee}}, {{temp|interfixsee}}, {{temp|infixsee}}, {{temp|circumfixsee}}, {{temp|surface analysis}}, {{temp|pseudo-loan}} and {{temp|abred}}.
Test for module errors:
* {{affix|en|archduke|-ess}}, {{suffix|en|archduke|ess}}
* {{affix|en|arch-|duchess}}, {{prefix|en|arch|duchess}}
<includeonly>
[[Category:Template interface modules]]
</includeonly>
kw999tpc5xk182hnfz2vx5jl1pqn7aa
88648
88647
2026-07-30T11:17:59Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/templates/documentation]]
88647
wikitext
text/x-wiki
Handles {{temp|compound}}, {{temp|concomp}}, {{temp|affix}}, {{temp|prefix}}, {{temp|suffix}}, {{temp|confix}}, {{temp|circumfix}}, {{temp|infix}}, {{temp|blend}}, {{temp|univerbation}}, {{temp|compoundsee}}, {{temp|prefixsee}}, {{temp|suffixsee}}, {{temp|interfixsee}}, {{temp|infixsee}}, {{temp|circumfixsee}}, {{temp|surface analysis}}, {{temp|pseudo-loan}} and {{temp|abred}}.
Test for module errors:
* {{affix|en|archduke|-ess}}, {{suffix|en|archduke|ess}}
* {{affix|en|arch-|duchess}}, {{prefix|en|arch|duchess}}
<includeonly>
[[Category:Template interface modules]]
</includeonly>
kw999tpc5xk182hnfz2vx5jl1pqn7aa
Mòideal:affix/lang-data/az
828
17840
88649
2025-09-22T12:49:20Z
en>Fenakhay
0
88649
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Azerbaijani.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local id_mapping = m_affix.id_mapping
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("-mək", {"-maq"}),
affix_variants("-lər", {"-lar"}),
affix_variants("-cə", {"-ca"}),
affix_variants("-lə", {"-la"}),
affix_variants("-lən", {"-lan"}),
affix_variants("-mə", {"-ma"}),
affix_variants("-ləş", {"-laş"}),
{
["-ır"] = id_mapping("-dir", { nominal = "-ir" }),
["-ir"] = id_mapping("-dir"),
["-ur"] = id_mapping("-dir", { nominal = "-ir" }),
["-ür"] = id_mapping("-dir", { nominal = "-ir" }),
},
affix_variants("-miş", { "-mış", "-muş", "-müş" }),
affix_variants("-ər", { "-yər", "-ar", "-yar" }),
affix_variants("-çi", { "-çı", "-çu", "-çü" }),
affix_variants("-lik", { "-lıq", "-luq", "-lük" }),
affix_variants("-li", { "-lı", "-lu", "-lü" }),
affix_variants("-siz", { "-sız", "-suz", "-süz" }),
affix_variants("-cik", { "-cuq", "-cıq", "-cük" }),
affix_variants("-kin", { "-gün", "-ğun", "-ğın", "-gin", "-kün", "-qın" }),
affix_variants("-il", { "-ul", "-ıl", "-ül" }),
affix_variants("-ik", { "-ük", "-ıq", "-uq" }),
affix_variants("-in", { "-ün", "-ın", "-un" }),
affix_variants("-inti", { "-ıntı", "-untu", "-üntü" }),
affix_variants("-dir", { "-dır", "-dur", "-dür" })
)
return {affix_mappings = affix_mappings}
rtti778aee1k0diuf6d7yixjl0fuxi9
88650
88649
2026-07-30T11:18:10Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/az]]
88649
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Azerbaijani.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local id_mapping = m_affix.id_mapping
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("-mək", {"-maq"}),
affix_variants("-lər", {"-lar"}),
affix_variants("-cə", {"-ca"}),
affix_variants("-lə", {"-la"}),
affix_variants("-lən", {"-lan"}),
affix_variants("-mə", {"-ma"}),
affix_variants("-ləş", {"-laş"}),
{
["-ır"] = id_mapping("-dir", { nominal = "-ir" }),
["-ir"] = id_mapping("-dir"),
["-ur"] = id_mapping("-dir", { nominal = "-ir" }),
["-ür"] = id_mapping("-dir", { nominal = "-ir" }),
},
affix_variants("-miş", { "-mış", "-muş", "-müş" }),
affix_variants("-ər", { "-yər", "-ar", "-yar" }),
affix_variants("-çi", { "-çı", "-çu", "-çü" }),
affix_variants("-lik", { "-lıq", "-luq", "-lük" }),
affix_variants("-li", { "-lı", "-lu", "-lü" }),
affix_variants("-siz", { "-sız", "-suz", "-süz" }),
affix_variants("-cik", { "-cuq", "-cıq", "-cük" }),
affix_variants("-kin", { "-gün", "-ğun", "-ğın", "-gin", "-kün", "-qın" }),
affix_variants("-il", { "-ul", "-ıl", "-ül" }),
affix_variants("-ik", { "-ük", "-ıq", "-uq" }),
affix_variants("-in", { "-ün", "-ın", "-un" }),
affix_variants("-inti", { "-ıntı", "-untu", "-üntü" }),
affix_variants("-dir", { "-dır", "-dur", "-dür" })
)
return {affix_mappings = affix_mappings}
rtti778aee1k0diuf6d7yixjl0fuxi9
Mòideal:affix/lang-data/fi
828
17841
88651
2026-03-28T19:06:44Z
en>Surjection
0
88651
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Finnish.
]=]
local affix_mappings = {
["-dä"] = "-da",
["-eliäs"] = "-elias",
["-ellä"] = "-ella",
["-eltää"] = "-eltaa",
["-ertää"] = "-ertaa",
["-ervö"] = "-ervo",
["-erö"] = "-ero",
["-etä"] = "-eta",
["-eä"] = "-ea",
["-hkiä"] = "-hkia",
["-hkä"] = "-hka",
["-hkö"] = "-hko",
["-htiä"] = "-htia",
["-htyä"] = "-htua",
["-hän"] = "-han",
["-idä"] = "-ida",
["-ikkä"] = "-ikka",
["-ikäs"] = "-ikas",
["-ikkö"] = "-ikko",
["-illä"] = "-illa",
["-iläs"] = "-ilas",
["-ilö"] = "-ilo",
["-imö"] = "-imo",
["-inkö"] = "-inko",
["-inä"] = "-ina",
["-istä"] = "-ista",
["-istää"] = "-istaa",
["-istö"] = "-isto",
["-isyys"] = "-isuus",
["-isä"] = "-isa",
["-isö"] = "-iso",
["-itsä"] = "-itsa",
["-ittäin"] = "-ittain",
["-ittää"] = "-ittaa",
["-itä"] = "-ita",
["-iä"] = "-ia",
["-iäinen"] = "-iainen",
["-iäs"] = "-ias",
["-iö"] = "-io",
["-jainen"] = "-iainen",
["-jä"] = "-ja",
["-jäin"] = "-jain",
["-jäinen"] = "-iainen",
["-keä"] = "-kea",
["-kky"] = "-kku",
["-kkä"] = "-kka",
["-kkäin"] = "-kkain",
["-kkäri"] = "-kkari",
["-kkö"] = "-kko",
["-kköin"] = "-kkoin",
["-ksiä"] = "-ksia",
["-ksyä"] = "-ksua",
["-käinen"] = "-kainen",
["-kä"] = "-ka",
["-käs"] = "-kas",
["-kään"] = "-kaan",
["-kö"] = "-ko",
["-köidä"] = "-koida",
["-köinen"] = "-koinen",
["-listö"] = "-listo",
["-liäs"] = "-lias",
["-llerö"] = "-llero",
["-llä"] = "-lla",
["-llöin"] = "-lloin",
["-llöinen"] = "-lloinen",
["-lmä"] = "-lma",
["-ltä"] = "-lta",
["-ltää"] = "-ltaa",
["-lys"] = "-lus",
["-lä"] = "-la",
["-läinen"] = "-lainen",
["-läs"] = "-las",
["-lö"] = "-lo",
["-löidä"] = "-loida",
["-mys"] = "-mus",
["-mä"] = "-ma",
["-mäinen"] = "-mainen",
["-mätön"] = "-maton",
["-mö"] = "-mo",
["-möinen"] = "-moinen",
["-nkä"] = "-nka",
["-nkäinen"] = "-nkainen",
["-nkö"] = "-nko",
["-nnellä"] = "-nnella",
["-nnäinen"] = "-nnainen",
["-nnöin"] = "-nnoin",
["-nnös"] = "-nnos",
["-nsä"] = "-nsa",
["-ntyä"] = "-ntua",
["-ntä"] = "-nta",
["-ntää"] = "-ntaa",
["-ntö"] = "-nto",
["-nyt"] = "-nut",
["-nä"] = "-na",
["-näinen"] = "-nainen",
["-ppä"] = "-ppa",
["-ppäri"] = "-ppari",
["-pyä"] = "-pua",
["-pä"] = "-pa",
["-rtää"] = "-rtaa",
["-rä"] = "-ra",
["-rmä"] = "-rma",
["-röidä"] = "-roida",
["-skellä"] = "-skella",
["-skennellä"] = "-skennella",
["-sky"] = "-sku",
["-skä"] = "-ska",
["-skäri"] = "-skari",
["-skö"] = "-sko",
["-stellä"] = "-stella",
["-styä"] = "-stua",
["-stää"] = "-staa",
["-stään"] = "-staan",
["-stö"] = "-sto",
["-sy"] = "-su",
["-sä"] = "-sa",
["-säkkä"] = "-sakka",
["-tellä"] = "-tella",
["-tsy"] = "-tsu",
["-tsä"] = "-tsa",
["-tty"] = "-ttu",
["-ttyä"] = "-ttua",
["-ttä"] = "-tta",
["-ttäin"] = "-ttain",
["-ttävä"] = "-ttava",
["-ttää"] = "-ttaa",
["-ty"] = "-tu",
["-tyinen"] = "-tuinen",
["-tyksin"] = "-tuksin",
["-tys"] = "-tus",
["-tysten"] = "-tusten",
["-tyä"] = "-tua",
["-tä"] = "-ta",
["-tär"] = "-tar",
["-tävä"] = "-tava",
["-tää"] = "-taa",
["-tön"] = "-ton",
["-vinään"] = "-vinaan",
["-Vntyä"] = "-Vntua",
["-vä"] = "-va",
["-y"] = "-u",
["-ye"] = "-ue",
["-yinen"] = "-uinen",
["-ykkä"] = "-ukka",
["-yli"] = "-uli",
["-ylä"] = "-ula",
["-ymä"] = "-uma",
["-yri"] = "-uri",
["-yrä"] = "-ura",
["-ys"] = "-us",
["-ystin"] = "-ustin",
["-ystä"] = "-usta",
["-ystää"] = "-ustaa",
["-yt"] = "-ut",
["-yttää"] = "-uttaa",
["-ytyä"] = "-utua",
["-yy"] = "-uu",
["-yys"] = "-uus",
["-yyttää"] = "-uuttaa",
["-yä"] = "-ua",
["-yäinen"] = "-uainen",
["-ä"] = "-a",
["-ähtää"] = "-ahtaa",
["-ähtävä"] = "-ahtava",
["-äistä"] = "-aista",
["-äjää"] = "-ajaa",
["-äkkä"] = "-akka",
["-älle"] = "-alle",
["-ällä"] = "-alla",
["-ältä"] = "-alta",
["-ältää"] = "-altaa",
["-äri"] = "-ari",
["-äs"] = "-as",
["-ätä"] = "-ata",
["-äys"] = "-aus",
["-ö"] = "-o",
["-öidä"] = "-oida",
["-öin"] = "-oin",
["-öinen"] = "-oinen",
["-öittyä"] = "-oittua",
["-öittää"] = "-oittaa",
["-öityä"] = "-oitua",
["-önen"] = "-onen",
["-ös"] = "-os",
["-öta"] = "-ota",
["-öttää"] = "-ottaa",
["-öä"] = "-oa",
}
return {affix_mappings = affix_mappings}
09eboyd1k9mnq3nywl7np47mc76bjyu
88652
88651
2026-07-30T11:18:13Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/fi]]
88651
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Finnish.
]=]
local affix_mappings = {
["-dä"] = "-da",
["-eliäs"] = "-elias",
["-ellä"] = "-ella",
["-eltää"] = "-eltaa",
["-ertää"] = "-ertaa",
["-ervö"] = "-ervo",
["-erö"] = "-ero",
["-etä"] = "-eta",
["-eä"] = "-ea",
["-hkiä"] = "-hkia",
["-hkä"] = "-hka",
["-hkö"] = "-hko",
["-htiä"] = "-htia",
["-htyä"] = "-htua",
["-hän"] = "-han",
["-idä"] = "-ida",
["-ikkä"] = "-ikka",
["-ikäs"] = "-ikas",
["-ikkö"] = "-ikko",
["-illä"] = "-illa",
["-iläs"] = "-ilas",
["-ilö"] = "-ilo",
["-imö"] = "-imo",
["-inkö"] = "-inko",
["-inä"] = "-ina",
["-istä"] = "-ista",
["-istää"] = "-istaa",
["-istö"] = "-isto",
["-isyys"] = "-isuus",
["-isä"] = "-isa",
["-isö"] = "-iso",
["-itsä"] = "-itsa",
["-ittäin"] = "-ittain",
["-ittää"] = "-ittaa",
["-itä"] = "-ita",
["-iä"] = "-ia",
["-iäinen"] = "-iainen",
["-iäs"] = "-ias",
["-iö"] = "-io",
["-jainen"] = "-iainen",
["-jä"] = "-ja",
["-jäin"] = "-jain",
["-jäinen"] = "-iainen",
["-keä"] = "-kea",
["-kky"] = "-kku",
["-kkä"] = "-kka",
["-kkäin"] = "-kkain",
["-kkäri"] = "-kkari",
["-kkö"] = "-kko",
["-kköin"] = "-kkoin",
["-ksiä"] = "-ksia",
["-ksyä"] = "-ksua",
["-käinen"] = "-kainen",
["-kä"] = "-ka",
["-käs"] = "-kas",
["-kään"] = "-kaan",
["-kö"] = "-ko",
["-köidä"] = "-koida",
["-köinen"] = "-koinen",
["-listö"] = "-listo",
["-liäs"] = "-lias",
["-llerö"] = "-llero",
["-llä"] = "-lla",
["-llöin"] = "-lloin",
["-llöinen"] = "-lloinen",
["-lmä"] = "-lma",
["-ltä"] = "-lta",
["-ltää"] = "-ltaa",
["-lys"] = "-lus",
["-lä"] = "-la",
["-läinen"] = "-lainen",
["-läs"] = "-las",
["-lö"] = "-lo",
["-löidä"] = "-loida",
["-mys"] = "-mus",
["-mä"] = "-ma",
["-mäinen"] = "-mainen",
["-mätön"] = "-maton",
["-mö"] = "-mo",
["-möinen"] = "-moinen",
["-nkä"] = "-nka",
["-nkäinen"] = "-nkainen",
["-nkö"] = "-nko",
["-nnellä"] = "-nnella",
["-nnäinen"] = "-nnainen",
["-nnöin"] = "-nnoin",
["-nnös"] = "-nnos",
["-nsä"] = "-nsa",
["-ntyä"] = "-ntua",
["-ntä"] = "-nta",
["-ntää"] = "-ntaa",
["-ntö"] = "-nto",
["-nyt"] = "-nut",
["-nä"] = "-na",
["-näinen"] = "-nainen",
["-ppä"] = "-ppa",
["-ppäri"] = "-ppari",
["-pyä"] = "-pua",
["-pä"] = "-pa",
["-rtää"] = "-rtaa",
["-rä"] = "-ra",
["-rmä"] = "-rma",
["-röidä"] = "-roida",
["-skellä"] = "-skella",
["-skennellä"] = "-skennella",
["-sky"] = "-sku",
["-skä"] = "-ska",
["-skäri"] = "-skari",
["-skö"] = "-sko",
["-stellä"] = "-stella",
["-styä"] = "-stua",
["-stää"] = "-staa",
["-stään"] = "-staan",
["-stö"] = "-sto",
["-sy"] = "-su",
["-sä"] = "-sa",
["-säkkä"] = "-sakka",
["-tellä"] = "-tella",
["-tsy"] = "-tsu",
["-tsä"] = "-tsa",
["-tty"] = "-ttu",
["-ttyä"] = "-ttua",
["-ttä"] = "-tta",
["-ttäin"] = "-ttain",
["-ttävä"] = "-ttava",
["-ttää"] = "-ttaa",
["-ty"] = "-tu",
["-tyinen"] = "-tuinen",
["-tyksin"] = "-tuksin",
["-tys"] = "-tus",
["-tysten"] = "-tusten",
["-tyä"] = "-tua",
["-tä"] = "-ta",
["-tär"] = "-tar",
["-tävä"] = "-tava",
["-tää"] = "-taa",
["-tön"] = "-ton",
["-vinään"] = "-vinaan",
["-Vntyä"] = "-Vntua",
["-vä"] = "-va",
["-y"] = "-u",
["-ye"] = "-ue",
["-yinen"] = "-uinen",
["-ykkä"] = "-ukka",
["-yli"] = "-uli",
["-ylä"] = "-ula",
["-ymä"] = "-uma",
["-yri"] = "-uri",
["-yrä"] = "-ura",
["-ys"] = "-us",
["-ystin"] = "-ustin",
["-ystä"] = "-usta",
["-ystää"] = "-ustaa",
["-yt"] = "-ut",
["-yttää"] = "-uttaa",
["-ytyä"] = "-utua",
["-yy"] = "-uu",
["-yys"] = "-uus",
["-yyttää"] = "-uuttaa",
["-yä"] = "-ua",
["-yäinen"] = "-uainen",
["-ä"] = "-a",
["-ähtää"] = "-ahtaa",
["-ähtävä"] = "-ahtava",
["-äistä"] = "-aista",
["-äjää"] = "-ajaa",
["-äkkä"] = "-akka",
["-älle"] = "-alle",
["-ällä"] = "-alla",
["-ältä"] = "-alta",
["-ältää"] = "-altaa",
["-äri"] = "-ari",
["-äs"] = "-as",
["-ätä"] = "-ata",
["-äys"] = "-aus",
["-ö"] = "-o",
["-öidä"] = "-oida",
["-öin"] = "-oin",
["-öinen"] = "-oinen",
["-öittyä"] = "-oittua",
["-öittää"] = "-oittaa",
["-öityä"] = "-oitua",
["-önen"] = "-onen",
["-ös"] = "-os",
["-öta"] = "-ota",
["-öttää"] = "-ottaa",
["-öä"] = "-oa",
}
return {affix_mappings = affix_mappings}
09eboyd1k9mnq3nywl7np47mc76bjyu
Mòideal:affix/lang-data/fr
828
17842
88653
2025-09-22T12:46:13Z
en>Fenakhay
0
88653
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for French.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local affix_mappings = affix_variants("-ation", {"-tion", "-xion", "-sion"})
return {affix_mappings = affix_mappings}
n1eo8ddggq4rq0tscuj1wfe8cjyf6jb
88654
88653
2026-07-30T11:18:15Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/fr]]
88653
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for French.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local affix_mappings = affix_variants("-ation", {"-tion", "-xion", "-sion"})
return {affix_mappings = affix_mappings}
n1eo8ddggq4rq0tscuj1wfe8cjyf6jb
Mòideal:affix/lang-data/izh
828
17843
88655
2024-04-27T09:08:36Z
en>SurjectionBot
0
Protected "[[Module:affix/lang-data/izh]]": (bot) automatically protect highly visible templates/modules (reference score: 1904+ >= 1000) ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite))
88655
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Ingrian.
]=]
local affix_mappings = {
["-ähtää"] = "-ahtaa",
["-ellä"] = "-ella",
["-ertää"] = "-ertaa",
["-etä"] = "-eta",
["-htiä"] = "-htia",
["-htyä"] = "-htua",
["-iä"] = "-ia",
["-iäin"] = "-iain",
["-issä"] = "-issa",
["-ikkö"] = "-ikko",
["-isä"] = "-isa",
["-issä"] = "-issa",
["-istää"] = "-istaa",
["-itä"] = "-ita",
["-jä"] = "-ja",
["-kä"] = "-ka",
["-kää"] = "-kaa",
["-käs"] = "-kas",
["-kkä"] = "-kka",
["-kkäin"] = "-kkain",
["-kkö"] = "-kko",
["-ksiä"] = "-ksia",
["-läin"] = "-lain",
["-mä"] = "-ma",
["-mäin"] = "-main",
["-mys"] = "-mus",
["-nä"] = "-na",
["-näin"] = "-nain",
["-nnös"] = "-nnos",
["-ntää"] = "-ntaa",
["-ntö"] = "-nto",
["-ö"] = "-o",
["-öä"] = "-oa",
["-öin"] = "-oin",
["-öjä"] = "-oja",
["-ös"] = "-os",
["-pyä"] = "-pua",
["-stää"] = "-staa",
["-stö"] = "-sto",
["-styä"] = "-stua",
["-tä"] = "-ta",
["-tää"] = "-taa",
["-tellä"] = "-tella",
["-töin"] = "-toin",
["-ttää"] = "-ttaa",
["-ttäin"] = "-ttain",
["-tty"] = "-ttu",
["-ttyä"] = "-ttua",
["-tyä"] = "-tua",
["-tyin"] = "-tuin",
["-y"] = "-u",
["-yä"] = "-ua",
["-yli"] = "-uli",
["-yri"] = "-uri",
["-ys"] = "-us",
["-ystä"] = "-usta",
["-yt"] = "-ut",
["-yttä"] = "-utta",
["-yys"] = "-uus",
["-vä"] = "-va",
}
return {affix_mappings = affix_mappings}
6j8oxblnij0k3xpqqvum9q6pfd4gmng
88656
88655
2026-07-30T11:18:19Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/izh]]
88655
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Ingrian.
]=]
local affix_mappings = {
["-ähtää"] = "-ahtaa",
["-ellä"] = "-ella",
["-ertää"] = "-ertaa",
["-etä"] = "-eta",
["-htiä"] = "-htia",
["-htyä"] = "-htua",
["-iä"] = "-ia",
["-iäin"] = "-iain",
["-issä"] = "-issa",
["-ikkö"] = "-ikko",
["-isä"] = "-isa",
["-issä"] = "-issa",
["-istää"] = "-istaa",
["-itä"] = "-ita",
["-jä"] = "-ja",
["-kä"] = "-ka",
["-kää"] = "-kaa",
["-käs"] = "-kas",
["-kkä"] = "-kka",
["-kkäin"] = "-kkain",
["-kkö"] = "-kko",
["-ksiä"] = "-ksia",
["-läin"] = "-lain",
["-mä"] = "-ma",
["-mäin"] = "-main",
["-mys"] = "-mus",
["-nä"] = "-na",
["-näin"] = "-nain",
["-nnös"] = "-nnos",
["-ntää"] = "-ntaa",
["-ntö"] = "-nto",
["-ö"] = "-o",
["-öä"] = "-oa",
["-öin"] = "-oin",
["-öjä"] = "-oja",
["-ös"] = "-os",
["-pyä"] = "-pua",
["-stää"] = "-staa",
["-stö"] = "-sto",
["-styä"] = "-stua",
["-tä"] = "-ta",
["-tää"] = "-taa",
["-tellä"] = "-tella",
["-töin"] = "-toin",
["-ttää"] = "-ttaa",
["-ttäin"] = "-ttain",
["-tty"] = "-ttu",
["-ttyä"] = "-ttua",
["-tyä"] = "-tua",
["-tyin"] = "-tuin",
["-y"] = "-u",
["-yä"] = "-ua",
["-yli"] = "-uli",
["-yri"] = "-uri",
["-ys"] = "-us",
["-ystä"] = "-usta",
["-yt"] = "-ut",
["-yttä"] = "-utta",
["-yys"] = "-uus",
["-vä"] = "-va",
}
return {affix_mappings = affix_mappings}
6j8oxblnij0k3xpqqvum9q6pfd4gmng
Mòideal:affix/lang-data/la
828
17844
88657
2025-09-22T12:47:25Z
en>Fenakhay
0
88657
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Latin.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("in-", {"il-", "im-", "ir-"}),
affix_variants("con-", {"col-", "com-", "cor-"})
)
return {affix_mappings = affix_mappings}
tlx7365xpmy6pdc2d5c0ml9qtoa3haq
88658
88657
2026-07-30T11:18:21Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/la]]
88657
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Latin.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("in-", {"il-", "im-", "ir-"}),
affix_variants("con-", {"col-", "com-", "cor-"})
)
return {affix_mappings = affix_mappings}
tlx7365xpmy6pdc2d5c0ml9qtoa3haq
Mòideal:affix/lang-data/sah
828
17845
88659
2025-09-22T12:46:11Z
en>Fenakhay
0
88659
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Yakut.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("-ис", {"-үс", "-ыс", "-ус"}),
affix_variants("-ии", {"-үү", "-ыы", "-уу"})
)
return {affix_mappings = affix_mappings}
17lj4vz734ope2gky32khnml72udday
88660
88659
2026-07-30T11:18:23Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/sah]]
88659
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Yakut.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("-ис", {"-үс", "-ыс", "-ус"}),
affix_variants("-ии", {"-үү", "-ыы", "-уу"})
)
return {affix_mappings = affix_mappings}
17lj4vz734ope2gky32khnml72udday
Mòideal:affix/lang-data/tk
828
17846
88661
2024-11-25T18:18:52Z
en>Saparmurat Niýazov Türkmenbaşy
0
Created page with "--[=[ This module contains lang-specific affix mappings for Turkmen. ]=] local affix_mappings = { ["-ly"] = "-li" } return {affix_mappings = affix_mappings}"
88661
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Turkmen.
]=]
local affix_mappings = {
["-ly"] = "-li"
}
return {affix_mappings = affix_mappings}
d0ppprfyyvspz3qn1f6wsev7c9jfbh3
88662
88661
2026-07-30T11:18:27Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/tk]]
88661
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Turkmen.
]=]
local affix_mappings = {
["-ly"] = "-li"
}
return {affix_mappings = affix_mappings}
d0ppprfyyvspz3qn1f6wsev7c9jfbh3
Mòideal:affix/lang-data/tr
828
17847
88663
2025-09-22T12:46:08Z
en>Fenakhay
0
88663
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Turkish.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("-mek", {"-mak"}),
affix_variants("-ler", {"-lar"}),
affix_variants("-sa", {"-se"}),
affix_variants("-le", {"-la", "-yla", "-yle"}),
affix_variants("-siz", {"-sız", "-suz", "-süz"}),
affix_variants("-gaç", {"-kaç", "-geç", "-keç"}),
affix_variants("-ci", {"-cı", "-cu", "-cü", "-çı", "-çi", "-çu", "-çü"}),
affix_variants("-ce", {"-ca", "-ça", "-çe"}),
affix_variants("-ik", {"-ık", "-uk", "-ük", "-k"}),
affix_variants("-li", {"-lı", "-lu", "-lü"}),
affix_variants("-im", {"-ım", "-um", "-üm"}),
affix_variants("-iş", {"-ış", "-uş", "-üş"}),
affix_variants("-lik", {"-lık", "-luk", "-lük"}),
affix_variants("-gin", {"-gın", "-gun", "-gün", "-kın", "-kin", "-kun", "-kün"}),
affix_variants("-in", {"-ın", "-un", "-ün"}),
affix_variants("-inci", {"-ıncı", "-uncu", "-üncü", "-ncı", "-ncu", "-ncü", "-nci"})
)
return {affix_mappings = affix_mappings}
4agybbydc4jet10mgqlxt4mllfr6yba
88664
88663
2026-07-30T11:18:31Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/tr]]
88663
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Turkish.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("-mek", {"-mak"}),
affix_variants("-ler", {"-lar"}),
affix_variants("-sa", {"-se"}),
affix_variants("-le", {"-la", "-yla", "-yle"}),
affix_variants("-siz", {"-sız", "-suz", "-süz"}),
affix_variants("-gaç", {"-kaç", "-geç", "-keç"}),
affix_variants("-ci", {"-cı", "-cu", "-cü", "-çı", "-çi", "-çu", "-çü"}),
affix_variants("-ce", {"-ca", "-ça", "-çe"}),
affix_variants("-ik", {"-ık", "-uk", "-ük", "-k"}),
affix_variants("-li", {"-lı", "-lu", "-lü"}),
affix_variants("-im", {"-ım", "-um", "-üm"}),
affix_variants("-iş", {"-ış", "-uş", "-üş"}),
affix_variants("-lik", {"-lık", "-luk", "-lük"}),
affix_variants("-gin", {"-gın", "-gun", "-gün", "-kın", "-kin", "-kun", "-kün"}),
affix_variants("-in", {"-ın", "-un", "-ün"}),
affix_variants("-inci", {"-ıncı", "-uncu", "-üncü", "-ncı", "-ncu", "-ncü", "-nci"})
)
return {affix_mappings = affix_mappings}
4agybbydc4jet10mgqlxt4mllfr6yba
Mòideal:affix/lang-data/trk-pro
828
17848
88665
2026-01-04T08:53:28Z
en>Fenakhay
0
Created page with "--[=[ This module contains lang-specific affix mappings for Proto-Turkic. ]=] local m_affix = require("Module:affix") local affix_variants = m_affix.affix_variants local merge_tables = m_affix.merge_tables local affix_mappings = merge_tables( affix_variants("*-gü", {"*-gu"}) ) return {affix_mappings = affix_mappings}"
88665
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Proto-Turkic.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("*-gü", {"*-gu"})
)
return {affix_mappings = affix_mappings}
49hyevop9smjhv7y005yivukiw7fjgx
88666
88665
2026-07-30T11:18:35Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/lang-data/trk-pro]]
88665
Scribunto
text/plain
--[=[
This module contains lang-specific affix mappings for Proto-Turkic.
]=]
local m_affix = require("Module:affix")
local affix_variants = m_affix.affix_variants
local merge_tables = m_affix.merge_tables
local affix_mappings = merge_tables(
affix_variants("*-gü", {"*-gu"})
)
return {affix_mappings = affix_mappings}
49hyevop9smjhv7y005yivukiw7fjgx
Mòideal:affix/pseudo-loan
828
17849
88667
2025-11-21T02:35:03Z
en>Benwing2
0
support semicolon separator arg for "or"
88667
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- set to true for testing
local m_affix = require("Module:affix")
local pseudo_loan_by_source = {
["ar"] = "Arabism",
["de"] = "Germanism",
["en"] = "anglicism",
["es"] = "Hispanism",
["fr"] = "Gallicism",
["it"] = "Italianism",
["ja"] = "Japonism",
["la"] = "Latinism",
}
local function get_pseudo_loan_text(lang, source, has_parts, nocap)
local langcode = lang:getCode()
local sourcecode = source:getCode()
local function glossary_pseudo_loan_link(display)
return "[[Appendix:Glossary#pseudo-loan|" .. display .. "]]"
end
local text
if langcode == "ja" and sourcecode == "en" then
local ja_link = require("Module:links").full_link({
term = "和製英語",
lang = require("Module:languages").getByCode("ja"),
tr = "-"
}, "term")
text = "[[Appendix:Japanese glossary#wasei eigo|" .. (nocap and "w" or "W") .. "asei eigo]] (" .. ja_link .. "; " .. glossary_pseudo_loan_link("pseudo-anglicism") .. ")"
elseif pseudo_loan_by_source[sourcecode] then
text = glossary_pseudo_loan_link((nocap and "p" or "P") .. "seudo-" .. pseudo_loan_by_source[sourcecode])
else
text = glossary_pseudo_loan_link((nocap and "p" or "P") .. "seudo-loan") .. " from " .. source:getCanonicalName()
end
if has_parts then
-- When nocap= is specified, the pseudo-loan template is being used in the middle of a sentence and the comma
-- doesn't make so much sense, e.g. on [[輕小說]], which uses `{{cal|...}}, a {{wasei eigo|nocap=y|nocat=y|light|novel}}`,
-- where it reads better as "Calque of ..., a pseudo-loan (wasei eigo) derived from ..." instead of
-- "Calque of ..., a pseudo-loan (wasei eigo), derived from ...". If this proves problematic in general, we will need
-- a separate parameter to control the appearance of the comma.
text = text .. (nocap and " " or ", ") .. "derived from "
end
return text
end
function export.show_pseudo_loan(data)
local parts_formatted = {}
local categories = {}
data.force_cat = data.force_cat or debug_force_cat
if not data.nocat then
table.insert(categories, "pseudo-loans from " .. data.source:getCanonicalName())
table.insert(categories, "terms derived from " .. data.source:getCanonicalName())
end
-- Make links out of all the parts
for i, part in ipairs(data.parts) do
part.part_lang = part.lang
-- When the part is in the source language, we need to use `source` so the part gets linked correctly. Otherwise,
-- `data.lang` will be used, which is correct, because the value is used as the destination language in
-- derived-from categories. An example is [[Ego-Shooter]], a German pseudo-loan from English but where the
-- first part is from Latin.
part.lang = part.lang or data.source
part.sc = part.sc or data.sc
table.insert(parts_formatted, m_affix.link_term(part, data, "include_separator"))
end
local text_sections = {}
if not data.notext then
table.insert(text_sections, get_pseudo_loan_text(data.lang, data.source, #data.parts > 0, data.nocap))
end
table.insert(text_sections, m_affix.join_formatted_parts {
data = data, parts_formatted = parts_formatted, categories = categories, separator_already_added = true}
)
return table.concat(text_sections)
end
return export
mxdhtinjtfy7hk7k9s4koxx4vyrzasu
88668
88667
2026-07-30T11:18:41Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Module:affix/pseudo-loan]]
88667
Scribunto
text/plain
local export = {}
local debug_force_cat = false -- set to true for testing
local m_affix = require("Module:affix")
local pseudo_loan_by_source = {
["ar"] = "Arabism",
["de"] = "Germanism",
["en"] = "anglicism",
["es"] = "Hispanism",
["fr"] = "Gallicism",
["it"] = "Italianism",
["ja"] = "Japonism",
["la"] = "Latinism",
}
local function get_pseudo_loan_text(lang, source, has_parts, nocap)
local langcode = lang:getCode()
local sourcecode = source:getCode()
local function glossary_pseudo_loan_link(display)
return "[[Appendix:Glossary#pseudo-loan|" .. display .. "]]"
end
local text
if langcode == "ja" and sourcecode == "en" then
local ja_link = require("Module:links").full_link({
term = "和製英語",
lang = require("Module:languages").getByCode("ja"),
tr = "-"
}, "term")
text = "[[Appendix:Japanese glossary#wasei eigo|" .. (nocap and "w" or "W") .. "asei eigo]] (" .. ja_link .. "; " .. glossary_pseudo_loan_link("pseudo-anglicism") .. ")"
elseif pseudo_loan_by_source[sourcecode] then
text = glossary_pseudo_loan_link((nocap and "p" or "P") .. "seudo-" .. pseudo_loan_by_source[sourcecode])
else
text = glossary_pseudo_loan_link((nocap and "p" or "P") .. "seudo-loan") .. " from " .. source:getCanonicalName()
end
if has_parts then
-- When nocap= is specified, the pseudo-loan template is being used in the middle of a sentence and the comma
-- doesn't make so much sense, e.g. on [[輕小說]], which uses `{{cal|...}}, a {{wasei eigo|nocap=y|nocat=y|light|novel}}`,
-- where it reads better as "Calque of ..., a pseudo-loan (wasei eigo) derived from ..." instead of
-- "Calque of ..., a pseudo-loan (wasei eigo), derived from ...". If this proves problematic in general, we will need
-- a separate parameter to control the appearance of the comma.
text = text .. (nocap and " " or ", ") .. "derived from "
end
return text
end
function export.show_pseudo_loan(data)
local parts_formatted = {}
local categories = {}
data.force_cat = data.force_cat or debug_force_cat
if not data.nocat then
table.insert(categories, "pseudo-loans from " .. data.source:getCanonicalName())
table.insert(categories, "terms derived from " .. data.source:getCanonicalName())
end
-- Make links out of all the parts
for i, part in ipairs(data.parts) do
part.part_lang = part.lang
-- When the part is in the source language, we need to use `source` so the part gets linked correctly. Otherwise,
-- `data.lang` will be used, which is correct, because the value is used as the destination language in
-- derived-from categories. An example is [[Ego-Shooter]], a German pseudo-loan from English but where the
-- first part is from Latin.
part.lang = part.lang or data.source
part.sc = part.sc or data.sc
table.insert(parts_formatted, m_affix.link_term(part, data, "include_separator"))
end
local text_sections = {}
if not data.notext then
table.insert(text_sections, get_pseudo_loan_text(data.lang, data.source, #data.parts > 0, data.nocap))
end
table.insert(text_sections, m_affix.join_formatted_parts {
data = data, parts_formatted = parts_formatted, categories = categories, separator_already_added = true}
)
return table.concat(text_sections)
end
return export
mxdhtinjtfy7hk7k9s4koxx4vyrzasu
Teamplaid:gd-decl-article
10
17850
88671
2025-12-28T23:31:18Z
en>WingerBot
0
use {{pagename}} in place of {{PAGENAME}}/{{SUBPAGENAME}}/{{BASEPAGENAME}} in inflection templates; use {{tcat}} for categorization; avoid [[Module:ugly hacks]] in favor of [[Module:string/templates]]; misc fixes (manually assisted)
88671
wikitext
text/x-wiki
{{inflection-table-top|palette=blue|title=Variation of ''{{pagename}}'' (definite article)|tall=yes}}
! rowspan="2" class="outer" |
! colspan="3" class="outer" | masculine
! colspan="3" class="outer" | feminine
! colspan="3" class="outer" | plural
|- class="vsHide"
! style="min-width:0" | [[nominative case|nom.]]
! style="min-width:0" | [[dative case|dat.]]
! style="min-width:0" | [[genitive case|gen.]]
! style="min-width:0" | [[nominative case|nom.]]
! style="min-width:0" | [[dative case|dat.]]
! style="min-width:0" | [[genitive case|gen.]]
! style="min-width:0" | [[nominative case|nom.]]
! style="min-width:0" | [[dative case|dat.]]
! style="min-width:0" | [[genitive case|gen.]]
|- class="vsHide"
! + ''f-''
| style="min-width:0" | {{l-self|gd|am}}
| colspan="2" | {{l-self|gd|an}}<sup>L</sup>
| colspan="2" | {{l-self|gd|an}}<sup>L</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nam}}
|- class="vsHide"
! | + ''m-'', ''p-'' or ''b-''
| style="min-width:0" | {{l-self|gd|am}}
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nam}}
|- class="vsHide"
! + ''c-'' or ''g-''
| style="min-width:0" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nan}}
|- class="vsHide"
! + ''s<abbr title=vowel>V</abbr>-'', ''sl-'', ''sn-'' or ''sr-''
| style="min-width:0" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}<sup>T</sup>
| colspan="2" | {{l-self|gd|an}}<sup>T</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nan}}
|- class="vsHide"
! + other consonant
| style="min-width:0" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nan}}
|- class="vsHide"
! + vowel
| style="min-width:0" | {{l-self|gd|an}}<sup>T</sup>
| colspan="2" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}
| style="min-width:0" | {{l-self|gd|na}}<sup>H</sup>
| colspan="2" | {{l-self|gd|na}}<sup>H</sup>
| style="min-width:0" | {{l-self|gd|nan}}
{{inflection-table-bottom|notes=<sup>L</sup> Triggers lenition; <sup>H</sup> Triggers H-prothesis; <sup>T</sup> Triggers T-prothesis}}<noinclude>{{tcat|article}}</noinclude>
0af4m7b28p8c04lmgq9dkwnvzh73hy5
88672
88671
2026-07-30T11:57:40Z
Altronic
4137
Chaidh 1 mhùthadh ion-phortachadh o [[:en:Template:gd-decl-article]]
88671
wikitext
text/x-wiki
{{inflection-table-top|palette=blue|title=Variation of ''{{pagename}}'' (definite article)|tall=yes}}
! rowspan="2" class="outer" |
! colspan="3" class="outer" | masculine
! colspan="3" class="outer" | feminine
! colspan="3" class="outer" | plural
|- class="vsHide"
! style="min-width:0" | [[nominative case|nom.]]
! style="min-width:0" | [[dative case|dat.]]
! style="min-width:0" | [[genitive case|gen.]]
! style="min-width:0" | [[nominative case|nom.]]
! style="min-width:0" | [[dative case|dat.]]
! style="min-width:0" | [[genitive case|gen.]]
! style="min-width:0" | [[nominative case|nom.]]
! style="min-width:0" | [[dative case|dat.]]
! style="min-width:0" | [[genitive case|gen.]]
|- class="vsHide"
! + ''f-''
| style="min-width:0" | {{l-self|gd|am}}
| colspan="2" | {{l-self|gd|an}}<sup>L</sup>
| colspan="2" | {{l-self|gd|an}}<sup>L</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nam}}
|- class="vsHide"
! | + ''m-'', ''p-'' or ''b-''
| style="min-width:0" | {{l-self|gd|am}}
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nam}}
|- class="vsHide"
! + ''c-'' or ''g-''
| style="min-width:0" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| colspan="2" | {{l-self|gd|a'}}<sup>L</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nan}}
|- class="vsHide"
! + ''s<abbr title=vowel>V</abbr>-'', ''sl-'', ''sn-'' or ''sr-''
| style="min-width:0" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}<sup>T</sup>
| colspan="2" | {{l-self|gd|an}}<sup>T</sup>
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nan}}
|- class="vsHide"
! + other consonant
| style="min-width:0" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}
| style="min-width:0" | {{l-self|gd|na}}
| colspan="2" | {{l-self|gd|na}}
| style="min-width:0" | {{l-self|gd|nan}}
|- class="vsHide"
! + vowel
| style="min-width:0" | {{l-self|gd|an}}<sup>T</sup>
| colspan="2" | {{l-self|gd|an}}
| colspan="2" | {{l-self|gd|an}}
| style="min-width:0" | {{l-self|gd|na}}<sup>H</sup>
| colspan="2" | {{l-self|gd|na}}<sup>H</sup>
| style="min-width:0" | {{l-self|gd|nan}}
{{inflection-table-bottom|notes=<sup>L</sup> Triggers lenition; <sup>H</sup> Triggers H-prothesis; <sup>T</sup> Triggers T-prothesis}}<noinclude>{{tcat|article}}</noinclude>
0af4m7b28p8c04lmgq9dkwnvzh73hy5