Wikipedia tumwiki https://tum.wikipedia.org/wiki/Jani_likulu MediaWiki 1.47.0-wmf.23 first-letter Media Special Talk User User talk Wikipedia Wikipedia talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk TimedText TimedText talk Module Module talk Event Event talk Brazil 0 4828 123247 50715 2026-10-11T02:44:44Z Viyowoyero-vya-Malaŵi 11606 123247 wikitext text/x-wiki {{Infobox country | conventional_long_name = Federative Republic of Brazil | common_name = Brazil | native_name = {{native name|pt|República Federativa do Brasil}} | image_flag = Flag of Brazil.svg | alt_flag = | image_coat = Coat of arms of Brazil.svg | alt_coat = | symbol_type = Coat of arms | other_symbol = {{vunblist |{{lang|pt|[[National Seal of Brazil|Selo Nacional do Brasil]]}}<br />{{small|National Seal of Brazil}} <br />[[File:National Seal of Brazil (color).svg|100px|link=National Seal of Brazil]]}} | other_symbol_type = [[Seal (emblem)|National Seal]] | national_motto = {{native phrase|pt|Ordem e Progresso|nolink=yes}}<br />{{small|"Order and Progress"}} | national_anthem = {{native phrase|pt|[[Brazilian National Anthem|Hino Nacional Brasileiro]]|nolink=yes}}<br />{{small|"Brazilian National Anthem"}}<br /><div style="display:inline-block;margin-top:0.4em;">[[File:Hino-Nacional-Brasil-instrumental-mec.ogg]]</div> | flag_anthem = {{native phrase|pt|[[Brazilian Flag Anthem|Hino à Bandeira Nacional]]|nolink=yes}}<br />{{small|"National Flag Anthem"}}<br /><div style="display:inline-block;margin-top:0.4em;">[[File:Brazilian Flag Anthem (Brazilian Army).ogg]]</div> | image_map = BRA orthographic.svg | alt_map = | capital = [[Brasília]] | coordinates = {{small|{{Coord|15|47|S|47|52|W|type:city}}}} | largest_city = [[São Paulo]]<br />{{small|{{coord|23|33|S|46|38|W|display=inline}}}} | languages_type = Official language<br />{{nobold|and national language}} | languages = [[Portuguese language|Portuguese]] | languages2_type = Recognized regional languages | languages2 = | ethnic_groups = {{Tree list}} *47.7% [[White Brazilians|White]]{{efn|includes [[Arab Brazilian]], [[History of the Jews in Brazil|Jewish Brazilian]], and [[Romani people|Romani Brazilian]]}} *{{nowrap|43.1% [[Pardo Brazilians|Mixed]]}}{{efn|includes ''[[Caboclo]]'', ''[[Mulatto]]'', and ''[[Zambo]]''}} *7.6% [[Afro-Brazilians|Black]] *1.1% [[Asian Brazilians|East Asian]]{{efn|The Brazilian census uses the term ''amarela'' (or ''yellow'' in English) as a racial category to describe people of East Asian background. This category therefore excludes those of other Asian origins, such as West Asians/Arabs and South Asians}} *0.4% [[Indigenous peoples in Brazil|Indigenous]] {{Tree list/end}} | ethnic_groups_year = 2010 | ethnic_groups_ref = <ref name="census2010">[ftp://ftp.ibge.gov.br/Censos/Censo_Demografico_2010/Caracteristicas_Gerais_Religiao_Deficiencia/tab1_4.pdf IBGE – Instituto Brasileiro de Geografia e Estatística (Brazilian Institute for Geography and Statistics). 2010 Census]. Retrieved 7 August 2012.</ref><ref>{{cite web | title=2010 Population Census – General characteristics of population, religion and persons with disabilities (Portuguese) | website=ibge.gov.br | date=16 November 2012 | url=http://www.ibge.gov.br/home/presidencia/noticias/noticia_impressao.php?id_noticia=2170 | archive-url=https://web.archive.org/web/20121116103249/http://www.ibge.gov.br/home/presidencia/noticias/noticia_impressao.php?id_noticia=2170 | archive-date=16 November 2012 | url-status=dead | language=pt | access-date=10 August 2019}}</ref> | demonym = [[Brazilians|Brazilian]], in Portuguese: Brasileira/e/o | government_type = [[Federalism|Federal]] [[Presidential system|presidential]] [[republic|constitutional republic]] | leader_title1 = [[President of Brazil|President]] | leader_name1 = [[Luiz Inácio Lula da Silva]] | leader_title2 = [[Vice President of Brazil|Vice President]] | leader_name2 = [[Geraldo Alckmin]] | leader_title3 = {{nowrap|[[President of the Chamber of Deputies (Brazil)|President of the<br />Chamber of Deputies]]}} | leader_name3 = [[Arthur Lira]] | leader_title4 = [[President of the Federal Senate (Brazil)|President of the <br />Federal Senate]] | leader_name4 = {{nowrap|[[Rodrigo Pacheco (politician)|Rodrigo Pacheco]]}} | leader_title5 = {{nowrap|[[Supreme Federal Court#President and Vice-President of the Court|President of the]]<br />[[Supreme Federal Court]]}} | leader_name5 = [[Rosa Weber]] | legislature = {{nowrap|[[National Congress of Brazil|National Congress]]}} | upper_house = {{nowrap|[[Federal Senate (Brazil)|Federal Senate]]}} | lower_house = {{nowrap|[[Chamber of Deputies (Brazil)|Chamber of Deputies]]}} | sovereignty_type = [[Independence of Brazil|Independence]] | sovereignty_note = from [[United Kingdom of Portugal, Brazil and the Algarves|Portugal]] | established_event1 = [[Independence of Brazil|Declared]] | established_date1 = 7 September 1822 | established_event2 = [[Treaty of Rio de Janeiro (1825)|Recognized]] | established_date2 = 29 August 1825 | established_event3 = [[Proclamation of the Republic (Brazil)|Republic]] | established_date3 = 15 November 1889 | established_event4 = [[Constitution of Brazil|Current constitution]] | established_date4 = 5 October 1988 | area_km2 = 8515767 | area_label = Total | area_rank = 5th | area_sq_mi = 3287597 | percent_water = 0.65 | population_estimate = 217,240,060<ref>{{Cite CIA World Factbook|country=Brazil|access-date=24 September 2022|year=2022}}</ref> | population_estimate_year = 2022 | population_estimate_rank = 7th | population_density_km2 = 25 | population_density_sq_mi = 64 | population_density_rank = 193rd | GDP_PPP = {{increase}} $3.958 trillion<ref name="IMFWEOBR">{{cite news |url=https://www.imf.org/en/Publications/WEO/weo-database/2022/October/weo-report?c=223,&s=NGDPD,PPPGDP,NGDPDPC,PPPPC,&sy=2020&ey=2027&ssm=0&scsm=1&scc=0&ssd=1&ssc=0&sic=0&sort=country&ds=.&br=1|title=World Economic Outlook Database, October 2022 |publisher=[[International Monetary Fund]] |newspaper=Imf |access-date=12 January 2023}}</ref> | GDP_PPP_year = 2023 | GDP_PPP_rank = 8th | GDP_PPP_per_capita = {{increase}} $18,396<ref name="IMFWEOBR" /> | GDP_PPP_per_capita_rank = 86th | GDP_nominal = {{increase}} $2.059 trillion<ref name="IMFWEOBR" /> | GDP_nominal_year = 2023 | GDP_nominal_rank = 12th | GDP_nominal_per_capita = {{increase}} $9,571<ref name="IMFWEOBR" /> | GDP_nominal_per_capita_rank = 81th | Gini = 48.9<!--number only--> | Gini_year = 2020 | Gini_change = decrease <!--increase/decrease/steady--> | Gini_ref = <ref name="WBgini">{{cite web |url=http://data.worldbank.org/indicator/SI.POV.GINI?locations=BR |title=GINI index (World Bank estimate) – Brazil |publisher= World Bank |access-date=12 January 2023}}</ref> | HDI = 0.754<!--number only--> | HDI_year = 2021<!-- Please use the year to which the data refers, not the publication year--> | HDI_change = decrease<!--increase/decrease/steady--> | HDI_ref = <ref name="HDI">{{cite web|url=https://hdr.undp.org/system/files/documents/global-report-document/hdr2021-22pdf_1.pdf |archive-url=https://ghostarchive.org/archive/20221009/https://hdr.undp.org/system/files/documents/global-report-document/hdr2021-22pdf_1.pdf |archive-date=9 October 2022 |url-status=live|title=Human Development Report 2021/2022|language=en|publisher=[[United Nations Development Programme]]|date=8 September 2022|access-date=8 September 2022}}</ref> | HDI_rank = 87th | currency = [[Brazilian real|Real]] (R$) | currency_code = BRL | time_zone = [[Time in Brazil|BRT]] | utc_offset = −2 to −5 | date_format = [[Date and time notation in Brazil|dd/mm/yyyy]] ([[Common Era|CE]]) | drives_on = right | calling_code = [[Telephone numbers in Brazil|+55]] | iso3166code = | cctld = [[.br]] | religion = {{Tree list}} *88.8% [[Christianity in Brazil|Christianity]] **64.6% [[Catholic Church in Brazil|Catholicism]] **22.2% [[Protestantism in Brazil|Protestantism]] **2.0% Other [[List of Christian denominations|Christian]] *8.0% [[Irreligion in Brazil|No religion]] *2.0% [[Spiritism]] *1.2% Other {{Tree list/end}} | religion_ref = <ref>{{cite web | title=2010 Population Census – General characteristics of population, religion and persons with disabilities (Portuguese) | website=ibge.gov.br | date=16 November 2012 | url=http://www.ibge.gov.br/home/presidencia/noticias/noticia_impressao.php?id_noticia=2170 | archive-url=https://web.archive.org/web/20121116103249/http://www.ibge.gov.br/home/presidencia/noticias/noticia_impressao.php?id_noticia=2170 | archive-date=16 November 2012 | url-status=dead | language=pt | access-date=10 August 2019}}</ref> | religion_year = 2010 | today = }} '''Brazil''', ni chalo icho chili kwa [[Amelika wa Kummwela]]. ==Vigaŵa== {{Brazil Labelled Map}} {{Countries of South America}} [[Category:Amelika wa Kummwela]] 3smp5lpkayftpv6fibnyfesvfvxe5fq India 0 5377 123244 115086 2026-10-11T02:40:59Z Viyowoyero-vya-Malaŵi 11606 123244 wikitext text/x-wiki [[File:Flag of India.svg|300px|thumb]] [[File:India (orthographic projection).svg|250px|thumb]] '''India''' ni chalo icho chili kwa [[Asia]]. ==Vigaŵa== {{India States and Territories Labelled Map}} [[Category:Asia]] [[Category:India]] 1djooqc32nrskbfx2a1lrqxtupxe5tu Indonesia 0 5553 123248 116167 2026-10-11T02:45:31Z Viyowoyero-vya-Malaŵi 11606 123248 wikitext text/x-wiki [[File:Flag of Indonesia.svg|300px|thumb]] [[File:Indonesia (orthographic projection).svg|250px|thumb]] '''Indonesia''' (id: '''Indonesia''', ms: '''Indonesia''', ace: '''Indônèsia''', jv: '''Indonésia'''), ni chalo icho chili kwa [[Asia]]. ==Vigaŵa== {{Indonesia provinces labelled map}} {{Indonesia}} [[Category:Asia]] rylcef9uhp1offiuqtgv3r4rfy132zk 123249 123248 2026-10-11T02:45:57Z Viyowoyero-vya-Malaŵi 11606 123249 wikitext text/x-wiki [[File:Flag of Indonesia.svg|250px|thumb]] [[File:Indonesia (orthographic projection).svg|200px|thumb]] '''Indonesia''' (id: '''Indonesia''', ms: '''Indonesia''', ace: '''Indônèsia''', jv: '''Indonésia'''), ni chalo icho chili kwa [[Asia]]. ==Vigaŵa== {{Indonesia provinces labelled map}} {{Indonesia}} [[Category:Asia]] 7hj50hf4ugove7qyt37kls6a13zbjuh Covid-19 0 6893 123239 121654 2026-10-11T02:27:31Z Viyowoyero-vya-Malaŵi 11606 123239 wikitext text/x-wiki '''COVID-19''' panji [[Nthenda ya Corona]] ([[Corona Virus]]) ni mtundu wa nthenda iyo ikukola munthu kwizila mu mvuche, mata panji  kukolana chasa na munthu uyo wana nthenda iyi. Kachibungu ako kakwambiska nthenda iyi kakuchemeka "Kachibungu kakali kachiwili ako kakutimbanizga nthowa ya mathutilo"(severe acute respiratory syndrome coronavirus 2 ). Munthu wakwamba kusangika na kachibungu aka wakawa wa ku [[Wuhan]], chalo cha [[China]], mu chaka cha December, 2019.<ref name="Unnamed-20230318115223">https://www.wsj.com/articles/in-hunt-for-covid-19-origin-patient-zero-points-to-second-wuhan-market-11614335404</ref> Vimanyikwilo vakuti munthu wana nthena iyi vikupambana munthu pa munthu, kwene kene kanandi munthu ukupulikanga: * Kuwawa kwa mutu * Kukhosomola * Kusuzgika pa kuthuta * Kuphwanya kwa thupi * Chikhoso cha mamphina * Masuzgikilo gha pulika kunowa kwa chakulya na kununkhizga.<ref>https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7753439</ref> Vimanyikwilo ivi vingaoneka pala pajumpha siku limoza panji madazi 14, pala watola waka nthenda iyi.Mzinda unandi wa wanthu awo wakukolekana na nthenda iyi wakuwevye vimanyikwilo nge ni vipachanya ivi.Wachekulu ndiwo wali pa chiophyezo chikulu chomene cha nthenda iyi. == VIMANYIKWILO VAKUTI UNA NTHENDA YA CORONA == * Vilonda va pasingo * Kujala kwa mphuno * Kufuma kwa mamphina * Kukhosomola * Kusuzgika pa kuthuta * Kuphwanya kwa thupi * Chikhoso cha mamphina * Masuzgikilo gha pulika kunowa kwa chakulya na kununkhizga fungo la vinthu. == CHAKWAMBISKA NTHENDA YA CORONA == Matenda gha Corona ghakwamba na kachibungu ako pa chingerezi kakuchemeka kuti 'severe acute respiratory syndrome coronavirus 2' (SARS-CoV-2). == UMO MUNTHU UKUTOLELA NTHENDA IYI == Kwizila mu kuthuta mphepo zakunangika na munthu uyo wana matenda agha pakukhosomola or pakuthunya. == References (uko kwafuma umboni wa ivi valembeka pachanya) == 1 <ref name="Unnamed-20230318115223"/>Wuhani Official news reports 2. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7753439 px4w2kw37a6m44sz6krotpoy3r31f6u 123240 123239 2026-10-11T02:27:48Z Viyowoyero-vya-Malaŵi 11606 Revise 123240 wikitext text/x-wiki {{Revision}} '''COVID-19''' panji [[Nthenda ya Corona]] ([[Corona Virus]]) ni mtundu wa nthenda iyo ikukola munthu kwizila mu mvuche, mata panji  kukolana chasa na munthu uyo wana nthenda iyi. Kachibungu ako kakwambiska nthenda iyi kakuchemeka "Kachibungu kakali kachiwili ako kakutimbanizga nthowa ya mathutilo"(severe acute respiratory syndrome coronavirus 2 ). Munthu wakwamba kusangika na kachibungu aka wakawa wa ku [[Wuhan]], chalo cha [[China]], mu chaka cha December, 2019.<ref name="Unnamed-20230318115223">https://www.wsj.com/articles/in-hunt-for-covid-19-origin-patient-zero-points-to-second-wuhan-market-11614335404</ref> Vimanyikwilo vakuti munthu wana nthena iyi vikupambana munthu pa munthu, kwene kene kanandi munthu ukupulikanga: * Kuwawa kwa mutu * Kukhosomola * Kusuzgika pa kuthuta * Kuphwanya kwa thupi * Chikhoso cha mamphina * Masuzgikilo gha pulika kunowa kwa chakulya na kununkhizga.<ref>https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7753439</ref> Vimanyikwilo ivi vingaoneka pala pajumpha siku limoza panji madazi 14, pala watola waka nthenda iyi.Mzinda unandi wa wanthu awo wakukolekana na nthenda iyi wakuwevye vimanyikwilo nge ni vipachanya ivi.Wachekulu ndiwo wali pa chiophyezo chikulu chomene cha nthenda iyi. == VIMANYIKWILO VAKUTI UNA NTHENDA YA CORONA == * Vilonda va pasingo * Kujala kwa mphuno * Kufuma kwa mamphina * Kukhosomola * Kusuzgika pa kuthuta * Kuphwanya kwa thupi * Chikhoso cha mamphina * Masuzgikilo gha pulika kunowa kwa chakulya na kununkhizga fungo la vinthu. == CHAKWAMBISKA NTHENDA YA CORONA == Matenda gha Corona ghakwamba na kachibungu ako pa chingerezi kakuchemeka kuti 'severe acute respiratory syndrome coronavirus 2' (SARS-CoV-2). == UMO MUNTHU UKUTOLELA NTHENDA IYI == Kwizila mu kuthuta mphepo zakunangika na munthu uyo wana matenda agha pakukhosomola or pakuthunya. == References (uko kwafuma umboni wa ivi valembeka pachanya) == 1 <ref name="Unnamed-20230318115223"/>Wuhani Official news reports 2. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7753439 ie9uhwyvqn1crlk6eya5rhpi9rk75gs ChiTumbuka 0 20519 123238 122846 2026-10-11T02:25:58Z Viyowoyero-vya-Malaŵi 11606 123238 wikitext text/x-wiki {{Short description|Niger-Congo language originating in parts of Malawi, Zambia, and Tanzania}} {{good article}} {{Infobox language | name = ChiTumbuka | states = [[Malaŵi]], [[Tanzania]], [[Zambia]] | region = | speakers = 7 miliyoni | date = 2022 | ref = | familycolor = Niger-Congo | fam2 = [[Atlantic–Congo languages|Atlantic–Congo]] | fam3 = [[Volta-Congo]] | fam4 = [[Benue–Congo languages|Benue–Congo]] | fam5 = [[Bantoid languages|Bantoid]] | fam6 = [[Southern Bantoid]] | fam7 = [[Bantu languages|Bantu]] ([[Guthrie classification of Bantu languages#Zone N|Zone N]]) | fam8 = [[Nyasa languages|Nyasa]] | iso2 = tum | iso3 = tum | glotto = tumb1250 | glottorefname = Tumbuka | script = {{Plainlist}} * [[Latin script]] ([[Roman alphabet]]) * [[Mwangwego script]] {{endplainlist}} | minority = {{plainlist}} * {{flag|Malawi}} * {{flag|Zambia}} * {{flag|Tanzania}} {{endplainlist}} | image = The Gonapamuhanya festival 2025.jpg | imagecaption = Msonkhano wa chikhalidwe cha ChiTumbuka cha chikondwerero cha Gonapamuhanya cha ŵanthu ŵa ChiTumbuka | guthrie = N.21 | lingua = [http://linguasphere.info/?page=linguascale&linguacode=99-AUS-wc 99-AUS-wc] (+ chi-Kamanga) <br>incl. varieties 99-AUS-wca...-wcl }} '''ChiTumbuka''' ntchiyowoyero cha [[ŴaTumbuka|ŵanthu]] ŵa mtundu wachi [[Bantu]] icho chikuyowoyeka mu [[Malaŵi]], [[Zambia]], na [[Tanzania]].<ref name="Michigan">[https://web.archive.org/web/20151123103050/http://africa.isp.msu.edu/afrlang/Tumbuka_root.html Michigan State University African Studies Center information page].</ref> Lizgu ili likumanyikwaso kuti Chitumbuka panji Citumbuka. Chi- icho chili kunthazi kwa Tumbuka chikung'anamura "mu nthowa ya", ndipo apa likung'anamura "chiyowoyero cha ŵanthu ŵa Tumbuka". ChiTumbuka chili mu chiyowoyero chimoza na [[ChiCheŵa|ChiCheŵa]] na [[ChiSena|Sena]].<ref>Kiso (2012), pp.21ff.</ref> Buku linyake ([[The World Almanac]]) likuti mu charu ichi muli ŵanthu pafupifupi 2,080,000. Ŵanthu ŵanandi ŵakuyowoya ChiTumbuka, nangauli ŵanyake ŵakuti ŵalipo ŵachoko chomene. Ŵanthu ŵanandi awo ŵakuyowoya ChiTumbuka ŵakukhala mu Malaŵi.<ref name="Michigan" /> ChiTumbuka ndicho chikuyowoyeka chomene kumpoto kwa Malawi, chomenechomene mu vigaŵa vya [[Rumphi]], [[Mzuzu]], na [[Mzimba]].<ref>University of Malawi (2006) Language Mapping Survey for Northern Malawi.</ref> Pali mphambano yikuru pakati pa ciyowoyero ca ChiTumbuka ico cikuyowoyeka mu misumba ya ku Malawi (ico cili na mazgu ghanyake kufuma ku [[Chiswahili|Ciswahili]] na ChiCheŵa) na ciyowoyero ca ChiTumbuka ico cikuyowoyeka mu mizi. Ŵanthu ŵanandi ŵakuwona kuti chiyowoyero cha Rumphi ndicho ntchakutowa chomene.<ref>Kamwendo (2004), p.282.</ref> Chiyowoyero cha ku Mzimba chikakhwaskika chomene na chiNgoni ([[ChiZulu|Zulu]]). Kwamba kale, ŵanthu ŵanandi ŵakuyowoya ChiTumbuka na ChiCheŵa. Ndipouli, ciyowoyero ca Tumbuka cikasuzgika comene mu nyengo ya muwuso wa Pulezidenti [[Hastings Kamuzu Banda]], cifukwa mu 1968 cifukwa ca fundo yake yakuti paŵe mtundu umoza na ciyowoyero cimoza, ciyowoyero ici cikaleka kuŵa ca boma mu Malawi. Ntheura, mu masukulu, pa wayilesi, na mu manyuzipepara ŵakafumiskamo ciyowoyero ici.<ref>Kamwendo (2004), p.278.</ref> Mu 1994, apo boma la Tumbuka likamba kulamulira na vipani vinandi, ŵakambaso kutegherezga maungano gha pa wayilesi. Kweni mabuku na mabuku ghanyake ghakaŵa ghanandi yayi.<ref>See Language Mapping Survey for Northern Malawi (2006), pp.38-40 for a list of publications.</ref> == Malembelo == [[File:WIKITONGUES-Temwa_Speaking_Tumbuka_-_free_to_use_file_under_Wikipedia_policies.webm|thumb|326x326px|Temwa wakuyowoya ChiTumbuka.]] Pali nthowa ziŵiri zakulembera ChiTumbuka izo zikugwiliskirika nchito: kalembero ka kaluso (kakulembeka mu [[Baibolo]] la ChiTumbuka la [[Wikipediya|Wikipedia]] na mu [[nyuzipepara y]]<nowiki/>a Fuko), umo mazgu gha banthu 'ŵanthu' na chaka 'chaka' ghakulembeka na 'b' na 'ch', na kalembero ka kaluso (kakulembeka mu dikishonare ya ChiTumbuka iyo yikufumiskika pa [[Intaneti]] na Centre for Language Studies na mu Baibolo la pa Intaneti), umo mazgu ghakulembeka na 'ŵ' na 'c', nga ŵanthu na caka. (Sumu ya 'ŵ' ni [w] yakuzingilizgika makora iyo yikuzunulika na lulimi pafupi na i).<ref>Atkins, Guy (1950) [https://www.jstor.org/stable/1156786 "Suggestions for an Amended Spelling and Word Division of Nyanja"] ''Africa: Journal of the International African Institute'', Vol. 20, No. 3, p.205.</ref> Ŵanthu ŵakumanya yayi apo ŵakwenera kulemba 'r' na 'l', nga ni cakulya ([[Dikishonare]]) panji cakurya (Baibolo) 'chakurya.' (Nadi, [l] na [r] ni mazgu ghakupambanapambana gha chiyowoyero chimoza.) Kweniso pali kukayikira pakati pa mazgu ghakuti'sk' na'sy' (miskombe na misyombe ('bamboo') ghali mu dikishonare ya ChiTumbuka).<ref>See entries {{lang|tum|citatanga}}, {{lang|tum|cidunga}}, {{lang|tum|cihengo}}.</ref> == Kuyowoya mazgu == === Mavowele === Mu chiyowoyero cha Tumbuka muli mazgu ghakuyana waka nga ni /a/, /ɛ/, /i/, /ɔ/, /u/ na /m̩/ aghoso ghali mu [[ChiCheŵa]].<ref>Vail (1972), p. 1.</ref> [[File:Monile.ogg|thumb|Kutauzgana mu ChiTumbuka.]] === Makonsonanti === Malizga gha chiyowoyero cha Tumbuka ghakuyana waka na gha ChiCheŵa, kweni ghakupambana. Mu chiyowoyero cha ChiCheŵa mulije mazgu ghakuti /ɣ/, /β/, na /h/. Kweniso ŵanthu ŵakutemwa kupulika mazgu agho ghakufuma mu mulomo {{IPA|/vʲ/}}, {{IPA|/fʲ/}}, {{IPA|/bʲ/}}, {{IPA|/pʲ/}}, {{IPA|/skʲ/}}, {{IPA|/zgʲ/}}, and {{IPA|/ɽʲ/}}. Mu ChiTumbuka mulije vilembo vya ChiCheŵa nga ni /psj/, /bzj/, /t͡s/, /d͡z/. Mazgu gha /s/ na /z/ ghakusangika yayi mu ChiTumbuka, ntheura Chewa nsómba ('somba') = Tumbuka somba. Lizgu lakuti /ʃ/ likusangika mu mazgu gha ku vyaru vinyake pera nga ni shati ('shati') na shuga ('shuga'). ChiTumbuka /?? / nyengo zinyake chikuyana na ChiCheŵa /d/, ChiCheŵa kudwala 'kuŵa mulwari' = Tumbuka kulwala, ChiCheŵa kudya 'kurya' = Tumbuka kulya. Kuyowoya kwa lizgu lakuti "sk" na lizgu lakuti "zg" vikupambana kuyana na chiyowoyero. Makonsonanti gha Tumbuka kanandi ghakusangika mu viyowoyero vinyake. Vinyake vingalembeka pambere chindindindi chindambe kufuma. Pa chithuzithuzi ichi, pali mazgu agho ghangaŵa pa chilembo ichi: {| class="wikitable" style="text-align:center;" |+Malembo gha Tumbuka<ref>Chavula (2016), pp. 11–13.</ref><ref>Vail (1972), pp. 4–19.</ref> ! colspan="2" rowspan="2" | ! colspan="3" |[[Labial consonant|labial]] ! colspan="3" |[[Dental consonant|dental]] ! colspan="2" |[[Palatal consonant|palatal]] ! colspan="2" |[[Velar consonant|velar]] ! rowspan="2" |[[Glottal consonant|glottal]] |- !<small>plain</small> !<small>lab.</small> !<small>pal.</small> !<small>plain</small> !<small>lab.</small> !<small>pal.</small> !<small>plain</small> !<small>lab.</small> !<small>plain</small> !<small>lab.</small> |- ! colspan="2" |[[Nasal consonant|nasal]] |ma<br />{{IPAslink|m}} |mwa<br />{{IPAslink|mʷ}} |mya<br />{{IPAslink|mʲ}} |na<br />{{IPAslink|n}} |nwa<br />{{IPAslink|nʷ}} |nya<br />{{IPAslink|nʲ}} | | |ng'a<br />{{IPAslink|ŋ}} |ng'wa<br />{{IPAslink|ŋʷ}} | |- ! rowspan="5" |[[plosive]]/<br />[[affricate]] !<small>unvoiced</small> |pa<br />{{IPAslink|p}} |pwa<br />{{IPAslink|pʷ}} |pya<br />{{IPAslink|pʲ}} |ta<br />{{IPAslink|t}} |twa<br />{{IPAslink|tʷ}} |tya<br />{{IPAslink|tʲ}} |ca<br />{{IPAslink|t͡ʃ}} |cwa<br />{{IPAslink|t͡ʃʷ}} |ka<br />{{IPAslink|k}} |kwa<br />{{IPAslink|kʷ}} | |- !<small>voiced</small> |ba<br />{{IPAslink|ɓ}} |bwa<br />{{IPAslink|ɓʷ}} |bya<br />{{IPAslink|bʲ}} |da<br />{{IPAslink|ɗ}} |dwa<br />{{IPAslink|ɗʷ}} |dya<br />{{IPAslink|ɗʲ}} |ja<br />{{IPAslink|d͡ʒ}} |jwa<br />{{IPAslink|d͡ʒʷ}} |ga<br />{{IPAslink|g}} |gwa<br />{{IPAslink|gʷ}} | |- !<small>aspirated</small> |pha<br />{{IPAslink|pʰ}} |phwa<br />{{IPAslink|pʷʰ}} |phya<br />{{IPAslink|pʲʰ}} |tha<br />{{IPAslink|tʰ}} |thwa<br />{{IPAslink|tʷʰ}} |thya<br />{{IPAslink|tʲʰ}} |cha<br />{{IPAslink|t͡ʃʰ}} | |kha<br />{{IPAslink|kʰ}} |khwa<br />{{IPAslink|kʷʰ}} | |- !<small>nasalised</small> |mba<br />{{IPAslink|ᵐb}} |mbwa<br />{{IPAslink|ᵐbʷ}} |mbya<br />{{IPAslink|ᵐbʲ}} |nda<br />{{IPAslink|ⁿd}} |ndwa<br />{{IPAslink|ⁿdʷ}} |(ndya){{efn|Only in the word {{lang|tum|ndyali}}.}}<br />{{IPAslink|ⁿdʲ}} |nja<br />{{IPAslink|ⁿd͡ʒ}} | |nga<br />{{IPAslink|ᵑg}} |ngwa<br />{{IPAslink|ᵑgʷ}} | |- !<small>nasalised<br />aspirated</small> |mpha<br />{{IPAslink|ᵐpʰ}} |mphwa<br />{{IPAslink|ᵐpʷʰ}} |mphya<br />{{IPAslink|ᵐpʲʰ}} |ntha<br />{{IPAslink|ⁿtʰ}} |nthwa<br />{{IPAslink|ⁿtʷʰ}} |(nthya)<br />{{IPAslink|ⁿtʲʰ}} |ncha<br />{{IPAslink|ⁿt͡ʃʰ}} | |nkha<br />{{IPAslink|ᵑkʰ}} |nkhwa<br />{{IPAslink|ᵑkʷʰ}} | |- ! rowspan="2" |[[fricative]] !<small>unvoiced</small> |fa<br />{{IPAslink|f}} |fwa<br />{{IPAslink|fʷ}} |fya<br />{{IPAslink|fʲ}} |sa<br />{{IPAslink|s}} |swa<br />{{IPAslink|sʷ}} |ska (sya)<br />{{IPAslink|sʲ}} |(sha)<br />{{IPAslink|ʃ}} | | | |ha<br />{{IPAslink|h}} |- !<small>voiced</small> |va<br />{{IPAslink|v}} |vwa<br />{{IPAslink|vʷ}} |vya<br />{{IPAslink|vʲ}} |za<br />{{IPAslink|z}} |zwa<br />{{IPAslink|zʷ}} |zga<br />{{IPAslink|zʲ}} | | | | | |- ! colspan="2" |[[semivowel]]/ [[Liquid consonant|liquid]] |ŵa<br />{{IPAslink|β}} |wa<br />{{IPAslink|w}} | |la/ra<br />{{IPAslink|ɽ}} |lwa/rwa<br />{{IPAslink|ɽʷ}} |lya/rya<br />{{IPAslink|ɽʲ}} |ya<br />{{IPAslink|j}} | |gha<br />{{IPAslink|ɣ}} | | |} {{notelist}} === Kapulikikilo === Kupambana kukuru pakati pa ChiCheŵa na ChiTumbuka nkhwa kuti ChiCheŵa ni chiyowoyero icho chikuyowoya mazgu ghakupambanapambana. ChiTumbuka chili na mazgu ghakupambanapambana, chifukwa lizgu lililose ilo likuyowoyeka payekha likuyana waka na lizgu lakwamba ilo likufuma pa lizgu laumaliro.<ref>Downing (2008, 2012).</ref> Ntheura, mu ChiTumbuka nchambura macitiko kupambaniska mazgu ghaŵiri ghakupambanapambana, nga umo vikuŵira mu ChiCheŵa na viyowoyero vinyake vya Bantu. Ndipouli, lizgu laumaliro yayi ndilo likuŵa pa lizgu lililose, kweni lizgu laumaliro pera:<ref>Downing (2012), p.123.</ref> * {{lang|tum|ti-ku-phika sî:ma}} 'tikuphika sima' A greater variety of tonal patterns is found in the [[Ideophone|ideophones]] (expressive words) of Tumbuka; for example Low ({{lang|tum|yoyoyo}} 'disintegrating into small pieces'), High ({{lang|tum|fyá:}} 'swooping low (of birds)'), High-Low ({{lang|tum|phúli}} 'sound of thing bursting'), and Low-High ({{lang|tum|yií}} 'sudden disappearance'), etc.<ref>Moto (1999), pp.112-120.</ref> Intonational tones are also used in Tumbuka; for example, in yes-no questions there is often a High-Low fall on the final syllable of the question:<ref>Downing (2008), p.55.</ref> * {{lang|tum|ku-limirâ-so ngô:mâ?}} 'are you also weeding the maize?' There does not seem to be any consistent, direct correlation between tone in Tumbuka and [[Focus (linguistics)|focus]].<ref>Downing (2012), p.129.</ref> == Mazina == === Makilasi gha manoun === Nga umo vikuŵira na viyowoyero vya ŵanthu ŵa ku Bantu, mazina gha ChiTumbuka ghakupangika mu vigaŵa vyakupambanapambana kuyana na vigaŵa vya mazina. Lizgu lililose lili na lizgu lake lakwimira, lizgu lakwimira, na lizgu la chiyowoyero. Para pali mphindano pakati pa mazgu agha na mazgu ghakwambilira, mazgu agha ndigho ghakuŵa pakwamba pakusankha zina. Mwaciyelezgero, lizgu lakuti katundu 'vinthu,' nangauli lili na lizgu lakuti ka-, lili mu gulu 1, cifukwa munthu wakuyowoya katundu uyu 'vinthu ivi' na lizgu lakuti uyu. Ŵanthu ŵa ku Malaŵi (nga umo viliri mu dikishonare ya ChiTumbuka ya pa Yunivesite ya Malawi) ŵakuzunura mazina gha viŵaro mu viyowoyero vinyake nga ni "Mu-Ŵa-"; kweni ŵanthu ŵa ku Bantu ŵakuzunura viŵaro mu manambara (1/2 etc.) agho ghakuyana na viŵaro vya viŵaro mu viyowoyero vinyake vya ku Bantu. Nyengo zinyake mazina ghakukolerana yayi na magulu ghakulondezgapo agha, nga ni fumu'mukuru' (kalasi 9) uyo wali na mazina ghanandi mu kilasi 6. '''Class 1/2 (Mu-Ŵa-)''' Some nouns in this class lack the prefix Mu-: * {{lang|tum|Munthu}} pl. {{lang|tum|ŵanthu (banthu)}} = person * {{lang|tum|Muzungu}} pl. {{lang|tum|ŵazungu (bazungu)}} = foreigner, white man * {{lang|tum|Mwana}} pl. {{lang|tum|ŵana (bana)}} = child * {{lang|tum|Bulu}} pl. {{lang|tum|ŵabulu}} = donkey * {{lang|tum|Sibweni}} pl. {{lang|tum|ŵasibweni}} = maternal uncle * {{lang|tum|Katundu}} (no pl.) = goods, possessions '''Class 3/4 (Mu-Mi-)''' * {{lang|tum|Mutu}} pl. {{lang|tum|mitu}} = head * {{lang|tum|Mkuyu}} pl. {{lang|tum|mikuyu}} = fig-tree * {{lang|tum|Moyo}} pl. {{lang|tum|miyoyo}} = life * {{lang|tum|Mtima}} pl. {{lang|tum|mitima}} = heart '''Class 5/6 (Li-Ma-)''' * {{lang|tum|Bele (bhele}} pl. {{lang|tum|mabele (mabhele)}} = breast * {{lang|tum|Boma (bhoma)}} pl. {{lang|tum|maboma (mabhoma)}} = government, district * {{lang|tum|Botolo (bhotolo)}} pl. {{lang|tum|mabotolo (mabhotolo)}} = bottle * {{lang|tum|Fuko}} pl. {{lang|tum|mafuko}} = tribe, nation * {{lang|tum|Jiso}} pl. {{lang|tum|maso}} = eye * {{lang|tum|Maji}} (no singular) = water * {{lang|tum|Phiri}} pl. {{lang|tum|mapiri}} = hill * {{lang|tum|Suzgo}} pl. {{lang|tum|masuzgo}} = problem, trouble * {{lang|tum|Woko}} pl. {{lang|tum|mawoko}} = hand '''Class 7/8 (Ci-Vi-)''' * {{lang|tum|Caka (chaka)}} pl. {{lang|tum|vyaka}} = year * {{lang|tum|Caro (charo)}} pl. {{lang|tum|vyaro}} = country, land * {{lang|tum|Ciŵeto (chibeto)}} pl. {{lang|tum|viŵeto (vibeto)}} = farm animal * {{lang|tum|Cidakwa (chidakwa)}} pl. {{lang|tum|vidakwa}} = drunkard * {{lang|tum|Cikoti (chikoti)}} pl. {{lang|tum|vikoti}} = whip '''Class 9/10 (Yi-Zi-)''' * {{lang|tum|Mbale}} pl. {{lang|tum|mbale (mambale)}} = plate * {{lang|tum|Ndalama}} pl. {{lang|tum|ndalama}} = money * {{lang|tum|Njelwa}} pl. {{lang|tum|njelwa}} = brick * {{lang|tum|Nkhuku}} pl. {{lang|tum|nkhuku}} = chicken * {{lang|tum|Somba}} pl. {{lang|tum|somba}} = fish '''Class 11 (Lu-)''' Some speakers treat words in this class as if they were in class 5/6.<ref>Shiozaki (2004).</ref> * {{lang|tum|Lwande}} = side * {{lang|tum|Lumbiri}} = fame * {{lang|tum|Lulimi}} = tongue '''Class 12/13 (Ka-Tu-)''' * {{lang|tum|Kanthu (kantu)}} pl. {{lang|tum|tunthu (tuntu)}} = small thing * {{lang|tum|Kamwana}} pl. {{lang|tum|tuŵana (tubana)}} = baby * {{lang|tum|Kayuni}} pl. {{lang|tum|tuyuni}} = bird * {{lang|tum|Tulo}} (no singular) = sleep '''Class 14/6 (U-Ma-)''' These nouns are frequently abstract and have no plural. * {{lang|tum|Usiku}} = night * {{lang|tum|Ulimi}} = farming * {{lang|tum|Ulalo}} pl. {{lang|tum|maulalo}} = bridge * {{lang|tum|Uta}} pl. {{lang|tum|mauta}} = bow '''Class 15 (Ku-) Infinitive''' * {{lang|tum|Kugula}} = to buy, buying * {{lang|tum|Kwiba (kwibha)}} = to steal, stealing '''Classes 16, 17, 18 (Pa-, Ku-, Mu-) Locative''' * {{lang|tum|Pasi}} = underneath * {{lang|tum|Kunthazi (kuntazi)}} = in front, before * {{lang|tum|Mukati}} = inside === Concords === Viyezgo, vimanyikwiro, manambara, mazgu ghakupambanapambana, na vimanyikwiro mu ChiTumbuka vikwenera kukolerana na lizgu ilo likuyowoyeka. Ŵakuchita nthena na vilembo vyakwambilira, vyakunthazi, panji vyakunthazi ivyo vikuchemeka 'concords.' Mtundu 1 uli na viyowoyero vyakupambanapambana, nga ni mazina ghakwimira vinthu, mazgu ghakwamba, mazgu ghaumaliro, manambara, vimanyikwiro, na mazgu ghaumaliro:<ref>Chase (2004).</ref><ref>Shiozaki (2004)</ref><ref>Vail (1971).</ref> * {{lang|tum|Mwana u'''yu'''}} = this child * {{lang|tum|Mwana '''yu'''moza}} = one child * {{lang|tum|Mwana u'''yo'''}} = that child * {{lang|tum|Mwana '''yo'''se}} = the whole child * {{lang|tum|Mwana '''wa'''li'''yo'''se}} = every child * {{lang|tum|Mwana '''wa'''ka'''mu'''wona}} = the child saw him * {{lang|tum|Mwana '''mu'''choko (coko)}} = the small child * {{lang|tum|Mwana '''wa''' Khumbo}} = Khumbo's child * {{lang|tum|Mwana '''wa'''ne}} = my child * {{lang|tum|Mwana '''wa'''wona}} = the child has seen Makilasi ghanyake gha manoun ghali na mitundu yichoko ya vimanyikwiro vyakukolerana, nga umo tingawonera pa thebulu ilo lili musi umu: {| class="wikitable" style="text-align: center; width: 200px; height: 200px;" |+Table of Tumbuka concords ! !noun !English !this !num !that !all !subj !object !adj !of !perf |- !1 |{{lang|tum|mwana}} |child |{{lang|tum|uyu}} |''yu-'' |{{lang|tum|uyo}} |{{lang|tum|yose}} |''wa-'' |''-mu-'' |''mu-'' |{{lang|tum|wa}} |''wa-'' |- !2 |{{lang|tum|ŵana}} |children |{{lang|tum|aŵa}} |''ŵa-'' |{{lang|tum|awo}} |{{lang|tum|wose}} |''ŵa-'' |''-ŵa-'' |''ŵa-'' |{{lang|tum|ŵa}} |''ŵa-'' |- !3 |{{lang|tum|mutu}} |head |{{lang|tum|uwu}} |''wu-'' |{{lang|tum|uwo}} |{{lang|tum|wose}} |''wu-'' | -''wu-'' |''wu-'' |{{lang|tum|wa}} |''wa-'' |- !4 |{{lang|tum|mitu}} |heads |{{lang|tum|iyi}} |''yi-'' |{{lang|tum|iyo}} |{{lang|tum|yose}} |''yi-'' |''-yi-'' |''yi-'' |{{lang|tum|ya}} |''ya-'' |- !5 |{{lang|tum|jiso}} |eye |{{lang|tum|ili}} |''li-'' |{{lang|tum|ilo}} |{{lang|tum|lose}} |''li-'' |''-li-'' |''li-'' |{{lang|tum|la}} |''la-'' |- !6 |{{lang|tum|maso}} |eyes |{{lang|tum|agha}} |''gha-'' |{{lang|tum|agho}} |{{lang|tum|ghose}} |''gha-'' |''-gha-'' |''gha-'' |{{lang|tum|gha}} |''gha-'' |- !7 |{{lang|tum|caka}} |year |{{lang|tum|ici}} |''ci-'' |{{lang|tum|ico}} |{{lang|tum|cose}} |''ci-'' |''-ci-'' |''ci-'' |{{lang|tum|ca}} |''ca-'' |- !8 |{{lang|tum|vyaka}} |years |{{lang|tum|ivi}} |''vi-'' |{{lang|tum|ivyo}} |{{lang|tum|vyose}} |''vi-'' |''-vi-'' |''vi-'' |{{lang|tum|vya}} |''vya-'' |- !9 |{{lang|tum|nyumba}} |house |{{lang|tum|iyi}} |''yi-'' |{{lang|tum|iyo}} |{{lang|tum|yose}} |''yi-'' |''-yi-'' |''yi-'' |{{lang|tum|ya}} |''ya-'' |- !10 |{{lang|tum|nyumba}} |houses |{{lang|tum|izi}} |''zi-'' |{{lang|tum|izo}} |{{lang|tum|zose}} |''zi-'' |''-zi-'' |''zi-'' |{{lang|tum|za}} |''za-'' |- !11 |{{lang|tum|lwande}} |side |{{lang|tum|ulu}} |''lu-'' |{{lang|tum|ulo}} |{{lang|tum|lose}} |''lu-'' |''-lu-'' |''lu-'' |{{lang|tum|lwa}} |''lwa-'' |- ! | |(or: |{{lang|tum|ili}} |''li-'' |{{lang|tum|ilo}} |{{lang|tum|lose}} |''li-'' |''-li-'' |''li-'' |{{lang|tum|la}} |''la-'') |- !12 |{{lang|tum|kayuni}} |bird |{{lang|tum|aka}} |''ka-'' |{{lang|tum|ako}} |{{lang|tum|kose}} |''ka-'' |''-ka-'' |''ka-'' |{{lang|tum|ka}} |''ka-'' |- !13 |{{lang|tum|tuyuni}} |birds |{{lang|tum|utu}} |''tu-'' |{{lang|tum|uto}} |{{lang|tum|tose}} |''tu-'' |''-tu-'' |''tu-'' |{{lang|tum|twa}} |''twa-'' |- !14 |{{lang|tum|uta}} |bow |{{lang|tum|uwu}} |''wu''- |{{lang|tum|uwo}} |{{lang|tum|wose}} |''wu-'' |''-wu-'' |''wu-'' |{{lang|tum|wa}} |''wa-'' |- !15 |{{lang|tum|kugula}} |buying |{{lang|tum|uku}} |''ku-'' |{{lang|tum|uko}} |{{lang|tum|kose}} |''ku-'' |''-ku-'' |''ku-'' |{{lang|tum|kwa}} |''kwa-'' |- !16 |{{lang|tum|pasi}} |underneath |{{lang|tum|apa}} |''pa-'' |{{lang|tum|apo}} |{{lang|tum|pose}} |''pa-'' |''-pa-'' |''pa-'' |{{lang|tum|pa}} |''pa-'' |- !17 |{{lang|tum|kunthazi}} |in front |{{lang|tum|uku}} |''ku-'' |{{lang|tum|uko}} |{{lang|tum|kose}} |''ku-'' |''-ku-'' |''ku-'' |{{lang|tum|kwa}} |''kwa-'' |- !18 |{{lang|tum|mukati}} |inside |{{lang|tum|umu}} |''mu-'' |{{lang|tum|umo}} |{{lang|tum|mose}} |''mu-'' |''-mu-'' |''mu-'' |{{lang|tum|mwa}} |''mwa-'' |- |} == Viyelezgero vya mazgu na malemba == Mazgu agha ndigho munthu wangayowoya para wakuluta ku chigaŵa icho ŵanthu ŵanandi ŵakuyowoya ChiTumbuka: {| class="wikitable" |+ !Tumbuka !Chizungu |- |Moni |Hello |- |Monile |hello, to a group of people |- |Muli makola? Mwaŵa uli? |how are you? |- |Muli makola? Mwaŵa uli? |How are you?, to a group of people |- |Nili makola |I'm okay |- |Tili makola |We're okay |- |Naonga (chomene) |Thank you (a lot) |- |Yewo (chomene) |Thanks (a lot) |- |Ndiwe njani zina lako? |What is your name? |- |Zina lane ndine.... |My name is.... |- |Nyengo ili uli? |What is the time? |- |Ningakuvwila? |Can I help you? |- |Uyende makola |Goodbye/go well/safe travels |- |Mwende makola |Goodbye/go well/safe travels (said to a group of people) |- |Enya/ Eh |Yes |- |Yayi/Chala |No |- |Kwali |I don't know |- |Mukumanya kuyowoya Chizungu? |Can you speak English? |- |Nayambapo kusambilila ChiTumbuka |I've just started learning Tumbuka |- |Mukung'anamula vichi? |What do you mean? |- |Chonde, ningaluta kubafa? |May I please go to the bathroom? |- |Nakutemwa/Nkhukutemwa |"I love you" |- |Phepa |Sorry |- |Phepani |Sorry (to agroup of people) |- |Banja |Family |- |Yowoya |Talk/speak |} == Verbs == === Subject prefix === Viyezgo vyose vikwenera kuŵa na lizgu lakunjilira ilo likuyana na lizgu lakunjilira. Mwaciyerezgero, lizgu lakuti ciŵinda'muthondo' lili mu gulu la 7, ntheura usange ni munthu, verebu ili lili na c-: : {{lang|tum|ciŵinda '''ci'''-ka-koma nkhalamu}} = 'the hunter killed a lion'<ref>Chavula (2016), p. 42.</ref> It is also possible for the subject to be a locative noun (classes 16, 17, 18), in which case the verb has a locative prefix:<ref>Chavula (2016), p. 23.</ref> : {{lang|tum|pamphasa '''pa'''-ka-khala mwana}} = 'on the mat there sat down a child' The locative prefix ''ku-'' (class 17) is also used impersonally when discussing the weather:<ref>Chavula (2016), p. 24.</ref> : {{lang|tum|'''ku'''kuzizima madazi ghano}} = 'it's cold these days' When the subject is a personal pronoun, the subject prefixes are as follows (the pronoun itself may be omitted, but not the subject prefix): : {{lang|tum|(ine) '''n'''-kha-gula}} = 'I bought' (''nkha-'' stands for ''ni-ka-'') : {{lang|tum|(iwe) '''u'''-ka-gula}} = 'you bought' (informal, singular) : {{lang|tum|(iyo)<ref>Chavula (2016), p. 23. But Kishindo et al. (2018), s.v. {{lang|tum|iye}}, have {{lang|tum|iye}}.</ref> '''wa'''-ka-gula}} = 'he, she bought' : {{lang|tum|(ise) '''ti'''-ka-gula}} = 'we bought' : {{lang|tum|(imwe) '''mu'''-ka-gula}} = 'you bought' (plural or respectful) : {{lang|tum|(iwo) '''ŵa'''-ka-gula}} = 'they bought', 'he/she bought' (plural or respectful) In the perfect tense, these are shortened to {{lang|tum|n-a-, w-a-, w-a-, t-a-, mw-a-, ŵ-a-}}, e.g. {{lang|tum|t-a-gula}} 'we have bought'. In [[Karonga]] dialect, in the 3rd person singular ''a-'' is found instead of ''wa-'', and the 3rd plural is ''wa-'' instead of ''ŵa-'', except in the perfect tense, when ''wa-'' and ''ŵa-'' are used.<ref>McNicholl (2010), pp. 7–8.</ref> === Object-marker === To indicate the object, an infix can be added to the verb immediately before the verb root. Generally speaking, the object-marker is optional:<ref>Chavula (2016), pp. 51–64.</ref> : {{lang|tum|Pokani wa('''yi''')gula galimoto}} = 'Pokani has bought a car' (class 9) : {{lang|tum|Changa waka('''mu''')nyamula katundu}} = 'Changa carried the luggage' (class 1) The object-marker agrees with the class of the object, as shown on the table of concords above. The object-marker can also be a locative (classes 16, 17, or 18):<ref>Chavula (2016), p. 56.</ref> : {{lang|tum|Kondwani wa('''pa''')kwera pa nyumba}} = 'Kondwani has climbed on top of the house' The locative markers for personal pronouns are as follows:<ref>Chavula (2016), pp. 53–4.</ref> : {{lang|tum|wa'''ni'''ona (ine)}} = 'he has seen me' : {{lang|tum|wa'''ku'''ona (iwe)}} = 'he has seen you' : {{lang|tum|wa'''mu'''ona}} = 'he has seen him/her' : {{lang|tum|wa'''ti'''ona}} = 'he has seen us' : {{lang|tum|wa'''mu'''ona'''ni'''}} = 'he has seen you' (plural or respectful) : {{lang|tum|wa'''ŵa'''ona}} = 'he has seen them' === Tenses === Tenses in Tumbuka are made partly by adding infixes, and partly by suffixes. Unlike ChiCheŵa, tones do not form any part of the distinction between one tense and another. In the past a distinction is made between hodiernal tenses (referring to events of today) and remote tenses (referring to events of yesterday or some time ago). However, the boundary between recent and remote is not exact.<ref>Kiso (2012), p. 176.</ref> Pali mphambano yikuru pakati pa nyengo iyo yajumpha na nyengo iyo yajumpha. Para munthu wakuyowoya mu nyengo yakufikapo, wakuyowoya kuti vinthu vicali makora, nga ni para wakuti: 'Vikondamoyo vyatandazgika mu munda.' Para munthu wakuyowoya lizgu lakuti ndakhala, wakung'anamura kuti "Nkhukhala" panji ndakondwa. Chizindikiro cha kutali chikugwiliskirika nchito pa vinthu ivyo vikacitika kale comene kweni ivyo vikucitika mazuŵa ghano, nga ni libwe lilikuwa 'libwe lawira' panji walikutayika 'wali kufwa.'<ref>Kiso (2012), pp. 171, 178.</ref><ref>Kiso (2012), p. 171, quoting Vail (1972).</ref> Nyengo zakunthazi nazo zikupambaniska pakati pa vyakuchitika vyapafupi na vyakutali. Vinyake vikulongora kuti cakucitika ici cizamucitikira kunyake, nga ni ndamukuchezga 'Nizamuluta kukacezga.'<ref>Kiso (2012), p. 184, quoting Vail (1972).</ref> Compound tenses are also found in Tumbuka, such as {{lang|tum|wati wagona}} 'he had slept', {{lang|tum|wakaŵa kuti wafumapo}} 'he had just left' and {{lang|tum|wazamukuŵa waguliska}} 'he will have sold'.<ref>Kiso (2012), pp. 172, 182, 184, quoting Vail (1972).</ref> {| class="wikitable" style="text-align: left" |+Some Tumbuka tenses<ref>Kiso (2012), pp. 163–192.</ref> !Tense !Tense marker !Example !Translation |- !Present infinitive |ku- |{{lang|tum|'''ku'''-luta}} |‘to go' |- ! |- !Present simple | -ku- |{{lang|tum|wa-'''ku'''-luta}} |‘he/she goes/is going’ |- !Present habitual | -ku-...-anga |{{lang|tum|wa-'''ku'''-lut-'''anga'''}} |‘he/she goes’ (some speakers only) |- ! |- !Present perfect | -a- |{{lang|tum|w-'''a'''-luta}} |‘he/she has gone’ |- !Present perfect continuous | -a-...-anga |{{lang|tum|w-'''a'''-lut-'''anga'''}} |‘he/she has been going' |- !Remote perfect | -liku- |{{lang|tum|wa-'''liku'''-luta}} |‘he/she has gone’ |- ! |- !Recent past simple | -angu- |{{lang|tum|w-'''angu'''-luta}} |‘he/she went’ (today) |- !Recent past continuous | -angu-...-anga |{{lang|tum|w-'''angu'''-lut-'''anga'''}} |‘he/she was going' (today) |- !Remote past simple | -ka- |{{lang|tum|wa-'''ka'''-luta}} |‘he/she went’ |- !Remote past continuous | -ka-...-anga |{{lang|tum|wa-'''ka'''-lut-'''anga'''}} |‘he/she was going/used to go' |- ! |- ![[Near future (grammar)|Near future]] |...-enge |{{lang|tum|wa-lut-'''enge'''}} |'he will go' (now or today) |- !Emphatic future<ref>Kiso (2012), p. 183, quoting Vail (1972).</ref> | -ti-...-enge |{{lang|tum|wa-'''ti'''-lut-'''enge'''}} |'he will certainly go' |- !Distal future<ref>Kiso (2012), p. 184, 185, quoting Vail (1972). For the term 'distal', see Botne (1999).</ref> | -amu-(ku)- |{{lang|tum|w-'''amuku'''-gula}} |‘he/she will buy’ (elsewhere) |- !Remote future | -zamu-(ku)- |{{lang|tum|wa-'''zamu'''-luta}} |‘he/she will go’ (tomorrow or later) |- !Remote future continuous | -zamu-...-anga |{{lang|tum|wa-'''zamu'''-lut-'''anga'''}} |‘he/she will be going' (tomorrow or later) |- ! |- !Present subjunctive | -e |{{lang|tum|ti-lut-'''e'''}} |‘let's go' |- !Distal subjunctive | -ka-...-e |{{lang|tum|wa-'''ka'''-gul-'''e'''}} |‘so that he can buy (elsewhere)' |- !Potential | -nga- |{{lang|tum|wa-'''nga'''-luta}} |'he can go'<ref>McNicholl (2010), p. 8.</ref> |} Other future tenses are given by Vail (1972) and others.<ref>See Kiso (2012) pp. 182–188.</ref> In the 1st person singular, ''ni-ku-'' and ''ni-ka-'' are shortened to ''nkhu-'' and ''nkha-'': {{lang|tum|nkhuluta}} 'I am going', 'I go', {{lang|tum|nkhalutanga}} 'I used to go'.<ref>Kiso (2012), pp. 163, 173.</ref> === Negative verbs === To make the negative of a verb in Tumbuka, the word {{lang|tum|yayi}} or {{lang|tum|cha(ra)}} is added at or near the end of the clause. It seems that {{lang|tum|yayi}} is preferred by younger speakers:<ref>Kiso (2012), p. 190.</ref> : {{lang|tum|wakulemba kalata '''yayi'''}} : 'he is not writing a letter' : {{lang|tum|tizamugwira ntchito '''cha''' machero}} : 'we will not work tomorrow' With the present perfect tense, however, a separate form exists, adding ''-nda-'' and ending in ''-e'':<ref>Kiso (2012), p. 191.</ref> : {{lang|tum|enya, n'''a'''kumana nawo}} : 'yes, I have met him' : {{lang|tum|yayi, ni'''nda'''kuman'''e''' nawo}} : 'no, I haven't met him' == The Ngoni influence on Tumbuka == '''Words of Ngoni (Zulu/Ndwandwe) origin found in Tumbuka:''' Viyowoyero vyose vya ChiTumbuka vikakhwaskika na chiyowoyero cha Chigoni, chomenechomene mu chigaŵa cha Mzimba ku Malawi. Chiyowoyero cha Ngoni chikamba na ŵanthu ŵa mtundu wa Ndwandwe awo ŵakaŵa ŵazengezgani ŵa fuko la Zulu pambere Ŵazulu ŵandaŵathereske. Ntheura chiyowoyero icho Ŵandwandwe ŵakayowoyanga chikaŵa chakuyana waka na cha Ŵazulu. Apa pali viyelezgero vinyake vya mazgu gha ChiTumbuka agho ghali kufuma ku chiZulu/Ndwandwe, nangauli ghanandi ghali na mazgu ghakwambilira gha ChiTumbuka agho ghakung'anamulika mu chiyowoyero ichi. {| class="wikitable" !English !Tumbuka !Tumbuka-Ngoni dialect |- |See |Wona |Bheka |- |Smoke |Khweŵa |Bhema |- |Man |Mwanalume |Doda |- |Virgin |Mwali |Nthombi |} == An example of Tumbuka == '''Months in Tumbuka:''' {| class="wikitable" !English !Tumbuka |- |January |Mathipa |- |February |Muswela |- |March |Nyakanyaka |- |April |Masika |- |May |Vuna |- |June |Zizima |- |July |Mphepo |- |August |Mpupulu |- |September |Lupya |- |October |Zimya |- |November |Thukila |- |December |Vula |} Chiyelezgero cha nkhani ya ŵanthu iyo yikang'anamulika mu ChiTumbuka na viyowoyero vinyake vya kumpoto kwa Malawi chili mu buku la Language Mapping Survey for Northern Malawi, ilo likalembeka na Center for Language Studies of the University of Malawi.<ref>[https://web.archive.org/web/20210413225347/http://unima-cls.org/Docs/MappingNorthernMalawi/lm-northernmalawi.pdf Language Mapping Survey], p. 60-64.</ref> Buku la ChiTumbuka ilo lili na nkhani iyi likuti: : {{lang|tum|KALULU NA FULU (ChiTumbuka)|italics=no}} : {{lang|tum|Fulu wakaluta kukapemphiska vyakulya ku ŵanthu. Pakuyeya thumba lake wakacita kukaka ku cingwe citali na kuvwara mu singo, ndipo pakwenda thumba lake likizanga kunyuma kwakhe.|italics=no}} : {{lang|tum|Wali mu nthowa, kalulu wakiza kunyuma kwakhe ndipo wakati “bowo, thumba lane!” Fulu wakati, "Thumba ndane iwe, wona cingwe ici ndakaka sono nkhuguza pakwenda.” Kalulu wakakana nipera, ndipo wakati “Tilute ku Mphala yikateruzge.” Mphala yikadumula mlandu na kuceketa cingwe ico Fulu wakakakira thumba. Ŵakatola thumba lira ndipo ŵakapa kalulu.|italics=no}} : {{lang|tum|Pa zuŵa linyakhe Kalulu wakendanga, Fulu wakamsanga ndipo wakati, "Bowo, mcira wane!" Kalulu wakati, “Ake! Fulu iwe m'cira ngwane." Fulu wakakana, ndipo wakati, "Ndasola ngwane." Ŵakaluta ku mphala, kuti yikaŵeruzge. Ku Mphala kula mlandu ukatowera Fulu. Ŵakadumula m'cira wa Kalulu nakupa Fulu.|italics=no}} : (Translation) : THE TORTOISE AND THE HARE : Tortoise went to beg food from people. To carry his bag, he tied it to a long string and wore it round his neck. As he walked along, the bag was coming behind him. : As he was on his way, Hare came up behind him and said, "There it is, my bag!" Tortoise said "The bag is mine, see this string I've tied now I'm pulling it as I go." Hare refused to accept this and said "Let's go the Court, so that it can judge us." The Court examined the case and cut Tortoise's string which he'd tied the bag with. They took that bag and gave it to Hare. : Another day when Hare was walking along, Tortoise found him and said, "There it is, my tail!" Hare said, "Nonsense, this is my tail, Tortoise." Tortoise refused to accept this and said, "What I've got is mine." They went to the Court so that it could make a judgement. In that Court, the case went in Tortoise's favour. They cut off Hare's tail and gave it to Tortoise. == Some vocabulary == === Helpful phrases === * {{lang|tum|Enya}} = Yes * {{lang|tum|Yayi}} = No * {{lang|tum|Yebo (yeŵo)}} = Thank you * {{lang|tum|Taonga}} = We are thankful * {{lang|tum|Nkhukhumba chakurya!}} = I want some food ! * {{lang|tum|Munganipako chakurya?}} = could you give me some food? * {{lang|tum|Ine nkhuyowoya ChiTumbuka yayi!}} = I do not speak ChiTumbuka! * {{lang|tum|Yendani makola}} = Travel well. * {{lang|tum|Nkukhumba maji yakumwa}} = I would like water to drink. === Greetings === * {{lang|tum|Mwawuka uli?}} = Good morning. (How did you wake up?) * {{lang|tum|Tawuka makola. Kwali imwe?}} = Fine. And you? (I woke up well. I don't know about you?) * {{lang|tum|Muli uli?}} = How are you? * {{lang|tum|Nili makola, kwali imwe?}} = I am fine, how are you? * {{lang|tum|Mwatandala uli?}} = Good afternoon. (How did you spend the day?) * {{lang|tum|Natandala makola. Kwali imwe?}} = Good afternoon. How are you? (I spent the day well. I don't know about you?) * {{lang|tum|Monile}} = somewhat more formal than "Hi". Perhaps best translated as "Greetings". * {{lang|tum|Tionanenge}} = We shall meet again. === People === The plural ba- (ŵa-) is often used for politeness when referring to elders: * {{lang|tum|Munyamata}} = boy * {{lang|tum|Banyamata (ŵanyamata)}} = boys * {{lang|tum|Musungwana}} = girl * {{lang|tum|Basungwana (ŵasungwana)}} = girls * {{lang|tum|Bamwali (ŵamwali)}} = young ladies * {{lang|tum|Banchembere (ŵancembele)}} = a woman with babies * {{lang|tum|Bamama (ŵamama)}} = mother * {{lang|tum|Badada(ŵadhadha)}} = dad * {{lang|tum|Bagogo (ŵagogo)}} = grandmother * {{lang|tum|Babuya (ŵabhuya)}} = grandmother, also used when addressing old female persons * {{lang|tum|Basekulu (ŵasekulu)}} = grandfather * {{lang|tum|Bankhazi (ŵankhazi)}} = paternal aunt * {{lang|tum|ŵa/Bamama ŵa/bachoko / ŵa/bakulu}} = maternal aunt usually your mother's younger/older sister * {{lang|tum|Basibweni (ŵasibweni)}} = maternal uncle * {{lang|tum|Badada(ŵadhadha) bachoko / bakulu}} = paternal uncle usually your father's younger/older brother * {{lang|tum|Mudumbu(mudhumbu) wane}} = my brother/ sister (for addressing a sibling of the opposite sex) * {{lang|tum|Muchoko wane / muzuna wane/ munung'una wane}} = my young brother / sister (for addressing a sibling of the same sex) * {{lang|tum|Mukuru wane / mulala wane}} = my elder brother / sister (for addressing a sibling of the same sex) === Verbs === * {{lang|tum|Kusebela (Kuseŵera)}} = to play * {{lang|tum|Kuseka}} = to laugh * {{lang|tum|Kurya}} = to eat * {{lang|tum|Kugona}} = to sleep * {{lang|tum|Kwenda}} = to walk * {{lang|tum|Kuchimbila}} = to run * {{lang|tum|Kulemba}} = to write * {{lang|tum|Kuchapa}} = to do laundry * {{lang|tum|Kugeza}} = to bath * {{lang|tum|Kuphika}} = to cook * {{lang|tum|Kulima}} = to dig / cultivate * {{lang|tum|Kupanda}} = to plant * {{lang|tum|Kuvina}} = to dance * {{lang|tum|Kwimba}} = to sing === Animals === * {{lang|tum|Fulu}} = tortoise * {{lang|tum|Kalulu}} = hare * {{lang|tum|Gwere}} = hippo * {{lang|tum|Chimbwi}} = hyena * {{lang|tum|Njoka}} = snake * {{lang|tum|Nkhumba}} = pig * {{lang|tum|Ng'ombe}} = cow * {{lang|tum|Nchebe (Ncheŵe)}} = dog * {{lang|tum|Chona/pusi/kiti}} = cat * {{lang|tum|Mbelele}} = sheep * {{lang|tum|Nkalamu}} = lion * {{lang|tum|Mbuzi}} = goat * {{lang|tum|Nkhuku}} = chicken == Wonaniso == * [[Tumbuka people]] * [[Tumbuka mythology]] == Notable Tumbuka People == * [[Shepherd Bushiri|Sheperd Bushiri]] (Christian preacher) * [[Mwai Kumwenda]] (netball player) * [[Bridget Kumwenda|Briddget Kumwenda]] (netball player) * [[Chakufwa Chihana]] ( human rights activist and politician) * [[Enoch Chihana]] (member of parliament) == Ukaboni == {{reflist}} == Bibliography == {{refbegin}} * Botne, Robert (1999). [https://web.archive.org/web/20210413225148/https://scholarworks.iu.edu/dspace/bitstream/handle/2022/3356/botne%20book%20chapter.pdf?sequence=1 "Future and distal -ka-'s: Proto-Bantu or nascent form(s)?"]. In: Jean-Marie Hombert and Larry M. Hyman (eds.), ''Bantu Historical Linguistics: Theoretical and Empirical Perspectives''. Stanford, CA: Center for the Study of Language and Information, pp.&nbsp;473–515. * Chase, Robert (2004). "A Comparison of Demonstratives in the Karonga and Henga Dialects of Tumbuka". Undergraduate paper. Amherst: Dept. of Linguistics, Univ. of Massachusetts. * Chavula, Jean Josephine (2016). [https://www.lotpublications.nl/Documents/423_fulltext.pdf "Verbal derivation and valency in ChiTumbuka"]. Leiden University doctoral thesis. * Downing, Laura J. (2006). "The Prosody and Syntax of Focus in ChiTumbuka". ''ZAS Papers in Linguistics'' 43, 55-79. * Downing, Laura J. (2008). "Focus and prominence in ChiCheŵa, ChiTumbuka and Durban Zulu". ''ZAS Papers in Linguistics'' 49, 47-65. * Downing, Laura J. (2012). [http://www.lingref.com/cpp/acal/42/paper2764.pdf "On the (Non-)congruence of Focus and Prominence in Tumbuka"]. ''Selected Proceedings of the 42nd Annual Conference on African Linguistics'', ed. Michael R. Marlo et al., 122-133. Somerville, MA: Cascadilla Proceedings Project. * Downing, Laura J. (2017). "Tone and intonation in ChiCheŵa and Tumbuka". In Laura J. Downing & Annie Rialland (eds) ''Intonation in African Tone Languages''. de Gruyter, Berlin/Boston, pp.&nbsp;365–392. * Downing, Laura J. (2019). [https://www.researchgate.net/profile/Laura_Downing/publication/335175896_Tumbuka_prosody_Between_tone_and_stress/links/5d55398645851545af43be4d/Tumbuka-prosody-Between-tone-and-stress.pdf "Tumbuka prosody: Between tone and stress"]. In: Emily Clem et al (eds). ''Theory and Description in African Linguistics: Selected papers from the 47th Annual Conference on African Linguistics'', 75-94. Also available online at: [https://books.google.com/books?id=fPSrDwAAQBAJ&dq=Tumbuka+prosody%3A+Between+tone+and+stress&pg=PA75] * Elmslie, Walter Angus (1923): ''Introductory Grammar of the Tumbuka Language''. Livingstonia Mission Press. * Kamwendo, Gregory H. (2004). [https://web.archive.org/web/20200929073334/http://www.njas.helsinki.fi/pdf-files/vol13num3/kamwendo.pdf Kamwendo "Your ChiTumbuka is Shallow. It's not the Real ChiTumbuka: Linguistic Purism Among ChiTumbuka Speakers in Malawi"], ''Nordic Journal of African Studies'' 13(3): 275–288. * Kishindo, Pascal J. et Allan L. Lipenga (2006). ''Parlons ChiTumbuka : langue et culture du Malawi et de la Zambie'', L'Harmattan, Paris, Budapest, Kinshasa, 138 pages. {{ISBN|2-296-00470-9}} * Kishindo, Pascal J. (ed), Jean J. Chavula and others (2018). {{lang|tum|Mung'anamulira mazgo wa ChiTumbuka}} (ChiTumbuka dictionary). Centre for Language Studies, University of Malawi. {{ISBN|978-99960-9-610-5}} * Kiso, Andrea (2012). [http://su.diva-portal.org/smash/get/diva2:546594/FULLTEXT01.pdf "Tense and Aspect in ChiCheŵa, ChiTumbuka, and Cisena"]. Ph.D. Thesis. Stockholm University. * McNicholl, Duncan (2010). [https://web.archive.org/web/20190819091447/http://malawinetwork.org/guide-to-chitumbuka.pdf "The No-Nonsense Guide to Learning ChiTumbuka: Volume 1"]. * Moto, Francis (1999). "The Tonal Phonology of Bantu Ideophones". ''Malilime: Malawian Journal of Linguistics'' no.1, 100-120. (pp.&nbsp;112–119 deals with tone in ChiTumbuka ideophones). * Mphande, L. (1989). "A Phonological Analysis of the Ideophone in ChiTumbuka". Ph.D. Dissertation. The University of Texas, Austin. * Shiozaki, Lisa (2004). "Concordial agreement in the Karonga dialect of Tumbuka". Undergraduate paper. Amherst: Dept. of Linguistics, Univ. of Massachusetts. * Turner, W.M. (1952). ''Tumbuka–Tonga–English Dictionary'' The Hetherwick Press, Blantyre, Nyasaland (now Malawi). * University of Malawi Centre for Language Studies (2006). [https://web.archive.org/web/20210413225347/http://unima-cls.org/Docs/MappingNorthernMalawi/lm-northernmalawi.pdf "Language Mapping Survey for Northern Malawi"]. * Vail, Hazen Leroy (1971). "The noun classes of Tumbuka". ''African studies'', v. 30, 1, p.&nbsp;35-59. * Vail, Hazen Leroy (1972). "Aspects of the Tumbuka Verb". Ph.D. dissertation, University of Wisconsin. {{refend}} == External links == {{InterWiki|code=tum}} {{Wikivoyage|Tumbuka phrasebook|Tumbuka|a phrasebook}} * [https://web.archive.org/web/20151123103050/http://africa.isp.msu.edu/afrlang/Tumbuka_root.html Very brief report on Tumbuka language.] * [https://web.archive.org/web/20210413225347/http://unima-cls.org/Docs/MappingNorthernMalawi/lm-northernmalawi.pdf Language Mapping Survey for Northern Malawi]. University of Malawi Centre for Language Studies, 2006. * [https://web.archive.org/web/20210413225407/http://unima-cls.org/Docs/MappingNorthernMalawi/mw-north-a4.jpg Language Map of Northern Malawi] * [https://web.archive.org/web/20051222115610/http://embangweni.com/chitumbu.htm Some more ChiTumbuka vocabulary.] * [http://www.bisharat.net/wikidoc/pmwiki.php/PanAfrLoc/Tumbuka PanAfrican L10n page on Tumbuka] * [https://web.archive.org/web/20210308020136/http://www.unima-cls.org/ ChiTumbuka monolingual dictionary] {{Languages of Malawi}} {{Languages of Zambia}} {{Narrow Bantu languages|N-S}} {{Authority control}} {{DEFAULTSORT:Tumbuka Language}} [[Category:Tumbuka language| ]] [[Category:Nyasa languages]] [[Category:Languages of Malawi]] [[Category:Languages of Zambia]] [[Category:Tumbuka people]] [[Category:Non-tonal languages in tonal families]] [[Category:Click languages|Tumbuka language (Mzimba dialect)]] g81q7fhukjlbo4sds4pftrgypu8j4w7 Module:Params 828 43807 123256 123158 2026-10-11T04:38:58Z Grufo 8824 Update from [[d:Special:GoToLinkedPage/mediawikiwiki/Q122696746|master]] using [[mw:Synchronizer| #Synchronizer]] 123256 Scribunto text/plain require[[strict]] --- --- --- PRIVATE ENVIRONMENT --- --- ________________________________ --- --- --- --[[ Abstract utilities ]]-- ---------------------------- -- Helper function for `string.gsub()` (for managing zero-padded numbers) local function zero_padded (str) return ('%03d%s'):format(#str, str) end -- Helper function for `table.sort()` (for natural sorting) local function natural_sort (var1, var2) return var1:gsub('%d+', zero_padded) < var2:gsub('%d+', zero_padded) end -- Return a copy or a reference to a table local function copy_or_ref_table (src, refonly) if refonly then return src end local newtab = {} for key, val in pairs(src) do newtab[key] = val end return newtab end -- Copy at most N items (of all kinds) from `src` to `dest` and return `dest` local function copy_table_maxn (dest, src, len) local idx = 1 for key, val in pairs(src) do dest[key], idx = val, idx + 1 if idx > len then break end end return dest end -- Remove some numeric elements from a table, shifting everything to the left local function remove_numeric_keys (tbl, idx, len) local cache, tmp = {}, idx + len - 1 for key, val in pairs(tbl) do if type(key) == 'number' and key >= idx then if key > tmp then cache[key - len] = val end tbl[key] = nil end end for key, val in pairs(cache) do tbl[key] = val end end -- Make a reduced copy of a table (shifting in both directions if necessary) local function copy_table_reduced (tbl, idx, len) local ret, tmp = {}, idx + len - 1 if idx > 0 then for key, val in pairs(tbl) do if type(key) ~= 'number' or key < idx then ret[key] = val elseif key > tmp then ret[key - len] = val end end elseif tmp > 0 then local nshift = 1 - idx for key, val in pairs(tbl) do if type(key) ~= 'number' then ret[key] = val elseif key > tmp then ret[key - tmp] = val elseif key < idx then ret[key + nshift] = val end end else for key, val in pairs(tbl) do if type(key) ~= 'number' or key > tmp then ret[key] = val elseif key < idx then ret[key + len] = val end end end return ret end -- Make an expanded copy of a table (shifting in both directions if necessary) local function copy_table_expanded (tbl, idx, len) local ret, tmp = {}, idx + len - 1 if idx > 0 then for key, val in pairs(tbl) do if type(key) ~= 'number' or key < idx then ret[key] = val else ret[key + len] = val end end elseif tmp > 0 then local nshift = idx - 1 for key, val in pairs(tbl) do if type(key) ~= 'number' then ret[key] = val elseif key > 0 then ret[key + tmp] = val elseif key < 1 then ret[key + nshift] = val end end else for key, val in pairs(tbl) do if type(key) ~= 'number' or key > tmp then ret[key] = val else ret[key - len] = val end end end return ret end -- Given a table, create two new tables containing the sorted list of keys local function get_sorted_key_list (tbl, sort_fn) local nums, words, nn, nw = {}, {}, 1, 1 for key, val in pairs(tbl) do if type(key) == 'number' then nums[nn], nn = key, nn + 1 else words[nw], nw = key, nw + 1 end end table.sort(nums) table.sort(words, sort_fn) return nums, words, nn - 1, nw - 1 end -- Parse a parameter name string and return it as a string or a number local function get_param_name (par_str) local ret = par_str:match'^%s*(.-)%s*$' if ret ~= '0' and ret:find'^%-?[1-9]%d*$' == nil then return ret end return tonumber(ret) end -- Move a key from a table to another, but only if under a different name and -- always parsing numeric strings as numbers local function steal_if_renamed (val, src, skey, dest, dkey) local realkey = get_param_name(dkey) if skey ~= realkey then dest[realkey], src[skey] = val, nil end end --[[ Public strings ]]-- ------------------------ -- Special match keywords (functions and modifiers MUST avoid these names) local mkeywords = { ['or'] = 0, pattern = 1, plain = 2, strict = 3 } -- Sort functions (functions and modifiers MUST avoid these names) local sortfunctions = { alphabetically = false, naturally = natural_sort } -- Callback styles for the `mapping_*` and `renaming_*` class of modifiers -- (functions and modifiers MUST avoid these names) --[[ Meanings of the columns: col[1] = Loop type (0-3) col[2] = Number of module arguments that the style requires (1-3) col[3] = Minimum number of sequential parameters passed to the callback col[4] = Name of the callback parameter where to place each parameter name col[5] = Name of the callback parameter where to place each parameter value col[6] = Argument in the modifier's invocation that will override `col[4]` col[7] = Argument in the modifier's invocation that will override `col[5]` A value of `-1` indicates that no meaningful value is stored (i.e. `nil`) ]]-- local mapping_styles = { names_and_values = { 3, 2, 2, 1, 2, -1, -1 }, values_and_names = { 3, 2, 2, 2, 1, -1, -1 }, values_only = { 1, 2, 1, -1, 1, -1, -1 }, names_only = { 2, 2, 1, 1, -1, -1, -1 }, names_and_values_as = { 3, 4, 0, -1, -1, 2, 3 }, names_only_as = { 2, 3, 0, -1, -1, 2, -1 }, values_only_as = { 1, 3, 0, -1, -1, -1, 2 }, blindly = { 0, 2, 0, -1, -1, -1, -1 } } -- Memory slots (functions and modifiers MUST avoid these names) local memoryslots = { h = 'header', f = 'footer', i = 'itersep', l = 'lastsep', n = 'ifngiven', p = 'pairsep', s = 'oxfordsep' } -- Possible trimming modes for the `parsing` modifier local trim_parse_opts = { trim_none = { false, false }, trim_positional = { false, true }, trim_named = { true, false }, trim_all = { true, true } } -- Possible string modes for the iteration separator in the `parsing` and -- `reinterpreting` modifiers local isep_parse_opts = { splitter_pattern = false, splitter_string = true } -- Possible string modes for the key-value separator in the `parsing` and -- `reinterpreting` modifiers local psep_parse_opts = { setter_pattern = false, setter_string = true } -- Possible position references for the `splicing` modifier local position_references = { add_nothing = 0, add_smallest_number = 1, add_last_of_sequence = 2, add_largest_number = 3 } -- Possible modes for the `reassigning` modifier local a_modes = { transfer = 0, clone = 1, rename = 2, copy = 3, sacrifice = 4, provide = 5, spare = 7 } -- Functions and modifiers MUST avoid these names too: `here`, `in_substack`, -- `let`, `expose`, `use`, `with_flushed_glue`, `without_flushed_glue` -- `without_sorting` --[[ Private constants ]]-- --------------------------- -- Hard-coded name of the module (to avoid going through `frame:getTitle()`) local modulename = 'Module:Params' -- The functions listed here declare that they don't need the -- `frame:getParent().args` metatable to be copied into a regular table; if -- they are modifiers they also guarantee that they will make their own -- (modified) copy available local refparams = { call_for_each_group = true, combining = true, combining_by_calling = true, combining_values = true, concat_and_call = true, concat_and_invoke = true, concat_and_magic = true, count = true, grouping_by_calling = true, mixing_names_and_values = true, keeping_at_most = true, renaming_by_mixing = true, renaming_to_sequence = true, renaming_to_uppercase = true, renaming_to_lowercase = true, shifting = true, splicing = true, value_of = true, with_name_matching = true } -- Maximum number of numeric parameters that can be filled, if missing (we -- chose an arbitrary number for this constant; you can discuss about its -- optimal value at Module talk:Params) local maxfill = 1024 -- The private table of functions local library = {} -- Functions and modifiers that can only be invoked in first position local static_iface = {} --[[ Private functions ]]-- --------------------------- -- Create a new context local function context_new (child_frame, first_fn_name) local main_frame, tpipe = child_frame:getParent(), { first_fn_name } for key, val in pairs(child_frame.args) do if type(key) == 'number' and key > 0 then tpipe[key + 1] = val else tpipe[key] = val end end return { frame = main_frame, pipe = tpipe, oparams = main_frame.args, firstposonly = static_iface, iterfunc = pairs, fnpos = 1, sorttype = 0, n_parents = 0, n_children = 0, n_available = maxfill } end -- Move to the next action within the user-given list local function context_iterate (ctx, next_fn_pos) local nextfn if ctx.pipe[next_fn_pos] ~= nil then nextfn = ctx.pipe[next_fn_pos]:match'^%s*(.*%S)' end if nextfn == nil then error(modulename .. ': You must specify a function to call', 0) end if library[nextfn] == nil then if ctx.firstposonly[nextfn] == nil then error(modulename .. ': The function ‘' .. nextfn .. '’ does not exist', 0) else error(modulename .. ': The ‘' .. nextfn .. '’ directive can only appear in first position', 0) end end ctx.fnpos = next_fn_pos return library[nextfn] end -- Main loop local function main_loop (ctx, start_with) local fn = start_with repeat fn = fn(ctx) until not fn if ctx.n_parents > 0 then error(modulename .. ': One or more ‘merging_substack’ directives are missing', 0) end if ctx.n_children > 0 then error(modulename .. ', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end end -- Load a `setting`-like directive string into the `dest` table local function set_strings_from_opts (dest, opts, offs) local cmd if opts[offs] == nil then return offs - 1 end cmd = opts[offs]:gsub('%s+', ''):gsub('/+', '/'):match'^/*(.*[^/])' if cmd == nil then return offs end local vname, chr local amap, sep, argc = {}, string.byte('/'), offs + 1 for idx = 1, #cmd do chr = cmd:byte(idx) if chr == sep then for key, val in ipairs(amap) do dest[val], amap[key] = opts[argc], nil end argc = argc + 1 else vname = memoryslots[string.char(chr)] if vname == nil then error(modulename .. ', ‘setting’: Unknown slot ‘' .. string.char(chr) .. '’', 0) end table.insert(amap, vname) end end for key, val in ipairs(amap) do dest[val] = opts[argc] end return argc end -- Add a new stack of parameters to `ctx.children` local function new_substack (ctx) local currsnap, newparams = ctx.n_children + 1, {} if ctx.children == nil then ctx.children = { newparams } else ctx.children[currsnap] = newparams end ctx.n_children = currsnap return newparams end -- Parse a raw argument containing a `sortfunctions` directive, or -- `'without_sorting'`, or `nil` local function load_sort_opt (raw_arg) if raw_arg == nil then return nil, 1, false end local trarg = raw_arg:match'^%s*(.-)%s*$' if trarg == 'without_sorting' then return nil, 2, false, trarg end local tmp = sortfunctions[trarg] if tmp == nil then return nil, 1, false, trarg end return tmp or nil, 2, true, trarg end -- Parse optional user arguments of type `...|[let/use]|[...]|[let/use]|[...]| -- [number of additional parameters]|[parameter 1]|[parameter 2]|[...]` local function load_child_opts (src, start_from, append_after, params) local tnamed, tmp1, tmp2 local pin, tbl, mem = start_from, {}, {} while src[pin] ~= nil and src[pin + 1] ~= nil do tmp1 = src[pin]:match'^%s*(.*%S)' if tmp1 == 'let' and src[pin + 2] ~= nil then tmp1 = get_param_name(src[pin + 1]) mem[tmp1], tbl[tmp1], pin = nil, src[pin + 2], pin + 3 --[[ elseif tmp1 == 'expose' then tmp1 = get_param_name(src[pin + 1]) tmp2 = params[tmp1] mem[tmp1], tbl[tmp1], pin = tmp2, tmp2, pin + 2 ]]-- elseif tmp1 == 'use' and src[pin + 2] ~= nil then tmp1 = get_param_name(src[pin + 2]) tmp2 = params[tmp1] mem[tmp1], tbl[get_param_name(src[pin + 1])], pin = tmp2, tmp2, pin + 3 else break end end local tnew = copy_or_ref_table(params, next(mem) == nil) for key in pairs(mem) do tnew[key] = nil end if pin ~= start_from then tnamed, tbl = tbl, {} end tmp1 = tonumber(src[pin]) if tmp1 ~= nil and math.floor(tmp1) == tmp1 then if tmp1 < 0 then tmp1 = -1 end tmp2 = append_after - pin for idx = pin + 1, pin + tmp1 do tbl[idx + tmp2] = src[idx] end pin = pin + tmp1 + 1 end if tnamed ~= nil then for key, val in pairs(tnamed) do tbl[key] = val end end return tbl, pin, tnew, mem end -- Load the optional arguments of some of the `mapping_*` and `renaming_*` -- class of modifiers local function load_callback_opts (src, start_from, default_style, params) local style, shf local tmp = src[start_from + 1] if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end if style == nil then style, shf = default_style, start_from - 1 else shf = start_from end local n_exist, karg, varg = style[3], style[4], style[5] tmp = style[6] if tmp > -1 then karg = src[tmp + shf]:match'^%s*(.-)%s*$' if karg == '0' or karg:find'^%-?[1-9]%d*$' ~= nil then karg = tonumber(karg) n_exist = math.max(n_exist, karg) end end tmp = style[7] if tmp > -1 then varg = src[tmp + shf]:match'^%s*(.-)%s*$' if varg == '0' or varg:find'^%-?[1-9]%d*$' ~= nil then varg = tonumber(varg) n_exist = math.max(n_exist, varg) end end tmp = style[1] local dest, argc, tnew, mem = load_child_opts(src, style[2] + shf, n_exist, params) if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then tmp = tmp - 2 end if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then tmp = tmp - 1 end return dest, argc, tmp, karg, varg, tnew, mem end -- Parse the arguments of some of the `mapping_*` and `renaming_*` class of -- modifiers local function load_replace_args (opts, offs, whoami) if opts[offs + 1] == nil then error(modulename .. ', ‘' .. whoami .. '’: No pattern string was given', 0) end if opts[offs + 2] == nil then error(modulename .. ', ‘' .. whoami .. '’: No replacement string was given', 0) end local ptn, repl, nmax, argc = opts[offs + 1], opts[offs + 2], tonumber(opts[offs + 3]), 3 if nmax ~= nil or (opts[offs + 3] or ''):match'^%s*$' ~= nil then argc = 4 end local flg = opts[offs + argc] if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end return ptn, repl, nmax, flg, offs + argc, (nmax ~= nil and nmax < 1) or (flg == 3 and ptn == repl) end -- Parse the arguments of the `with_*_matching` class of modifiers local function load_pattern_args (opts, offs, whoami) local keyw local ptns, arg, state, nptns, idx = {}, opts[offs + 1], 0, 0, offs + 2 while arg ~= nil do if state == 0 then nptns, state = nptns + 1, -1 ptns[nptns] = { arg, false, false } else keyw = arg:match'^%s*(.*%S)' if keyw == nil or mkeywords[keyw] == nil or ( state > 0 and mkeywords[keyw] > 0 ) then break else state = mkeywords[keyw] if state > 1 then ptns[nptns][2] = true end if state == 3 then ptns[nptns][3] = true end end end arg, idx = opts[idx], idx + 1 end if state == 0 then error(modulename .. ', ‘' .. whoami .. '’: No pattern was given', 0) end return ptns, nptns, idx - 1 end -- Load the optional arguments of the `parsing`, `reinterpreting` and -- `evaluating` modifiers local function load_parse_opts (opts, offs, isp, psp) local tmp local optslots, noptslots, argc, trimn, trimu, iplain, pplain = { true, true, true }, 3, offs, true, false, true, true repeat noptslots, tmp = noptslots - 1, opts[argc] if tmp == nil then break end tmp = tmp:match'^%s*(.-)%s*$' if optslots[1] ~= nil and trim_parse_opts[tmp] ~= nil then tmp = trim_parse_opts[tmp] trimn, trimu, optslots[1] = tmp[1], tmp[2], nil elseif optslots[2] ~= nil and isep_parse_opts[tmp] ~= nil then argc = argc + 1 iplain, isp, optslots[2] = isep_parse_opts[tmp], opts[argc], nil elseif optslots[3] ~= nil and psep_parse_opts[tmp] ~= nil then argc = argc + 1 pplain, psp, optslots[3] = psep_parse_opts[tmp], opts[argc], nil else break end argc = argc + 1 until noptslots < 1 return isp, iplain, psp, pplain, trimn, trimu, argc end -- Map parameters' values using a custom callback and a referenced table local value_maps = { [0] = function (tbl, margs, karg, varg, fn) for key in pairs(tbl) do tbl[key] = fn() end end, [1] = function (tbl, margs, karg, varg, fn) for key, val in pairs(tbl) do margs[varg] = val tbl[key] = fn() end end, [2] = function (tbl, margs, karg, varg, fn) for key in pairs(tbl) do margs[karg] = key tbl[key] = fn() end end, [3] = function (tbl, margs, karg, varg, fn) for key, val in pairs(tbl) do margs[karg], margs[varg] = key, val tbl[key] = fn() end end } -- Private table for `map_names()` local name_thieves = { [0] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do steal_if_renamed(val, tbl, key, cache, fn()) end end, [1] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do rargs[varg] = val steal_if_renamed(val, tbl, key, cache, fn()) end end, [2] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do rargs[karg] = key steal_if_renamed(val, tbl, key, cache, fn()) end end, [3] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do rargs[karg], rargs[varg] = key, val steal_if_renamed(val, tbl, key, cache, fn()) end end } -- Map parameters' names using a custom callback and a referenced table local function map_names (tbl, rargs, karg, varg, looptype, fn) local cache = {} name_thieves[looptype](cache, tbl, rargs, karg, varg, fn) for key, val in pairs(cache) do tbl[key] = val end end -- Return a new table that contains `src` regrouped according to the numeric -- suffixes in its keys local function make_groups (src) -- NOTE: `src` might be the original metatable! local prefix, gid local groups = {} for key, val in pairs(src) do -- `key` must only be a string or a number... if type(key) == 'string' then prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$' gid = tonumber(gid) or '' else prefix, gid = '', key end if groups[gid] == nil then groups[gid] = {} end if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then prefix = tonumber(prefix) if prefix < 1 then prefix = prefix - 1 end end groups[gid][prefix] = val end return groups end -- Split into parts a string containing the `$#` and `$@` placeholders and -- return the information as a skeleton table, a canvas table and a length local function parse_placeholder_string (target) local skel, canvas, idx, s_pos, e_pos = {}, {}, 1, 1, string.find(target, '%$[@#]', 1, false) while e_pos ~= nil do canvas[idx], skel[idx + 1] = target:sub(s_pos, e_pos - 1), target:sub(e_pos, e_pos + 1) == '$@' idx, s_pos = idx + 2, e_pos + 2 e_pos = string.find(target, '%$[@#]', s_pos, false) end if (s_pos > target:len()) then idx = idx - 1 else canvas[idx] = target:sub(s_pos) end return skel, canvas, idx end -- Populate a table by parsing a parameter string (heavy lifting for `parsing`, -- `reinterpreting` and `evaluating`) local function parse_parameter_string (tbl, str, isp, ipl, psp, ppl, trn, tru) local key, val, spos1, spos2, pos1, pos2 local pos3, idx, lenplone = 0, 1, #str + 1 if isp == nil or isp == '' then if psp == nil or psp == '' then if tru then tbl[idx] = str:match'^%s*(.-)%s*$' else tbl[idx] = str end return end spos1, spos2 = str:find(psp, 1, ppl) if spos1 == nil then key = idx if tru then val = str:match'^%s*(.-)%s*$' else val = str end else key = get_param_name(str:sub(1, spos1 - 1)) val = str:sub(spos2 + 1) if trn then val = val:match'^%s*(.-)%s*$' end end tbl[key] = val return end if psp == nil or psp == '' then repeat pos1 = pos3 + 1 pos2, pos3 = str:find(isp, pos1, ipl) val = str:sub(pos1, (pos2 or lenplone) - 1) if tru then val = val:match'^%s*(.-)%s*$' end tbl[idx], idx = val, idx + 1 until pos2 == nil return end repeat pos1 = pos3 + 1 pos2, pos3 = str:find(isp, pos1, ipl) val = str:sub(pos1, (pos2 or lenplone) - 1) spos1, spos2 = val:find(psp, 1, ppl) if spos1 == nil then key = idx if tru then val = val:match'^%s*(.-)%s*$' end idx = idx + 1 else key = get_param_name(val:sub(1, spos1 - 1)) val = val:sub(spos2 + 1) if trn then val = val:match'^%s*(.-)%s*$' end end tbl[key] = val until pos2 == nil return end -- Heavy lifting for `snapshotting` and `remembering` local function make_child (ctx, src, whoami) local len = tonumber(ctx.pipe[ctx.fnpos + 1]) if len == nil or len == 0 then local stack = new_substack(ctx) for key, val in pairs(src) do stack[key] = val end return len == nil and 1 or 2 end if len < 0 or math.floor(len) ~= len then error(modulename .. ', ‘' .. whoami .. '’: The number of parameters to copy must be an integer greater than zero', 0) end copy_table_maxn(new_substack(ctx), src, len) return 2 end -- Heavy lifting for `setting_by_flushing`, `combining` and `combining_values` local function set_strings_from_substack (ctx, dest, whoami) if ctx.n_children < 1 then error(modulename .. ', ‘' .. whoami .. '’: There are no substacks to flush', 0) end local currsnap = ctx.n_children local stack = ctx.children[currsnap] for key, val in pairs(memoryslots) do if stack[key] ~= nil then dest[val] = stack[key] end end ctx.children[currsnap], ctx.n_children = nil, currsnap - 1 end -- Heavy lifting for `combining` and `combining_values` local function combine_parameters (ctx, keyval_fn, whoami) -- NOTE: `ctx.params` might be the original metatable! This function -- MUST create a copy of it before returning local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘' .. whoami .. '’: No parameter name was provided', 0) end local argc local tbl, vars = ctx.params, {} local sortfn, ivar0, do_sort, tmp = load_sort_opt(opts[offs + 2]) if ivar0 == 2 then tmp = opts[offs + 3] and opts[offs + 3]:match'^%s*(.-)%s*$' end ivar0 = ivar0 + offs if tmp == 'with_flushed_glue' then ivar0 = ivar0 + 1 argc = set_strings_from_opts(vars, opts, ivar0 + 1) set_strings_from_substack(ctx, vars, whoami) else if tmp == 'without_flushed_glue' then ivar0 = ivar0 + 1 end argc = set_strings_from_opts(vars, opts, ivar0 + 1) end if argc < ivar0 then error(modulename .. ', ‘' .. whoami .. '’: No setting directive was given', 0) end if next(tbl) == nil then if vars.ifngiven ~= nil then ctx.params = { [get_param_name(opts[offs + 1])] = vars.ifngiven } elseif tbl == ctx.oparams then ctx.params = {} end return argc end local cache, len if do_sort then local words cache, words, len, tmp = get_sorted_key_list(tbl, sortfn) for idx = 1, tmp do cache[len + idx] = words[idx] end len = len + tmp else cache, len = {}, 1 for key in pairs(tbl) do cache[len], len = key, len + 1 end len = len - 1 end local pmap, nss, kvs, pps = {}, 0, vars.pairsep or '', vars.itersep or '' for idx = 1, len do tmp, pmap[nss + 1] = cache[idx], pps pmap[nss + 2] = keyval_fn(tmp, tbl[tmp], kvs) nss = nss + 2 end tmp = vars.oxfordsep or vars.lastsep if tmp ~= nil and nss > 4 then pmap[nss - 1] = tmp elseif nss > 2 and vars.lastsep ~= nil then pmap[nss - 1] = vars.lastsep end pmap[1] = vars.header or '' if vars.footer ~= nil then pmap[nss + 1] = vars.footer end ctx.params = { [get_param_name(opts[offs + 1])] = table.concat(pmap) } return argc end -- Concatenate the numeric keys from the table of parameters to the numeric -- keys from the table of options; non-numeric keys from the table of options -- will prevail over colliding non-numeric keys from the table of parameters local function concat_params (ctx, offs) local tbl, retval, cache, nmax = ctx.params, {}, {}, 0 for key, val in pairs(ctx.pipe) do if type(key) == 'number' then if key < 1 then cache[key] = val elseif key > offs then cache[key - offs] = val end if key > nmax then nmax = key end else cache[key] = val end end nmax = nmax - offs if ctx.subset == 1 then -- We need only the sequence for key, val in ipairs(tbl) do retval[key + nmax] = val end else if ctx.subset == -1 then for key in ipairs(tbl) do tbl[key] = nil end end for key, val in pairs(tbl) do if type(key) == 'number' and key > 0 then retval[key + nmax] = val else retval[key] = val end end end for key, val in pairs(cache) do retval[key] = val end return retval end -- Flush the parameters by calling a custom function for each value (after this -- function has been invoked `ctx.params` will be no longer usable) local function flush_params (ctx, fn) local tmp local tbl = ctx.params if ctx.subset == -1 then for key, val in ipairs(tbl) do tbl[key] = nil end elseif ctx.subset == 1 then if ctx.pins == nil then for key, val in ipairs(tbl) do fn(key, val) end return end tmp = {} for key, val in ipairs(tbl) do tmp[key] = val end tbl = tmp end if ctx.pins ~= nil then local marker = ctx.sorttype < 1 and ctx.subset ~= -1 or nil for idx = 1, #ctx.pins do tmp = ctx.pins[idx] if tbl[tmp] ~= nil then fn(tmp, tbl[tmp]) tbl[tmp] = marker end end if ctx.subset == 1 then for key, val in ipairs(tbl) do if val ~= true then fn(key, val) end end return end end if ctx.sorttype > 0 then local nums, words, nn, nw = get_sorted_key_list(tbl, natural_sort) if ctx.sorttype == 2 then for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end return end for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end return end if ctx.subset == -1 or ctx.pins == nil then for key, val in ipairs(tbl) do fn(key, val) tbl[key] = nil end for key, val in pairs(tbl) do fn(key, val) end return end for key, val in ipairs(tbl) do if val ~= true then fn(key, val) end tbl[key] = nil end for key, val in pairs(tbl) do if val ~= true then fn(key, val) end end end -- Flush the parameters by calling one of two custom functions for each value -- (after this function has been invoked `ctx.params` will be no longer usable) local function mixed_flush_params (ctx, fn_seq, fn_oth) if ctx.subset == 1 then flush_params(ctx, fn_seq) return end if ctx.subset == -1 then flush_params(ctx, fn_oth) return end local tbl = ctx.params if ctx.pins == nil and ctx.sorttype < 1 then for key, val in ipairs(tbl) do fn_seq(key, val) tbl[key] = nil end for key, val in pairs(tbl) do fn_oth(key, val) end return end local tseq = {} for key, val in ipairs(tbl) do tseq[key] = val end if ctx.pins ~= nil then local tmp local marker = ctx.sorttype < 1 or nil for idx = 1, #ctx.pins do tmp = ctx.pins[idx] if tseq[tmp] ~= nil then fn_seq(tmp, tbl[tmp]) tbl[tmp], tseq[tmp] = nil, marker elseif tbl[tmp] ~= nil then fn_oth(tmp, tbl[tmp]) tbl[tmp] = nil end end end if ctx.sorttype > 0 then local nums, words, nn, nw = get_sorted_key_list(tbl, natural_sort) if ctx.sorttype == 2 then for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end end for idx = 1, nn do if tseq[nums[idx]] ~= nil then fn_seq(nums[idx], tseq[nums[idx]]) else fn_oth(nums[idx], tbl[nums[idx]]) end end if ctx.sorttype ~= 2 then for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end end return end for key, val in ipairs(tseq) do if val ~= true then fn_seq(key, val) tbl[key] = nil end end for key, val in pairs(tbl) do fn_oth(key, val) end end -- Finalize and return a concatenated list local function finalize_and_return_concatenated_list (ctx, lst, len, modsize) if len > 0 then local tmp = ctx.oxfordsep or ctx.lastsep if tmp ~= nil and len > modsize * 2 then lst[len - modsize + 1] = tmp elseif len > modsize and ctx.lastsep ~= nil then lst[len - modsize + 1] = ctx.lastsep end lst[1] = ctx.header or '' if ctx.footer ~= nil then lst[len + 1] = ctx.footer end ctx.text = table.concat(lst) else ctx.text = ctx.ifngiven or '' end end --- --- --- PUBLIC ENVIRONMENT --- --- ________________________________ --- --- --- --[[ Modifiers ]]-- ------------------- -- Syntax: #invoke:params|sequential|pipe to library.sequential = function (ctx) if ctx.subset == 1 then error(modulename .. ': The ‘sequential’ directive has been provided more than once', 0) end if ctx.subset == -1 then error(modulename .. ': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end if ctx.sorttype > 0 then error(modulename .. ': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end ctx.iterfunc, ctx.subset = ipairs, 1 return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|non-sequential|pipe to library['non-sequential'] = function (ctx) if ctx.subset == -1 then error(modulename .. ': The ‘non-sequential’ directive has been provided more than once', 0) end if ctx.subset == 1 then error(modulename .. ': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end ctx.iterfunc, ctx.subset = pairs, -1 return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|all_sorted|pipe to library.all_sorted = function (ctx) if ctx.sorttype == 1 then error(modulename .. ': The ‘all_sorted’ directive has been provided more than once', 0) end if ctx.subset == 1 then error(modulename .. ': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end if ctx.sorttype == 2 then error(modulename .. ': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end ctx.sorttype = 1 return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|reassorted|pipe to library.reassorted = function (ctx) if ctx.sorttype == 2 then error(modulename .. ': The ‘reassorted’ directive has been provided more than once', 0) end if ctx.subset == 1 then error(modulename .. ': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end if ctx.sorttype == 1 then error(modulename .. ': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end ctx.sorttype = 2 return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|pinned_until|sentinel|[parameter name 1]|[parameter -- name 2]|...|parameter name N|sentinel|pipe to library.pinned_until = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘pinned_until’: No sentinel was provided', 0) end local tmp, bucket, curr, ncurr local sntl, idx = opts[offs + 1]:match'^%s*(.-)%s*$', 2 if ctx.pin_bucket == nil then bucket, curr, ncurr = {}, {}, 0 ctx.pin_bucket, ctx.pins = bucket, curr else bucket, curr, ncurr = ctx.pin_bucket, ctx.pins, ctx.npins end while opts[offs + idx] ~= nil do tmp = opts[offs + idx]:match'^%s*(.-)%s*$' if tmp == sntl then if idx == 2 then error(modulename .. ', ‘pinned_until’: No parameters to pin were provided', 0) end ctx.npins = ncurr + idx - 2 return context_iterate(ctx, offs + idx + 1) end if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then tmp = tonumber(tmp) end if bucket[tmp] then error(modulename .. ', ‘pinned_until’: Duplicate pinned parameter ‘' .. tostring(tmp) .. '’', 0) end curr[ncurr + idx - 1], bucket[tmp], idx = tmp, true, idx + 1 end error(modulename .. ', ‘pinned_until’: Missing sentinel in position #' .. tostring(idx), 0) end -- Syntax: #invoke:params|setting|directives|...|pipe to library.setting = function (ctx) local new_offs = set_strings_from_opts(ctx, ctx.pipe, ctx.fnpos + 1) if new_offs - ctx.fnpos < 2 then error(modulename .. ', ‘setting’: No directive was given', 0) end return context_iterate(ctx, new_offs + 1) end -- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to library.scoring = function (ctx) local opts, offs, retval = ctx.pipe, ctx.fnpos, 0 if opts[offs + 1] == nil then error(modulename .. ', ‘scoring’: No parameter name was provided', 0) end local tmp for _ in pairs(ctx.params) do retval = retval + 1 end if opts[offs + 2] ~= nil then tmp = opts[offs + 2]:match'^%s*(.*%S)' end if tmp == 'in_substack' then new_substack(ctx)[get_param_name(opts[offs + 1])] = tostring(retval) return context_iterate(ctx, offs + 3) end ctx.params[get_param_name(opts[offs + 1])] = tostring(retval) return context_iterate(ctx, tmp == 'here' and offs + 3 or offs + 2) end -- Syntax: #invoke:params|squeezing|pipe to library.squeezing = function (ctx) local store, indices, tbl, newlen = {}, {}, ctx.params, 0 for key, val in pairs(tbl) do if type(key) == 'number' then newlen = newlen + 1 indices[newlen], store[key], tbl[key] = key, val, nil end end table.sort(indices) for idx = 1, newlen do tbl[idx] = store[indices[idx]] end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|filling_the_gaps|pipe to library.filling_the_gaps = function (ctx) local newval, tbl, tmp, nmin, nmax, nnums = ctx.pipe[ctx.fnpos + 1], ctx.params, {}, 1, nil, -1 if newval == nil then error(modulename .. ', ‘filling_the_gaps’: No value was provided', 0) end for key, val in pairs(tbl) do if type(key) == 'number' then if nmax == nil then if key < nmin then nmin = key end nmax = key elseif key > nmax then nmax = key elseif key < nmin then nmin = key end tmp[key], nnums = val, nnums + 1 end end if nmax ~= nil and nmax - nmin > nnums then ctx.n_available = ctx.n_available + nmin + nnums - nmax if ctx.n_available < 0 then error(modulename .. ', ‘filling_the_gaps’: It is possible to fill at most ' .. tostring(maxfill) .. ' parameters', 0) end for idx = nmin, nmax do tbl[idx] = newval end for key, val in pairs(tmp) do tbl[key] = val end end return context_iterate(ctx, ctx.fnpos + 2) end -- Syntax: #invoke:params|clearing|pipe to library.clearing = function (ctx) local tbl, numerics = ctx.params, {} for key, val in pairs(tbl) do if type(key) == 'number' then numerics[key], tbl[key] = val, nil end end for key, val in ipairs(numerics) do tbl[key] = val end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|cutting|left cut|right cut|pipe to library.cutting = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos local lcut = tonumber(opts[offs + 1]) if lcut == nil or math.floor(lcut) ~= lcut then error(modulename .. ', ‘cutting’: Left cut must be an integer number', 0) end local rcut = tonumber(opts[offs + 2]) if rcut == nil or math.floor(rcut) ~= rcut then error(modulename .. ', ‘cutting’: Right cut must be an integer number', 0) end local tbl = ctx.params local len = #tbl if lcut < 0 then lcut = len + lcut end if rcut < 0 then rcut = len + rcut end local tot = lcut + rcut if tot > 0 then local cache = {} if tot >= len then for key in ipairs(tbl) do tbl[key] = nil end tot = len else for idx = len - rcut + 1, len do tbl[idx] = nil end for idx = 1, lcut do tbl[idx] = nil end end for key, val in pairs(tbl) do if type(key) == 'number' and key > 0 then if key > len then cache[key - tot] = val else cache[key - lcut] = val end tbl[key] = nil end end for key, val in pairs(cache) do tbl[key] = val end end return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|cropping|left crop|right crop|pipe to library.cropping = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos local lcut = tonumber(opts[offs + 1]) if lcut == nil or math.floor(lcut) ~= lcut then error(modulename .. ', ‘cropping’: Left crop must be an integer number', 0) end local rcut = tonumber(opts[offs + 2]) if rcut == nil or math.floor(rcut) ~= rcut then error(modulename .. ', ‘cropping’: Right crop must be an integer number', 0) end local tbl = ctx.params local nmin, nmax for key in pairs(tbl) do if type(key) == 'number' then if nmin == nil then nmin, nmax = key, key elseif key > nmax then nmax = key elseif key < nmin then nmin = key end end end if nmin ~= nil then local len = nmax - nmin + 1 if lcut < 0 then lcut = len + lcut end if rcut < 0 then rcut = len + rcut end if lcut + rcut - len > -1 then for key in pairs(tbl) do if type(key) == 'number' then tbl[key] = nil end end elseif lcut + rcut > 0 then for idx = nmax - rcut + 1, nmax do tbl[idx] = nil end for idx = nmin, nmin + lcut - 1 do tbl[idx] = nil end local lshift = nmin + lcut - 1 if lshift > 0 then for idx = lshift + 1, nmax do tbl[idx - lshift], tbl[idx] = tbl[idx], nil end end end end return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|purging|start offset|length|pipe to library.purging = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos local idx = tonumber(opts[offs + 1]) if idx == nil or math.floor(idx) ~= idx then error(modulename .. ', ‘purging’: Start offset must be an integer number', 0) end local len = tonumber(opts[offs + 2]) if len == nil or math.floor(len) ~= len then error(modulename .. ', ‘purging’: Length must be an integer number', 0) end local tbl = ctx.params if len < 1 then len = len + table.maxn(tbl) if idx > len then return context_iterate(ctx, offs + 3) end len = len - idx + 1 end ctx.params = copy_table_reduced(tbl, idx, len) return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|backpurging|start offset|length|pipe to library.backpurging = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos local last = tonumber(opts[offs + 1]) if last == nil or math.floor(last) ~= last then error(modulename .. ', ‘backpurging’: Start offset must be an integer number', 0) end local len = tonumber(opts[offs + 2]) if len == nil or math.floor(len) ~= len then error(modulename .. ', ‘backpurging’: Length must be an integer number', 0) end local idx local tbl = ctx.params if len > 0 then idx = last - len + 1 else for key in pairs(tbl) do if type(key) == 'number' and (idx == nil or key < idx) then idx = key end end if idx == nil then return context_iterate(ctx, offs + 3) end idx = idx - len if last < idx then return context_iterate(ctx, offs + 3) end len = last - idx + 1 end ctx.params = copy_table_reduced(ctx.params, idx, len) return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|shifting|addend|pipe to library.shifting = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local nshift = tonumber(ctx.pipe[ctx.fnpos + 1]) if nshift == nil or nshift == 0 or math.floor(nshift) ~= nshift then error(modulename .. ', ‘shifting’: A non-zero integer number must be provided', 0) end local tbl = {} for key, val in pairs(ctx.params) do if type(key) == 'number' then tbl[key + nshift] = val else tbl[key] = val end end ctx.params = tbl return context_iterate(ctx, ctx.fnpos + 2) end -- Syntax: #invoke:params|reversing_numeric_names|pipe to library.reversing_numeric_names = function (ctx) local tbl, numerics, nmax = ctx.params, {}, 0 for key, val in pairs(tbl) do if type(key) == 'number' then numerics[key], tbl[key] = val, nil if key > nmax then nmax = key end end end for key, val in pairs(numerics) do tbl[nmax - key + 1] = val end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|pivoting_numeric_names|pipe to --[[ library.pivoting_numeric_names = function (ctx) local tbl = ctx.params local shift = #tbl + 1 if shift < 2 then return library.reversing_numeric_names(ctx) end local tmp = {} for key, val in pairs(tbl) do if type(key) == 'number' then tmp[key], tbl[key] = val, nil end end for key, val in pairs(tmp) do tbl[shift - key] = val end return context_iterate(ctx, ctx.fnpos + 1) end ]]-- -- Syntax: #invoke:params|mirroring_numeric_names|pipe to --[[ library.mirroring_numeric_names = function (ctx) local nmax, nmin local tbl, tmp = ctx.params, {} for key, val in pairs(tbl) do if type(key) == 'number' then tmp[key], tbl[key] = val, nil if nmax == nil then nmin, nmax = key, key elseif key > nmax then nmax = key elseif key < nmin then nmin = key end end end for key, val in pairs(tmp) do tbl[nmax + nmin - key] = val end return context_iterate(ctx, ctx.fnpos + 1) end ]]-- -- Syntax: #invoke:params|swapping_numeric_names|pipe to --[[ library.swapping_numeric_names = function (ctx) local tmp local tbl, cache, nsize = ctx.params, {}, 1 for key in pairs(tbl) do if type(key) == 'number' then cache[nsize], nsize = key, nsize + 1 end end table.sort(cache) for idx = math.floor((nsize - 1) / 2), 1, -1 do tmp = tbl[cache[idx] ] tbl[cache[idx] ] = tbl[cache[nsize - idx] ] tbl[cache[nsize - idx] ] = tmp end return context_iterate(ctx, ctx.fnpos + 1) end ]]-- -- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to library.sorting_sequential_values = function (ctx) local sortfn local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then sortfn = sortfunctions[opts[offs + 1]:match'^%s*(.-)%s*$'] end if sortfn then table.sort(ctx.params, sortfn) else table.sort(ctx.params) end -- i.e. either `false` or `nil` if sortfn == nil then return context_iterate(ctx, offs + 1) end return context_iterate(ctx, offs + 2) end -- Syntax: #invoke:params|splicing|[add to position]|position|increment| -- [number of elements to write]|...|pipe to library.splicing = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local tmp2, argc, pos, refp local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos local tmp1 = opts[offs + 1] if tmp1 ~= nil then tmp2 = tonumber(tmp1) if tmp2 == nil or math.floor(tmp2) ~= tmp2 then pos, argc, tmp2 = tonumber(opts[offs + 2]), offs + 4, tmp1:match'^%s*(.*%S)' if tmp2 ~= nil then refp = position_references[tmp2] if refp == nil then error(modulename .. ', ‘splicing’: ‘' .. tostring(tmp2) .. '’ is not a valid first argument', 0) end else refp = 0 end else pos, argc, refp = tmp2, offs + 3, 0 end else pos, argc, refp = tonumber(opts[offs + 2]), offs + 4, 0 end if pos == nil or math.floor(pos) ~= pos then error(modulename .. ', ‘splicing’: The position must be an integer number', 0) end local len = tonumber(opts[argc - 1]) if len == nil or math.floor(len) ~= len then error(modulename .. ', ‘splicing’: The increment must be an integer number', 0) end local insn = tonumber(opts[argc]) if len == 0 and (insn == nil or insn < 1) then error(modulename .. ', ‘splicing’: When the increment is zero the number of elements to write cannot be zero', 0) end if refp == 2 then for _ in ipairs(tbl) do pos = pos + 1 end refp = 0 end tmp1, tmp2 = nil, nil if refp ~= 0 or len ~= 0 then for key, val in pairs(tbl) do if type(key) == 'number' then if tmp1 == nil then tmp1, tmp2 = key, key elseif key < tmp1 then tmp1 = key elseif key > tmp2 then tmp2 = key end end end end if tmp2 == nil then len = 0 elseif refp == 3 then pos = pos + tmp2 elseif refp == 1 then pos = pos + tmp1 end if len > 0 and pos + len > tmp1 and pos <= tmp2 then tbl = copy_table_expanded(tbl, pos, len) elseif len < 0 and pos - len > tmp1 and pos <= tmp2 then tbl = copy_table_reduced(tbl, pos, -len) else tbl = copy_or_ref_table(tbl, tbl ~= ctx.oparams) end ctx.params = tbl if insn == nil or insn < 0 or math.floor(insn) ~= insn then return context_iterate(ctx, argc) end tmp1 = argc - offs - pos + 1 for key = pos, pos + insn - 1 do tbl[key] = opts[offs + key + tmp1] end return context_iterate(ctx, argc + insn + 1) end -- Syntax: #invoke:params|imposing|name|value|pipe to library.imposing = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘imposing’: Missing parameter name to impose', 0) end ctx.params[get_param_name(opts[offs + 1])] = opts[offs + 2] return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|providing|name|value|pipe to library.providing = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘providing’: Missing parameter name to provide', 0) end local key = get_param_name(opts[offs + 1]) if ctx.params[key] == nil then ctx.params[key] = opts[offs + 2] end return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|reassigning|source|destination|[mode]|pipe to library.reassigning = function (ctx) local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘reassigning’: Missing source parameter', 0) end if opts[offs + 2] == nil then error(modulename .. ', ‘reassigning’: Missing destination parameter', 0) end local mode, argc local src = get_param_name(opts[offs + 1]) local val = tbl[src] if opts[offs + 3] ~= nil then mode = a_modes[opts[offs + 3]:match'^%s*(.-)%s*$'] end if mode == nil then mode, argc = 0, offs + 3 else argc = offs + 4 end if val == nil and mode > 1 then return context_iterate(ctx, argc) end local dest = get_param_name(opts[offs + 2]) local tmp = tbl[dest] == nil if mode % 2 == 0 or (mode == 7 and tmp) then tbl[src] = nil end if tmp or mode < 4 then tbl[dest] = val end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|discarding|name|[how many]|pipe to library.discarding = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘discarding’: Missing parameter name to discard', 0) end local len = tonumber(opts[offs + 2]) if len == nil then ctx.params[get_param_name(opts[offs + 1])] = nil return context_iterate(ctx, offs + 2) end local key = tonumber(opts[offs + 1]) if key == nil or math.floor(key) ~= key then error(modulename .. ', ‘discarding’: A range was provided, but the initial parameter name is not an integer number', 0) end if len < 1 or math.floor(len) ~= len then error(modulename .. ', ‘discarding’: A range can only be an integer number greater than zero', 0) end for idx = key, key + len - 1 do ctx.params[idx] = nil end return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|excluding_non-numeric_names|pipe to library['excluding_non-numeric_names'] = function (ctx) local tmp = ctx.params for key, val in pairs(tmp) do if type(key) ~= 'number' then tmp[key] = nil end end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|excluding_numeric_names|pipe to library.excluding_numeric_names = function (ctx) local tmp = ctx.params for key, val in pairs(tmp) do if type(key) == 'number' then tmp[key] = nil end end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|with_name_matching|target 1|[plain flag 1]|[or]| -- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag -- N]|pipe to library.with_name_matching = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local tmp, ptn local tbl, newparams, opts, offs = ctx.params, {}, ctx.pipe, ctx.fnpos local targets, nptns, argc = load_pattern_args(opts, offs, 'with_name_matching') for idx = 1, nptns do ptn = targets[idx] if ptn[3] then tmp = ptn[1] if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then tmp = tonumber(tmp) end newparams[tmp] = tbl[tmp] else for key, val in pairs(tbl) do if tostring(key):find(ptn[1], 1, ptn[2]) then newparams[key] = val end end end end ctx.params = newparams return context_iterate(ctx, argc) end -- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]| -- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain -- flag N]|pipe to library.with_name_not_matching = function (ctx) local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos local targets, nptns, argc = load_pattern_args(opts, offs, 'with_name_not_matching') if nptns == 1 and targets[1][3] then local tmp = targets[1][1] if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then tbl[tonumber(tmp)] = nil else tbl[tmp] = nil end return context_iterate(ctx, argc) end local yesmatch, ptn for key in pairs(tbl) do yesmatch = true for idx = 1, nptns do ptn = targets[idx] if ptn[3] then if tostring(key) ~= ptn[1] then yesmatch = false break end elseif not tostring(key):find(ptn[1], 1, ptn[2]) then yesmatch = false break end end if yesmatch then tbl[key] = nil end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]| -- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag -- N]|pipe to library.with_value_matching = function (ctx) local nomatch, ptn local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos local targets, nptns, argc = load_pattern_args(opts, offs, 'with_value_matching') for key, val in pairs(tbl) do nomatch = true for idx = 1, nptns do ptn = targets[idx] if ptn[3] then if val == ptn[1] then nomatch = false break end elseif val:find(ptn[1], 1, ptn[2]) then nomatch = false break end end if nomatch then tbl[key] = nil end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]| -- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain -- flag N]|pipe to library.with_value_not_matching = function (ctx) local yesmatch, ptn local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos local targets, nptns, argc = load_pattern_args(opts, offs, 'with_value_not_matching') for key, val in pairs(tbl) do yesmatch = true for idx = 1, nptns do ptn = targets[idx] if ptn[3] then if val ~= ptn[1] then yesmatch = false break end elseif not val:find(ptn[1], 1, ptn[2]) then yesmatch = false break end end if yesmatch then tbl[key] = nil end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|keeping_at_most|number of parameters to pick|pipe to library.keeping_at_most = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local len = tonumber(ctx.pipe[ctx.fnpos + 1]) if len == nil or len < 1 or math.floor(len) ~= len then error(modulename .. ', ‘keeping_at_most’: The number of parameters to keep must be an integer greater than zero', 0) end ctx.params = copy_table_maxn({}, ctx.params, len) return context_iterate(ctx, ctx.fnpos + 2) end -- Syntax: #invoke:params|trimming_values|pipe to library.trimming_values = function (ctx) local tbl = ctx.params for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|mapping_to_lowercase|pipe to library.mapping_to_lowercase = function (ctx) local tbl = ctx.params for key, val in pairs(tbl) do tbl[key] = val:lower() end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|mapping_to_uppercase|pipe to library.mapping_to_uppercase = function (ctx) local tbl = ctx.params for key, val in pairs(tbl) do tbl[key] = val:upper() end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|mapping_by_calling|template name|[call -- style]|[let/use]|[...]|[let/use]|[...]|[number of additional -- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to library.mapping_by_calling = function (ctx) local tname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then tname = opts[offs + 1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘mapping_by_calling’: No template name was provided', 0) end local margs, argc, looptype, karg, varg, tbl, mem = load_callback_opts(opts, offs + 1, mapping_styles.values_only, ctx.params) local model = { title = tname, args = margs } value_maps[looptype](tbl, margs, karg, varg, function () return ctx.frame:expandTemplate(model) end) for key, val in pairs(mem) do tbl[key] = val end ctx.params = tbl return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_invoking|module name|function name|[call -- style]|[let/use]|[...]|[let/use]|[...]|[number of additional -- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to library.mapping_by_invoking = function (ctx) local mname, fname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then mname = opts[offs + 1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘mapping_by_invoking’: No module name was provided', 0) end if opts[offs + 2] ~= nil then fname = opts[offs + 2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘mapping_by_invoking’: No function name was provided', 0) end local margs, argc, looptype, karg, varg, tbl, mem = load_callback_opts(opts, offs + 2, mapping_styles.values_only, ctx.params) local model = { title = 'Module:' .. mname, args = margs } local mfunc = require(model.title)[fname] if mfunc == nil then error(modulename .. ', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end value_maps[looptype](tbl, margs, karg, varg, function () return tostring(mfunc(ctx.frame:newChild(model))) end) for key, val in pairs(mem) do tbl[key] = val end ctx.params = tbl return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_magic|parser function|[call -- style]|[let/use]|[...]|[let/use]|[...]|[number of additional -- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to library.mapping_by_magic = function (ctx) local magic local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then magic = opts[offs + 1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘mapping_by_magic’: No parser function was provided', 0) end local margs, argc, looptype, karg, varg, tbl, mem = load_callback_opts(opts, offs + 1, mapping_styles.values_only, ctx.params) value_maps[looptype](tbl, margs, karg, varg, function () return ctx.frame:callParserFunction(magic, margs) end) for key, val in pairs(mem) do tbl[key] = val end ctx.params = tbl return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain -- flag]|pipe to library.mapping_by_replacing = function (ctx) local ptn, repl, nmax, flg, argc, die = load_replace_args(ctx.pipe, ctx.fnpos, 'mapping_by_replacing') if die then return context_iterate(ctx, argc) end local tbl = ctx.params if flg == 3 then for key, val in pairs(tbl) do if val == ptn then tbl[key] = repl end end else if flg == 2 then -- Copied from Module:String's `str._escapePattern()` ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0') end for key, val in pairs(tbl) do tbl[key] = val:gsub(ptn, repl, nmax) end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to library.mapping_by_mixing = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘mapping_by_mixing’: No mixing string was provided', 0) end local tbl, mix = ctx.params, opts[offs + 1] if mix == '$#' then for key in pairs(tbl) do tbl[key] = tostring(key) end return context_iterate(ctx, offs + 2) end local skel, cnv, n_parts = parse_placeholder_string(mix) for key, val in pairs(tbl) do for idx = 2, n_parts, 2 do if skel[idx] then cnv[idx] = val else cnv[idx] = tostring(key) end end tbl[key] = table.concat(cnv) end return context_iterate(ctx, offs + 2) end -- Syntax: #invoke:params|renaming_to_lowercase|pipe to library.renaming_to_lowercase = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache = {} for key, val in pairs(ctx.params) do if type(key) == 'string' then cache[key:lower()] = val else cache[key] = val end end ctx.params = cache return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|renaming_to_uppercase|pipe to library.renaming_to_uppercase = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache = {} for key, val in pairs(ctx.params) do if type(key) == 'string' then cache[key:upper()] = val else cache[key] = val end end ctx.params = cache return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to library.renaming_to_sequence = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache, len local tbl = ctx.params local sortfn, argc, do_sort = load_sort_opt(ctx.pipe[ctx.fnpos + 1]) if do_sort then local words, wl cache, words, len, wl = get_sorted_key_list(tbl, sortfn) for idx = 1, len do cache[idx] = tbl[cache[idx]] end for idx = 1, wl do cache[len + idx] = tbl[words[idx]] end else cache, len = {}, 1 for _, val in pairs(tbl) do cache[len], len = val, len + 1 end end ctx.params = cache return context_iterate(ctx, ctx.fnpos + argc) end -- Syntax: #invoke:params|renaming_by_calling|template name|[call -- style]|[let/use]|[...]|[let/use]|[...]|[number of additional -- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to library.renaming_by_calling = function (ctx) local tname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then tname = opts[offs + 1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘renaming_by_calling’: No template name was provided', 0) end local rargs, argc, looptype, karg, varg, tbl, mem = load_callback_opts(opts, offs + 1, mapping_styles.names_only, ctx.params) local model = { title = tname, args = rargs } map_names(tbl, rargs, karg, varg, looptype, function () return ctx.frame:expandTemplate(model) end) for key, val in pairs(mem) do tbl[key] = val end ctx.params = tbl return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_invoking|module name|function -- name|[call style]|[let/use]|[...]|[let/use]|[...]|[number of -- additional arguments]|[argument 1]|[argument 2]|[...]|[argument -- N]|pipe to library.renaming_by_invoking = function (ctx) local mname, fname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then mname = opts[offs + 1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘renaming_by_invoking’: No module name was provided', 0) end if opts[offs + 2] ~= nil then fname = opts[offs + 2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘renaming_by_invoking’: No function name was provided', 0) end local rargs, argc, looptype, karg, varg, tbl, mem = load_callback_opts(opts, offs + 2, mapping_styles.names_only, ctx.params) local model = { title = 'Module:' .. mname, args = rargs } local mfunc = require(model.title)[fname] if mfunc == nil then error(modulename .. ', ‘renaming_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end map_names(tbl, rargs, karg, varg, looptype, function () return tostring(mfunc(ctx.frame:newChild(model))) end) for key, val in pairs(mem) do tbl[key] = val end ctx.params = tbl return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_magic|parser function|[call -- style]|[let/use]|[...]|[let/use]|[...]|[number of additional -- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to library.renaming_by_magic = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos local magic if opts[offs + 1] ~= nil then magic = opts[offs + 1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘renaming_by_magic’: No parser function was provided', 0) end local rargs, argc, looptype, karg, varg, tbl, mem = load_callback_opts(opts, offs + 1, mapping_styles.names_only, ctx.params) map_names(tbl, rargs, karg, varg, looptype, function () return ctx.frame:callParserFunction(magic, rargs) end) for key, val in pairs(mem) do tbl[key] = val end ctx.params = tbl return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain -- flag]|pipe to library.renaming_by_replacing = function (ctx) local ptn, repl, nmax, flg, argc, die = load_replace_args(ctx.pipe, ctx.fnpos, 'renaming_by_replacing') if die then return context_iterate(ctx, argc) end local tbl = ctx.params if flg == 3 then ptn = get_param_name(ptn) local val = tbl[ptn] if val ~= nil then tbl[ptn], tbl[get_param_name(repl)] = nil, val end else if flg == 2 then -- Copied from Module:String's `str._escapePattern()` ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0') end local cache = {} for key, val in pairs(tbl) do steal_if_renamed(val, tbl, key, cache, tostring(key):gsub(ptn, repl, nmax)) end for key, val in pairs(cache) do tbl[key] = val end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to library.renaming_by_mixing = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local mix = ctx.pipe[ctx.fnpos + 1] if mix == nil then error(modulename .. ', ‘renaming_by_mixing’: No mixing string was provided', 0) end local cache = {} mix = mix:match'^%s*(.-)%s*$' if mix == '$@' then for _, val in pairs(ctx.params) do cache[get_param_name(val)] = val end else local skel, canvas, n_parts = parse_placeholder_string(mix) for key, val in pairs(ctx.params) do for idx = 2, n_parts, 2 do if skel[idx] then canvas[idx] = val else canvas[idx] = tostring(key) end end cache[get_param_name(table.concat(canvas))] = val end end ctx.params = cache return context_iterate(ctx, ctx.fnpos + 2) end -- Syntax: #invoke:params|grouping_by_calling|template -- name|[let/use]|[...]|[let/use]|[...]|[number of additional -- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to library.grouping_by_calling = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts, offs = ctx.pipe, ctx.fnpos local tmp, argc, tbl, mem = load_child_opts(opts, offs + 2, 0, ctx.params) local gargs = {} for key, val in pairs(tmp) do if type(key) == 'number' and key < 1 then gargs[key - 1] = val else gargs[key] = val end end tmp = opts[offs + 1] if tmp ~= nil then tmp = tmp:match'^%s*(.*%S)' end if tmp == nil then error(modulename .. ', ‘grouping_by_calling’: No template name was provided', 0) end local model = { title = tmp } local groups = make_groups(tbl) for gid, group in pairs(groups) do for key, val in pairs(gargs) do group[key] = val end group[0], model.args = gid, group groups[gid] = ctx.frame:expandTemplate(model) end for key, val in pairs(mem) do groups[key] = val end ctx.params = groups return context_iterate(ctx, argc) end -- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration -- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to library.parsing = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘parsing’: No string to parse was provided', 0) end local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc = load_parse_opts(opts, offs + 2, '|', '=') parse_parameter_string(ctx.params, opts[offs + 1], isep, iplain, psep, pplain, trimnamed, trimunnamed) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim -- flag]|[iteration delimiter setter]|[...]|[key-value delimiter -- setter]|[...]|pipe to library.reinterpreting = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc = load_parse_opts(opts, offs + 2, '|', '=') local tbl, tmp = ctx.params, get_param_name(opts[offs + 1]) local str = tbl[tmp] if str ~= nil then tbl[tmp] = nil parse_parameter_string(tbl, str, isep, iplain, psep, pplain, trimnamed, trimunnamed) end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration -- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to library.evaluating = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘evaluating’: No string to parse was provided', 0) end local isep, iplain, psep, pplain, trimnamed, trimunnamed, repos = load_parse_opts(opts, offs + 2, '!', ':') if opts[offs + 1]:match'^%s*(.*%S)' == nil then remove_numeric_keys(opts, offs, repos - offs) return context_iterate(ctx, offs) end local new_opts, cache = {}, {} parse_parameter_string(cache, opts[offs + 1], isep, iplain, psep, pplain, trimnamed, trimunnamed) local shift = #cache + offs - repos + 1 for key, val in pairs(opts) do if type(key) ~= 'number' or key < offs then new_opts[key] = val elseif key >= repos then new_opts[key + shift] = val end end for key, val in pairs(cache) do if type(key) ~= 'number' or key < 1 then new_opts[key] = val else new_opts[key + offs] = val end end ctx.pipe = new_opts return context_iterate(ctx, offs + 1) end -- Syntax: #invoke:params|mixing_names_and_values|mixing string|pipe to library.mixing_names_and_values = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end if opts[offs + 2] == nil then error(modulename .. ', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end local tmp local cache, mix_k, mix_v = {}, opts[offs + 1]:match'^%s*(.-)%s*$', opts[offs + 2] if mix_k == '$@' and mix_v == '$@' then for _, val in pairs(ctx.params) do cache[get_param_name(val)] = val end elseif mix_k == '$@' and mix_v == '$#' then for key, val in pairs(ctx.params) do cache[get_param_name(val)] = tostring(key) end elseif mix_k == '$#' and mix_v == '$#' then for key in pairs(ctx.params) do cache[key] = tostring(key) end else local skel_k, cnv_k, n_parts_k = parse_placeholder_string(mix_k) local skel_v, cnv_v, n_parts_v = parse_placeholder_string(mix_v) for key, val in pairs(ctx.params) do tmp = tostring(key) for idx = 2, n_parts_k, 2 do if skel_k[idx] then cnv_k[idx] = val else cnv_k[idx] = tmp end end for idx = 2, n_parts_v, 2 do if skel_v[idx] then cnv_v[idx] = val else cnv_v[idx] = tmp end end cache[get_param_name(table.concat(cnv_k))] = table.concat(cnv_v) end end ctx.params = cache return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|combining|new parameter name|[sort -- order]|[with/without flushed glue]|setting directives|...|pipe to library.combining = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning return context_iterate(ctx, combine_parameters( ctx, function (key, val, kvs) return key .. kvs .. val end, 'combining' ) + 1) end -- Syntax: #invoke:params|combining_values|new parameter name|[sort -- order]|[with/without flushed glue]|setting directives|...|pipe to library.combining_values = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning return context_iterate(ctx, combine_parameters( ctx, function (key, val, kvs) return val end, 'combining_values' ) + 1) end -- Syntax: #invoke:params|combining_by_calling|template name|new parameter -- name|pipe to library.combining_by_calling = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts, offs = ctx.pipe, ctx.fnpos local tname = opts[offs + 1] if tname ~= nil then tname = tname:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_calling’: No template name was provided', 0) end if opts[offs + 2] == nil then error(modulename .. ', ‘combining_by_calling’: No parameter name was provided', 0) end ctx.params = { [get_param_name(opts[offs + 2])] = ctx.frame:expandTemplate{ title = tname, args = ctx.params } } return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|combining_by_invoking|module name|function name|new -- parameter name|pipe to library.combining_by_invoking = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts, offs = ctx.pipe, ctx.fnpos local mname = opts[offs + 1] if mname ~= nil then mname = mname:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_invoking’: No module name was provided', 0) end local fname = opts[offs + 2] if fname ~= nil then fname = fname:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_invoking’: No function name was provided', 0) end if opts[offs + 3] == nil then error(modulename .. ', ‘combining_by_invoking’: No parameter name was provided', 0) end local model = { title = 'Module:' .. mname, args = ctx.params } local mfunc = require(model.title)[fname] if mfunc == nil then error(modulename .. ', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end ctx.params = { [get_param_name(opts[offs + 3])] = tostring(mfunc(ctx.frame:newChild(model))) } return context_iterate(ctx, offs + 4) end -- Syntax: #invoke:params|combining_by_magic|parser function|new parameter -- name|pipe to library.combining_by_magic = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts, offs = ctx.pipe, ctx.fnpos local magic = opts[offs + 1] if magic ~= nil then magic = magic:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_magic’: No parser function was provided', 0) end if opts[offs + 2] == nil then error(modulename .. ', ‘combining_by_magic’: No parameter name was provided', 0) end ctx.params = { [get_param_name(opts[offs + 2])] = ctx.frame:callParserFunction(magic, ctx.params) } return context_iterate(ctx, offs + 3) end -- Syntax: #invoke:params|snapshotting|[maximum number]|pipe to library.snapshotting = function (ctx) return context_iterate(ctx, ctx.fnpos + make_child(ctx, ctx.params, 'snapshotting')) end -- Syntax: #invoke:params|remembering|[maximum number]|pipe to library.remembering = function (ctx) return context_iterate(ctx, ctx.fnpos + make_child(ctx, ctx.oparams, 'remembering')) end -- Syntax: #invoke:params|entering_substack|[new]|pipe to library.entering_substack = function (ctx) local tbl, opts, offs, ncurrparent = ctx.params, ctx.pipe, ctx.fnpos, ctx.n_parents + 1 if ctx.parents == nil then ctx.parents = { tbl } else ctx.parents[ncurrparent] = tbl end ctx.n_parents = ncurrparent if opts[offs + 1] ~= nil and opts[offs + 1]:match'^%s*new%s*$' then ctx.params = {} return context_iterate(ctx, offs + 2) end local currsnap = ctx.n_children if currsnap > 0 then ctx.params, ctx.children[currsnap], ctx.n_children = ctx.children[currsnap], nil, currsnap - 1 else local newparams = {} for key, val in pairs(tbl) do newparams[key] = val end ctx.params = newparams end return context_iterate(ctx, offs + 1) end -- Syntax: #invoke:params|pulling|parameter name|pipe to library.pulling = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘pulling’: No parameter to pull was provided', 0) end local tmp = ctx.n_parents local parent = tmp < 1 and ctx.oparams or ctx.parents[tmp] tmp = get_param_name(opts[offs + 1]) if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end return context_iterate(ctx, ctx.fnpos + 2) end -- Syntax: #invoke:params|recalling|parameter name|pipe to library.recalling = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘recalling’: No parameter to recall was provided', 0) end local arg = get_param_name(opts[offs + 1]) if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end return context_iterate(ctx, ctx.fnpos + 2) end -- Syntax: #invoke:params|finding|parameter name|pipe to --[[ library.finding = function (ctx) local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘finding’: No parameter to find was provided', 0) end local arg = get_param_name(opts[offs + 1]) local parent for idx = ctx.n_parents, 1, -1 do parent = ctx.parents[idx] if parent[arg] ~= nil then ctx.params[arg] = parent[arg] return context_iterate(ctx, offs + 2) end end if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end return context_iterate(ctx, offs + 2) end ]]-- -- Syntax: #invoke:params|picking|number of parameters to pick|pipe to --[[ library.picking = function (ctx) local len = tonumber(ctx.pipe[ctx.fnpos + 1]) if len == nil or len < 1 or math.floor(len) ~= len then error(modulename .. ', ‘picking’: The number of parameters to pick must be an integer greater than zero', 0) end if ctx.n_parents < 1 then copy_table_maxn(ctx.params, ctx.oparams, len) else copy_table_maxn(ctx.params, ctx.parents[ctx.n_parents], len) end return context_iterate(ctx, ctx.fnpos + 2) end ]]-- -- Syntax: #invoke:params|detaching_substack|pipe to library.detaching_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘detaching_substack’: No substack has been created', 0) end local parent = ctx.parents[ncurrparent] for key in pairs(ctx.params) do parent[key] = nil end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|dropping_substack|pipe to library.dropping_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘dropping_substack’: No substack has been created', 0) end ctx.params, ctx.parents[ncurrparent], ctx.n_parents = ctx.parents[ncurrparent], nil, ncurrparent - 1 return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|leaving_substack|pipe to library.leaving_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘leaving_substack’: No substack has been created', 0) end local currsnap = ctx.n_children + 1 if ctx.children == nil then ctx.children = { ctx.params } else ctx.children[currsnap] = ctx.params end ctx.params, ctx.parents[ncurrparent], ctx.n_parents, ctx.n_children = ctx.parents[ncurrparent], nil, ncurrparent - 1, currsnap return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|merging_substack|pipe to library.merging_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘merging_substack’: No substack has been created', 0) end local parent, child = ctx.parents[ncurrparent], ctx.params ctx.params, ctx.parents[ncurrparent], ctx.n_parents = parent, nil, ncurrparent - 1 for key, val in pairs(child) do parent[key] = val end return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|flushing|pipe to library.flushing = function (ctx) if ctx.n_children < 1 then error(modulename .. ', ‘flushing’: There are no substacks to flush', 0) end local parent, currsnap = ctx.params, ctx.n_children for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end ctx.children[currsnap], ctx.n_children = nil, currsnap - 1 return context_iterate(ctx, ctx.fnpos + 1) end -- Syntax: #invoke:params|setting_by_flushing|pipe to library.setting_by_flushing = function (ctx) set_strings_from_substack(ctx, ctx, 'setting_by_flushing') return context_iterate(ctx, ctx.fnpos + 1) end --[[ Functions ]]-- ----------------------------- -- Syntax: #invoke:params|count library.count = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local retval = 0 for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end if ctx.subset == -1 then retval = retval - #ctx.params end ctx.text = retval return false end -- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]| -- [...]|[item n]|[named item 1=value 1]|[...]|[named item n=value -- n]|[...] library.concat_and_call = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local tname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then tname = opts[offs + 1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘concat_and_call’: No template name was provided', 0) end ctx.text = ctx.frame:expandTemplate{ title = tname, args = concat_params(ctx, offs + 1) } return false end -- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend -- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named -- item n=value n]|[...] library.concat_and_invoke = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local mname, fname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then mname = opts[offs + 1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘concat_and_invoke’: No module name was provided', 0) end if opts[offs + 2] ~= nil then fname = opts[offs + 2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘concat_and_invoke’: No function name was provided', 0) end local mfunc = require('Module:' .. mname)[fname] if mfunc == nil then error(modulename .. ', ‘concat_and_invoke’: The function ‘' .. fname .. '’ does not exist', 0) end ctx.text = mfunc(ctx.frame:newChild{ title = 'Module:' .. mname, args = concat_params(ctx, offs + 2) }) return false end -- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend -- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n= -- value n]|[...] library.concat_and_magic = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local magic local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then magic = opts[offs + 1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘concat_and_magic’: No parser function was provided', 0) end ctx.text = ctx.frame:callParserFunction(magic, concat_params(ctx, offs + 1)) return false end -- Syntax: #invoke:params|value_of|parameter name library.value_of = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] == nil then error(modulename .. ', ‘value_of’: No parameter name was provided', 0) end local val local key = opts[offs + 1]:match'^%s*(.-)%s*$' if key == '0' or key:find'^%-?[1-9]%d*$' ~= nil then key = tonumber(key) val = ctx.params[key] -- No worries: #ctx.params is unused when the modifier is in -- first position (and therefore `ctx.params` is a metatable) if val ~= nil and ( ctx.subset ~= -1 or key > #ctx.params or key < 1 ) and ( ctx.subset ~= 1 or (key <= #ctx.params and key > 0) ) then ctx.text = (ctx.header or '') .. val .. (ctx.footer or '') else ctx.text = ctx.ifngiven or '' end else val = ctx.params[key] if ctx.subset ~= 1 and val ~= nil then ctx.text = (ctx.header or '') .. val .. (ctx.footer or '') else ctx.text = ctx.ifngiven or '' end end return false end -- Syntax: #invoke:params|list library.list = function (ctx) local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or '' flush_params(ctx, function (key, val) ret[nss + 1], ret[nss + 2], ret[nss + 3], ret[nss + 4], nss = pps, key, kvs, val, nss + 4 end) finalize_and_return_concatenated_list(ctx, ret, nss, 4) return false end -- Syntax: #invoke:params|list_values library.list_values = function (ctx) -- NOTE: `library.coins()` and `library.unique_coins()` rely on us local ret, nss, pps = {}, 0, ctx.itersep or '' flush_params(ctx, function (key, val) ret[nss + 1], ret[nss + 2], nss = pps, val, nss + 2 end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|list_maybe_with_names library.list_maybe_with_names = function (ctx) local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or '' mixed_flush_params( ctx, function (key, val) ret[nss + 1], ret[nss + 2], ret[nss + 3], ret[nss + 4], nss = pps, '', '', val, nss + 4 end, function (key, val) ret[nss + 1], ret[nss + 2], ret[nss + 3], ret[nss + 4], nss = pps, key, kvs, val, nss + 4 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 4) return false end -- Syntax: #invoke:params|for_each|wikitext library.for_each = function (ctx) local ret, nss, pps, txt = {}, 0, ctx.itersep or '', ctx.pipe[ctx.fnpos + 1] or '' local skel, cnv, n_parts = parse_placeholder_string(txt) flush_params(ctx, function (key, val) for idx = 2, n_parts, 2 do if skel[idx] then cnv[idx] = val else cnv[idx] = tostring(key) end end ret[nss + 1], nss = pps, nss + 2 ret[nss] = table.concat(cnv) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]| -- [...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.call_for_each = function (ctx) local tname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then tname = opts[offs + 1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘call_for_each’: No template name was provided', 0) end local cargs = copy_table_reduced(opts, 1, offs - 1) local model, ret, nss, ccs = { title = tname, args = cargs }, {}, 0, ctx.itersep or '' flush_params(ctx, function (key, val) cargs[1], cargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2 ret[nss] = ctx.frame:expandTemplate(model) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|invoke_for_each|module name|module function|[append -- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]| -- [named param n=value n]|[...] library.invoke_for_each = function (ctx) local mname, fname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then mname = opts[offs + 1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘invoke_for_each’: No module name was provided', 0) end if opts[offs + 2] ~= nil then fname = opts[offs + 2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘invoke_for_each’: No function name was provided', 0) end local iargs = copy_table_reduced(ctx.pipe, 1, offs) local model = { title = 'Module:' .. mname, args = iargs } local mfunc, ret, nss, ccs = require(model.title)[fname], {}, 0, ctx.itersep or '' if mfunc == nil then error(modulename .. ', ‘invoke_for_each’: The function ‘' .. fname .. '’ does not exist', 0) end flush_params(ctx, function (key, val) iargs[1], iargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2 ret[nss] = mfunc(ctx.frame:newChild(model)) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.magic_for_each = function (ctx) local magic local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then magic = opts[offs + 1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘magic_for_each’: No parser function was provided', 0) end local ret, nss, ccs, cargs = {}, 0, ctx.itersep or '', copy_table_reduced(opts, 1, offs - 1) flush_params(ctx, function (key, val) cargs[1], cargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2 ret[nss] = ctx.frame:callParserFunction(magic, cargs) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.call_for_each_value = function (ctx) local tname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then tname = opts[offs + 1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘call_for_each_value’: No template name was provided', 0) end local cargs = copy_table_reduced(ctx.pipe, 1, offs) local model = { title = tname, args = cargs } local ret, nss, ccs = {}, 0, ctx.itersep or '' flush_params(ctx, function (key, val) cargs[1], ret[nss + 1], nss = val, ccs, nss + 2 ret[nss] = ctx.frame:expandTemplate(model) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|invoke_for_each_value|module name|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.invoke_for_each_value = function (ctx) local mname, fname local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then mname = opts[offs + 1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘invoke_for_each_value’: No module name was provided', 0) end if opts[offs + 2] ~= nil then fname = opts[offs + 2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘invoke_for_each_value’: No function name was provided', 0) end local iargs = copy_table_reduced(ctx.pipe, 1, offs + 1) local model = { title = 'Module:' .. mname, args = iargs } local mfunc, ret, nss, ccs = require(model.title)[fname], {}, 0, ctx.itersep or '' if mfunc == nil then error(modulename .. ', ‘invoke_for_each_value’: The function ‘' .. fname .. '’ does not exist', 0) end flush_params(ctx, function (key, val) iargs[1], ret[nss + 1], nss = val, ccs, nss + 2 ret[nss] = mfunc(ctx.frame:newChild(model)) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|magic_for_each_value|parser function|[append 1]| -- [append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named -- param n=value n]|[...] library.magic_for_each_value = function (ctx) local magic local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then magic = opts[offs + 1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘magic_for_each_value’: No parser function was provided', 0) end local cargs, ret, nss, ccs = copy_table_reduced(opts, 1, offs), {}, 0, ctx.itersep or '' flush_params(ctx, function (key, val) cargs[1], ret[nss + 1], nss = val, ccs, nss + 2 ret[nss] = ctx.frame:callParserFunction(magic, cargs) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|call_for_each_group|template name|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.call_for_each_group = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local tmp local opts, offs = ctx.pipe, ctx.fnpos if opts[offs + 1] ~= nil then tmp = opts[offs + 1]:match'^%s*(.*%S)' end if tmp == nil then error(modulename .. ', ‘call_for_each_group’: No template name was provided', 0) end local model = { title = tmp } local bargs, ret, nss, ccs = {}, {}, 0, ctx.itersep or '' for key, val in pairs(opts) do if type(key) ~= 'number' then bargs[key] = val elseif key > offs then bargs[key - offs - 1] = val elseif key < 1 then bargs[key - 1] = val end end ctx.params = make_groups(ctx.params) flush_params(ctx, function (gid, group) for key, val in pairs(bargs) do group[key] = val end group[0], model.args, ret[nss + 1], nss = gid, group, ccs, nss + 2 ret[nss] = ctx.frame:expandTemplate(model) end) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end --[[ First-position-only modifiers ]]-- --------------------------------------- -- Syntax: #invoke:params|new|pipe to static_iface.new = function (child_frame) local ctx = context_new(child_frame, 'new') ctx.params = {} main_loop(ctx, context_iterate(ctx, 2)) return ctx.text end --[[ First-position-only functions ]]-- --------------------------------------- -- Syntax: #invoke:params|self static_iface.self = function (child_frame) return child_frame:getParent():getTitle() end --[[ Public metatable of functions ]]-- --------------------------------------- return setmetatable({}, { __index = function (_, query) local fname = query:match'^%s*(.*%S)' if fname == nil then error(modulename .. ': You must specify a function to call', 0) end local func = static_iface[fname] if func ~= nil then return func end func = library[fname] if func == nil then error(modulename .. ': The function ‘' .. fname .. '’ does not exist', 0) end return function (child_frame) local ctx = context_new(child_frame, fname) ctx.params = copy_or_ref_table(ctx.oparams, refparams[fname]) main_loop(ctx, func) return ctx.text end end }) jnrp2hde108asrud4ch6fuc8nkppvn4 Mia (zina) 0 49945 123233 2026-10-10T13:36:23Z Viyowoyero-vya-Malaŵi 11606 Created page with "'''Mia '''ni [[zina]] lakwamba la mwanakazi. Mia waŵa yumoza wa mazina 10 agho ghakumanyikwa chomene gha ŵasungwana awo ŵababika sonosono ku [[United States]].<ref>https://www.behindthename.com/name/mia</ref> ==Mndandanda wa ŵanthu== * [[Mia Alvar]] * [[Mia Bitsch]] * [[Mia Boman]] * [[Mia Brownell]] * [[Mia Clift]] * [[Mía Cueva]] * [[Mia Davies]] * [[Mia Falkenberg]] * [[Mia Farrow]] * [[Mia Goth]] * [[Mia Hagman]] * [[Mia Isabella]] * [[Mia Kilburg]] * Mia Ki..." 123233 wikitext text/x-wiki '''Mia '''ni [[zina]] lakwamba la mwanakazi. Mia waŵa yumoza wa mazina 10 agho ghakumanyikwa chomene gha ŵasungwana awo ŵababika sonosono ku [[United States]].<ref>https://www.behindthename.com/name/mia</ref> ==Mndandanda wa ŵanthu== * [[Mia Alvar]] * [[Mia Bitsch]] * [[Mia Boman]] * [[Mia Brownell]] * [[Mia Clift]] * [[Mía Cueva]] * [[Mia Davies]] * [[Mia Falkenberg]] * [[Mia Farrow]] * [[Mia Goth]] * [[Mia Hagman]] * [[Mia Isabella]] * [[Mia Kilburg]] * [[Mia Kirshner]] * [[Mia Kretzer]] * [[Mia Kupres]] * [[Mia Love]] * [[Mia Makaroff]] * [[Mia Mamede]] * [[Mia Malkova]] * [[Mia Mastrov]] * [[Mia May]] * [[Mia Michaels]] * [[Mia Mottley]] * [[Mia Münster]] * [[Mia Newley]] * [[Mia Pohánková]] * [[Mia Pojatina]] * [[Mia Riddle]] * [[Mia Rodriguez]] * [[Mia Sara]] * [[Mia Strömmer]] * [[Mia Talerico]] * [[Mia Tavonatti]] * [[Mia Tharia]] * [[Mia Threapleton]] * [[Mia Tomlinson]] * [[Mia Tyler]] * [[Mia Wasikowska]] * [[Mia Wray]] * [[Mia Yamamoto]] * [[Mia Zabelka]] * [[Mia Zapata]] * [[Mia Zutter]] ==Ukaboni== {{reflist}} [[Category:Mazina]] hwd3lpjdee555aavhl76fct37hze586 Leah (zina) 0 49947 123235 2026-10-10T13:44:46Z Viyowoyero-vya-Malaŵi 11606 Created page with "'''Leah '''ni [[zina]] lakwamba la mwanakazi. Zina lakuti "Leah" likuyowoyaso za lizgu la [[ChiNgelezi Chakale]] lakuti léah ilo likung'anamura "munda".<ref>https://www.behindthename.com/name/leah</ref> ==Mndandanda wa ŵanthu== ===Ŵanthu ŵa ufumu=== *[[Leah Isadora Behn]] ===Ŵanthu ŵa boma=== *[[Leah Manning]] *[[Leah Rabin]] *[[Leah Rosenthal]] *[[Leah Taylor Roy]] *[[Leah Ward Sears]] ===Luso na maseŵero=== {{...}} ===Ŵanyake=== *[[Leah Berman]] *Leah Ca..." 123235 wikitext text/x-wiki '''Leah '''ni [[zina]] lakwamba la mwanakazi. Zina lakuti "Leah" likuyowoyaso za lizgu la [[ChiNgelezi Chakale]] lakuti léah ilo likung'anamura "munda".<ref>https://www.behindthename.com/name/leah</ref> ==Mndandanda wa ŵanthu== ===Ŵanthu ŵa ufumu=== *[[Leah Isadora Behn]] ===Ŵanthu ŵa boma=== *[[Leah Manning]] *[[Leah Rabin]] *[[Leah Rosenthal]] *[[Leah Taylor Roy]] *[[Leah Ward Sears]] ===Luso na maseŵero=== {{...}} ===Ŵanyake=== *[[Leah Berman]] *[[Leah Carola Czollek]] *[[Leah Chase]] *[[Leah Findlater]] *[[Leah Horowitz]] *[[Leah Mosher]] *[[Leah Namugerwa]] ==Ukaboni== {{reflist}} [[Category:Mazina]] co2v8h94d4y6l7u6ztf5bkbc7f7bq1l 123236 123235 2026-10-10T13:48:08Z Viyowoyero-vya-Malaŵi 11606 Delete 123236 wikitext text/x-wiki {{Delete|Some Wikidata error, meaning it is not linking with the other articles}} '''Leah '''ni [[zina]] lakwamba la mwanakazi. Zina lakuti "Leah" likuyowoyaso za lizgu la [[ChiNgelezi Chakale]] lakuti léah ilo likung'anamura "munda".<ref>https://www.behindthename.com/name/leah</ref> ==Mndandanda wa ŵanthu== ===Ŵanthu ŵa ufumu=== *[[Leah Isadora Behn]] ===Ŵanthu ŵa boma=== *[[Leah Manning]] *[[Leah Rabin]] *[[Leah Rosenthal]] *[[Leah Taylor Roy]] *[[Leah Ward Sears]] ===Luso na maseŵero=== {{...}} ===Ŵanyake=== *[[Leah Berman]] *[[Leah Carola Czollek]] *[[Leah Chase]] *[[Leah Findlater]] *[[Leah Horowitz]] *[[Leah Mosher]] *[[Leah Namugerwa]] ==Ukaboni== {{reflist}} [[Category:Mazina]] tmcvd2pyhqxqwdvj5f9801vlyqiusz5 123237 123236 2026-10-10T13:48:52Z Viyowoyero-vya-Malaŵi 11606 Fixed 123237 wikitext text/x-wiki '''Leah '''ni [[zina]] lakwamba la mwanakazi. Zina lakuti "Leah" likuyowoyaso za lizgu la [[ChiNgelezi Chakale]] lakuti léah ilo likung'anamura "munda".<ref>https://www.behindthename.com/name/leah</ref> ==Mndandanda wa ŵanthu== ===Ŵanthu ŵa ufumu=== *[[Leah Isadora Behn]] ===Ŵanthu ŵa boma=== *[[Leah Manning]] *[[Leah Rabin]] *[[Leah Rosenthal]] *[[Leah Taylor Roy]] *[[Leah Ward Sears]] ===Luso na maseŵero=== {{...}} ===Ŵanyake=== *[[Leah Berman]] *[[Leah Carola Czollek]] *[[Leah Chase]] *[[Leah Findlater]] *[[Leah Horowitz]] *[[Leah Mosher]] *[[Leah Namugerwa]] ==Ukaboni== {{reflist}} [[Category:Mazina]] co2v8h94d4y6l7u6ztf5bkbc7f7bq1l Template:Aceh labelled map 10 49948 123241 2026-10-11T02:33:00Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123241 wikitext text/x-wiki {{Image label begin|image=Indonesia Aceh location map.svg|width={{{width|400}}}|float={{{float|none}}}|link=|font-size=75%|thumb={{{thumb|}}}|caption={{{caption|}}}}} {{Image label|x=0.210|y=0.130|scale={{{width|400}}}|text=[[{{{prefix|}}}Sabang, Aceh|Sabang]]}} {{Image label|x=0.200|y=0.200|scale={{{width|400}}}|text=[[{{{prefix|}}}Banda Aceh|Banda<br>Aceh]]}} {{Image label|x=0.270|y=0.230|scale={{{width|400}}}|text=[[{{{prefix|}}}Aceh Besar Regency|Aceh<br>Besar]]}} {{Image label|x=0.300|y=0.350|scale={{{width|400}}}|text=[[{{{prefix|}}}Aceh Jaya Regency|Aceh<br>Jaya]]}} {{Image label|x=0.690|y=0.360|scale={{{width|400}}}|text=[[{{{prefix|}}}East Aceh Regency|East<br>Aceh]]}} {{Image label|x=0.550|y=0.350|scale={{{width|400}}}|text=[[{{{prefix|}}}Bener Meriah Regency|Bener<br>Meriah]]}} {{Image label|x=0.560|y=0.310|scale={{{width|400}}}|text=[[{{{prefix|}}}North Aceh Regency|North Aceh]]}} {{Image label|x=0.560|y=0.260|scale={{{width|400}}}|text=[[{{{prefix|}}}Lhokseumawe]]}} {{Image label|x=0.470|y=0.300|scale={{{width|400}}}|text=[[{{{prefix|}}}Bireuen Regency|Bireuen]]}} {{Image label|x=0.370|y=0.330|scale={{{width|400}}}|text=[[{{{prefix|}}}Pidie Regency|Pidie]]}} {{Image label|x=0.400|y=0.260|scale={{{width|400}}}|text=[[{{{prefix|}}}Pidie Jaya Regency|Pidie<br>Jaya]]}} {{Image label|x=0.390|y=0.420|scale={{{width|400}}}|text=[[{{{prefix|}}}West Aceh Regency|West<br>Aceh]]}} {{Image label|x=0.450|y=0.480|scale={{{width|400}}}|text=[[{{{prefix|}}}Nagan Raya Regency|Nagan<br>Raya]]}} {{Image label|x=0.510|y=0.410|scale={{{width|400}}}|text=[[{{{prefix|}}}Central Aceh Regency|Central<br>Aceh]]}} {{Image label|x=0.500|y=0.540|scale={{{width|400}}}|text=[[{{{prefix|}}}Southwest Aceh Regency|Southwest<br>Aceh]]}} {{Image label|x=0.660|y=0.620|scale={{{width|400}}}|text=[[{{{prefix|}}}Southeast Aceh Regency|Southeast<br>Aceh]]}} {{Image label|x=0.630|y=0.510|scale={{{width|400}}}|text=[[{{{prefix|}}}Gayo Lues Regency|Gayo<br>Lues]]}} {{Image label|x=0.740|y=0.420|scale={{{width|400}}}|text=[[{{{prefix|}}}Langsa]]}} {{Image label|x=0.730|y=0.470|scale={{{width|400}}}|text=[[{{{prefix|}}}Aceh Tamiang Regency|Aceh<br>Tamiang]]}} {{Image label|x=0.630|y=0.680|scale={{{width|400}}}|text=[[{{{prefix|}}}South Aceh Regency|South<br>Aceh]]}} {{Image label|x=0.700|y=0.760|scale={{{width|400}}}|text=[[{{{prefix|}}}Subulussalam]]}} {{Image label|x=0.380|y=0.730|scale={{{width|400}}}|text=[[{{{prefix|}}}Simeulue Regency|Simeulue]]}} {{Image label|x=0.680|y=0.870|scale={{{width|400}}}|text=[[{{{prefix|}}}Aceh Singkil Regency|Aceh<br>Singkil]]}} {{Image label|x=0.850|y=0.680|scale={{{width|400}}}|text=[[{{{prefix|}}}North Sumatra|''NORTH<br>SUMATRA'']]}} {{Image label end}} <noinclude> {{Documentation | content = Labeled map for listing [[Regency (Indonesia)|regencies]] and [[City status in Indonesia|cities]] of [[Aceh]]. == Usage == * {{tlc|{{PAGENAME}}}} (default linking) * {{tlc|{{PAGENAME}}|prefix{{=}}List of Aceh regencies and cities#}} (links to sections/anchors in [[List of regencies and cities in Aceh]]) == Image label == {{Image label begin/doc}} [[Category:Labelled map templates]] [[Category:Indonesia map templates]] }}<!--(end Documentation)--> </noinclude> 4siuhndeqef11a1v1sn5d5xuvgthhpz Template:ASEAN Labelled Map (blue) 10 49949 123242 2026-10-11T02:38:32Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123242 wikitext text/x-wiki <onlyinclude>{{Image label begin|image=ASEAN members.svg|thumb=1|float=right|width=500|margin=0.5em 0pt 1.3em 1.4em|link=|alt=labelled map of ASEAN members states|caption=Vyalo vya ASEAN}} {{Image label small|x=0.2000|y=0.165|scale=400|text=<div style="text-align: center;">[[Myanmar|<span style="color:black;">Myanmar</span>]]</div>}} {{Image label small|x=0.3340|y=0.190|scale=400|text=<div style="text-align: center;">[[Laos|<span style="color:black;">Laos</span>]]</div>}} {{Image label small|x=0.4580|y=0.295|scale=400|text=<div style="text-align: center;">[[Vietnam|<span style="color:black;">Vietnam</span>]]</div>}} {{Image label small|x=0.3040|y=0.275|scale=400|text=<div style="text-align: center;">[[Thailand|<span style="color:black;">Thailand</span>]]</div>}} {{Image label small|x=0.3730|y=0.310|scale=400|text=<div style="text-align: center;">[[Cambodia|<span style="color:black;">Cam-<br>bodia</span>]]</div>}} {{Image label small|x=0.6300|y=0.340|scale=400|text=<div style="text-align: center;">[[Philippines|<span style="color:black;">Philippines</span>]]</div>}} {{Image label small|x=0.4830|y=0.455|scale=400|text=<div style="text-align: center;">[[Brunei|<span style="color:black;">Brunei</span>]]</div>}} {{Image label small|x=0.4150|y=0.495|scale=400|text=<div style="text-align: center;">[[Malaysia|<span style="color:black;">Malaysia</span>]]</div>}} {{Image label small|x=0.0730|y=0.550|scale=400|text=<div style="text-align: center;">[[Malaysia|<span style="color:black;">Malaysia</span>]]</div>}} {{Image label small|x=0.0730|y=0.626|scale=400|text=<div style="text-align: center;">[[Singapore|<span style="color:black;">Singapore</span>]]</div>}} {{Image label small|x=0.5450|y=0.620|scale=400|text=<div style="text-align: center;">[[Indonesia|<span style="color:black;">I&nbsp;&nbsp;n&nbsp;&nbsp;d&nbsp;&nbsp;o&nbsp;&nbsp;n&nbsp;&nbsp;e&nbsp;&nbsp;s&nbsp;&nbsp;i&nbsp;&nbsp;a</span>]]</div>}} {{Image label end}}</onlyinclude><noinclude> [[Category:ASEAN templates]] [[Category:Labelled map templates]] </noinclude> dge6vatyji9ps9zp9lwf8dc2vxqp1q0 Template:India States and Territories Labelled Map 10 49950 123243 2026-10-11T02:40:10Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123243 wikitext text/x-wiki {{Image label begin|image=India-locator-map-blank.svg|width={{{width|400}}}|float={{{float|none}}}|font-size=74%|padding=8px}} {{Image label|x=0.370|y=0.880|scale={{{width|400}}}|text=[[Andhra Pradesh]]}} {{Image label|x=0.85|y=0.35|scale={{{width|400}}}|text=[[Arunachal Pradesh]]}} {{Image label|x=0.81|y=0.456|scale={{{width|400}}}|text=[[Assam]]}} {{Image label|x=0.630|y=0.50|scale={{{width|400}}}|text=[[Bihar]]}} {{Image label|x=0.5025|y=0.6475|scale={{{width|400}}}|text=[[Chhattisgarh]]}} {{Image label|x=0.3|y=0.395|scale={{{width|400}}}|text=''[[Delhi|National<br />Capital Territory]]''}} {{Image label|x=0.18|y=0.885|scale={{{width|400}}}|text=[[Goa]]}} {{Image label|x=0.14|y=0.595|scale={{{width|400}}}|text=[[Gujarat]]}} {{Image label|x=0.285|y=0.355|scale={{{width|400}}}|text=[[Haryana]]}} {{Image label|x=0.33|y=0.255|scale={{{width|400}}}|text=[[Himachal Pradesh]]}} {{Image label|x=0.24|y=0.17|scale={{{width|400}}}|text=''[[Jammu na Kashmir|Jammu<br />na<br />Kashmir]]''}} {{Image label|x=0.35|y=0.162|scale={{{width|400}}}|text=''[[Ladakh]]''}} {{Image label|x=0.59|y=0.5625|scale={{{width|400}}}|text=[[Jharkhand]]}} {{Image label|x=0.275|y=0.96|scale={{{width|400}}}|text=[[Karnataka]]}} {{Image label|x=0.285|y=1.08|scale={{{width|400}}}|text=[[Kerala]]}} {{Image label|x=0.305|y=0.595|scale={{{width|400}}}|text=[[Madhya Pradesh]]}} {{Image label|x=0.225|y=0.748|scale={{{width|400}}}|text=[[Maharashtra]]}} {{Image label|x=0.90|y=0.510|scale={{{width|400}}}|text=[[Manipur]]}} {{Image label|x=0.78|y=0.485|scale={{{width|400}}}|text=[[Meghalaya]]}} {{Image label|x=0.8675|y=0.58|scale={{{width|400}}}|text=[[Mizoram]]}} {{Image label|x=0.905|y=0.4375|scale={{{width|400}}}|text=[[Nagaland]]}} {{Image label|x=0.59|y=0.69|scale={{{width|400}}}|text=[[Odisha]]}} {{Image label|x=0.275|y=0.315|scale={{{width|400}}}|text=[[Punjab, India|Punjab]]}} {{Image label|x=0.20|y=0.45|scale={{{width|400}}}|text=[[Rajasthan]]}} {{Image label|x=0.69|y=0.425|scale={{{width|400}}}|text=[[Sikkim]]}} {{Image label|x=0.3425|y=1.04|scale={{{width|400}}}|text=[[Tamil Nadu]]}} {{Image label|x=0.3825|y=0.795|scale={{{width|400}}}|text=[[Telangana]]}} {{Image label|x=0.81|y=0.5425|scale={{{width|400}}}|text=[[Tripura]]}} {{Image label|x=0.395|y=0.33|scale={{{width|400}}}|text=[[Uttarakhand]]}} {{Image label|x=0.425|y=0.475|scale={{{width|400}}}|text=[[Uttar Pradesh]]}} {{Image label|x=0.6875|y=0.59|scale={{{width|400}}}|text=[[West Bengal|West<br />Bengal]]}} {{Image label|x=0.76|y=0.96|scale={{{width|400}}}|text=''[[Andaman na Nicobar Islands|Andaman<br/>na<br/>Nicobar Islands]]''}} {{Image label|x=0.30|y=0.29|scale={{{width|400}}}|text=''[[Chandigarh]]''}} {{Image label|x=0.057|y=0.69|scale={{{width|400}}}|text=''[[Dadra na Nagar Haveli na Daman na Diu|Dadra na Nagar Haveli na<br />Daman na Diu]]''}} {{Image label|x=0.11|y=1.045|scale={{{width|400}}}|text=''[[Lakshadweep]]''}} {{Image label|x=0.45|y=0.995|scale={{{width|400}}}|text=''[[Puducherry|Puducherry]]''}} {{Image label end}}<noinclude> {{Documentation|Template:Image label begin/doc}} [[Category:India state and territory templates| ]] [[Category:Labelled map templates]] </noinclude> bach8pkw27v7pbwe79x5ke8d57vj4r9 Template:Indonesia provinces labelled map 10 49951 123245 2026-10-11T02:42:04Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123245 wikitext text/x-wiki {{Image label begin|image=Indonesia provinces blank map.svg|width={{{width|800}}}|float={{{float|none}}}|link=|font-size=85%|thumb={{{thumb|}}}|caption={{{caption|}}}}} {{Image label|x=0.045|y=0.085|scale={{{width|800}}}|text=[[{{{prefix|}}}Aceh|Aceh]]}} {{Image label|x=0.077|y=0.13|scale={{{width|800}}}|text=[[{{{prefix|}}}North Sumatra|North<br>Sumatra]]}} {{Image label|x=0.095|y=0.19|scale={{{width|800}}}|text=[[{{{prefix|}}}West Sumatra|West<br>Sumatra]]}} {{Image label|x=0.15|y=0.18|scale={{{width|800}}}|text=[[{{{prefix|}}}Riau|Riau]]}} {{Image label|x=0.24|y=0.13|scale={{{width|800}}}|text=[[{{{prefix|}}}Riau Islands|Riau<br>Islands]]}} {{Image label|x=0.25|y=0.215|scale={{{width|800}}}|text=[[{{{prefix|}}}Bangka Belitung Islands|Bangka<br>Belitung]]}} {{Image label|x=0.164|y=0.214|scale={{{width|800}}}|text=[[{{{prefix|}}}Jambi|Jambi]]}} {{Image label|x=0.193|y=0.238|scale={{{width|800}}}|text=[[{{{prefix|}}}South Sumatra|South<br>Sumatra]]}} {{Image label|x=0.121|y=0.277|scale={{{width|800}}}|text=[[{{{prefix|}}}Bengkulu|Bengkulu]]}} {{Image label|x=0.19333333|y=0.293|scale={{{width|800}}}|text=[[{{{prefix|}}}Lampung|Lampung]]}} {{Image label|x=0.205|y=0.33333334|scale={{{width|800}}}|text=[[{{{prefix|}}}Banten|Banten]]}} {{Image label| text-align=left |x=0.268|y=0.288|scale={{{width|800}}}|text=[[{{{prefix|}}}Jakarta|Jakarta<br>↓]]}} {{Image label|x=0.269|y=0.323|scale={{{width|800}}}|text=[[{{{prefix|}}}West Java|West<br>Java]]}} {{Image label|x=0.31833333|y=0.32|scale={{{width|800}}}|text=[[{{{prefix|}}}Central Java|Central<br>Java]]}} {{Image label|x=0.315|y=0.355|scale={{{width|800}}}|text=↑<br>[[{{{prefix|}}}Special Region of Yogyakarta|Yogyakarta]]}} {{Image label|x=0.372|y=0.34|scale={{{width|800}}}|text=[[{{{prefix|}}}East Java|East<br>Java]]}} {{Image label|x=0.435|y=0.3616|scale={{{width|800}}}|text=[[{{{prefix|}}}Bali|Bali]]}} {{Image label|x=0.453|y=0.36|scale={{{width|800}}}|text=[[{{{prefix|}}}West Nusa Tenggara|West<br>Nusa<br>Tenggara]]}} {{Image label|x=0.5466667|y=0.36666667|scale={{{width|800}}}|text=[[{{{prefix|}}}East Nusa Tenggara|East Nusa<br>Tenggara]]}} {{Image label|x=0.322|y=0.17|scale={{{width|800}}}|text=[[{{{prefix|}}}West Kalimantan|West<br>Kalimantan]]}} {{Image label|x=0.37166667|y=0.203|scale={{{width|800}}}|text=[[{{{prefix|}}}Central Kalimantan|Central<br>Kalimantan]]}} {{Image label|x=0.4553|y=0.1|scale={{{width|800}}}|text=[[{{{prefix|}}}North Kalimantan|North<br>Kalimantan]]}} {{Image label|x=0.44|y=0.17|scale={{{width|800}}}|text=[[{{{prefix|}}}East Kalimantan|East<br>Kalimantan]]}} {{Image label|x=0.41|y=0.255|scale={{{width|800}}}|text=[[{{{prefix|}}}South Kalimantan|South<br>Kalimantan]]}} {{Image label|x=0.6166667|y=0.14166667|scale={{{width|800}}}|text=[[{{{prefix|}}}North Sulawesi|North<br>Sulawesi]]}} {{Image label|x=0.66|y=0.18333334|scale={{{width|800}}}|text=[[{{{prefix|}}}North Maluku|North<br>Maluku]]}} {{Image label|x=0.55|y=0.195|scale={{{width|800}}}|text=[[{{{prefix|}}}Central Sulawesi|Central<br>Sulawesi]]}} {{Image label|x=0.548|y=0.139| text-align=right |scale={{{width|800}}}|text=[[{{{prefix|}}}Gorontalo|Gorontalo]]<br>↓}} {{Image label|x=0.47666666|y=0.22833334|scale={{{width|800}}}|text=[[{{{prefix|}}}West Sulawesi|West<br>Sulawesi]]}} {{Image label|x=0.49|y=0.27|scale={{{width|800}}}|text=[[{{{prefix|}}}South Sulawesi|South<br>Sulawesi]]}} {{Image label|x=0.575|y=0.258|scale={{{width|800}}}|text=[[{{{prefix|}}}Southeast Sulawesi|Southeast<br>Sulawesi]]}} {{Image label|x=0.73|y=0.295|scale={{{width|800}}}|text=[[{{{prefix|}}}Maluku (province)|Maluku]]}} {{Image label|x=0.760|y=0.195|scale={{{width|800}}}|text=[[Southwest Papua|Southwest<br />Papua]]}} {{Image label|x=0.815|y=0.235|scale={{{width|800}}}|text=[[West Papua (province)|West<br />Papua]]}} {{Image label|x=0.875|y=0.260|scale={{{width|800}}}|text=[[Central Papua|Central<br />Papua]]}} {{Image label|x=0.920|y=0.230|scale={{{width|800}}}|text=[[Papua (province)|Papua]]}} {{Image label|x=0.935|y=0.260|scale={{{width|800}}}|text=[[Highland Papua|Highland<br />Papua]]}} {{Image label|x=0.940|y=0.313|scale={{{width|800}}}|text=[[South Papua|South<br />Papua]]}} {{Image label end}}<noinclude> {{Documentation | content = Labeled map for listing [[provinces of Indonesia]]. == Usage == * {{tlc|{{PAGENAME}}}} (default linking) * {{tlc|{{PAGENAME}}|prefix{{=}}List of regencies and cities of Indonesia#}} (links to sections/anchors in [[List of regencies and cities of Indonesia]]) == Image label == {{Image label begin/doc}} [[Category:Labelled map templates]] [[Category:Indonesia map templates]] }}<!--(end Documentation)--> </noinclude> khr4fmmrknfzeuu3ziiw0g927qws31q Template:Brazil Labelled Map 10 49952 123246 2026-10-11T02:43:44Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123246 wikitext text/x-wiki {{Image label begin|image=Brazil Labelled Map.svg|width={{{width|}}}|float={{{float|none}}}|font-size=90%}} {{Image label|x=0.840|y=0.09|scale={{{width|}}}|text=[[Atlantic Ocean|<i style="color: #333366;">Atlantic<br/>Ocean</i>]]}} {{Image label|x=0.04|y=0.70|scale={{{width|}}}|text=[[Pacific Ocean|<i style="color: #333366;">Pacific<br/>Ocean</i>]]}} {{Image label|x=0.75|y=0.701|scale={{{width|}}}|text=[[North Region, Brazil|North]]}} {{Image label|x=0.75|y=0.737|scale={{{width|}}}|text=[[Northeast Region, Brazil|Northeast]]}} {{Image label|x=0.75|y=0.773|scale={{{width|}}}|text=[[Central-West Region, Brazil|Central-West]]}} {{Image label|x=0.75|y=0.809|scale={{{width|}}}|text=[[Southeast Region, Brazil|Southeast]]}} {{Image label|x=0.75|y=0.845|scale={{{width|}}}|text=[[South Region, Brazil|South]]}} {{Image label|x=0.10|y=0.33|scale={{{width|}}}|text=[[Acre (state)|<span style="color: black;">Acre</span>]]}} {{Image label|x=0.20|y=0.22|scale={{{width|}}}|text=[[Amazonas (Brazilian state)|<span style="color: black;">Amazonas</span>]]}} {{Image label|x=0.48|y=0.22|scale={{{width|}}}|text=[[Pará|<span style="color: black;">Pará</span>]]}} {{Image label|x=0.27|y=0.08|scale={{{width|}}}|text=[[Roraima|<span style="color: black;">Roraima</span>]]}} {{Image label|x=0.48|y=0.095|scale={{{width|}}}|text=[[Amapá|<span style="color: black;">Amapá</span>]]}} {{Image label|x=0.24|y=0.39|scale={{{width|}}}|text=[[Rondônia|<span style="color: black;">Rondônia</span>]]}} {{Image label|x=0.545|y=0.36|scale={{{width|}}}|text=[[Tocantins (state)|<span style="color: black;">Tocantins</span>]]}} {{Image label|x=0.61|y=0.25|scale={{{width|}}}|text=[[Maranhão|<span style="color: black;">Maranhão</span>]]}} {{Image label|x=0.70|y=0.40|scale={{{width|}}}|text=[[Bahia|<span style="color: black;">Bahia</span>]]}} {{Image label|x=0.70|y=0.30|scale={{{width|}}}|text=[[Piauí|<span style="color: black;">Piauí</span>]]}} {{Image label|x=0.75|y=0.23|scale={{{width|}}}|text=[[Ceará|<span style="color: black;">Ceará</span>]]}} {{Image label|x=0.84|y=0.23|scale={{{width|}}}|text=[[Rio Grande do Norte|<span style="color: black;">Rio Grande<br>do Norte</span>]]}} {{Image label|x=0.85|y=0.29|scale={{{width|}}}|text=[[Paraíba|<span style="color: black;">Paraíba</span>]]}} {{Image label|x=0.77|y=0.32|scale={{{width|}}}|text=[[Pernambuco|<span style="color: black;">Pernambuco</span>]]}} {{Image label|x=0.85|y=0.35|scale={{{width|}}}|text=[[Alagoas|<span style="color: black;">Alagoas</span>]]}} {{Image label|x=0.82|y=0.38|scale={{{width|}}}|text=[[Sergipe|<span style="color: black;">Sergipe</span>]]}} {{Image label|x=0.38|y=0.43|scale={{{width|}}}|text=[[Mato Grosso|<span style="color: black;">Mato Grosso</span>]]}} {{Image label|x=0.39|y=0.58|scale={{{width|}}}|text=[[Mato Grosso do Sul|<span style="color: black;">Mato Grosso<br>do Sul</span>]]}} {{Image label|x=0.565|y=0.45|scale={{{width|}}}|text=[[Federal District (Brazil)|<span style="color: black;">Federal<br>District</span>]]}} {{Image label|x=0.52|y=0.51|scale={{{width|}}}|text=[[Goiás|<span style="color: black;">Goiás</span>]]}} {{Image label|x=0.60|y=0.56|scale={{{width|}}}|text=[[Minas Gerais|<span style="color: black;">Minas Gerais</span>]]}} {{Image label|x=0.52|y=0.62|scale={{{width|}}}|text=[[São Paulo (state)|<span style="color: black;">São Paulo</span>]]}} {{Image label|x=0.70|y=0.63|scale={{{width|}}}|text=[[Rio de Janeiro (state)|<span style="color: black;">Rio de Janeiro</span>]]}} {{Image label|x=0.75|y=0.58|scale={{{width|}}}|text=[[Espírito Santo|<span style="color: black;">Espírito Santo</span>]]}} {{Image label|x=0.48|y=0.68|scale={{{width|}}}|text=[[Paraná (state)|<span style="color: black;">Paraná</span>]]}} {{Image label|x=0.51|y=0.73|scale={{{width|}}}|text=[[Santa Catarina (state)|<span style="color: black;">Santa Catarina</span>]]}} {{Image label|x=0.43|y=0.78|scale={{{width|}}}|text=[[Rio Grande do Sul|<span style="color: black;">Rio Grande<br>do Sul</span>]]}} {{Image label|x=0.22|y=0.80|scale={{{width|}}}|text=''[[Argentina|<span style="color: #C0C0C0;">Argentina</span>]]''}} {{Image label|x=0.22|y=0.51|scale={{{width|}}}|text=''[[Bolivia|<span style="color: #C0C0C0;">Bolivia</span>]]''}} {{Image label|x=0.14|y=0.65|scale={{{width|}}}|text=''[[Chile|<span style="color: #C0C0C0;">Chile</span>]]''}} {{Image label|x=0.05|y=0.07|scale={{{width|}}}|text=''[[Colombia|<span style="color: #C0C0C0;">Colombia</span>]]''}} {{Image label|x=0.48|y=0.03|scale={{{width|}}}|text=''[[French Guiana|<span style="color: #C0C0C0;">French Guiana</span>]]''}} {{Image label|x=0.35|y=0.07|scale={{{width|}}}|text=''[[Guyana|<span style="color: #C0C0C0;">Guyana</span>]]''}} {{Image label|x=0.33|y=0.64|scale={{{width|}}}|text=''[[Paraguay|<span style="color: #C0C0C0;">Paraguay</span>]]''}} {{Image label|x=0.05|y=0.43|scale={{{width|}}}|text=''[[Peru|<span style="color: #C0C0C0;">Peru</span>]]''}} {{Image label|x=0.40|y=0.05|scale={{{width|}}}|text=''[[Suriname|<span style="color: #C0C0C0;">Suriname</span>]]''}} {{Image label|x=0.395|y=0.86|scale={{{width|}}}|text=''[[Uruguay|<span style="color: #C0C0C0;">Uruguay</span>]]''}} {{Image label|x=0.20|y=0.03|scale={{{width|}}}|text=''[[Venezuela|<span style="color: #C0C0C0;">Venezuela</span>]]''}} {{Image label end}}<noinclude> {{Documentation|Template:Image label begin/doc}} [[Category:Labelled map templates]] </noinclude> e7tolov4dtokhu6wson7wnnsuhnb2ha Template:National Parks in the Republic of Ireland labelled map 10 49953 123250 2026-10-11T02:47:48Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123250 wikitext text/x-wiki {{Location map+|Ireland|relief=1|width=250|float=right | caption=[[Mndandanda wa malo ghakusungirako vinyama gha ku Ireland|Malo ghakusungirako vinyama gha ku Ireland]]{{Navbar|National Parks in the Republic of Ireland map|mini=1|nodiv=1|style=float:right}} | places= {{Location map~ | Ireland | mark= | label=[[Páirc Náisiúnta na Mara]] | coordinates = {{coord|52|14|N|10|15|W}} | position=top }} {{Location map~ | Ireland | mark= | label=[[Wild Nephin National Park|Wild Nephin]] | coordinates = {{coord|54|01|N|9|42|W}} | position=right }} {{Location map~ | Ireland | mark= | label=[[Brú na Bóinne]] | coordinates = {{coord|53.7058|-6.4471}} | position=bottom }} {{Location map~ | Ireland | mark= | label=[[Connemara National Park|Connemara]] | coordinates = {{coord|53|33|04|N|9|56|0|W}} | position=bottom }} {{Location map~ | Ireland | mark= | label=[[Glenveagh]] | coordinates = {{coord|55|01|N|8|03|W}} | position=bottom }} {{Location map~ | Ireland | mark= | label=[[Killarney National Park|Killarney]] | coordinates = {{coord|51|59|36|N|9|33|0|W}} | position=right }} {{Location map~ | Ireland | mark= | label=[[Burren National Park|Burren]] | coordinates = {{coord|53|03|N|9|06|W}} | position=bottom }} {{Location map~ | Ireland | mark= | label=[[Wicklow Mountains National Park|Wicklow Mountains]] | coordinates = {{coord|53|05|N|6|20|W}} | position=bottom }} }}<noinclude> [[Category:Republic of Ireland templates]] [[Category:Labelled map templates]] </noinclude> 05vbeuety1tf0lvbscjchbk4tt5d3f1 Module:Location map/data/Ireland 828 49954 123251 2026-10-11T02:48:50Z Viyowoyero-vya-Malaŵi 11606 Created page with "return { name = 'Ireland', top = 55.6, bottom = 51.2, left = -11.0, right = -5.0, image = 'Ireland adm location map.svg', image1 = 'Ireland relief location map.png' }" 123251 Scribunto text/plain return { name = 'Ireland', top = 55.6, bottom = 51.2, left = -11.0, right = -5.0, image = 'Ireland adm location map.svg', image1 = 'Ireland relief location map.png' } afkiavf16db2atfjq0sz4w6k3ggtfh8 Template:Eurozone labelled map 10 49955 123252 2026-10-11T02:50:45Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123252 wikitext text/x-wiki {{image frame |width=410 |content= <div style="position:relative; overflow-x:auto"> {{Image label begin|image=Eurozone map.svg{{!}}border|font-size=85%|overflow-x=visible}} {{Image label|x=.245 |y=.645 |font-size=115%|text=[[Eurozone|<span style="color:white;letter-spacing:.44em">EUROZONE</span>]]}} {{Image label|x=.42 |y=.45 |font-size=80% |text=[[Denmark and the euro|<span style="color:black">Denmark</span>]]}} {{Image label|x=.516 |y=.615 |font-size=90% |text=[[Czech Republic and the euro|<span style="color:black">Czechia</span>]]}} {{Image label|x=.59 |y=.68 |font-size=80% |text=[[Hungary and the euro|<span style="color:black">Hungary</span>]]}} {{Image label|x=.555 |y=.54 |font-size=140% |text=[[Poland and the euro|<span style="color:black">Poland</span>]]}} {{Image label|x=.68 |y=.70 |font-size=110% |text=[[Romania and the euro|<span style="color:black">Romania</span>]]}} {{Image label|x=.505 |y=.34 |font-size=80% |text=[[Sweden and the euro|<span style="color:black">Sweden</span>]]}} {{Image label|x=.25 |y=.78 |font-size=80% |text=[[Andorra and the euro|<span style="background:#F29527;color:black">Andorra</span>]]}} {{Image label|x=.36 |y=.756 |font-size=80% |text=[[Monégasque euro coins|<span style="background:#F29527;color:black">Monaco</span>]]}} {{Image label|x=.46 |y=.745|font-size=80% |text=[[San Marino euro coins|<span style="background:#F29527;color:black">San Marino</span>]]}} {{Image label|x=.46 |y=.855|font-size=80% |text=[[Vatican euro coins|<span style="background:#F29527;color:black">Vatican City</span>]]}} {{Image label|x=.70|y=.795|font-size=80% |text=[[Kosovo and the euro|<span style="background:#da2131;color:black">Kos.</span>]]}} {{Image label|x=.57 |y=.795|font-size=80% |text=[[Montenegro and the euro|<span style="background:#da2131;color:black">Mont.</span>]]}} {{Image label end}} </div>}}<noinclude> {{Documentation|Template:Image label begin/doc}} [[Category:Labelled map templates]] [[Category:European Union currency templates]] </noinclude> f693w3jgt9s1bx9heo72rpylvc6cipq Template:European Union Labelled Map (blue) 10 49956 123253 2026-10-11T02:53:28Z Viyowoyero-vya-Malaŵi 11606 Paste from English template 123253 wikitext text/x-wiki <onlyinclude>{{image frame|width=400 | content = {{Image label begin|image=European Union enlargement.gif|width=400|padding=0px;height:400px|link=|alt=labelled map of Europe showing progressive EU enlargements}} {{Image label small|x=0.5775|y=0.863|scale=400|text=[[Albania|<span style="color:black;">Albania</span>]]}} {{Image label small|x=0.4675|y=0.699|scale=400|text=[[Austria|<span style="color:black;">Austria</span>]]}} {{Image label small|x=0.6775|y=0.52|scale=400|text=[[Belarus|<span style="color:black;">Belarus</span>]]}} {{Image label small|x=0.2875|y=0.615|scale=400|text=[[Belgium|<span style="color:black;">Belgium</span>]]}} {{Image label small|x=0.57|y=0.795|scale=400|text=[[Bosnia and Herzegovina|<span style="color:black;">Bosnia</span>]]}} {{Image label small|x=0.7|y=0.8|scale=400|text=[[Bulgaria|<span style="color:black;">Bulgaria</span>]]}} {{Image label small|x=0.5125|y=0.76|scale=400|text=[[Croatia|<span style="color:black;">Croatia</span>]]}} {{Image label small|x=0.8925|y=0.98|scale=400|text=[[Cyprus|<span style="color:black;">Cyprus</span>]]}} {{Image label small|x=0.4875|y=0.628|scale=400|text=[[Czech Republic|<span style="color:black;">Czech<Br>Rep.</span>]]}} {{Image label small|x=0.3775|y=0.487|scale=400|text=[[Denmark|<span style="color:black;">Denmark</span>]]}} {{Image label small|x=0.5875|y=0.375|scale=400|text=[[Estonia|<span style="color:black;">Estonia</span>]]}} {{Image label small|x=0.5875|y=0.27|scale=400|text=[[Finland|<span style="color:black;">Finland</span>]]}} {{Image label small|x=0.2565|y=0.72|scale=400|text=[[France|<span style="color:black;">France</span>]]}} {{Image label small|x=0.3875|y=0.6|scale=400|text=[[Germany|<span style="color:black;">Germany</span>]]}} {{Image label small|x=0.6475|y=0.91|scale=400|text=[[Greece|<span style="color:black;">Greece</span>]]}} {{Image label small|x=0.5575|y=0.707|scale=400|text=[[Hungary|<span style="color:black;">Hungary</span>]]}} {{Image label small|x=0.0805|y=0.17|scale=400|text=[[Iceland|<span style="color:black;">Iceland</span>]]}} {{Image label small|x=0.0975|y=0.51|scale=400|text=[[Republic of Ireland|<span style="color:black;">Ireland</span>]]}} {{Image label small|x=0.4615|y=0.83|scale=400|text=[[Italy|<span style="color:black;">Italy</span>]]}} {{Image label small|x=0.6155|y=0.426|scale=400|text=[[Latvia|<span style="color:black;">Latvia</span>]]}} {{Image label small|x=0.5715|y=0.47|scale=400|text=[[Lithuania|<span style="color:black;">Lithuania</span>]]}} {{Image label small|x=0.3075|y=0.657|scale=400|text=[[Luxembourg|<span style="color:black;">Luxembourg</span>]]}} {{Image label small|x=0.4455|y=0.98|scale=400|text=[[Malta|<span style="color:black;">Malta<big>→</big></span>]]}} {{Image label small|x=0.7335|y=0.67|scale=400|text=[[Moldova|<span style="color:black;">Moldova</span>]]}} {{Image label small|x=0.5775|y=0.83|scale=400|text=[[Montenegro|<span style="color:black;">Mont.</span>]]}} {{Image label small|x=0.2925|y=0.57|scale=400|text=[[Netherlands|<span style="color:black;">Netherlands</span>]]}} {{Image label small|x=0.6375|y=0.845|scale=400|text=[[North Macedonia|<span style="color:black;">N. Mac.</span>]]}} {{Image label small|x=0.3775|y=0.32|scale=400|text=[[Norway|<span style="color:black;">Norway</span>]]}} {{Image label small|x=0.5475|y=0.567|scale=400|text=[[Poland|<span style="color:black;">Poland</span>]]}} {{Image label small|x=0.0175|y=0.84|scale=400|text=[[Portugal|<span style="color:black;">Portugal</span>]]}} {{Image label small|x=0.6625|y=0.719|scale=400|text=[[Romania|<span style="color:black;">Romania</span>]]}} {{Image label small|x=0.7975|y=0.32|scale=400|text=[[Russia|<span style="color:black;">Russia</span>]]}} {{Image label small|x=0.6175|y=0.77|scale=400|text=[[Serbia|<span style="color:black;">Serbia</span>]]}} {{Image label small|x=0.5675|y=0.66|scale=400|text=[[Slovakia|<span style="color:black;">Slovakia</span>]]}} {{Image label small|x=0.4655|y=0.74|scale=400|text=[[Slovenia|<span style="color:black;">Slovenia</span>]]}} {{Image label small|x=0.1245|y=0.88|scale=400|text=[[Spain|<span style="color:black;">Spain</span>]]}} {{Image label small|x=0.4725|y=0.3|scale=400|text=[[Sweden|<span style="color:black;">Sweden</span>]]}} {{Image label small|x=0.3675|y=0.718|scale=400|text=&nbsp;[[Switzerland|<span style="color:black;">Switz-<br />erland</span>]]}} {{Image label small|x=0.8675|y=0.86|scale=400|text=[[Turkey|<span style="color:black;">Turkey</span>]]}} {{Image label small|x=0.7575|y=0.6|scale=400|text=[[Ukraine|<span style="color:black;">Ukraine</span>]]}} {{Image label small|x=0.1925|y=0.496|scale=400|text=[[United Kingdom|<span style="color:black;">United<br />Kingdom</span>]]}} {{Image label end}} | caption = Malo gha mamembala gha European Union (Malo gha ku Europe pambere 1993 ghandafike), ghakukhazikika mu ndondomeko ya kunjilirapo. Vigaŵa vya mu Europe na vyakuzingilizga pera ndivyo vikulongoreka. <br>{{navbar|European Union Labelled Map (blue)}} }}</onlyinclude><noinclude> [[Category:European Union templates]] [[Category:Labelled map templates]] </noinclude> 59ilqe0tsoez3mb5jh5syml2mv3l8yb Category:Labelled map templates 14 49957 123254 2026-10-11T02:54:45Z Viyowoyero-vya-Malaŵi 11606 Paste from English category 123254 wikitext text/x-wiki {Template category | type = image-based | description = '''Templates presenting maps to which labels have been added''' {{small|(e.g. using {{tla|Image label begin|{{hsp|Image label&nbsp;...}}}} templates; see {{tlbare|Image label begin/doc}})}}. ''{{hlist|style=font-size:80%; |See also {{cat|Wikipedia geographic image maps}} |[[Commons:Category:Clickable maps|{{color|#002bb8|Clickable maps}}]] and [[Commons:Commons:Image map resources|{{color|#002bb8|Image map resources}}]] at Wikimedia Commons}}'' }} [[Category:Map templates]] [[Category:Wikipedia image maps|τ]] {{CatAutoTOC}} qgyhw073zymv5e3vaxx1whx911n3y36 123255 123254 2026-10-11T02:55:15Z Viyowoyero-vya-Malaŵi 11606 123255 wikitext text/x-wiki {{Template category | type = image-based | description = '''Templates presenting maps to which labels have been added''' {{small|(e.g. using {{tla|Image label begin|{{hsp|Image label&nbsp;...}}}} templates; see {{tlbare|Image label begin/doc}})}}. ''{{hlist|style=font-size:80%; |See also {{cat|Wikipedia geographic image maps}} |[[Commons:Category:Clickable maps|{{color|#002bb8|Clickable maps}}]] and [[Commons:Commons:Image map resources|{{color|#002bb8|Image map resources}}]] at Wikimedia Commons}}'' }} [[Category:Map templates]] [[Category:Wikipedia image maps|τ]] {{CatAutoTOC}} 3n9me99be6jmc5963f0q8rpa3inc2y8 The Sims 0 49958 123257 2026-10-11T05:28:54Z Viyowoyero-vya-Malaŵi 11606 Created page with "{{Italic title}} {{Databox}} '''''{{PAGENAME}}''''' ni [[Maseŵero gha pa vidiyo|maseŵero gha pa vidiyo]] agho ghakasindikizgika na {{#invoke:wd|property|linked|references|P123}}. ==Zuŵa ilo likalembekera== ''{{PAGENAME}}'' wakafumiskika mu {{#invoke:wd|property|linked|references|P577}}. ==Ukaboni== {{reflist}} [[Category:Maseŵera gha pa vidiyo]]" 123257 wikitext text/x-wiki {{Italic title}} {{Databox}} '''''{{PAGENAME}}''''' ni [[Maseŵero gha pa vidiyo|maseŵero gha pa vidiyo]] agho ghakasindikizgika na {{#invoke:wd|property|linked|references|P123}}. ==Zuŵa ilo likalembekera== ''{{PAGENAME}}'' wakafumiskika mu {{#invoke:wd|property|linked|references|P577}}. ==Ukaboni== {{reflist}} [[Category:Maseŵera gha pa vidiyo]] ah5sw8rl8uq6u9l28thyezboudfhbxj MySims 0 49959 123258 2026-10-11T05:30:01Z Viyowoyero-vya-Malaŵi 11606 Created page with "{{Italic title}} {{Databox}} '''''{{PAGENAME}}''''' ni [[Maseŵero gha pa vidiyo|maseŵero gha pa vidiyo]] agho ghakasindikizgika na {{#invoke:wd|property|linked|references|P123}}. ==Zuŵa ilo likalembekera== ''{{PAGENAME}}'' wakafumiskika mu {{#invoke:wd|property|linked|references|P577}}. ==Ukaboni== {{reflist}} [[Category:Maseŵera gha pa vidiyo]]" 123258 wikitext text/x-wiki {{Italic title}} {{Databox}} '''''{{PAGENAME}}''''' ni [[Maseŵero gha pa vidiyo|maseŵero gha pa vidiyo]] agho ghakasindikizgika na {{#invoke:wd|property|linked|references|P123}}. ==Zuŵa ilo likalembekera== ''{{PAGENAME}}'' wakafumiskika mu {{#invoke:wd|property|linked|references|P577}}. ==Ukaboni== {{reflist}} [[Category:Maseŵera gha pa vidiyo]] ah5sw8rl8uq6u9l28thyezboudfhbxj 123259 123258 2026-10-11T05:32:30Z Viyowoyero-vya-Malaŵi 11606 123259 wikitext text/x-wiki {{Italic title}} '''''{{PAGENAME}}''''' ni [[Maseŵero gha pa vidiyo|maseŵero gha pa vidiyo]] agho ghakasindikizgika na {{#invoke:wd|property|linked|references|P123}}. Maseŵera agha ghakaguliskika mayuniti ghakujumpha 4 miliyoni kufuma mu 2008. ==Zuŵa ilo likalembekera== ''{{PAGENAME}}'' wakafumiskika mu {{#invoke:wd|property|linked|references|P577}}. Iwo wakafumiskikaso ku Microsoft Windows na mafoni mu 2008.<ref>https://medium.com/shinkretro/the-story-so-far-on-the-mysims-franchise-ed562b3266e5</ref> ==Ukaboni== {{reflist}} [[Category:Maseŵera gha pa vidiyo]] bsc2539tpb0myee676i1gdovge3g7ef An Khê 0 49960 123260 2026-10-11T09:41:29Z Viyowoyero-vya-Malaŵi 11606 Created page with "{{Databox}} '''{{PAGENAME}}''' ni muzi mu [[chigaŵa cha Gia Lai]] mu charu cha {{#invoke:wd|property|linked|references|P17}}.<ref>https://geonames.org</ref> Muli ŵanthu 63,118 (2003).<ref>http://www.statoids.com/yvn.html</ref> ==Mbiri== Mu vilimika vya m’ma 1500, An Khê ukaŵa msumba wa [[ŴaCham]]/ŵa ku mapiri ndipo ukaŵa na zina lakuti Samriddhipuri. ==Ukaboni== {{reflist}} [[Category:Vietnam]]" 123260 wikitext text/x-wiki {{Databox}} '''{{PAGENAME}}''' ni muzi mu [[chigaŵa cha Gia Lai]] mu charu cha {{#invoke:wd|property|linked|references|P17}}.<ref>https://geonames.org</ref> Muli ŵanthu 63,118 (2003).<ref>http://www.statoids.com/yvn.html</ref> ==Mbiri== Mu vilimika vya m’ma 1500, An Khê ukaŵa msumba wa [[ŴaCham]]/ŵa ku mapiri ndipo ukaŵa na zina lakuti Samriddhipuri. ==Ukaboni== {{reflist}} [[Category:Vietnam]] 0ti9tkpmmusx7i2qr766irzw72bla94