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 .. " &mdash; " .. 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 .. " &mdash; " .. 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 .. " &mdash; " .. 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 .. " &mdash; " .. 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 .. " &mdash; " .. 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 .. " &mdash; " .. 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 .. " &mdash; " .. 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>&#124;{{#if:{{{}}}|{{#if:{{{1<includeonly>|</includeonly>}}}|{{{1}}}{{#if:{{{list|}}}|<var>N</var>}}=}}{{{2<includeonly>|</includeonly>}}}|={{{1|}}}}}</code><!-- -->{{#if:{{{3|}}}<!-- -->|&nbsp;({{#if:{{{req|}}}|'''''required''''',&nbsp;}}{{#if:{{{opt|}}}|''optional'',&nbsp;}}{{{3}}})<!-- -->|{{#if:{{{req|}}}|&nbsp;('''''required''''')}}{{#if:{{{opt|}}}|&nbsp;(''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>&#124;{{#if:{{{}}}|{{#if:{{{1<includeonly>|</includeonly>}}}|{{{1}}}{{#if:{{{list|}}}|<var>N</var>}}=}}{{{2<includeonly>|</includeonly>}}}|={{{1|}}}}}</code><!-- -->{{#if:{{{3|}}}<!-- -->|&nbsp;({{#if:{{{req|}}}|'''''required''''',&nbsp;}}{{#if:{{{opt|}}}|''optional'',&nbsp;}}{{{3}}})<!-- -->|{{#if:{{{req|}}}|&nbsp;('''''required''''')}}{{#if:{{{opt|}}}|&nbsp;(''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("&#32;and&#32;") .. seq[2] else local comma = '<span class="serial-comma">,</span>' local conj = '<span class="serial-and">&#32;and&#32;</span>' return table.concat(seq, wrap_in_inflection_of_sep(",&#32;"), 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("&#32;and&#32;") .. seq[2] else local comma = '<span class="serial-comma">,</span>' local conj = '<span class="serial-and">&#32;and&#32;</span>' return table.concat(seq, wrap_in_inflection_of_sep(",&#32;"), 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">&#x5b;[{{fullurl:{{SUBJECTSPACE}}:{{BASEPAGENAME}}|action=edit}} edit]&#x5d;</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">&#x5b;[{{fullurl:{{SUBJECTSPACE}}:{{BASEPAGENAME}}|action=edit}} edit]&#x5d;</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.&#8203;indic.&#8203;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.&#8203;indic.&#8203;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=&#42;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.&#8203;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.&#8203;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.&#8203;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.&#8203;indic.&#8203;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.&#8203;indic.&#8203;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.&#8203;indic.&#8203;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.&#8203;indic.&#8203;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=&#42;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.&#8203;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.&#8203;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.&#8203;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.&#8203;indic.&#8203;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.&#8203;indic.&#8203;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}}}|"|&quot;}}}}">{{{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}}}|"|&quot;}}}}">{{{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 " +&lrm; " 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 " +&lrm; " 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 &lrm; is what [[Module:affix]] has always done default_separator = data.allow_semicolon_separator and " +&lrm; " 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 = " +&lrm; ", 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 = " +&lrm; ", 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 = " +&lrm; ", 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 &lrm; is what [[Module:affix]] has always done default_separator = data.allow_semicolon_separator and " +&lrm; " 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 = " +&lrm; ", 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 = " +&lrm; ", 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 = " +&lrm; ", 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