Wikipedia sowiki https://so.wikipedia.org/wiki/Bogga_Hore MediaWiki 1.47.0-wmf.18 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 Portal Portal talk TimedText TimedText talk Module Module talk Event Event talk Reer Nuur 0 2817 307124 306177 2026-09-05T08:52:36Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307124 wikitext text/x-wiki '''Reer Nuur''' (Af-Soomaali: Reer Nuur), oo sidoo kale loo yaqaano Nuur Yoonis, waa beel ka tirsan waqooyiga Soomaalida, waana laan hoose oo ka tirsan qoyska beelweynta [[Gadabuursi|Gadabuursiga]].<ref>{{Cite book|url=https://books.google.com/books?id=lAyeNqKK7bQC&q=Reer+Nuur+is+a+Somali+clan&pg=PA143|title=Who Cares about Somalia: Hassan's Ordeal; Reflections on a Nation's Future|last=Jama|first=Hassan Ali|date=2005|publisher=Verlag Hans Schiler|isbn=9783899300758|language=en}}</ref>{{Infobox ethnic group | group = Soomaali | native_name = Reer Nuur | native_name_lang = so | flag = {{flagcountry|Somalia}} {{flagcountry|Djibouti}} {{flagcountry|Ethiopia}} {{flagcountry|Somaliland}} | genealogy = [[Dir (clan)|Dir]] | regions = [[Somaliland]], [[Djibouti]], [[Ethiopia]] | langs = [[Af Soomaali]], [[Carabi]] | religions = Islaam | related_groups = kuwa Kale qabiilo, iyo [[Dir (qabiil)|Dir]] sida [[Barsuug]], [[Biimaal]], [[Gurgura]], [[Surre]], [[Ciise (qabiil)|Ciise]] }} == Guud Mar == Reer Nuur waa mid ka mid ah beel-hoosaadyada ugu waaweyn qoyska beelweynta [[Gadabuursi]]. Taariikh ahaan, waxay deganayeen aagga kala duwan ee u dhexeeya qabaa'ilka [[Gadabuursi]] iyo [[Isaaq]].<ref>{{Cite book|url=https://books.google.com/books?id=_8D0gYZZVKEC&q=rer+nuur+gadabursi&pg=PA136|title=Voice and Power|last1=Hayward|first1=R. J.|last2=Lewis|first2=I. M.|date=2005-08-17|publisher=Routledge|isbn=9781135751753|language=en}}</ref> Taariikh ahaan, marka ay beeli isu timaado arrimo siyaasadeed awgood, Reer Nuur waxaa loo tixgelin jiray laan gaar ah oo la siman kooxaha kale ee qoyska Gadabuursi ee ah ''Habar Afan'', ''Mahad 'Ase'', ''Aadan Yonis'' iyo ''Jibril Yonis''.<ref name=":1">{{Cite book|title=CLAN SHIP, CONFLICT AND REFUGEES: AN INTRODUCTION TO SOMALIS IN THE HORN OF AFRICA|last=Ambroso|first=Guido|publisher=UNHCR HARGEISA|year=2002|location=Brussels|page=7|quote=One informer told me that in Borama, when there are important decisions to be made, the Gadabursi normally divide themselves into four "parties.The Habar Afan, the Mahad Asse, the Jibril Yonis, and the Nur Yonis.}}</ref> == Deegaanka == Reer Nuur waxay degaan 3 dal, oo kala ah [[Djibouti|Jabuuti]], [[Ethiopia|Itoobiya]], iyo [[Somaliland]]. Gudaha '''Somaliland,''' Reer Nuur waxay degaan gobolka [[Awdal]], waxayna wadaagaan [[Baki District|Degmada Baki]] Beesha Reer Maxamed (Mahad 'Ase) iyo Habar Afan, inkastoo [[Dilla District|Degmada Dilla]] ay u badanyihiin iyagu. Sidoo kale waxay degaan [[Borama District|Degmada Boorama]].<ref>{{Cite news|url=http://waaheen.com/2015/01/17/siimoodi-iyo-baki-reer-nuur-baa-leh-balse-waa-lanala-degaa-salaadiinta-reer-nuur/|title="Siimoodi iyo Baki Reer Nuur baa leh, Balse Waa lanala Degaa." Salaadiinta Reer Nuur.|last=Wariye|date=2015-01-17|work=Waaheen Media Group|access-date=2018-03-30|language=en-US|archive-date=2018-06-12|archive-url=https://web.archive.org/web/20180612140312/http://waaheen.com/2015/01/17/siimoodi-iyo-baki-reer-nuur-baa-leh-balse-waa-lanala-degaa-salaadiinta-reer-nuur/|url-status=dead}}</ref> Gudaha gobolka [[Maroodi Jeex]], waxay degaan [[Gabiley District|Degmada Gabiley]], magaalooyinka sida [[Tog Wajaale]],<ref>{{Cite book|title=Addressing Land-based Conflicts in Somaliland and Afghanistan|last=Abdi|first=Mohamed|publisher=Academy for Peace and Development|year=2007|page=67|quote=Within Tog Wajaale, there was a continuous conflict from 1993-2016 between the Samaroon (Reer Maxamed Nur) and the Jibril Abokor (Aadan Cumar) regarding the privatization of communal land. Through the work of traditional elders, Guurti, and the Gabiley Local council, it has been partially resolved.}}</ref><ref>{{Cite book|url=https://books.google.com/books?id=ESOMi7W6Pj4C&q=140&pg=PA141|title=Des paroles douces comme la soie: introduction aux contes dans l'aire couchitique (Bedja, Afar, Saho, Somali)|last=Morin|first=Didier|date=1995|publisher=Peeters Publishers|isbn=9789068316780|language=fr}}</ref> [[El Bardale]],<ref>{{Cite news|url=http://www.irinnews.org/report/86595/somalia-rival-clans-re-arming-over-somaliland-farm|title=Rival clans "re-arming" over Somaliland farm|date=2009-10-16|work=IRIN|access-date=2018-03-30|language=en|quote=Elberdale farmland dispute. The farmland dates back to the 1950s with the two clans - the Reer Nour and Reer Hared - each claiming ownership over farms in the town.}}</ref><ref>{{Cite news|url=http://www.irinnews.org/report/85309/somalia-clashes-displace-hundreds-families-somaliland|title=Clashes displace hundreds of families in Somaliland|date=2009-07-16|work=IRIN|access-date=2018-03-30|language=en|quote=The latest clashes marked the fourth time armed conflict has broken out in the Elberdale farmland in the past six months between the Hared and Mohamoud Nour clans.}}</ref> iyo [[Gabiley]].<ref name=":02">{{Cite book|title=PILLARS OF PEACE:Democracy in Somaliland Challenges and Opportunities|last=Saeed Gees|first=Mohamed|publisher=Academy for Peace and Development|year=2010|location=Hargeysa|page=77}}</ref><ref>{{cite book|title=CLANSHIP, CONFLICT AND REFUGEES: AN INTRODUCTION TO SOMALIS IN THE HORN OF AFRICA|last1=Ambroso|first1=Guido|date=March 2002|publisher=UNCHR|location=Brussels, Belgium|page=69|quote=Genealogical Chart #2.2 shows the diversity of the Gadabursi lineages residing in Gabiley. The Bahabar Aden, Bahabar Abokor, and Degaweyne lineages constituting the "Bah Samaroon" alliance group of the Gadabursi that reside in Gabiley. Chart also shows the Reer Mohamed Nur (Also Gadabursi) residing in Gabiley as well.}}</ref><ref>{{cite book|title=Shattering Tradition: Custom, Law and the Individual in the Muslim Mediterranean|last1=Dostal|first1=Walter|page=296}}</ref><ref>{{cite book|title=Pastoral society and transnational refugees: population movements in Somaliland and eastern Ethiopia|date=8 August 2002|publisher=UN High Commissioner for Refugees|page=5|quote=Table 1: Somaliland’s clans by region, Page 5 shows that the Gadabursi do reside in Gabiley.}}</ref><ref>{{cite book|title=Cahiers d'études africaines, Volume 37, Issues 1-2; Volume 37, Issues 145-146|author1=École pratique des hautes études|author2=Section des sciences économiques et sociales|author3=École des hautes études en sciences sociales|date=1997|publisher=Mouton|location=Indiana University|page=360|quote=various Gadabursi lineages reside in Gabiley}}</ref><ref>{{Cite news|url=http://www.awdalpress.com/index/isbahaysigii-gol-waraabe-ee-ay-bahwadaagta-ku-ahaayeen-reer-nuur-iyo-jibriil-abokor/|title=Isbahaysigii Gol-waraabe ee ay bahwadaagta ku ahaayeen Reer Nuur iyo Jibriil Abokor.|date=2011-01-14|work=Awdalpress.com|access-date=2018-03-30|language=en-US|archive-date=2025-01-25|archive-url=https://web.archive.org/web/20250125040216/http://www.awdalpress.com/index/isbahaysigii-gol-waraabe-ee-ay-bahwadaagta-ku-ahaayeen-reer-nuur-iyo-jibriil-abokor/|url-status=dead}}</ref> Degmada [[Hargeisa District|Hargeysa dhexdeeda]], waxay ka degaan xaafadaha Stadium iyo State Park.<ref>{{Cite book|title=Housing Land and Property Issues in Somalia: Persons of Concern in Somaliland and South-Central Somalia|publisher=Legal Action Worldwide (LAW)|year=2014|page=23|quote=Figure 2 on page 23 shows the Samaroon people inhabiting the neighborhoods of Stadium and State House Park in Hargeisa.}}</ref> Gudaha dalka '''Jabuuti''', Reer Nuur waxay degaan xaafadaha 4 iyo 5 ee [[Djibouti (city)|magaalada Jabuuti]].<ref>{{Cite book|url=https://books.google.com/books?id=G-bZiKh9FHkC&q=gadaboursi&pg=PA284|title=Tracer des frontières à Djibouti: des territoires et des hommes aux XIXe et XXe siècles|last=Imbert-Vier|first=Simon|date=2011|publisher=KARTHALA Editions|isbn=9782811105068|language=fr}}</ref><ref name="Rayne2">{{Cite book|url=https://books.google.com/books?id=R-kzjgEACAAJ&q=Sultan+Mahomed+Haji+Dideh+gadabursi|title=Sun, Sand and Somals; Leaves from the Note-Book of a District Commissioner in British Somalia|last=Rayne|first=Henry a|date=2015-08-08|publisher=BiblioLife|isbn=9781297569760|language=en}}</ref> Gudaha '''Itoobiya''', Reer Nuur waxay degaan [[Somali Region|Gobolka Soomaalida]], gaar ahaan degmada [[Awbare (woreda)|Awbare]], oo ah deegaanka ugu dadka badan [[Jigjiga Zone|gobolka Jigjiga]]. Reer Nuur taariikh ahaan xoolahooda waxay daaq jireen ilaa [[Jigjiga]]<ref>{{Cite book|title=Hararino, ricerche e studi geografici|last=Scarin|first=Emilio|date=1942|publisher=[[Sansoni (publisher)|G. C. Sansoni]]|language=it}}</ref> waxayna ka yihiin inta badan dadka deggan magaalada [[Awbare]].<ref>{{Cite book|url=https://books.google.com/books?id=_8D0gYZZVKEC&q=Rer+Nur+Dila+town&pg=PA136|title=Voice and Power|last1=Hayward|first1=R. J.|last2=Lewis|first2=I. M.|date=2005-08-17|publisher=Routledge|isbn=9781135751753|page=136|language=en|quote=The major town and region of the Rer Farah Nur, Aw Baare.}}</ref><ref name="battera296">{{cite book|url=https://books.google.com/books?id=Pos3wAofV4UC&pg=PP1|title=Shattering Tradition: Custom, Law and the Individual in the Muslim Mediterranean|last1=Battera|first1=Federico|publisher=I.B. Taurus|others=Walter Dostal, Wolfgang Kraus (ed.)|year=2005|isbn=1-85043-634-7|location=London|page=296|chapter=Chapter 9: The Collapse of the State and the Resurgence of Customary Law in Northern Somalia|access-date=2010-03-18|chapter-url=https://books.google.com/books?id=Pos3wAofV4UC&pg=PA278}}</ref><ref name="TMCBS">{{cite web|url=http://www.somaliawatch.org/archivedec02/021207202.htm|title=Somaliland: The Myth of Clan-Based Statehood|date=2002-12-07|publisher=Somalia Watch|archive-url=https://web.archive.org/web/20060615230152/http://somaliawatch.org/archivedec02/021207202.htm|archive-date=15 June 2006|url-status=dead|access-date=2007-01-29|df=dmy}}</ref><ref name=":0">{{Cite book|url=https://books.google.com/books?id=z4AAAwAAQBAJ|title=Shattering Tradition: Custom, Law and the Individual in the Muslim Mediterranean|last1=Dostal|first1=Walter|last2=Kraus|first2=Wolfgang|date=2005-04-22|publisher=I.B.Tauris|isbn=9780857716774|page=296|language=en}}</ref> == Taariikh == Sida ay tahay xubinta ka tirsan beesha [[Dir (clan)|Dir]], Reer Nuur waxay hoos yimaadaan laanta Makahiil ee [[Gadabuursi]]. Sida ay yihiin qeyb ka mid ah beesha Dir, Reer Nuur waxay qayb ka ahaayeen [[Sultanate of Ifat|Immigiriyadii Ifat]] iyo [[Adal Sultanate|Saldanaddii Cadal]].<ref>Futūḥ al-Ḥabasha. (n.d.). Christian-Muslim Relations 1500 - 1900. doi:10.1163/2451-9537_cmrii_com_26077</ref> Saldanaddahan waxaa maamulayay [[Walashma dynasty|Reer Walaashma]], oo ay abtirsiimo u leeyihiin [[Yusuf bin Ahmad al-Kawneyn|Sheekh Yuusuf Bin Axmed Al-Kowneyn]]. Reer Nuur waxay sidoo kale degaan qaar ka mid ah magaalooyinka ugu taariikhda weyn saldanaddahan, kuwaas oo kala ah magaalooyinka [[Amud|Amuus]] iyo [[Awbare|Aubare]]. Kuwaas oo sidoo kale ah goobo taariikhiga ah oo caan ku ah hoyga awliyo badan oo Soomaaliyeed.<ref>{{Cite book|url=https://books.google.com/books?id=M6NI2FejIuwC&q=amoud&pg=PA148|title=Somaliland: With Addis Ababa & Eastern Ethiopia|last=Briggs|first=Philip|date=2011-12-19|publisher=Bradt Travel Guides|isbn=9781841623719|language=en}}</ref><ref>{{Cite book|url=https://books.google.com/books?id=7_LBDAAAQBAJ&q=amoud&pg=PA71|title=Margaret Laurence: Critical Reflections|last=Staines|first=David|date=2001-06-26|publisher=University of Ottawa Press|isbn=9780776616582|language=en}}</ref> Weligii xilligii gumeysiga, Reer Nuur waxay si adag uga soo horjeedeen gumeysiga, waxayna diideen inay la safdaan Ingiriiska (iyo qaar ka mid ah beelaha Gadabuursi) ee ka gees ahaa [[Dervish movement (Somali)|Halgankii Daraawiishta]].<ref>{{Cite news|title=Gil Bas|last=Gugenheim|first=Eugène|date=1902-11-18|quote=A Zeylah, le gouvernement britannique a essayé de lever des recrues parmi les guerriers Gadaboursis : mais ceux-ci ont refusé de marcher contre le Madht du Somaliiand}}</ref> Nooca fanka iyo maansada ee [[Balwo]] waxaa ikhtiraacay xubin ka tirsan beesha Reer Nuur, oo loo yaqaano [[Abdi Sinimo|Cabdi Saciid (Cabdi Sinimo)]]. Noociisa cusub ee muusikada ayaa sidoo kale horseeday inuu soo baxo fanka [[Heello (song)|Heellada]] wuxuuna dhalay muusigga casriga ah ee Soomaaliyeed.<ref>{{Cite book|url=https://books.google.com/books?id=1flJAQAAQBAJ&q=balwo&pg=PA277|title=A Poet's Glossary|last=Hirsch|first=Edward|date=2014-04-08|publisher=Houghton Mifflin Harcourt|isbn=9780547737461|language=en}}</ref><ref>{{Cite book|url=https://archive.org/details/culturecustomsof00diri|url-access=registration|page=[https://archive.org/details/culturecustomsof00diri/page/171 171]|quote=balwo.|title=Culture and Customs of Somalia|last=Abdullahi|first=Mohamed Diriye|date=2001|publisher=Greenwood Publishing Group|isbn=9780313313332|language=en}}</ref> == Abtirsiinta Beesha == Reer Nuur waxay ka soo jeedaan Dir iyada oo la sii marinayo Gadabuursi, sida hoos ku xusan. * '''Gadabuursi'''<ref name=":1" /><ref>{{Cite web|url=http://www.abtirsi.com/view.php?person=4154|title=Abtirsi.com : Nor Yuunes Muse|website=www.abtirsi.com|access-date=2018-03-30}}</ref> * Habar Makadur (Makadoor) ** Makahil *** Mussee **** Yuunes (Reer Yoonis) ***** '''Nuur Yoonis (Reer Nuur)''' Laamaha hoose ee '''Nuur Yoonis''': * '''Nuur Yoonis''' (Reer Nuur)<ref>{{Cite news|url=https://samaroon.wordpress.com/2009/07/15/abla-ablaynta-beelaha-qabiilka-gadabuursi-samaroon-siciid/|title=Abla-Ablaynta Beelaha Qabiilka Gadabuursi (samaroon siciid).|date=2009-07-15|work=Samaroon's Weblog|access-date=2018-03-30|language=en-US}}</ref> ** Reer Mahmuud *** Abdi Mahamuud **** Xuseen ***** Xaad (Buul-xun) ***** Shirdoon ***** Gabbal ****** Koohi (Bafaad) ****** Samatar (Bafaad) ******* Bahdoon Samatar ****** Ali ****** Raage ****** Xergeeye ****** Khayre (bah-caso) ****** Bahdoon (bah-caso) ****** Samatar-yare (bah-caso) ****** Dhaabur (bah-caso) **** Cismaan (Reer – Cismaan) *** Halas Mahmuud **** Cumar Halas ***** Husien Omar ***** Farah Omar ***** Afi Omar ***** Gelleh Omar ***** Roble Omar **** Guled Halas ***** Samatar Guled ***** Xildiid Guled(Xareed-Qoobbuur) ***** Dhidar Guled **** Muse Halas **** Hiraab Halas **** Cali Halas *** Hassan Mahmuud (Nimidoor) *** Hufane Mahmuud (Nimidoor) *** Roble Mahmuud (Ba-Jibra’en) *** Mohamed Mahmuud (Ba-Jibra’en) ** Reer Farah *** Ibrahim Farah **** Guled Ibraahim ***** Amare Guled ****** Xergeeye Amare ****** Faarah Amare ***** Shirwac Guled ****** Gaboobe Shirwac ****** Xirsi Shirwac ****** Samatar Shirwac ****** Geedi Shirwac ****** Geeldoon Shirwac ***** Abrar Guled ***** Rooble Guled **** Gaade Ibraahim ***** Meecaad Gaade ***** Loodoon Gaade ***** Bahdoon Gaade **** Bare Ibraahim ***** Gabdoon Bare ****** Meecaad Gabdoon (Gurey) ****** sareeye Gabdoon ****** Samatar Gabdoon (Qabile) ****** Magan Gabdoon ******* Waadhawr Magan (Reer wadheer) ******* Abdillahi Magan ******* Bahdoon Magan **** Samakaab Ibraahim **** Rooble Ibraahim ***** Samatar Rooble **** Dadar Ibraahim **** Salah Ibraahim (Dadar) *** Geedi Farah also known as (Gabarmadow) **** Wayteen Geedi **** Cali Geedi **** Mahamed Geedi **** Dabeer Geedi **** Hiraab Geedi *** Reer Ali Abdi == Tixraacyo == {{reflist}} [[Category:Gadabuursi]] 83rmnolqa3kd33ic1q4ytbr924w9sm4 Module:Navbox 828 10332 307133 288453 2026-09-05T10:28:35Z Isma4l 41797 307133 Scribunto text/plain require('strict') local p = {} local cfg = mw.loadData('Module:Navbox/configuration') local inArray = require("Module:TableTools").inArray local getArgs -- lazily initialized local hiding_templatestyles = {} -- global passthrough variables local passthrough = { [cfg.arg.above]=true,[cfg.arg.aboveclass]=true,[cfg.arg.abovestyle]=true, [cfg.arg.basestyle]=true, [cfg.arg.below]=true,[cfg.arg.belowclass]=true,[cfg.arg.belowstyle]=true, [cfg.arg.bodyclass]=true, [cfg.arg.groupclass]=true, [cfg.arg.image]=true,[cfg.arg.imageclass]=true,[cfg.arg.imagestyle]=true, [cfg.arg.imageleft]=true,[cfg.arg.imageleftstyle]=true, [cfg.arg.listclass]=true, [cfg.arg.name]=true, [cfg.arg.navbar]=true, [cfg.arg.state]=true, [cfg.arg.title]=true,[cfg.arg.titleclass]=true,[cfg.arg.titlestyle]=true, argHash=true } -- helper functions local andnum = function(s, n) return string.format(cfg.arg[s .. '_and_num'], n) end local isblank = function(v) return (v or '') == '' end local function concatstrings(s) local r = table.concat(s, '') if r:match('^%s*$') then return nil end return r end local function concatstyles(s) local r = '' for _, v in ipairs(s) do v = mw.text.trim(v, "%s;") if not isblank(v) then r = r .. v .. ';' end end if isblank(r) then return nil end return r end local function getSubgroup(args, listnum, listText, prefix) local subArgs = { [cfg.arg.border] = cfg.keyword.border_subgroup, [cfg.arg.navbar] = cfg.keyword.navbar_plain, argHash = 0 } local hasSubArgs = false local subgroups_and_num = prefix and {prefix} or cfg.arg.subgroups_and_num for k, v in pairs(args) do k = tostring(k) for _, w in ipairs(subgroups_and_num) do w = string.format(w, listnum) .. "_" if (#k > #w) and (k:sub(1, #w) == w) then subArgs[k:sub(#w + 1)] = v hasSubArgs = true subArgs.argHash = subArgs.argHash + (v and #v or 0) end end end return hasSubArgs and p._navbox(subArgs) or listText end -- Main functions function p._navbox(args) if args.type == cfg.keyword.with_collapsible_groups then return p._withCollapsibleGroups(args) elseif args.type == cfg.keyword.with_columns then return p._withColumns(args) end local function striped(wikitext, border) -- Return wikitext with markers replaced for odd/even striping. -- Child (subgroup) navboxes are flagged with a category that is removed -- by parent navboxes. The result is that the category shows all pages -- where a child navbox is not contained in a parent navbox. local orphanCat = cfg.category.orphan if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes then -- No change; striping occurs in outermost navbox. return wikitext .. orphanCat end local first, second = cfg.class.navbox_odd_part, cfg.class.navbox_even_part if args[cfg.arg.evenodd] then if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then first, second = second, first else first = args[cfg.arg.evenodd] second = first end end local changer if first == second then changer = first else local index = 0 changer = function (code) if code == '0' then -- Current occurrence is for a group before a nested table. -- Set it to first as a valid although pointless class. -- The next occurrence will be the first row after a title -- in a subgroup and will also be first. index = 0 return first end index = index + 1 return index % 2 == 1 and first or second end end local regex = orphanCat:gsub('([%[%]])', '%%%1') return (wikitext:gsub(regex, ''):gsub(cfg.marker.regex, changer)) -- () omits gsub count end local function processItem(item, nowrapitems) if item:sub(1, 2) == '{|' then -- Applying nowrap to lines in a table does not make sense. -- Add newlines to compensate for trim of x in |parm=x in a template. return '\n' .. item .. '\n' end if nowrapitems == cfg.keyword.nowrapitems_yes then local lines = {} for line in (item .. '\n'):gmatch('([^\n]*)\n') do local prefix, content = line:match('^([*:;#]+)%s*(.*)') if prefix and not content:match(cfg.pattern.nowrap) then line = string.format(cfg.nowrap_item, prefix, content) end table.insert(lines, line) end item = table.concat(lines, '\n') end if item:match('^[*:;#]') then return '\n' .. item .. '\n' end return item end local function has_navbar() return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain and ( args[cfg.arg.name] or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, '') ~= cfg.pattern.navbox ) end -- extract text color from css, which is the only permitted inline CSS for the navbar local function extract_color(css_str) -- return nil because navbar takes its argument into mw.html which handles -- nil gracefully, removing the associated style attribute return mw.ustring.match(';' .. css_str .. ';', '.*;%s*([Cc][Oo][Ll][Oo][Rr]%s*:%s*.-)%s*;') or nil end local function renderNavBar(titleCell) if has_navbar() then local navbar = require('Module:Navbar')._navbar titleCell:wikitext(navbar{ [cfg.navbar.name] = args[cfg.arg.name], [cfg.navbar.mini] = 1, [cfg.navbar.fontstyle] = extract_color( (args[cfg.arg.basestyle] or '') .. ';' .. (args[cfg.arg.titlestyle] or '') ) }) end end local function renderTitleRow(tbl) if not args[cfg.arg.title] then return end local titleRow = tbl:tag('tr') local titleCell = titleRow:tag('th'):attr('scope', 'col') local titleColspan = 2 if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end if args[cfg.arg.image] then titleColspan = titleColspan + 1 end titleCell :cssText(args[cfg.arg.basestyle]) :cssText(args[cfg.arg.titlestyle]) :addClass(cfg.class.navbox_title) :attr('colspan', titleColspan) renderNavBar(titleCell) titleCell :tag('div') -- id for aria-labelledby attribute :attr('id', mw.uri.anchorEncode(args[cfg.arg.title]) .. args.argHash) :addClass(args[cfg.arg.titleclass]) :css('font-size', '114%') :css('margin', '0 4em') :wikitext(processItem(args[cfg.arg.title])) end local function getAboveBelowColspan() local ret = 2 if args[cfg.arg.imageleft] then ret = ret + 1 end if args[cfg.arg.image] then ret = ret + 1 end return ret end local function renderAboveRow(tbl) if not args[cfg.arg.above] then return end tbl:tag('tr') :tag('td') :addClass(cfg.class.navbox_abovebelow) :addClass(args[cfg.arg.aboveclass]) :cssText(args[cfg.arg.basestyle]) :cssText(args[cfg.arg.abovestyle]) :attr('colspan', getAboveBelowColspan()) :tag('div') -- id for aria-labelledby attribute, if no title :attr('id', (not args[cfg.arg.title]) and (mw.uri.anchorEncode(args[cfg.arg.above]) .. args.argHash) or nil) :wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems])) end local function renderBelowRow(tbl) if not args[cfg.arg.below] then return end tbl:tag('tr') :tag('td') :addClass(cfg.class.navbox_abovebelow) :addClass(args[cfg.arg.belowclass]) :cssText(args[cfg.arg.basestyle]) :cssText(args[cfg.arg.belowstyle]) :attr('colspan', getAboveBelowColspan()) :tag('div') :wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems])) end local function renderListRow(tbl, index, listnum, listnums_size) local row = tbl:tag('tr') if index == 1 and args[cfg.arg.imageleft] then row :tag('td') :addClass(cfg.class.noviewer) :addClass(cfg.class.navbox_image) :addClass(args[cfg.arg.imageclass]) :css('width', '1px') -- Minimize width :css('padding', '0 2px 0 0') :cssText(args[cfg.arg.imageleftstyle]) :attr('rowspan', listnums_size) :tag('div') :wikitext(processItem(args[cfg.arg.imageleft])) end local group_and_num = andnum('group', listnum) local groupstyle_and_num = andnum('groupstyle', listnum) if args[group_and_num] then local groupCell = row:tag('th') -- id for aria-labelledby attribute, if lone group with no title or above if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then groupCell :attr('id', mw.uri.anchorEncode(args[cfg.arg.group1]) .. args.argHash) end groupCell :attr('scope', 'row') :addClass(cfg.class.navbox_group) :addClass(args[cfg.arg.groupclass]) :cssText(args[cfg.arg.basestyle]) -- If groupwidth not specified, minimize width :css('width', args[cfg.arg.groupwidth] or '1%') groupCell :cssText(args[cfg.arg.groupstyle]) :cssText(args[groupstyle_and_num]) :wikitext(args[group_and_num]) end local listCell = row:tag('td') if args[group_and_num] then listCell :addClass(cfg.class.navbox_list_with_group) else listCell:attr('colspan', 2) end if not args[cfg.arg.groupwidth] then listCell:css('width', '100%') end local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing if index % 2 == 1 then rowstyle = args[cfg.arg.oddstyle] else rowstyle = args[cfg.arg.evenstyle] end local list_and_num = andnum('list', listnum) local listText = inArray(cfg.keyword.subgroups, args[list_and_num]) and getSubgroup(args, listnum, args[list_and_num]) or args[list_and_num] local oddEven = cfg.marker.oddeven if listText:sub(1, 12) == '</div><table' then -- Assume list text is for a subgroup navbox so no automatic striping for this row. oddEven = listText:find(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part end local liststyle_and_num = andnum('liststyle', listnum) local listclass_and_num = andnum('listclass', listnum) listCell :css('padding', '0') :cssText(args[cfg.arg.liststyle]) :cssText(rowstyle) :cssText(args[liststyle_and_num]) :addClass(cfg.class.navbox_list) :addClass(cfg.class.navbox_part .. oddEven) :addClass(args[cfg.arg.listclass]) :addClass(args[listclass_and_num]) :tag('div') :css('padding', (index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or '0 0.25em' ) :wikitext(processItem(listText, args[cfg.arg.nowrapitems])) if index == 1 and args[cfg.arg.image] then row :tag('td') :addClass(cfg.class.noviewer) :addClass(cfg.class.navbox_image) :addClass(args[cfg.arg.imageclass]) :css('width', '1px') -- Minimize width :css('padding', '0 0 0 2px') :cssText(args[cfg.arg.imagestyle]) :attr('rowspan', listnums_size) :tag('div') :wikitext(processItem(args[cfg.arg.image])) end end local function has_list_class(htmlclass) local patterns = { '^' .. htmlclass .. '$', '%s' .. htmlclass .. '$', '^' .. htmlclass .. '%s', '%s' .. htmlclass .. '%s' } for arg, _ in pairs(args) do if type(arg) == 'string' and mw.ustring.find(arg, cfg.pattern.class) then for _, pattern in ipairs(patterns) do if mw.ustring.find(args[arg] or '', pattern) then return true end end end end return false end -- there are a lot of list classes in the wild, so we add their TemplateStyles local function add_list_styles() local frame = mw.getCurrentFrame() local function add_list_templatestyles(htmlclass, templatestyles) if has_list_class(htmlclass) then return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles } } else return '' end end local hlist_styles = add_list_templatestyles('hlist', cfg.hlist_templatestyles) local plainlist_styles = add_list_templatestyles('plainlist', cfg.plainlist_templatestyles) -- a second workaround for [[phab:T303378]] -- when that issue is fixed, we can actually use has_navbar not to emit the -- tag here if we want if has_navbar() and hlist_styles == '' then hlist_styles = frame:extensionTag{ name = 'templatestyles', args = { src = cfg.hlist_templatestyles } } end -- hlist -> plainlist is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because most navboxes will emit only -- one of these classes [hlist_note] return hlist_styles .. plainlist_styles end local function needsHorizontalLists(border) if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then return false end return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist) end local function hasBackgroundColors() for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle, cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do if tostring(args[key]):find('background', 1, true) then return true end end return false end local function hasBorders() for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do if tostring(args[key]):find('border', 1, true) then return true end end return false end local function isIllegible() local styleratio = require('Module:Color contrast')._styleratio for key, style in pairs(args) do if tostring(key):match(cfg.pattern.style) then if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then return true end end end return false end local function getTrackingCategories(border) local cats = {} if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end if isIllegible() then table.insert(cats, cfg.category.illegible) end if hasBorders() then table.insert(cats, cfg.category.borders) end return cats end local function renderTrackingCategories(builder, border) local title = mw.title.getCurrentTitle() if title.namespace ~= 10 then return end -- not in template space local subpage = title.subpageText if subpage == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox or subpage == cfg.keyword.subpage_testcases then return end for _, cat in ipairs(getTrackingCategories(border)) do builder:wikitext('[[Category:' .. cat .. ']]') end end local function renderMainTable(border, listnums) local tbl = mw.html.create('table') :addClass(cfg.class.nowraplinks) :addClass(args[cfg.arg.bodyclass]) local state = args[cfg.arg.state] if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then if state == cfg.keyword.state_collapsed then state = cfg.class.collapsed end tbl :addClass(cfg.class.collapsible) :addClass(state or cfg.class.autocollapse) end tbl:css('border-spacing', 0) if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then tbl :addClass(cfg.class.navbox_subgroup) :cssText(args[cfg.arg.bodystyle]) :cssText(args[cfg.arg.style]) else -- regular navbox - bodystyle and style will be applied to the wrapper table tbl :addClass(cfg.class.navbox_inner) :css('background', 'transparent') :css('color', 'inherit') end tbl:cssText(args[cfg.arg.innerstyle]) renderTitleRow(tbl) renderAboveRow(tbl) local listnums_size = #listnums for i, listnum in ipairs(listnums) do renderListRow(tbl, i, listnum, listnums_size) end renderBelowRow(tbl) return tbl end local function add_navbox_styles(hiding_templatestyles) local frame = mw.getCurrentFrame() -- This is a lambda so that it doesn't need the frame as a parameter local function add_user_styles(templatestyles) if not isblank(templatestyles) then return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles } } end return '' end -- get templatestyles. load base from config so that Lua only needs to do -- the work once of parser tag expansion local base_templatestyles = cfg.templatestyles local templatestyles = add_user_styles(args[cfg.arg.templatestyles]) local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles]) -- The 'navbox-styles' div exists to wrap the styles to work around T200206 -- more elegantly. Instead of combinatorial rules, this ends up being linear -- number of CSS rules. return mw.html.create('div') :addClass(cfg.class.navbox_styles) :wikitext( add_list_styles() .. -- see [hlist_note] applied to 'before base_templatestyles' base_templatestyles .. templatestyles .. child_templatestyles .. table.concat(hiding_templatestyles) ) :done() end -- work around [[phab:T303378]] -- for each arg: find all the templatestyles strip markers, insert them into a -- table. then remove all templatestyles markers from the arg local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)' local argHash = 0 for k, arg in pairs(args) do if type(arg) == 'string' then for marker in string.gfind(arg, strip_marker_pattern) do table.insert(hiding_templatestyles, marker) end argHash = argHash + #arg args[k] = string.gsub(arg, strip_marker_pattern, '') end end if not args.argHash then args.argHash = argHash end local listnums = {} for k, _ in pairs(args) do if type(k) == 'string' then local listnum = k:match(cfg.pattern.listnum) if listnum and args[andnum('list', tonumber(listnum))] then table.insert(listnums, tonumber(listnum)) end end end table.sort(listnums) local border = mw.text.trim(args[cfg.arg.border] or args[1] or '') if border == cfg.keyword.border_child then border = cfg.keyword.border_subgroup end -- render the main body of the navbox local tbl = renderMainTable(border, listnums) local res = mw.html.create() -- render the appropriate wrapper for the navbox, based on the border param if border == cfg.keyword.border_none then res:node(add_navbox_styles(hiding_templatestyles)) local nav = res:tag('div') :attr('role', 'navigation') :node(tbl) -- aria-labelledby title, otherwise above, otherwise lone group if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then nav:attr( 'aria-labelledby', mw.uri.anchorEncode( args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1] ) .. args.argHash ) else nav:attr('aria-label', cfg.aria_label .. args.argHash) end elseif border == cfg.keyword.border_subgroup then -- We assume that this navbox is being rendered in a list cell of a -- parent navbox, and is therefore inside a div with padding:0em 0.25em. -- We start with a </div> to avoid the padding being applied, and at the -- end add a <div> to balance out the parent's </div> res :wikitext('</div>') :node(tbl) :wikitext('<div>') else res:node(add_navbox_styles(hiding_templatestyles)) local nav = res:tag('div') :attr('role', 'navigation') :addClass(cfg.class.navbox) :addClass(args[cfg.arg.navboxclass]) :cssText(args[cfg.arg.bodystyle]) :cssText(args[cfg.arg.style]) :css('padding', '3px') :node(tbl) -- aria-labelledby title, otherwise above, otherwise lone group if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then nav:attr( 'aria-labelledby', mw.uri.anchorEncode( args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1] ) .. args.argHash ) else nav:attr('aria-label', cfg.aria_label .. args.argHash) end end if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then renderTrackingCategories(res, border) end return striped(tostring(res), border) end --p._navbox function p._withCollapsibleGroups(pargs) -- table for args passed to navbox local targs = {} -- process args local passthroughLocal = { [cfg.arg.bodystyle] = true, [cfg.arg.border] = true, [cfg.arg.style] = true, } for k,v in pairs(pargs) do if k and type(k) == 'string' then if passthrough[k] or passthroughLocal[k] then targs[k] = v elseif (k:match(cfg.pattern.num)) then local n = k:match(cfg.pattern.num) local list_and_num = andnum('list', n) if ((k:match(cfg.pattern.listnum) or k:match(cfg.pattern.contentnum)) and targs[list_and_num] == nil and pargs[andnum('group', n)] == nil and pargs[andnum('sect', n)] == nil and pargs[andnum('section', n)] == nil) then targs[list_and_num] = concatstrings({ pargs[list_and_num] or '', pargs[andnum('content', n)] or '' }) if (targs[list_and_num] and inArray(cfg.keyword.subgroups, targs[list_and_num])) then targs[list_and_num] = getSubgroup(pargs, n, targs[list_and_num]) end elseif ((k:match(cfg.pattern.groupnum) or k:match(cfg.pattern.sectnum) or k:match(cfg.pattern.sectionnum)) and targs[list_and_num] == nil) then local titlestyle = concatstyles({ pargs[cfg.arg.groupstyle] or '', pargs[cfg.arg.secttitlestyle] or '', pargs[andnum('groupstyle', n)] or '', pargs[andnum('sectiontitlestyle', n)] or '' }) local liststyle = concatstyles({ pargs[cfg.arg.liststyle] or '', pargs[cfg.arg.contentstyle] or '', pargs[andnum('liststyle', n)] or '', pargs[andnum('contentstyle', n)] or '' }) local title = concatstrings({ pargs[andnum('group', n)] or '', pargs[andnum('sect', n)] or '', pargs[andnum('section', n)] or '' }) local list = concatstrings({ pargs[list_and_num] or '', pargs[andnum('content', n)] or '' }) if list and inArray(cfg.keyword.subgroups, list) then list = getSubgroup(pargs, n, list) end local abbr_and_num = andnum('abbr', n) local state = (pargs[abbr_and_num] and pargs[abbr_and_num] == pargs[cfg.arg.selected]) and cfg.keyword.state_uncollapsed or (pargs[andnum('state', n)] or cfg.keyword.state_collapsed) targs[list_and_num] =p._navbox({ cfg.keyword.border_child, [cfg.arg.navbar] = cfg.keyword.navbar_plain, [cfg.arg.state] = state, [cfg.arg.basestyle] = pargs[cfg.arg.basestyle], [cfg.arg.title] = title, [cfg.arg.titlestyle] = titlestyle, [andnum('list', 1)] = list, [cfg.arg.liststyle] = liststyle, [cfg.arg.listclass] = pargs[andnum('listclass', n)], [cfg.arg.image] = pargs[andnum('image', n)], [cfg.arg.imageleft] = pargs[andnum('imageleft', n)], [cfg.arg.listpadding] = pargs[cfg.arg.listpadding], argHash = pargs.argHash }) end end end end -- ordering of style and bodystyle targs[cfg.arg.style] = concatstyles({targs[cfg.arg.style] or '', targs[cfg.arg.bodystyle] or ''}) targs[cfg.arg.bodystyle] = nil -- child or subgroup if targs[cfg.arg.border] == nil then targs[cfg.arg.border] = pargs[1] end return p._navbox(targs) end --p._withCollapsibleGroups function p._withColumns(pargs) -- table for args passed to navbox local targs = {} -- tables of column numbers local colheadernums = {} local colnums = {} local colfooternums = {} -- process args local passthroughLocal = { [cfg.arg.evenstyle]=true, [cfg.arg.groupstyle]=true, [cfg.arg.liststyle]=true, [cfg.arg.oddstyle]=true, [cfg.arg.state]=true, } for k,v in pairs(pargs) do if passthrough[k] or passthroughLocal[k] then targs[k] = v elseif type(k) == 'string' then if k:match(cfg.pattern.listnum) then local n = k:match(cfg.pattern.listnum) targs[andnum('liststyle', n + 2)] = pargs[andnum('liststyle', n)] targs[andnum('group', n + 2)] = pargs[andnum('group', n)] targs[andnum('groupstyle', n + 2)] = pargs[andnum('groupstyle', n)] if v and inArray(cfg.keyword.subgroups, v) then targs[andnum('list', n + 2)] = getSubgroup(pargs, n, v) else targs[andnum('list', n + 2)] = v end elseif (k:match(cfg.pattern.colheadernum) and v ~= '') then table.insert(colheadernums, tonumber(k:match(cfg.pattern.colheadernum))) elseif (k:match(cfg.pattern.colnum) and v ~= '') then table.insert(colnums, tonumber(k:match(cfg.pattern.colnum))) elseif (k:match(cfg.pattern.colfooternum) and v ~= '') then table.insert(colfooternums, tonumber(k:match(cfg.pattern.colfooternum))) end end end table.sort(colheadernums) table.sort(colnums) table.sort(colfooternums) -- HTML table for list1 local coltable = mw.html.create( 'table' ):addClass('navbox-columns-table') local row, col local tablestyle = ( (#colheadernums > 0) or (not isblank(pargs[cfg.arg.fullwidth])) ) and 'width:100%' or 'width:auto; margin-left:auto; margin-right:auto' coltable:cssText(concatstyles({ 'border-spacing: 0px; text-align:left', tablestyle, pargs[cfg.arg.coltablestyle] or '' })) --- Header row --- if (#colheadernums > 0) then row = coltable:tag('tr') for k, n in ipairs(colheadernums) do col = row:tag('th'):addClass('navbox-abovebelow') col:cssText(concatstyles({ (k > 1) and 'border-left:2px solid #fdfdfd' or '', 'font-weight:bold', pargs[cfg.arg.colheaderstyle] or '', pargs[andnum('colheaderstyle', n)] or '' })) col:attr('colspan', tonumber(pargs[andnum('colheadercolspan', n)])) col:wikitext(pargs[andnum('colheader', n)]) end end --- Main columns --- row = coltable:tag('tr'):css('vertical-align', 'top') for k, n in ipairs(colnums) do if k == 1 and isblank(pargs[andnum('colheader', 1)]) and isblank(pargs[andnum('colfooter', 1)]) and isblank(pargs[cfg.arg.fullwidth]) then local nopad = inArray( {'off', '0', '0em', '0px'}, mw.ustring.gsub(pargs[cfg.arg.padding] or '', '[;%%]', '')) if not nopad then row:tag('td'):wikitext('&nbsp;&nbsp;&nbsp;') :css('width', (pargs[cfg.arg.padding] or '5em')) end end col = row:tag('td'):addClass('navbox-list') col:cssText(concatstyles({ (k > 1) and 'border-left:2px solid #fdfdfd' or '', 'padding:0px', pargs[cfg.arg.colstyle] or '', ((n%2 == 0) and pargs[cfg.arg.evencolstyle] or pargs[cfg.arg.oddcolstyle]) or '', pargs[andnum('colstyle', n)] or '', 'width:' .. (pargs[andnum('colwidth', n)] or pargs[cfg.arg.colwidth] or '10em') })) local wt = pargs[andnum('col', n)] if wt and inArray(cfg.keyword.subgroups, wt) then wt = getSubgroup(pargs, n, wt, cfg.arg.col_and_num) end col:tag('div'):newline():wikitext(wt):newline() end --- Footer row --- if (#colfooternums > 0) then row = coltable:tag('tr') for k, n in ipairs(colfooternums) do col = row:tag('td'):addClass('navbox-abovebelow') col:cssText(concatstyles({ (k > 1) and 'border-left:2px solid #fdfdfd' or '', 'font-weight:bold', pargs[cfg.arg.colfooterstyle] or '', pargs[andnum('colfooterstyle', n)] or '' })) col:attr('colspan', tonumber(pargs[andnum('colfootercolspan', n)])) col:wikitext(pargs[andnum('colfooter', n)]) end end -- assign table to list1 targs[andnum('list', 1)] = tostring(coltable) if isblank(pargs[andnum('colheader', 1)]) and isblank(pargs[andnum('col', 1)]) and isblank(pargs[andnum('colfooter', 1)]) then targs[andnum('list', 1)] = targs[andnum('list', 1)] .. cfg.category.without_first_col end -- Other parameters targs[cfg.arg.border] = pargs[cfg.arg.border] or pargs[1] targs[cfg.arg.evenodd] = (not isblank(pargs[cfg.arg.evenodd])) and pargs[cfg.arg.evenodd] or nil targs[cfg.arg.list1padding] = '0px' targs[andnum('liststyle', 1)] = 'background:transparent;color:inherit;' targs[cfg.arg.style] = concatstyles({pargs[cfg.arg.style], pargs[cfg.arg.bodystyle]}) targs[cfg.arg.tracking] = 'no' return p._navbox(targs) end --p._withColumns -- Template entry points function p.navbox (frame, boxtype) local function readArgs(args, prefix) local function readSubgroups(element, i) if inArray(cfg.keyword.subgroups, args[prefix .. andnum(element, i)]) then for _, v in ipairs(cfg.arg.subgroups_and_num) do readArgs(args, prefix .. string.format(v, i) .. "_") end readArgs(args, prefix .. andnum('col', i) .. "_") end end -- Read the arguments in the order they'll be output in, to make references -- number in the right order. local _ _ = args[prefix .. cfg.arg.title] _ = args[prefix .. cfg.arg.above] -- Limit this to 20 as covering 'most' cases (that's a SWAG) and because -- iterator approach won't work here local boxtype = args.type or cfg.keyword[boxtype] if boxtype == cfg.keyword.with_columns then for i = 1, 20 do _ = args[prefix .. andnum('colheader', i)] end for i = 1, 20 do readSubgroups('col', i) end for i = 1, 20 do _ = args[prefix .. andnum('colfooter', i)] end end for i = 1, 20 do _ = args[prefix .. andnum('group', i)] readSubgroups('list', i) end _ = args[prefix .. cfg.arg.below] end if not getArgs then getArgs = require('Module:Arguments').getArgs end local args = getArgs(frame, {wrappers = {cfg.pattern[boxtype or 'navbox']}}) readArgs(args, "") args.argHash = nil -- we shouldn't accept argHash passed from a template args.type = args.type or cfg.keyword[boxtype] return p['_navbox'](args) end p[cfg.keyword.with_collapsible_groups] = function (frame) return p.navbox(frame, 'with_collapsible_groups') end p[cfg.keyword.with_columns] = function (frame) return p.navbox(frame, 'with_columns') end return p 1s4hl193ornydh8zrrhga8nr1v6arn9 Module:Coordinates 828 18050 307143 288952 2026-09-05T11:07:10Z Isma4l 41797 307143 Scribunto text/plain --[[ This module is intended to replace the functionality of {{Coord}} and related templates. It provides several methods, including {{#invoke:Coordinates | coord }} : General function formatting and displaying coordinate values. {{#invoke:Coordinates | dec2dms }} : Simple function for converting decimal degree values to DMS format. {{#invoke:Coordinates | dms2dec }} : Simple function for converting DMS format to decimal degree format. {{#invoke:Coordinates | link }} : Export the link used to reach the tools ]] require('strict') local math_mod = require("Module:Math") local coordinates = {}; local isSandbox = mw.getCurrentFrame():getTitle():find('sandbox', 1, true); local current_page = mw.title.getCurrentTitle() local page_name = mw.uri.encode( current_page.prefixedText, 'WIKI' ); local coord_link = 'https://geohack.toolforge.org/geohack.php?pagename=' .. page_name .. '&params=' --[[ Helper function, replacement for {{coord/display/title}} ]] local function displaytitle(coords) return mw.getCurrentFrame():extensionTag{ name = 'indicator', args = { name = 'coordinates' }, content = '<span id="coordinates">[[Geographic coordinate system|Coordinates]]: ' .. coords .. '</span>' } end --[[ Helper function, used in detecting DMS formatting ]] local function dmsTest(first, second) if type(first) ~= 'string' or type(second) ~= 'string' then return nil end local s = (first .. second):upper() return s:find('^[NS][EW]$') or s:find('^[EW][NS]$') end --[[ Wrapper function to grab args, see Module:Arguments for this function's documentation. ]] local function makeInvokeFunc(funcName) return function (frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Coord' }) return coordinates[funcName](args, frame) end end --[[ Helper function, handle optional args. ]] local function optionalArg(arg, supplement) return arg and arg .. supplement or '' end --[[ Formats any error messages generated for display ]] local function errorPrinter(errors) local result = "" for i,v in ipairs(errors) do result = result .. '<strong class="error">Coordinates: ' .. v[2] .. '</strong><br />' end return result end --[[ Determine the required CSS class to display coordinates Usually geo-nondefault is hidden by CSS, unless a user has overridden this for himself default is the mode as specificied by the user when calling the {{coord}} template mode is the display mode (dec or dms) that we will need to determine the css class for ]] local function displayDefault(default, mode) if default == "" then default = "dec" end if default == mode then return "geo-default" else return "geo-nondefault" end end --[[ specPrinter Output formatter. Takes the structure generated by either parseDec or parseDMS and formats it for inclusion on Wikipedia. ]] local function specPrinter(args, coordinateSpec) local uriComponents = coordinateSpec["param"] if uriComponents == "" then -- RETURN error, should never be empty or nil return "ERROR param was empty" end if args["name"] then uriComponents = uriComponents .. "&title=" .. mw.uri.encode(coordinateSpec["name"]) end local geodmshtml = '<span class="geo-dms" title="Maps, aerial photos, and other data for this location">' .. '<span class="latitude">' .. coordinateSpec["dms-lat"] .. '</span> ' .. '<span class="longitude">' ..coordinateSpec["dms-long"] .. '</span>' .. '</span>' local lat = tonumber( coordinateSpec["dec-lat"] ) or 0 local geodeclat if lat < 0 then -- FIXME this breaks the pre-existing precision geodeclat = tostring(coordinateSpec["dec-lat"]):sub(2) .. "°S" else geodeclat = (coordinateSpec["dec-lat"] or 0) .. "°N" end local long = tonumber( coordinateSpec["dec-long"] ) or 0 local geodeclong if long < 0 then -- FIXME does not handle unicode minus geodeclong = tostring(coordinateSpec["dec-long"]):sub(2) .. "°W" else geodeclong = (coordinateSpec["dec-long"] or 0) .. "°E" end local geodechtml = '<span class="geo-dec" title="Maps, aerial photos, and other data for this location">' .. geodeclat .. ' ' .. geodeclong .. '</span>' local geonumhtml = '<span class="geo">' .. coordinateSpec["dec-lat"] .. '; ' .. coordinateSpec["dec-long"] .. '</span>' local inner = '<span class="' .. displayDefault(coordinateSpec["default"], "dms" ) .. '">' .. geodmshtml .. '</span>' .. '<span class="geo-multi-punct">&#xfeff; / &#xfeff;</span>' .. '<span class="' .. displayDefault(coordinateSpec["default"], "dec" ) .. '">'; if not args["name"] then inner = inner .. geodechtml .. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span></span>' else inner = inner .. '<span class="vcard">' .. geodechtml .. '<span style="display:none">&#xfeff; / ' .. geonumhtml .. '</span>' .. '<span style="display:none">&#xfeff; (<span class="fn org">' .. args["name"] .. '</span>)</span></span></span>' end local stylesheetLink = 'Module:Coordinates' .. ( isSandbox and '/sandbox' or '' ) .. '/styles.css' return mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = stylesheetLink } } .. '<span class="plainlinks nourlexpansion">[' .. coord_link .. uriComponents .. ' ' .. inner .. ']</span>' .. '[[Category:Pages using gadget WikiMiniAtlas]]' end --[[ Helper function, convert decimal to degrees ]] local function convert_dec2dms_d(coordinate) local d = math_mod._round( coordinate, 0 ) .. "°" return d .. "" end --[[ Helper function, convert decimal to degrees and minutes ]] local function convert_dec2dms_dm(coordinate) coordinate = math_mod._round( coordinate * 60, 0 ); local m = coordinate % 60; coordinate = math.floor( (coordinate - m) / 60 ); local d = coordinate % 360 .."°" return d .. string.format( "%02d′", m ) end --[[ Helper function, convert decimal to degrees, minutes, and seconds ]] local function convert_dec2dms_dms(coordinate) coordinate = math_mod._round( coordinate * 60 * 60, 0 ); local s = coordinate % 60 coordinate = math.floor( (coordinate - s) / 60 ); local m = coordinate % 60 coordinate = math.floor( (coordinate - m) / 60 ); local d = coordinate % 360 .."°" return d .. string.format( "%02d′", m ) .. string.format( "%02d″", s ) end --[[ Helper function, convert decimal latitude or longitude to degrees, minutes, and seconds format based on the specified precision. ]] local function convert_dec2dms(coordinate, firstPostfix, secondPostfix, precision) local coord = tonumber(coordinate) local postfix if coord >= 0 then postfix = firstPostfix else postfix = secondPostfix end precision = precision:lower(); if precision == "dms" then return convert_dec2dms_dms( math.abs( coord ) ) .. postfix; elseif precision == "dm" then return convert_dec2dms_dm( math.abs( coord ) ) .. postfix; elseif precision == "d" then return convert_dec2dms_d( math.abs( coord ) ) .. postfix; end end --[[ Convert DMS format into a N or E decimal coordinate ]] local function convert_dms2dec(direction, degrees_str, minutes_str, seconds_str) local degrees = tonumber(degrees_str) local minutes = tonumber(minutes_str) or 0 local seconds = tonumber(seconds_str) or 0 local factor = 1 if direction == "S" or direction == "W" then factor = -1 end local precision = 0 if seconds_str then precision = 5 + math.max( math_mod._precision(seconds_str), 0 ); elseif minutes_str and minutes_str ~= '' then precision = 3 + math.max( math_mod._precision(minutes_str), 0 ); else precision = math.max( math_mod._precision(degrees_str), 0 ); end local decimal = factor * (degrees+(minutes+seconds/60)/60) return string.format( "%." .. precision .. "f", decimal ) -- not tonumber since this whole thing is string based. end --[[ Checks input values to for out of range errors. ]] local function validate( lat_d, lat_m, lat_s, long_d, long_m, long_s, source, strong ) local errors = {}; lat_d = tonumber( lat_d ) or 0; lat_m = tonumber( lat_m ) or 0; lat_s = tonumber( lat_s ) or 0; long_d = tonumber( long_d ) or 0; long_m = tonumber( long_m ) or 0; long_s = tonumber( long_s ) or 0; if strong then if lat_d < 0 then table.insert(errors, {source, "latitude degrees < 0 with hemisphere flag"}) end if long_d < 0 then table.insert(errors, {source, "longitude degrees < 0 with hemisphere flag"}) end --[[ #coordinates is inconsistent about whether this is an error. If globe: is specified, it won't error on this condition, but otherwise it will. For not simply disable this check. if long_d > 180 then table.insert(errors, {source, "longitude degrees > 180 with hemisphere flag"}) end ]] end if lat_d > 90 then table.insert(errors, {source, "latitude degrees > 90"}) end if lat_d < -90 then table.insert(errors, {source, "latitude degrees < -90"}) end if lat_m >= 60 then table.insert(errors, {source, "latitude minutes >= 60"}) end if lat_m < 0 then table.insert(errors, {source, "latitude minutes < 0"}) end if lat_s >= 60 then table.insert(errors, {source, "latitude seconds >= 60"}) end if lat_s < 0 then table.insert(errors, {source, "latitude seconds < 0"}) end if long_d >= 360 then table.insert(errors, {source, "longitude degrees >= 360"}) end if long_d <= -360 then table.insert(errors, {source, "longitude degrees <= -360"}) end if long_m >= 60 then table.insert(errors, {source, "longitude minutes >= 60"}) end if long_m < 0 then table.insert(errors, {source, "longitude minutes < 0"}) end if long_s >= 60 then table.insert(errors, {source, "longitude seconds >= 60"}) end if long_s < 0 then table.insert(errors, {source, "longitude seconds < 0"}) end return errors; end --[[ parseDec Transforms decimal format latitude and longitude into the structure to be used in displaying coordinates ]] local function parseDec( lat, long, format ) local coordinateSpec = {} local errors = {} if not long then return nil, {{"parseDec", "Missing longitude"}} elseif not tonumber(long) then return nil, {{"parseDec", "Longitude could not be parsed as a number: " .. long}} end errors = validate( lat, nil, nil, long, nil, nil, 'parseDec', false ); coordinateSpec["dec-lat"] = lat; coordinateSpec["dec-long"] = long; local mode = coordinates.determineMode( lat, long ); coordinateSpec["dms-lat"] = convert_dec2dms( lat, "N", "S", mode) -- {{coord/dec2dms|{{{1}}}|N|S|{{coord/prec dec|{{{1}}}|{{{2}}}}}}} coordinateSpec["dms-long"] = convert_dec2dms( long, "E", "W", mode) -- {{coord/dec2dms|{{{2}}}|E|W|{{coord/prec dec|{{{1}}}|{{{2}}}}}}} if format then coordinateSpec.default = format else coordinateSpec.default = "dec" end return coordinateSpec, errors end --[[ parseDMS Transforms degrees, minutes, seconds format latitude and longitude into the a structure to be used in displaying coordinates ]] local function parseDMS( lat_d, lat_m, lat_s, lat_f, long_d, long_m, long_s, long_f, format ) local coordinateSpec, errors, backward = {}, {} lat_f = lat_f:upper(); long_f = long_f:upper(); -- Check if specified backward if lat_f == 'E' or lat_f == 'W' then lat_d, long_d, lat_m, long_m, lat_s, long_s, lat_f, long_f, backward = long_d, lat_d, long_m, lat_m, long_s, lat_s, long_f, lat_f, true; end errors = validate( lat_d, lat_m, lat_s, long_d, long_m, long_s, 'parseDMS', true ); if not long_d then return nil, {{"parseDMS", "Missing longitude" }} elseif not tonumber(long_d) then return nil, {{"parseDMS", "Longitude could not be parsed as a number:" .. long_d }} end if not lat_m and not lat_s and not long_m and not long_s and #errors == 0 then if math_mod._precision( lat_d ) > 0 or math_mod._precision( long_d ) > 0 then if lat_f:upper() == 'S' then lat_d = '-' .. lat_d; end if long_f:upper() == 'W' then long_d = '-' .. long_d; end return parseDec( lat_d, long_d, format ); end end coordinateSpec["dms-lat"] = lat_d.."°"..optionalArg(lat_m,"′") .. optionalArg(lat_s,"″") .. lat_f coordinateSpec["dms-long"] = long_d.."°"..optionalArg(long_m,"′") .. optionalArg(long_s,"″") .. long_f coordinateSpec["dec-lat"] = convert_dms2dec(lat_f, lat_d, lat_m, lat_s) -- {{coord/dms2dec|{{{4}}}|{{{1}}}|0{{{2}}}|0{{{3}}}}} coordinateSpec["dec-long"] = convert_dms2dec(long_f, long_d, long_m, long_s) -- {{coord/dms2dec|{{{8}}}|{{{5}}}|0{{{6}}}|0{{{7}}}}} if format then coordinateSpec.default = format else coordinateSpec.default = "dms" end return coordinateSpec, errors, backward end --[[ Check the input arguments for coord to determine the kind of data being provided and then make the necessary processing. ]] local function formatTest(args) local result, errors local backward, primary = false, false local function getParam(args, lim) local ret = {} for i = 1, lim do ret[i] = args[i] or '' end return table.concat(ret, '_') end if not args[1] then -- no lat logic return errorPrinter( {{"formatTest", "Missing latitude"}} ) elseif not tonumber(args[1]) then -- bad lat logic return errorPrinter( {{"formatTest", "Unable to parse latitude as a number:" .. args[1]}} ) elseif not args[4] and not args[5] and not args[6] then -- dec logic result, errors = parseDec(args[1], args[2], args.format) if not result then return errorPrinter(errors); end -- formatting for geohack: geohack expects D_N_D_E notation or D;D notation -- wikiminiatlas doesn't support D;D notation -- #coordinates parserfunction doesn't support negative decimals with NSWE result.param = table.concat({ math.abs(tonumber(args[1])), ((tonumber(args[1]) or 0) < 0) and 'S' or 'N', math.abs(tonumber(args[2])), ((tonumber(args[2]) or 0) < 0) and 'W' or 'E', args[3] or ''}, '_') elseif dmsTest(args[4], args[8]) then -- dms logic result, errors, backward = parseDMS(args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args.format) if args[10] then table.insert(errors, {'formatTest', 'Extra unexpected parameters'}) end if not result then return errorPrinter(errors) end result.param = getParam(args, 9) elseif dmsTest(args[3], args[6]) then -- dm logic result, errors, backward = parseDMS(args[1], args[2], nil, args[3], args[4], args[5], nil, args[6], args['format']) if args[8] then table.insert(errors, {'formatTest', 'Extra unexpected parameters'}) end if not result then return errorPrinter(errors) end result.param = getParam(args, 7) elseif dmsTest(args[2], args[4]) then -- d logic result, errors, backward = parseDMS(args[1], nil, nil, args[2], args[3], nil, nil, args[4], args.format) if args[6] then table.insert(errors, {'formatTest', 'Extra unexpected parameters'}) end if not result then return errorPrinter(errors) end result.param = getParam(args, 5) else -- Error return errorPrinter({{"formatTest", "Unknown argument format"}}) .. '[[Category:Pages with malformed coordinate tags]]' end result.name = args.name local extra_param = {'dim', 'globe', 'scale', 'region', 'source', 'type'} for _, v in ipairs(extra_param) do if args[v] then table.insert(errors, {'formatTest', 'Parameter: "' .. v .. '=" should be "' .. v .. ':"' }) end end local ret = specPrinter(args, result) if #errors > 0 then ret = ret .. ' ' .. errorPrinter(errors) .. '[[Category:Pages with malformed coordinate tags]]' end return ret, backward end --[[ Generate Wikidata tracking categories. ]] local function makeWikidataCategories(qid) local ret local qid = qid or mw.wikibase.getEntityIdForCurrentPage() if mw.wikibase and current_page.namespace == 0 then if qid and mw.wikibase.entityExists(qid) and mw.wikibase.getBestStatements(qid, "P625") and mw.wikibase.getBestStatements(qid, "P625")[1] then local snaktype = mw.wikibase.getBestStatements(qid, "P625")[1].mainsnak.snaktype if snaktype == 'value' then -- coordinates exist both here and on Wikidata, and can be compared. ret = 'Coordinates on Wikidata' elseif snaktype == 'somevalue' then ret = 'Coordinates on Wikidata set to unknown value' elseif snaktype == 'novalue' then ret = 'Coordinates on Wikidata set to no value' end else -- We have to either import the coordinates to Wikidata or remove them here. ret = 'Coordinates not on Wikidata' end end if ret then return string.format('[[Category:%s]]', ret) else return '' end end --[[ Parse coordinates entered as a single string ]] local function text2coord(text) if type(text) ~= 'string' then return end local coords = {} local numTerms = 0 local parts local function assign(k, number, start, pos) if number then coords[start + pos - 1] = number if k == 1 then numTerms = pos elseif numTerms < pos then -- more terms in long than lat return false end elseif numTerms >= pos then -- more terms in lat than long return false end return true end text = mw.ustring.gsub(mw.text.trim(text:uupper()), "[*′″]", {['*'] = '°', ['′'] = "'", ['″'] = '"'}) for _, regex in ipairs({ "^([+%-%d.°'\"NS%s]+),%s*([+%-%d.°'\"EW%s]+)$", --split by commas "^([+%-%d.°'\"%s]+[NS])%s*([+%-%d.°'\"%s]+[EW])$", --split by N/S "^([+%-%d.°'%s]+\")%s*([+%-%d.°'%s]+\")$", --split by " "^([+%-%d.°%s]+')%s*([+%-%d.°%s]+')$", --split by ' "^([+%-%d.%s]+°)%s*([+%-%d.%s]+°)$", --split by ° "^([+%-%d.]+)%s+([+%-%d.]+)$" --split by space }) do local lat, long = string.match(text, regex) if lat and long then parts = {mw.text.trim(lat), mw.text.trim(long)} break end end if not parts then return end local SW = {"S", "W"} local NE = {"N", "E"} for k, v in ipairs(parts) do local number local start = k + numTerms -- Find or create N, S, E, and W local dir = v:match("([NSEW])$") if dir then v = v:sub(1,-2) elseif v:sub(1,1) == '-' then v = v:sub(2) dir = SW[k] else dir = NE[k] end -- attempt to convert text to number number = tonumber(v) if number then -- Single number, assign it to the position "start" in the "coords" array if not assign(k, number, start, 1) then return end -- attempt to convert dms to decimal elseif string.match(v, "°") then for pos, regex in ipairs({ "^%s*([+%-%d.]+)%s*°[^°]*$", --degrees "^[^°']+°%s*([%d.]+)%s*'[^°']*$", --minutes "^[^'\"]+'%s*([%d.]+)%s*\"[^'\"]*$" --seconds }) do -- Assign component to a position in the "coords" array determined -- by "start" and "pos", and increment "numTerms" if this is latitude if not assign(k, tonumber(string.match(v, regex)), start, pos) then return end end end if coords[start] == nil then return end coords[start + numTerms] = dir end return coords end --[[ link Simple function to export the coordinates link for other uses. Usage: {{#invoke:Coordinates | link }} ]] function coordinates.link(frame) return coord_link; end --[[ dec2dms Wrapper to allow templates to call dec2dms directly. Usage: {{#invoke:Coordinates | dec2dms | decimal_coordinate | positive_suffix | negative_suffix | precision }} decimal_coordinate is converted to DMS format. If positive, the positive_suffix is appended (typical N or E), if negative, the negative suffix is appended. The specified precision is one of 'D', 'DM', or 'DMS' to specify the level of detail to use. ]] coordinates.dec2dms = makeInvokeFunc('_dec2dms') function coordinates._dec2dms(args) local coordinate = args[1] local firstPostfix = args[2] or '' local secondPostfix = args[3] or '' local precision = args[4] or '' return convert_dec2dms(coordinate, firstPostfix, secondPostfix, precision) end --[[ Helper function to determine whether to use D, DM, or DMS format depending on the precision of the decimal input. ]] function coordinates.determineMode( value1, value2 ) local precision = math.max( math_mod._precision( value1 ), math_mod._precision( value2 ) ); if precision <= 0 then return 'd' elseif precision <= 2 then return 'dm'; else return 'dms'; end end --[[ dms2dec Wrapper to allow templates to call dms2dec directly. Usage: {{#invoke:Coordinates | dms2dec | direction_flag | degrees | minutes | seconds }} Converts DMS values specified as degrees, minutes, seconds too decimal format. direction_flag is one of N, S, E, W, and determines whether the output is positive (i.e. N and E) or negative (i.e. S and W). ]] coordinates.dms2dec = makeInvokeFunc('_dms2dec') function coordinates._dms2dec(args) local direction = args[1] local degrees = args[2] local minutes = args[3] local seconds = args[4] return convert_dms2dec(direction, degrees, minutes, seconds) end --[[ coord Main entry point for Lua function to replace {{coord}} Usage: {{#invoke:Coordinates | coord }} {{#invoke:Coordinates | coord | lat | long }} {{#invoke:Coordinates | coord | lat | lat_flag | long | long_flag }} ... Refer to {{coord}} documentation page for many additional parameters and configuration options. Note: This function provides the visual display elements of {{coord}}. In order to load coordinates into the database, the {{#coordinates:}} parser function must also be called, this is done automatically in the Lua version of {{coord}}. ]] coordinates.coord = makeInvokeFunc('_coord') function coordinates._coord(args) if not tonumber(args[1]) then local parsed = text2coord(args[1]) if parsed then -- full lat/long entered as a single string for i = 2, #args do args[#parsed + i - 1] = args[i] end for i, v in ipairs(parsed) do args[i] = v end elseif not args[2] then -- look for coordinates from wikidata args[3] = args[1]; args[1] = nil local entity = mw.wikibase.getEntityObject(args.qid) if entity and entity.claims and entity.claims.P625 and entity.claims.P625[1].mainsnak.snaktype == 'value' then local precision = entity.claims.P625[1].mainsnak.datavalue.value.precision args[1] = entity.claims.P625[1].mainsnak.datavalue.value.latitude args[2] = entity.claims.P625[1].mainsnak.datavalue.value.longitude if precision then precision = -math_mod._round(math.log(precision)/math.log(10),0) args[1] = math_mod._round(args[1],precision) args[2] = math_mod._round(args[2],precision) end end end end local contents, backward = formatTest(args) local Notes = args.notes or '' local Display = args.display and args.display:lower() or 'inline' -- it and ti are short for inline,title and title,inline local function isInline(s) -- Finds whether coordinates are displayed inline. return s:find('inline') ~= nil or s == 'i' or s == 'it' or s == 'ti' end local function isInTitle(s) -- Finds whether coordinates are displayed in the title. return s:find('title') ~= nil or s == 't' or s == 'it' or s == 'ti' end local function coord_wrapper(in_args) -- Calls the parser function {{#coordinates:}}. return mw.getCurrentFrame():callParserFunction('#coordinates', in_args) or '' end local text = '' if isInline(Display) then text = text .. '<span class="geo-inline">' .. contents .. Notes .. '</span>' end if isInTitle(Display) then -- Add to output since indicator content is invisible to Lua later on if not isInline(Display) then text = text .. '<span class="geo-inline-hidden noexcerpt">' .. contents .. Notes .. '</span>' end text = text .. displaytitle(contents .. Notes) .. makeWikidataCategories(args.qid) end if not args.nosave then local page_title, count = mw.title.getCurrentTitle(), 1 if backward then local tmp = {} while not string.find((args[count-1] or ''), '[EW]') do tmp[count] = (args[count] or ''); count = count+1 end tmp.count = count; count = 2*(count-1) while count >= tmp.count do table.insert(tmp, 1, (args[count] or '')); count = count-1 end for i, v in ipairs(tmp) do args[i] = v end else while count <= 9 do args[count] = (args[count] or ''); count = count+1 end end if isInTitle(Display) and not page_title.isTalkPage and page_title.subpageText ~= 'doc' and page_title.subpageText ~= 'testcases' then args[10] = 'primary' end args.notes, args.format, args.display = nil text = text .. coord_wrapper(args) end return text end --[[ coord2text Extracts a single value from a transclusion of {{Coord}}. IF THE GEOHACK LINK SYNTAX CHANGES THIS FUNCTION MUST BE MODIFIED. Usage: {{#invoke:Coordinates | coord2text | {{Coord}} | parameter }} Valid values for the second parameter are: lat (signed integer), long (signed integer), type, scale, dim, region, globe, source ]] function coordinates._coord2text(coord,type) if coord == '' or type == '' or not type then return nil end type = mw.text.trim(type) if type == 'lat' or type == 'long' then local coordString = mw.ustring.match(coord,'[%.%d]+°[NS] [%.%d]+°[EW]') if not coordString then return nil end local result = mw.text.split(coordString, ' ') local negative if type == 'lat' then result, negative = result[1], 'S' else result, negative = result[2], 'W' end if not result then return nil end result = mw.text.split(result, '°') if not result[1] then return nil end if result[2] == negative then result[1] = '-'..result[1] end return result[1] else return mw.ustring.match(coord, 'params=.-_' .. type .. ':(.-)[ _]') end end function coordinates.coord2text(frame) return coordinates._coord2text(frame.args[1],frame.args[2]) or '' end --[[ coordinsert Injects some text into the Geohack link of a transclusion of {{Coord}} (if that text isn't already in the transclusion). Outputs the modified transclusion of {{Coord}}. IF THE GEOHACK LINK SYNTAX CHANGES THIS FUNCTION MUST BE MODIFIED. Usage: {{#invoke:Coordinates | coordinsert | {{Coord}} | parameter:value | parameter:value | … }} Do not make Geohack unhappy by inserting something which isn't mentioned in the {{Coord}} documentation. ]] function coordinates.coordinsert(frame) -- for the 2nd or later integer parameter (the first is the coord template, as above) for i, v in ipairs(frame.args) do if i ~= 1 then -- if we cannot find in the coord_template the i_th coordinsert parameter e.g. region if not mw.ustring.find(frame.args[1], (mw.ustring.match(frame.args[i], '^(.-:)') or '')) then -- find from the params= up to the first possibly-present underscore -- and append the i_th coordinsert parameter and a space -- IDK why we're adding a space but it does seem somewhat convenient frame.args[1] = mw.ustring.gsub(frame.args[1], '(params=.-)_? ', '%1_'..frame.args[i]..' ') end end end if frame.args.name then -- if we can't find the vcard class if not mw.ustring.find(frame.args[1], '<span class="vcard">') then -- take something that looks like a coord template and add the vcard span with class and fn org class local namestr = frame.args.name frame.args[1] = mw.ustring.gsub( frame.args[1], '(<span class="geo%-default">)(<span[^<>]*>[^<>]*</span><span[^<>]*>[^<>]*<span[^<>]*>[^<>]*</span></span>)(</span>)', '%1<span class="vcard">%2<span style="display:none">&#xfeff; (<span class="fn org">' .. namestr .. '</span>)</span></span>%3' ) -- then find anything from coordinates parameters to the 'end' and attach the title parameter frame.args[1] = mw.ustring.gsub( frame.args[1], '(&params=[^&"<>%[%] ]*) ', '%1&title=' .. mw.uri.encode(namestr) .. ' ' ) end end -- replace the existing indicator with a new indicator using the modified content frame.args[1] = mw.ustring.gsub( frame.args[1], '(<span class="geo%-inline[^"]*">(.+)</span>)\127[^\127]*UNIQ%-%-indicator%-%x+%-%-?QINU[^\127]*\127', function (inline, coord) return inline .. displaytitle(coord) end ) return frame.args[1] end return coordinates mgr040y9bhe26jrkzioi6ulvlqhvehy Module:Math 828 18051 307144 289490 2026-09-05T11:09:50Z Isma4l 41797 307144 Scribunto text/plain --[[ This module provides a number of basic mathematical operations. ]] local yesno, getArgs -- lazily initialized local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules. local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua. --[[ Helper functions used to avoid redundant code. ]] local function err(msg) -- Generates wikitext error messages. return mw.ustring.format('<strong class="error">Formatting error: %s</strong>', msg) end local function unpackNumberArgs(args) -- Returns an unpacked list of arguments specified with numerical keys. local ret = {} for k, v in pairs(args) do if type(k) == 'number' then table.insert(ret, v) end end return unpack(ret) end local function makeArgArray(...) -- Makes an array of arguments from a list of arguments that might include nils. local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs. local nums = {} -- Stores the numbers of valid numerical arguments. local ret = {} for k, v in pairs(args) do v = p._cleanNumber(v) if v then nums[#nums + 1] = k args[k] = v end end table.sort(nums) for i, num in ipairs(nums) do ret[#ret + 1] = args[num] end return ret end local function fold(func, ...) -- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters, -- and must return a number as an output. This number is then supplied as input to the next function call. local vals = makeArgArray(...) local count = #vals -- The number of valid arguments if count == 0 then return -- Exit if we have no valid args, otherwise removing the first arg would cause an error. nil, 0 end local ret = table.remove(vals, 1) for _, val in ipairs(vals) do ret = func(ret, val) end return ret, count end --[[ Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value). ]] local function binary_fold(func, ...) local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...) return value end --[[ random Generate a random number Usage: {{#invoke: Math | random }} {{#invoke: Math | random | maximum value }} {{#invoke: Math | random | minimum value | maximum value }} ]] function wrap.random(args) local first = p._cleanNumber(args[1]) local second = p._cleanNumber(args[2]) return p._random(first, second) end function p._random(first, second) math.randomseed(mw.site.stats.edits + mw.site.stats.pages + os.time() + math.floor(os.clock() * 1000000000)) -- math.random will throw an error if given an explicit nil parameter, so we need to use if statements to check the params. if first and second then if first <= second then -- math.random doesn't allow the first number to be greater than the second. return math.random(first, second) end elseif first then return math.random(first) else return math.random() end end --[[ order Determine order of magnitude of a number Usage: {{#invoke: Math | order | value }} ]] function wrap.order(args) local input_string = (args[1] or args.x or '0'); local input_number = p._cleanNumber(input_string); if input_number == nil then return err('order of magnitude input appears non-numeric') else return p._order(input_number) end end function p._order(x) if x == 0 then return 0 end return math.floor(math.log10(math.abs(x))) end --[[ precision Detemines the precision of a number using the string representation Usage: {{ #invoke: Math | precision | value }} ]] function wrap.precision(args) local input_string = (args[1] or args.x or '0'); local trap_fraction = args.check_fraction; if not yesno then yesno = require('Module:Yesno') end if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]]. local pos = string.find(input_string, '/', 1, true); if pos ~= nil then if string.find(input_string, '/', pos + 1, true) == nil then local denominator = string.sub(input_string, pos+1, -1); local denom_value = tonumber(denominator); if denom_value ~= nil then return math.log10(denom_value); end end end end local _, clean_string = p._cleanNumber(input_string); if clean_string == nil then return err('precision input appears non-numeric') else return p._precision(clean_string) end end function p._precision(x) if type(x) == 'number' then x = tostring(x) end local result = 0; --subtract exponent local _, _, coefficient, exponent = x:find("^(.*)[eE](.*)$") if coefficient then result = result - (tonumber(exponent) or 0) x = coefficient end --add decimal places local i, j = x:find('%..*$') if i then result = result + (j - i) return result end --subtract trailing zeroes i, j = x:find('[^0]0+$') if i then result = result - (j - i) end return result end --[[ max Finds the maximum argument Usage: {{#invoke:Math| max | value1 | value2 | ... }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.max(args) return p._max(unpackNumberArgs(args)) end function p._max(...) local max_value = binary_fold((function(a, b) return a > b end), ...) if max_value then return max_value end end --[[ median Find the median of set of numbers Usage: {{#invoke:Math | median | number1 | number2 | ...}} OR {{#invoke:Math | median }} ]] function wrap.median(args) return p._median(unpackNumberArgs(args)) end function p._median(...) local vals = makeArgArray(...) local count = #vals table.sort(vals) if count == 0 then return 0 end if p._mod(count, 2) == 0 then return (vals[count/2] + vals[count/2+1])/2 else return vals[math.ceil(count/2)] end end --[[ min Finds the minimum argument Usage: {{#invoke:Math| min | value1 | value2 | ... }} OR {{#invoke:Math| min }} When used with no arguments, it takes its input from the parent frame. Note, any values that do not evaluate to numbers are ignored. ]] function wrap.min(args) return p._min(unpackNumberArgs(args)) end function p._min(...) local min_value = binary_fold((function(a, b) return a < b end), ...) if min_value then return min_value end end --[[ sum Finds the sum Usage: {{#invoke:Math| sum | value1 | value2 | ... }} OR {{#invoke:Math| sum }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.sum(args) return p._sum(unpackNumberArgs(args)) end function p._sum(...) local sums = fold((function(a, b) return a + b end), ...) if not sums then return 0 else return sums end end --[[ average Finds the average Usage: {{#invoke:Math| average | value1 | value2 | ... }} OR {{#invoke:Math| average }} Note, any values that do not evaluate to numbers are ignored. ]] function wrap.average(args) return p._average(unpackNumberArgs(args)) end function p._average(...) local sum, count = fold((function(a, b) return a + b end), ...) if not sum then return 0 else return sum / count end end --[[ round Rounds a number to specified precision Usage: {{#invoke:Math | round | value | precision }} --]] function wrap.round(args) local value = p._cleanNumber(args[1] or args.value or 0) local precision = p._cleanNumber(args[2] or args.precision or 0) if value == nil or precision == nil then return err('round input appears non-numeric') else return p._round(value, precision) end end function p._round(value, precision) local rescale = math.pow(10, precision or 0); return math.floor(value * rescale + 0.5) / rescale; end --[[ log10 returns the log (base 10) of a number Usage: {{#invoke:Math | log10 | x }} ]] function wrap.log10(args) return math.log10(args[1]) end --[[ mod Implements the modulo operator Usage: {{#invoke:Math | mod | x | y }} --]] function wrap.mod(args) local x = p._cleanNumber(args[1]) local y = p._cleanNumber(args[2]) if not x then return err('first argument to mod appears non-numeric') elseif not y then return err('second argument to mod appears non-numeric') else return p._mod(x, y) end end function p._mod(x, y) local ret = x % y if not (0 <= ret and ret < y) then ret = 0 end return ret end --[[ gcd Calculates the greatest common divisor of multiple numbers Usage: {{#invoke:Math | gcd | value 1 | value 2 | value 3 | ... }} --]] function wrap.gcd(args) return p._gcd(unpackNumberArgs(args)) end function p._gcd(...) local function findGcd(a, b) local r = b local oldr = a while r ~= 0 do local quotient = math.floor(oldr / r) oldr, r = r, oldr - quotient * r end if oldr < 0 then oldr = oldr * -1 end return oldr end local result = fold(findGcd, ...) return result end --[[ precision_format Rounds a number to the specified precision and formats according to rules originally used for {{template:Rnd}}. Output is a string. Usage: {{#invoke: Math | precision_format | number | precision }} ]] function wrap.precision_format(args) local value_string = args[1] or 0 local precision = args[2] or 0 return p._precision_format(value_string, precision) end function p._precision_format(value_string, precision) -- For access to Mediawiki built-in formatter. local lang = mw.getContentLanguage(); local value value, value_string = p._cleanNumber(value_string) precision = p._cleanNumber(precision) -- Check for non-numeric input if value == nil or precision == nil then return err('invalid input when rounding') end local abs_value = math.abs(value) local current_precision = p._precision(value) local order = p._order(value) -- Due to round-off effects it is neccesary to limit the returned precision under -- some circumstances because the terminal digits will be inaccurately reported. if order + precision >= 14 then if order + p._precision(value_string) >= 14 then precision = 13 - order; end end -- If rounding off, truncate extra digits if precision < current_precision then value = p._round(value, precision) abs_value = math.abs(value) current_precision = p._precision(value) end local formatted_num = lang:formatNum(abs_value) -- Handle cases requiring scientific notation if math.abs(order) >= 9 or string.find(formatted_num, 'E', 1, true) then value = value * (10 ^ (-order)) abs_value = math.abs(value) current_precision = current_precision + order precision = precision + order formatted_num = lang:formatNum(abs_value) else order = 0; end -- Use proper unary minus sign rather than ASCII default formatted_num = ((value < 0) and '−' or '') .. formatted_num -- Pad with zeros, if needed if current_precision < precision then local padding if current_precision <= 0 then if precision > 0 then local zero_sep = lang:formatNum(1.1) formatted_num = formatted_num .. zero_sep:sub(2,2) padding = precision if padding > 20 then padding = 20 end formatted_num = formatted_num .. string.rep('0', padding) end else padding = precision - current_precision if padding > 20 then padding = 20 end formatted_num = formatted_num .. string.rep('0', padding) end end -- Add exponential notation, if necessary. if order ~= 0 then -- Use proper unary minus sign rather than ASCII default if order < 0 then order = '−' .. lang:formatNum(math.abs(order)) else order = lang:formatNum(order) end formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>' end return formatted_num end --[[ divide Implements the division operator Usage: {{#invoke:Math | divide | x | y | round= | precision= }} --]] function wrap.divide(args) local x = args[1] local y = args[2] local round = args.round local precision = args.precision if not yesno then yesno = require('Module:Yesno') end return p._divide(x, y, yesno(round), precision) end function p._divide(x, y, round, precision) if y == nil or y == "" then return err("Empty divisor") elseif not tonumber(y) then if type(y) == 'string' and string.sub(y, 1, 1) == '<' then return y else return err("Not a number: " .. y) end elseif x == nil or x == "" then return err("Empty dividend") elseif not tonumber(x) then if type(x) == 'string' and string.sub(x, 1, 1) == '<' then return x else return err("Not a number: " .. x) end else local z = x / y if round then return p._round(z, 0) elseif precision then return p._round(z, precision) else return z end end end --[[ Helper function that interprets the input numerically. If the input does not appear to be a number, attempts evaluating it as a parser functions expression. ]] function p._cleanNumber(number_string, unformat) if type(number_string) == 'number' then -- We were passed a number, so we don't need to do any processing. return number_string, tostring(number_string) elseif type(number_string) ~= 'string' or not number_string:find('%S') then -- We were passed a non-string or a blank string, so exit. return nil, nil; end -- Attempt basic conversion local number = tonumber(number_string) -- If failed, try unformatting the number_string if unformat and number == nil then -- Cannot use mw.language.getContentLanguage():parseFormattedNumber() -- because, unlike {{formatnum:|R}}, it won't ignore operators (it -- would return an error on "1,234+1,234" instead of "1234+1234") number_string = mw.getCurrentFrame():callParserFunction("formatnum", {number_string, "R"}) number = tonumber(number_string) end -- If failed, attempt to evaluate input as an expression if number == nil then local success, result = pcall(mw.ext.ParserFunctions.expr, number_string) if success then number = tonumber(result) number_string = tostring(number) else number = nil number_string = nil end else number_string = number_string:match("^%s*(.-)%s*$") -- String is valid but may contain padding, clean it. number_string = number_string:match("^%+(.*)$") or number_string -- Trim any leading + signs. if number_string:find('^%-?0[xX]') then -- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead. number_string = tostring(number) end end return number, number_string end --[[ Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments. ]] local mt = { __index = function(_, k) return function(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return wrap[k](getArgs(frame)) -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed. end end } return setmetatable(p, mt) f4r823qxvpkct3eikmvj99wyjq9cjkm Template:Sfrac 10 21077 307127 164140 2026-09-05T10:15:34Z Isma4l 41797 /* */ 307127 wikitext text/x-wiki {{ {{{|safesubst:}}}#invoke:Unsubst||$B=<templatestyles src="Sfrac/styles.css" /><span class="sfrac">&NoBreak;{{#if:{{{3|}}}|{{{1}}}<span class="sr-only">+</span>}}<!-- --><span class="tion" {{#if:{{{font-size|}}}|style="font-size:{{{font-size}}}"}}><!-- --><span class="num">{{#if:{{{3|}}}|{{{2}}}|{{#if:{{{2|}}}|{{{1}}}|1}}}}</span><!-- --><span class="sr-only">/</span><!-- --><span class="den">{{{3|{{{2|{{{1|1}}}}}}}}}</span><!-- --></span><!-- -->&NoBreak;</span>}}<noinclude> {{documentation}} <!-- Add categories to /doc subpage, not here. --> </noinclude> 32mv70cbd4f0m43l2vz2f7pex1ig26i Template:Taxon info 10 22303 307149 168765 2026-09-05T11:23:04Z Isma4l 41797 /* */ 307149 wikitext text/x-wiki {{#invoke:Autotaxobox|taxonInfo|{{{1|<noinclude>Acacia</noinclude>}}}|{{{2|<noinclude>parent</noinclude>}}}}}<noinclude>{{documentation}}</noinclude> 81398n6a16baqofp8mue2gyw3jh5xdx Module:Side box 828 22768 307148 292633 2026-09-05T11:17:09Z Isma4l 41797 307148 Scribunto text/plain local yesno = require('Module:Yesno') local p = {} local function makeData(args) local data = {} -- Main table classes data.classes = {} if yesno(args.metadata) ~= false then table.insert(data.classes, 'metadata') end if args.position and args.position:lower() == 'left' then table.insert(data.classes, 'side-box-left') else table.insert(data.classes, 'side-box-right') end if args.collapsible then table.insert(data.classes, 'mw-collapsible') if args.collapsible == "collapsed" then table.insert(data.classes, 'mw-collapsed') end data.collapsible = true end table.insert(data.classes, args.class) -- Image if args.image and args.image ~= 'none' then data.image = args.image end -- we have to check to see if a downstream use has plainlist like -- Template:Sister_project. also it's the default. wikitext is :( if args.textclass == 'plainlist' or not args.textclass then data.textclass = 'plainlist' data.plainlist_templatestyles = 'Plainlist/styles.css' else data.textclass = args.textclass end -- Copy over data that does not need adjusting local argsToCopy = { -- aria qualities 'role', 'labelledby', -- Styles 'style', 'textstyle', 'templatestyles', -- Above row 'above', 'abovestyle', -- Body row 'text', 'imageright', -- Below row 'below', } for i, key in ipairs(argsToCopy) do data[key] = args[key] end return data end local function renderSidebox(data) -- Renders the sidebox HTML. -- Table root local root = mw.html.create('div') root:attr('role', data.role) :attr('aria-labelledby', data.labelledby) :addClass('side-box') for i, class in ipairs(data.classes or {}) do root:addClass(class) end if data.style then root:cssText(data.style) end local frame = mw.getCurrentFrame() if data.plainlist_templatestyles then root:wikitext(frame:extensionTag{ name = 'templatestyles', args = { src = data.plainlist_templatestyles } }) end -- The "above" row if data.above then local above = root:newline():tag('div') above:addClass('side-box-abovebelow') :newline() :wikitext(data.above) if data.textstyle then above:cssText(data.textstyle) end if data.abovestyle then above:cssText(data.abovestyle) end end -- The body row local body = root:newline():tag('div') body:addClass('side-box-flex') :addClass(data.collapsible and 'mw-collapsible-content') :newline() if data.image then body:tag('div') :addClass('side-box-image') :wikitext(data.image) end local text = body:newline():tag('div') text:addClass('side-box-text') :addClass(data.textclass) if data.textstyle then text:cssText(data.textstyle) end text:wikitext(data.text) if data.imageright then body:newline():tag('div') :addClass('side-box-imageright') :wikitext(data.imageright) end -- The below row if data.below then local below = root:newline():tag('div') below :addClass('side-box-abovebelow') :wikitext(data.below) if data.textstyle then below:cssText(data.textstyle) end end root:newline() local templatestyles = '' if data.templatestyles then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = data.templatestyles } } end return frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Side box/styles.css' } } .. templatestyles .. tostring(root) end -- private, export for testing p._makeData = makeData p._renderSidebox = renderSidebox function p._main(args) local data = makeData(args) return renderSidebox(data) end function p.main(frame) local origArgs = frame:getParent().args local args = {} for k, v in pairs(origArgs) do v = v:match('%s*(.-)%s*$') if v ~= '' then args[k] = v end end return p._main(args) end return p hu1w1vy5vzibls2pne08un5bivqwbcp Maine 0 24319 307122 268842 2026-09-05T07:31:54Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307122 wikitext text/x-wiki {{ infobox US state |Name = Maine |Fullname = State of Maine<br/>{{native name|fr|État de Maine}} |Flag = Flag of Maine.svg |Flaglink = [[Flag of Maine|Flag]] |Seal = Seal of Maine.svg |StateAnthem = [[State of Maine Song]] |Map = Maine in United States.svg |Nickname = "The Pine Tree State"<br />"Vacationland"<ref>{{Cite news | url = http://traveltips.usatoday.com/maine-vacation-57068.html | title = Maine for Vacation | newspaper = USA Today | accessdate = August 5, 2013 | quote = There's a reason it's called "Vacationland"... | ciwaan = Nuqul Archive | archive-date = Bisha Kow iyo Tobnaad 12, 2013 | archive-url = https://web.archive.org/web/20131112224536/http://traveltips.usatoday.com/maine-vacation-57068.html | dead-url = yes }}</ref> |Demonym = Mainer<ref name=mainer_definition /> |Motto = "[[Dirigo]]"<br />(Latin for "I lead", "I guide", or "I direct") |Former = [[District of Maine]] ([[Massachusetts]]) |State number = 23rd state |Capital = [[Augusta, Maine|Augusta]] |LargestCity = [[Portland, Maine|Portland]] |LargestMetro = [[Portland, Maine metropolitan area|Greater Portland]] |Governor = [[Paul LePage]] ([[Maine Republican Party|R]]) |Lieutenant Governor = [[Michael Thibodeau]] (R)<ref>In the event of a vacancy in the office of Governor, the President of the [[Maine Senate|State Senate]] is first in line for succession.</ref> |Lieutenant Governor_alt = President of the Senate |Legislature = [[Maine Legislature]] |Upperhouse = [[Maine Senate|Senate]] |Lowerhouse = [[Maine House of Representatives|House of Representatives]] |Senators = [[Susan Collins]] ([[Republican Party (United States)|R]])<br />[[Angus King]] ([[Independent politician|I]]) |Representative = [[Chellie Pingree]] ([[Democratic Party (United States)|D]])<br />[[Bruce Poliquin]] (R) |PostalAbbreviation = ME |TradAbbreviation = Me. |OfficialLang = None{{#tag:ref|Maine does not have an [[official language]].<ref name="auto">{{Cite news|url=https://www.worldtravelguide.net/guides/north-america/united-states-of-america/maine/history-language-culture/|title=Maine - World Travel Guide|work=World Travel Guide|access-date=2018-03-12|language=en-US}}</ref> Both English and [[French language|French]] are considered the ''de facto'' languages of the state.<ref>{{Cite book|url=https://books.google.com/books?id=x9KoAkzfVqIC&pg=PA195#v=onepage&q&f=false|title=Progress in Language Planning: International Perspectives|last=Cobarrubias|first=Juan|date=1983|publisher=Walter de Gruyter|isbn=9789027933584|language=en}}</ref><ref>{{Cite web|url=https://www.crt.state.la.us/cultural-development/codofil/about/french-in-louisiana/legal-status/index|title=Legal Status {{!}} CODOFIL - Louisiana DCRT|website=www.crt.state.la.us|language=en|access-date=2018-03-12|ciwaan=Nuqul Archive|archive-date=2018-07-21|archive-url=https://web.archive.org/web/20180721073139/https://www.crt.state.la.us/cultural-development/codofil/about/french-in-louisiana/legal-status/index|dead-url=yes}}</ref><ref>{{Cite web|url=http://acim.umfk.maine.edu/language.html|title=French Language - Acadian Culture in Maine|website=acim.umfk.maine.edu|access-date=2018-03-12}}</ref> French in particular is legally protected and recognized as Maine's [[minority language]].<ref name="auto1">{{Cite web|url=https://statisticalatlas.com/state/Maine/Languages|title=Languages in Maine (State) - Statistical Atlas|website=statisticalatlas.com|language=en|access-date=2018-03-12|archive-date=2019-04-28|archive-url=https://web.archive.org/web/20190428174222/https://statisticalatlas.com/state/Maine/Languages|url-status=dead}}</ref><ref>{{Cite web|url=http://www.maine.gov/dhhs/interpreting.html|title=Maine DHHS - Multicultural Resources - Interpreting Services& Referral Agencies|website=www.maine.gov|language=en|access-date=2018-03-12|ciwaan=Nuqul Archive|archive-date=2018-04-22|archive-url=https://web.archive.org/web/20180422084144/http://www.maine.gov/dhhs/interpreting.html|dead-url=yes}}</ref> Maine (along with [[Louisiana]]) is considered apart of the [[Geographical distribution of French speakers|Francophone world]] and makes up the [[French language in the United States|largest French-speaking population]] in the United States.<ref name="auto1"/><references group="nb" /> |group="nb"}} |Languages = * [[English language|English]]: 92% * [[French language|French]]: 5% * Other: ≤ 3% |AreaRank = 39th |TotalAreaUS = 35,385 |TotalArea = 91,646 |LandAreaUS = 30,862 |LandArea = 80,005 |WaterAreaUS = 4,523 |WaterArea = 11,724 |PCWater = 13.5 |PopRank = 42nd |2010Pop = 1,335,907 (2017 est.)<ref>{{cite web|url=https://www.census.gov/quickfacts/fact/table/ME,US/PST045217 |date=July 1, 2017 |accessdate=May 6, 2017|publisher=[[U.S. Census Bureau]]|title=Maine: Population estimates}}</ref> |DensityRank = 38th |2000DensityUS = 43.0 |2000Density = 16.6 |MedianHouseholdIncome=$50,756<ref>{{cite web|url=http://kff.org/other/state-indicator/median-annual-income/?currentTimeframe=0|work=The Henry J. Kaiser Family Foundation|title=Median Annual Household Income|accessdate=December 9, 2016}}</ref> |IncomeRank=40th |AdmittanceOrder = 23rd |AdmittanceDate = March 15, 1820 |TimeZone = [[Eastern Time Zone (North America)|Eastern]]: [[Coordinated Universal Time|UTC]] [[Eastern Time Zone|−5]]/[[Eastern Daylight Time|−4]] |Longitude = 66° 57′ W to 71° 5′ W |Latitude = 42° 58′ N to 47° 28′ N |WidthUS = 210 |Width = 338 |LengthUS = 320 |Length = 515 |HighestPoint = [[Mount Katahdin]]<ref>{{cite ngs|id=QG1451|designation=Katahdin 2|accessdate= October 20, 2011}}</ref><ref name=USGS>{{cite web|url=http://egsc.usgs.gov/isb/pubs/booklets/elvadist/elvadist.html |title=Elevations and Distances in the United States |publisher=[[United States Geological Survey]] |year=2001 |accessdate=October 21, 2011 |deadurl=yes |archiveurl=https://web.archive.org/web/20111015012701/http://egsc.usgs.gov/isb/pubs/booklets/elvadist/elvadist.html |archivedate=October 15, 2011 }}</ref><ref name=NAVD88>Elevation adjusted to [[North American Vertical Datum of 1988]].</ref> |HighestElevUS = 5,270 |HighestElev = 1606.4 |MeanElevUS = 600 |MeanElev = 180 |LowestPoint = [[Atlantic Ocean]]<ref name=USGS /> |LowestElevUS = 0 |LowestElev = 0 |ISOCode = US-ME |Website = www.maine.gov |ElectoralVotes = 4 }} {{Infobox U.S. state symbols |Name = Maine |Flag = Flag of Maine.svg |Seal = Seal of Maine.svg |Amphibian = |Bird = [[Chickadee]] |Butterfly = |Crustacean = |Fish = [[Atlantic salmon|Landlocked Atlantic salmon]] |Flower = [[Pinus strobus|White pine cone]] |Grass = |Insect = [[Honey bee]] |Mammal = [[Moose]] |Reptile = |Tree = Eastern white pine |Beverage = [[Moxie]]<ref>{{cite web|url=http://legislature.maine.gov/statutes/1/title1sec224.html|title=Title 1, §224: State soft drink|website=legislature.maine.gov}}</ref> |Colors = |Dance = |Dinosaur = |Food = [[Blueberry pie]] |Fossil = [[Pertica|Pertica quadrifaria]] |Gemstone = [[Tourmaline]] |Instrument = |Mineral = |Motto = [[Seal of Maine|Dirigo]] (I Lead) |Poem = |Rock = |Shell = |Ships = |Slogan = |Soil = Chesuncook soil series |Song = "[[State of Maine Song]]" |Sport = |Tartan = |Toy = |Other = |Route Marker = MA Route 11.svg |Quarter = 2003 ME Proof.png |QuarterReleaseDate = 2003 }} Maine (/ meɪn /) waa gobol [[Gobolada Midoobay|Maraykan]] ah oo ku yaal gobolka New England ee waqooyi bari ee Maraykanka. Maine waa meesha 12aad ee ugu yar ee degaanka, tirada ugu yar ee 9aad, iyo 38ka ugu badan ee dadku ku badan yihiin 50 dawladood. Waxaa xuduud la leh New Hampshire xagga galbeedka, Badweynta Atlantic ee koonfur-bari, iyo gobollada Canadian ee New Brunswick iyo Quebec oo kuyaal waqooyi-bari iyo waqooyi-galbeed. Maine waa gobolka ugu sarraysa bariga Maraykanka, iyo waqooyiga bari ee Barafka Weyn. Waxaa loo yaqaanaa geeldeeda, xeebta dhagaxda; buuraha daaqaya; gudaha dhismaha oo aad u culus; iyo marinnada quruxda badan, iyo sidoo kale cunnooyinka badda, gaar ahaan clams and lobster. Waxaa jira jawi cimilada qoyan ee gobolka oo idil, xitaa meelaha xeebaha sida magaalada ugu badan ee Portland. [16] Caasimaddu waa Augusta. Kumanaan sano, dadka asaliga ah waxay ahaayeen dadka deggan degaanka hadda ee Maine. Waqtiga Europe ee soo galaya ee iminka Maine, dad badan oo Algonquian-ku hadla ayaa ku nool degaanka. Degmadda [[Yurub]] ee ugu horraysa ee aagga waxay ahayd Faransiiska oo ku yaala 1604 Saint Jroix Island, Pierre Dugua, Sieur de Mons. Heshiiska Ingiriisiga ee ugu horreeyey wuxuu ahaa Popham Colony, oo uu aasaasay Shirkadda Plymouth ee 1607. Qaar badan oo ka mid ah degaannada Ingiriisiga ayaa la aasaasay xeebta Maine ee 1620aad, inkastoo jawiga cakiran, lumay, iyo khilaafka dadweynaha maxalliga ah dad badan ayaa ku fashilmay sanado badan. 3ay9a6jucbqeutujploiwfnbato0wl9 Module:Redirect template 828 29484 307140 293513 2026-09-05T10:48:40Z Isma4l 41797 307140 Scribunto text/plain require('strict') local p = {} -- key is beginning of arg name. value is table with namespace number and link -- alternatively, a function taking the namespace number and returning a validity -- can be used local namespaceCategories = { all = { function() return true end }, main = { 0, '[[WP:Mainspace|main]]' }, help = { 12, '[[WP:Help namespace|help]]' }, portal = { 100, '[[WP:Portal|portal]]' }, mos = { 126, '[[WP:MOS namespace|MOS]]' }, talk = { function(n) return n > 0 and n%2 == 1 end, '[[Help:Talk pages|talk]]' }, template = { 10, '[[WP:Template namespace|template]]' }, wikipedia = { 4, '[[WP:Project namespace|Wikipedia project]]' }, category = { 14, '[[WP:Categorization|category]]' }, user = { 2, '[[WP:User pages|user]]' }, draft = { 118, '[[WP:Drafts|draft]]' }, } -- remove whitespaces from beginning and end of args local function valueFunc(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil end end return val end local function getPrettyName(args) for k in pairs(namespaceCategories) do if args[k .. ' category'] then return string.format("'''[[:Category:%s|%s]]''': ", args[k .. ' category'], args.name) end end return string.format("'''%s''': ", args.name) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Redirect template', valueFunc = valueFunc}) local namespace = mw.title.getCurrentTitle().namespace --- XXX: this is a HORRIBLE HACK. kill it with fire as soon as https://phabricator.wikimedia.org/T14974 is fixed --- [[phab:T14974]] was previously known as [[bugzilla:12974]] https://bugzilla.wikimedia.org/show_bug.cgi?id=12974 local beCompatibleWithBug14974 = args.info and (args.info:find('^[:;#*]', 1) == 1 or args.info:find('{|', 1, true) == 1) and '\n' or ' ' local content = string.format('\n<div class="rcat %s">\n*%sThis is a redirect%s%s.%s%s\n</div>', args.id and ('rcat-' .. string.gsub(args.id, ' ', '_')) or '', args.name and getPrettyName(args) or '', args.from and (' from ' .. args.from) or '', args.to and (' to ' .. args.to) or '', args.info and beCompatibleWithBug14974 or '', args.info or '' ) for k,v in pairs(namespaceCategories) do if args[k .. ' category'] then if type(v[1]) == 'function' and v[1](namespace) or v[1] == namespace then if args.sortkey then content = content .. string.format('[[Category:%s|%s]]', args[k .. ' category'], args.sortkey) else content = content .. string.format('[[Category:%s]]', args[k .. ' category']) end elseif args['other category'] then if args.sortkey then content = content .. string.format('[[Category:%s|%s]]', args['other category'], args.sortkey) else content = content .. string.format('[[Category:%s]]', args['other category']) end else content = content .. frame:expandTemplate{title = 'Incorrect redirect template', args = {v[2]}} end end end if namespace == 0 then local yesno = require('Module:Yesno') if yesno(args.printworthy) == true then return content .. '[[Category:Printworthy redirects]]' elseif yesno(args.printworthy) == false then return content .. '[[Category:Unprintworthy redirects]]' end end return content end return p 7vajdchxsgtfzfo0bbnl18pwnlasddx 307141 307140 2026-09-05T10:52:03Z Isma4l 41797 307141 Scribunto text/plain require('strict') local p = {} -- key is beginning of arg name. value is table with namespace number and link -- alternatively, a function taking the namespace number and returning a validity -- can be used local namespaceCategories = { all = { function() return true end }, main = { 0, '[[WP:Mainspace|main]]' }, help = { 12, '[[WP:Help namespace|help]]' }, portal = { 100, '[[WP:Portal|portal]]' }, mos = { 126, '[[WP:MOS namespace|MOS]]' }, talk = { function(n) return n > 0 and n%2 == 1 end, '[[Help:Talk pages|talk]]' }, template = { 10, '[[WP:Template namespace|template]]' }, wikipedia = { 4, '[[WP:Project namespace|Wikipedia project]]' }, category = { 14, '[[WP:Categorization|category]]' }, user = { 2, '[[WP:User pages|user]]' }, draft = { 118, '[[WP:Drafts|draft]]' }, } -- remove whitespaces from beginning and end of args local function valueFunc(key, val) if type(val) == 'string' then val = val:match('^%s*(.-)%s*$') if val == '' then return nil end end return val end local function getPrettyName(args) for k in pairs(namespaceCategories) do if args[k .. ' category'] then return string.format("'''[[:Category:%s|%s]]''': ", args[k .. ' category'], args.name) end end return string.format("'''%s''': ", args.name) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Redirect template', valueFunc = valueFunc}) local namespace = mw.title.getCurrentTitle().namespace --- XXX: this is a HORRIBLE HACK. kill it with fire as soon as https://phabricator.wikimedia.org/T14974 is fixed --- [[phab:T14974]] was previously known as [[bugzilla:12974]] https://bugzilla.wikimedia.org/show_bug.cgi?id=12974 local beCompatibleWithBug14974 = args.info and (args.info:find('^[:;#*]', 1) == 1 or args.info:find('{|', 1, true) == 1) and '\n' or ' ' local content = string.format('\n<div class="rcat %s">\n*%sKani waa sii toosin%s%s.%s%s\n</div>', args.id and ('rcat-' .. string.gsub(args.id, ' ', '_')) or '', args.name and getPrettyName(args) or '', args.from and (' from ' .. args.from) or '', args.to and (' to ' .. args.to) or '', args.info and beCompatibleWithBug14974 or '', args.info or '' ) for k,v in pairs(namespaceCategories) do if args[k .. ' category'] then if type(v[1]) == 'function' and v[1](namespace) or v[1] == namespace then if args.sortkey then content = content .. string.format('[[Category:%s|%s]]', args[k .. ' category'], args.sortkey) else content = content .. string.format('[[Category:%s]]', args[k .. ' category']) end elseif args['other category'] then if args.sortkey then content = content .. string.format('[[Category:%s|%s]]', args['other category'], args.sortkey) else content = content .. string.format('[[Category:%s]]', args['other category']) end else content = content .. frame:expandTemplate{title = 'Incorrect redirect template', args = {v[2]}} end end end if namespace == 0 then local yesno = require('Module:Yesno') if yesno(args.printworthy) == true then return content .. '[[Category:Printworthy redirects]]' elseif yesno(args.printworthy) == false then return content .. '[[Category:Unprintworthy redirects]]' end end return content end return p gcrrd13zk69wpondh5306icxb7mruik Beesha Iidle Biciide 0 40939 307114 305690 2026-09-04T22:04:57Z ~2026-48264-68 47260 /* */ 307114 wikitext text/x-wiki '''<big><u>BEESHA IIDLE BICIIDE (HABARJECLO)</u></big>''' Beesha Iidle Biciide waa beel ka tirsan Habar Jeclo Gaar ahaan Muuse Abokor. Waxa ay degaan degaano ka tirsan G.Sanaag. sida Ceel-Afweyn, Bixin, Biyo dhacay, Dhabar-Dalool, Suuf-Dheere iyo Ceerigabo. Waxa kaso jeeda beesha Siyaasiyiin, Saraakiil iyo cuqaal aad uga so dhex muuqday halgankii xornimo doonka somaliland. == Deegaannada ay degaan == Beesha Iidle Biciide waxaa lagu sheegaa inay degto deegaannadan: * Bixin * Suf-dheere * Biyo-dhacay * Garuuble * Dhabar-dalool * Ceel Afweyn * Ceerigaabo ■ '''IIDLE BICIIDE...''' == Jilibyada == Beesha Iidle Biciide waxay u kala baxdaa jilibyadan: * Rooble * Saalax * Wacays * Maxamed Cabdi * Xareed * Cabdulle Cabdi ■ <code>Reer Daahir</code> ■ <code>Reer Axmed</code> ■ <code>Reer Dhunkaall</code> == Dadka caanka ah == === MUJAAHIDIINTA === ● C/laahi Saalax Oogle ● Alyoos Jaamac Ducaale ● Yaasin Jaamac Ducaale PG ● Maxamed Cabdi Cabdulle === SIYAASIYIINTA === ● Siyaasi Ismaaciil Faarax Maxamed (DAD-QAL) Mid kamida Aasaasayaashi xisbigii UDUB ● Siyaasi Cismaan Faarax Maxamed (Hamasholl) ● Siyaasi Axmed Siciid Maxamed ( Godane) DG Agaasimaha Guud ee Ciyaara ● Xill-dhibaan Sahal Mire === MADAX DHAQAMEEDKA BEESHA === ● Chief Caaqil Faarax Maxamed Dhunkaall ● Cheif Caaqil Aadan cabdi ● Cheif Caaqil Cabdulle Cade ● Cheif Caaqil Cawl cabdulle nuur ● Caaqil Ismaaciil Aadan cabdi ● Caaqil Cali Axmed Weyrax ● Caaqil maxamed ismaaciil Aadan ● Caaqil Ismaaciil Axmed Weyrax ● Caaqil Cabdi cawl Cabdulle '''ODAYAASHA BEESHA''' ● Cawil Mire Rooble ● Maxamuud Faarax Maxamed (hurre) ● Cali Cismaan Faarax (Cali madoobe) ● Maxamed Siciid Maxamed ● Iiman Cabdi Cabdulle ● Aw salaad ● ismaaciil Xuseen Gabaydhe ( Baylood) ● Rashiid Faarax Maxamed ● Rashiid Gadhoodhsade ● Maxamed ciise ● Ibraahin Axmed Weyrax ● Xasan Caateeye Dhunkaall ● Goox cabdi ● Siciid Maxamed Aadan '''DHALINYARADA BEESHA''' ● Axmed Aadan 《GANACSADE 》 ● Yaasiin Maxamuud Faarax 《GANACSADE 》 ● Saleeban Maxamed Siciid 《GANACSADE 》 ● Naasir Cali Cismaan 《SIYAASI 》 ● Maxamed Faarax Darawal 《GANACSADE》 ● Saleeban Cabdullahi Cawed 《DR 》 ●Mukhtaar Maxamed Saalax 《ENGINEER 》 ● Maxamed Faarax Cali 《DR 》 ● Axmed Maxamuud Faarax 《GANACSADE 》 ● Nuux Hadhweyne 《ENGINEER 》 ● Cabdisalaan Jaamac Ciise 《DR 》 ● C/raxmaan xusen Aadan《GANACSADE 》 ● Maxamuud cilmi 《AQOONYAHAN 》 gowfvkl4vwyrndn6cix6b7c86vwj15f Module:Infobox3cols 828 42347 307151 281694 2026-09-05T11:28:52Z Isma4l 41797 307151 Scribunto text/plain local check_for_unknown_parameters = require("Module:Check for unknown parameters")._check local p = {} local args = {} local origArgs = {} local root local lists = { plainlist_t = { patterns = { '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found = false, styles = 'Plainlist/styles.css' }, hlist_t = { patterns = { '^hlist$', '%shlist$', '^hlist%s', '%shlist%s' }, found = false, styles = 'Hlist/styles.css' } } local function has_list_class(args_to_check) for _, list in pairs(lists) do if not list.found then for _, arg in pairs(args_to_check) do for _, pattern in ipairs(list.patterns) do if mw.ustring.find(arg or '', pattern) then list.found = true break end end if list.found then break end end end end end -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2) local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix, suffix) local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([0-9]%d*)' .. suffix .. '$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) if rowArgs.header then has_list_class({rowArgs.rowclass, rowArgs.class, args.headerclass}) root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan', '4') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num .. 'h']) :wikitext(rowArgs.header) elseif rowArgs.label then if rowArgs.data then has_list_class({rowArgs.rowclass, rowArgs.class}) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row :tag('th') :attr('scope', 'row') :addClass('infobox-label') :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num .. 'l']) :wikitext(rowArgs.label) :done() local dataCell = row:tag('td') dataCell :attr('colspan', '3') :addClass('infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num]) :newline() :wikitext(rowArgs.data) elseif rowArgs.dataa or rowArgs.datab or rowArgs.datac then has_list_class({rowArgs.rowclass, rowArgs.classa}) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row :tag('th') :attr('scope', 'row') :addClass('infobox-label') :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num .. 'l']) :wikitext(rowArgs.label) :done() local dataCella = row:tag('td') dataCella :addClass('infobox-data infobox-data-a') :addClass(rowArgs.classa) -- @deprecated next; target .infobox-<name> .infobox-data-a :cssText(rowArgs.dataastyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num .. 'a']) :newline() :wikitext(rowArgs.dataa) if rowArgs.renderb then has_list_class({rowArgs.classb}) local dataCellb = row:tag('td') dataCellb :addClass('infobox-data infobox-data-b') :addClass(rowArgs.classb) -- @deprecated next; target .infobox-<name> .infobox-data-b :cssText(rowArgs.databstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num .. 'b']) :newline() :wikitext(rowArgs.datab) end if rowArgs.renderc then has_list_class({rowArgs.classc}) local dataCellc = row:tag('td') dataCellc :addClass('infobox-data infobox-data-c') :addClass(rowArgs.classc) -- @deprecated next; target .infobox-<name> .infobox-data-c :cssText(rowArgs.datacstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num .. 'c']) :newline() :wikitext(rowArgs.datac) end end elseif rowArgs.data then has_list_class({rowArgs.rowclass, rowArgs.class}) local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) local dataCell = row:tag('td') dataCell :attr('colspan', '4') :addClass('infobox-full-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox-full-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num]) :newline() :wikitext(rowArgs.data) end end local function renderTitle() if not args.title then return end has_list_class({args.titleclass}) root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end local function renderAboveRow() if not args.above then return end has_list_class({args.aboveclass}) root :tag('tr') :tag('th') :attr('colspan', '4') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(args.above) end local function renderBelowRow() if not args.below then return end has_list_class({args.belowclass}) root :tag('tr') :tag('td') :attr('colspan', '4') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :newline() :wikitext(args.below) end local function addSubheaderRow(subheaderArgs) if not subheaderArgs.data then return end has_list_class({subheaderArgs.rowclass, subheaderArgs.class}) local row = root:tag('tr') row:addClass(subheaderArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '4') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :newline() :wikitext(subheaderArgs.data) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass end local subheadernums = getArgNums('subheader','') for k, num in ipairs(subheadernums) do addSubheaderRow({ data = args['subheader' .. tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle = args.subheaderstyle, rowcellstyle = args['subheaderstyle' .. tostring(num)], class = args.subheaderclass, rowclass = args['subheaderrowclass' .. tostring(num)] }) end end local function addImageRow(imageArgs) if not imageArgs.data then return end has_list_class({imageArgs.rowclass, imageArgs.class}) local row = root:tag('tr') row:addClass(imageArgs.rowclass) local dataCell = row:tag('td') dataCell :attr('colspan', '4') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :newline() :wikitext(imageArgs.data) end local function renderImages() if args.image then args.image1 = args.image end if args.caption then args.caption1 = args.caption end local imagenums = getArgNums('image','') for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)]) if caption then data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data = tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle = args.imagestyle, class = args.imageclass, rowclass = args['imagerowclass' .. tostring(num)] }) end end -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows() local rownums = union(getArgNums('header',''), getArgNums('data','[abc]?')) local datab_count = #(getArgNums('data','b')) local datac_count = #(getArgNums('data','c')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ num = tostring(num), renderb = datab_count > 0, renderc = datac_count > 0, header = args['header' .. tostring(num)], label = args['label' .. tostring(num)], data = args['data' .. tostring(num)], datastyle = args.datastyle, class = args['class' .. tostring(num)], dataa = args['data' .. tostring(num) .. 'a'], dataastyle = args.datastylea, classa = args['class' .. tostring(num) .. 'a'], datab = args['data' .. tostring(num) .. 'b'], databstyle = args.datastyleb, classb = args['class' .. tostring(num) .. 'b'], datac = args['data' .. tostring(num) .. 'c'], datacstyle = args.datastylec, classc = args['class' .. tostring(num) .. 'c'], rowclass = args['rowclass' .. tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle = args['rowstyle' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)], }) end end local function renderNavBar() if not args.name then return end root :tag('tr') :tag('td') :attr('colspan', '4') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then root:wikitext(require('Module:Italic title')._main({})) end end -- Render tracking categories. args.decat == turns off tracking categories. local function renderTrackingCategories() local title = mw.title.getCurrentTitle() if args.decat == 'yes' then return end if #(getArgNums('data','[abc]?')) == 0 and title.namespace == 0 then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end root:wikitext(check_for_unknown_parameters({ ['unknown'] = mw.getCurrentFrame():expandTemplate{ title = 'main other', args = {'[[Category:Pages using infobox3cols with unknown parameters|_VALUE_"' .. title.text .. ']]'} }, ['preview'] = 'Page using [[Template:infobox3cols]] with unknown parameter "_VALUE_"', ['ignoreblank'] = 'y', regexp1 = "header[%d]+", regexp2 = "label[%d]+", regexp3 = "data[%d]+[abc]?", regexp4 = "class[%d]+[abc]?", regexp5 = "rowclass[%d]+", regexp6 = "rowstyle[%d]+", regexp7 = "rowcellstyle[%d]+", regexp8 = "subheader[1]?[0-9]?", regexp9 = "subheaderrowclass[1]?[0-9]?", "above", "aboveclass", "aboverowclass", "abovestyle", "below", "belowclass", "belowrowclass", "belowstyle", "bodyclass", "bodystyle", "caption", "caption1", "caption2", "captionstyle", "child", "datastyle", "datastylea", "datastyleb", "datastylec", "extracellstyles", "headerstyle", "image", "image1", "image2", "imageclass", "imagerowclass1", "imagerowclass2", "imagestyle", "labelstyle", "name", "subbox", "subheaderstyle", "templatestyles", "title", "titleclass", "titlestyle" }, origArgs)) if origArgs.header0 or origArgs.label0 or origArgs.data0 or origArgs.data0a or origArgs.data0b or origArgs.data0c or origArgs.class0 or origArgs.rowclass0 then root:wikitext("[[Category:Pages using infobox3cols with header0 or label0 or data0]]") end if title.namespace == 10 and mw.ustring.sub(title.text, 1, 7) == "Infobox" then root:wikitext("[[Category:Infobox templates|" .. mw.ustring.sub(title.text, 9) .. "]]") end end --[=[ Loads the templatestyles for the infobox. TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar. ]=] local function loadTemplateStyles() local frame = mw.getCurrentFrame() local hlist_templatestyles = '' if lists.hlist_t.found then hlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.hlist_t.styles } } end local plainlist_templatestyles = '' if lists.plainlist_t.found then plainlist_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = lists.plainlist_t.styles } } end -- See function description local base_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } } local templatestyles = '' if args['templatestyles'] then templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['templatestyles'] } } end local child_templatestyles = '' if args['child templatestyles'] then child_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['child templatestyles'] } } end local grandchild_templatestyles = '' if args['grandchild templatestyles'] then grandchild_templatestyles = frame:extensionTag{ name = 'templatestyles', args = { src = args['grandchild templatestyles'] } } end return table.concat({ -- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering. -- this ordering is not a guarantee because the rows of interest invoking -- each class may not be on a specific page hlist_templatestyles, plainlist_templatestyles, base_templatestyles, templatestyles, child_templatestyles, grandchild_templatestyles }) end -- common functions between the child and non child cases local function structure_infobox_common() renderSubheaders() renderImages() -- preprocessRows() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() -- renderEmptyRowCategories() renderTrackingCategories() -- cleanInfobox() end -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() root = mw.html.create('table') has_list_class({args.bodyclass}) root :addClass((args.child == 'yes' or args.subbox == 'yes') and 'infobox-subbox' or 'infobox') :addClass(args.child == 'yes' and 'infobox-3cols-child' or nil) -- avoid https://phabricator.wikimedia.org/F55300125 :addClass('infobox-table') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() structure_infobox_common() return loadTemplateStyles() .. tostring(root) end -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) if type(prefixTable) ~= 'table' then error("Non-table value detected for the prefix table", 2) end if type(step) ~= 'number' then error("Invalid step value detected", 2) end -- Get arguments without a number suffix, and check for bad input. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Invalid input detected to preprocessArgs prefix table', 2) end preprocessSingleArg(v.prefix) -- Only parse the depend parameter if the prefix parameter is present -- and not blank. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. local a = 0 -- Counter variable. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) .. (v.suffix or '') if origArgs[prefixArgName] then -- Do another loop if any arguments are found, even blank ones. moreArgumentsExist = true preprocessSingleArg(prefixArgName) end -- Process the depend table if the prefix argument is present -- and not blank, or we are processing "prefix1" and "prefix" is -- present and not blank, and if the depend table is present. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) .. (v.dependsuffix or '') preprocessSingleArg(dependArgName) end end end end a = a + step end end -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters() preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessSingleArg('image') preprocessSingleArg('caption') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'data', suffix = 'a', depend = {'label'}}, {prefix = 'data', suffix = 'a'}, {prefix = 'data', suffix = 'b', depend = {'label'}}, {prefix = 'data', suffix = 'b'}, {prefix = 'data', suffix = 'c', depend = {'label'}}, {prefix = 'data', suffix = 'c'}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'class', suffix = 'a'}, {prefix = 'class', suffix = 'b'}, {prefix = 'class', suffix = 'c'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('datastylea') preprocessSingleArg('datastyleb') preprocessSingleArg('datastylec') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title'] = origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') args['extracellstyles'] = {} for line in mw.text.gsplit(origArgs['extracellstyles'] or '', '\n') do local equals = line:find('=') if equals then for i in mw.text.gsplit(line:sub(1, equals - 1), '%s*,%s*') do args.extracellstyles[i] = line:sub(equals + 1) end end end end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end parseDataParameters() return _infobox() end -- For calling via #invoke within a template function p.infoboxTemplate(frame, extra_args) origArgs = extra_args or {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end parseDataParameters() return _infobox() end -- Shortcut for making child infoboxes via #invoke. function p.child(frame) return p.infoboxTemplate(frame, {child = "yes"}) end return p koel0uj7ch2jol6ermjr8okirt90pi7 Talk:Somali Formal Education Network 1 42464 307077 282228 2026-09-04T13:11:03Z Isma4l 41797 /* */ 307077 wikitext text/x-wiki #REDIRECT [[Shabakadda Waxbarashada Rasmiga ah ee Soomaaliyeed]] ogii4b7ky61sdmnwuiakavxm8u2v2zf Template:Routemap/styles.css 10 42597 307130 283370 2026-09-05T10:18:40Z Isma4l 41797 307130 sanitized-css text/css /* {{pp-template}} */ /* container */ .RMbox { box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12), 0 3px 1px -2px rgba(0,0,0,.2); } .RMinline { float: none; width: 100%; margin: 0; border: none; } .RMmaptitle { background: #EEEEEE; color: #252525; } .RMtitle a, .RMtitle a:visited, .RMmaptitle a, .RMmaptitle a:visited { color: inherit !important; } .RMbox small, .RMinline small { color: inherit; } /* diagram table */ table.routemap { padding: 0; border: 0; border-collapse: collapse; white-space: nowrap; line-height: 1.2; margin: auto; } /* collapsible section tables */ table.routemap .RMcollapse { margin: 0; border-collapse: collapse; vertical-align: middle; } /* collapsible section row replacement tables */ table.routemap .RMreplace { margin: 0; border-collapse: collapse; vertical-align: middle; position: absolute; bottom: 0; } /* small text in side cells */ table.routemap .RMsi { display: inline; /* HTML Tidy forced the use of div instead of span */ font-size: 90%; } /* icon row container */ table.routemap .RMir { padding: 0 !important; } /* first left cell */ table.routemap .RMl1 { padding: 0 3px !important; text-align: left; } /* first right cell */ table.routemap .RMr1 { padding: 0 3px !important; text-align: right; } /* main left cell */ table.routemap .RMl { padding: 0 !important; text-align: right; } /* main right cell */ table.routemap .RMr { padding: 0 !important; text-align: left; } /* leftmost cell */ table.routemap .RMl4 { padding: 0 3px 0 0 !important; text-align: left; } /* rightmost cell */ table.routemap .RMr4 { padding: 0 0 0 3px !important; text-align: right; } /* table rows */ table.routemap > tbody > tr { line-height: 1; } /* all table cells */ table.routemap > tbody > tr > td, table.RMcollapse > tbody > tr > td, table.RMreplace > tbody > tr > td{ padding: 0; width: auto; vertical-align: middle; text-align: center; } /* icon row inline divs */ .RMir > div { display: inline-block; vertical-align: middle; padding: 0; height: 20px; min-height: 20px; } /* icons */ .RMir img { height: initial !important; /* Monobook uses !important */ max-width: initial !important; /* Monobook uses !important */ } /* text cells */ .RMir .RMtx { line-height: 20px; height: 20px; min-height: 20px; vertical-align: middle; text-align: center; } /* empty cells */ .RMir .RMsp { height: 20px; min-height: 20px; } /* text in text cells */ .RMir .RMtx > abbr, .RMir .RMtx > div { line-height: .975; display: inline-block; vertical-align: middle; } .RMbox .navbar-brackets a, .RMbox .navbar-brackets a:visited, .RMbox .navbar-brackets a abbr, .RMinline .navbar-brackets a, .RMinline .navbar-brackets a:visited, .RMinline .navbar-brackets a abbr { color: inherit !important; } /* overlap containers */ .RMir .RMov { position: relative; } /* overlap icons and text cells */ .RMir .RMov .RMic, .RMir .RMov .RMtx { position: absolute; left: 0; top: 0; padding: 0; } /* small text */ .RMir .RMts { font-size: 90%; transform: scaleX(.89); } /* filler cells */ .RMir .RMf_ { height: 5px; min-height: 5px; width: 20px; min-width: 20px; } /* "line" in filler cells */ .RMir .RMfm { height: 100%; min-height: 100%; width: 4px; min-width: 4px; margin: 0 auto; } /* widths */ .RMir .RMo{width:2.5px;min-width:2.5px} .RMir .RMc{width:5px;min-width:5px} .RMir .RMoc{width:7.5px;min-width:7.5px} .RMir .RMd{width:10px;min-width:10px} .RMir .RMod{width:12.5px;min-width:12.5px} .RMir .RMcd{width:15px;min-width:15px} .RMir .RMocd{width:17.5px;min-width:17.5px} .RMir .RM_{width:20px;min-width:20px} .RMir .RM_o{width:22.5px;min-width:22.5px} .RMir .RM_c{width:25px;min-width:25px} .RMir .RM_oc{width:27.5px;min-width:27.5px} .RMir .RM_d{width:30px;min-width:30px} .RMir .RM_od{width:32.5px;min-width:32.5px} .RMir .RM_cd{width:35px;min-width:35px} .RMir .RM_ocd{width:37.5px;min-width:37.5px} .RMir .RMb{width:40px;min-width:40px} .RMir .RMcb{width:45px;min-width:45px} .RMir .RMdb{width:50px;min-width:50px} .RMir .RMcdb{width:55px;min-width:55px} .RMir .RM_b{width:60px;min-width:60px} .RMir .RM_cb{width:65px;min-width:65px} .RMir .RM_db{width:70px;min-width:70px} .RMir .RM_cdb{width:75px;min-width:75px} .RMir .RMs{width:80px;min-width:80px} .RMir .RMds{width:90px;min-width:90px} .RMir .RM_s{width:100px;min-width:100px} .RMir .RM_ds{width:110px;min-width:110px} .RMir .RMbs{width:120px;min-width:120px} .RMir .RMdbs{width:130px;min-width:130px} .RMir .RM_bs{width:140px;min-width:140px} .RMir .RM_dbs{width:150px;min-width:150px} .RMir .RMw{width:160px;min-width:160px} .RMir .RM_w{width:180px;min-width:180px} .RMir .RMbw{width:200px;min-width:200px} .RMir .RM_bw{width:220px;min-width:220px} .RMir .RMsw{width:240px;min-width:240px} .RMir .RM_sw{width:260px;min-width:260px} .RMir .RMbsw{width:280px;min-width:280px} .RMir .RM_bsw{width:300px;min-width:300px} /* BSsplit, BSto, BScvt, BSsrws */ .RMsplit { font-weight: inherit; color: inherit; background: transparent; margin-top: -3px; margin-bottom: -3px; width: initial !important; box-sizing: initial; display: inline-table; vertical-align: middle; } /* BSsplit, etc., when used in main left cell or main right cell */ table.routemap .RMl > .RMsplit, table.routemap .RMr > .RMsplit { font-size: 90%; } @media screen { html.skin-theme-clientpref-night .RMbox, html.skin-theme-clientpref-night .RMinline { background: inherit !important; color: white; } html.skin-theme-clientpref-night .RMbox th, html.skin-theme-clientpref-night .RMinline th { background: inherit !important; color: inherit !important; border-bottom: solid 1px #be2d2c; } html.skin-theme-clientpref-night .RMbox img, html.skin-theme-clientpref-night .RMinline img { filter: contrast(0.4); } } @media screen and (prefers-color-scheme: dark) { html.skin-theme-clientpref-os .RMbox, html.skin-theme-clientpref-os .RMinline { background: inherit !important; color: white; } html.skin-theme-clientpref-os .RMbox th, html.skin-theme-clientpref-os .RMinline th { background: inherit !important; color: inherit !important; border-bottom: solid 1px #be2d2c; } html.skin-theme-clientpref-os .RMbox img, html.skin-theme-clientpref-os .RMinline img { filter: contrast(0.4); } } 2r5jxnxzhnbxad08vr3r17dzsh1wen0 Module:Navbox/configuration 828 44161 307134 288454 2026-09-05T10:29:27Z Isma4l 41797 307134 Scribunto text/plain return { aria_label = 'Navbox', nowrap_item = '%s<span class="nowrap">%s</span>', templatestyles = mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Module:Navbox/styles.css' } }, hlist_templatestyles = 'Hlist/styles.css', plainlist_templatestyles = 'Plainlist/styles.css', -- do not localize marker table marker = { oddeven = '\127_ODDEVEN_\127', restart = '\127_ODDEVEN0_\127', regex = '\127_ODDEVEN(%d?)_\127' }, category = { orphan = '[[Category:Navbox orphans]]', horizontal_lists = 'Navigational boxes without horizontal lists', background_colors = 'Navboxes using background colours', illegible = 'Potentially illegible navboxes', borders = 'Navboxes using borders', without_first_col = '[[Category:Pages using navbox columns without the first column]]' }, keyword = { border_subgroup = 'subgroup', border_child = 'child', border_none = 'none', evenodd_swap = 'swap', navbar_off = 'off', navbar_plain = 'plain', nocat_false = 'false', nowrapitems_yes = 'yes', orphan_yes = 'yes', state_collapsed = 'collapsed', state_off = 'off', state_plain = 'plain', state_uncollapsed = 'uncollapsed', subgroups = {'subgroup', 'child', ''}, subpage_doc = 'doc', subpage_sandbox = 'sandbox', subpage_testcases = 'testcases', tracking_no = 'no', with_collapsible_groups = 'with collapsible groups', with_collapsible_groups_short = 'collapsible', with_columns = 'with columns', with_columns_short = 'columns', }, class = { autocollapse = 'autocollapse', collapsible = 'mw-collapsible', collapsed = 'mw-collapsed', -- Warning navbox = 'navbox', -- WMF currently hides 'navbox' from mobile, -- so you probably shouldn't change the navbox class. navbox_abovebelow = 'navbox-abovebelow', navbox_group = 'navbox-group', navbox_image = 'navbox-image', navbox_inner = 'navbox-inner', navbox_list = 'navbox-list', navbox_list_with_group = 'navbox-list-with-group', navbox_part = 'navbox-', -- do not l10n navbox_styles = 'navbox-styles', navbox_subgroup = 'navbox-subgroup', navbox_title = 'navbox-title', -- l10n only if you change pattern.navbox_title below navbox_odd_part = 'odd', -- do not l10n navbox_even_part = 'even', -- do not l10n nomobile = 'nomobile', nowraplinks = 'nowraplinks', noviewer = 'noviewer', -- used to remove images from MediaViewer notheme = 'notheme' }, pattern = { class = 'class', colnum = '^col(%d+)$', colheadernum = '^col(%d+)header$', colfooternum = '^col(%d+)footer$', contentnum = '^content(%d+)$', groupnum = '^group(%d+)$', hlist = 'hlist', listnum = '^list(%d+)$', navbox = 'Template:Navbox', navbox_title = '<th[^>]*"navbox%-title"', nowrap = '^<span class="nowrap">', num = '^%a+(%d+)$', plainlist = 'plainlist', sandbox = '/sandbox$', sectionnum = '^section(%d+)$', sectnum = '^sect(%d+)$', style = 'style$', with_collapsible_groups = 'Template:Navbox with collapsible groups', with_columns = 'Template:Navbox with columns', }, arg = { abbr_and_num = 'abbr%d', above = 'above', aboveclass = 'aboveclass', abovestyle = 'abovestyle', basestyle = 'basestyle', below = 'below', belowclass = 'belowclass', belowstyle = 'belowstyle', bodyclass = 'bodyclass', bodystyle = 'bodystyle', border = 'border', content_and_num = 'content%d', contentstyle = 'contentstyle', contentstyle_and_num = 'content%dstyle', colheaderstyle = 'colheaderstyle', colheader_and_num = 'col%dheader', colheaderstyle_and_num = 'col%dheaderstyle', colheadercolspan_and_num = 'col%dheadercolspan', colstyle = 'colstyle', col_and_num = 'col%d', colstyle_and_num = 'col%dstyle', colwidth = 'colwidth', colwidth_and_num = 'col%dwidth', colfooterstyle = 'colfooterstyle', colfooter_and_num = 'col%dfooter', colfooterstyle_and_num = 'col%dfooterstyle', colfootercolspan_and_num = 'col%dfootercolspan', coltablestyle = 'coltablestyle', evencolstyle = 'evencolstyle', evenodd = 'evenodd', evenstyle = 'evenstyle', fullwidth = 'fullwidth', group1 = 'group1', group2 = 'group2', group_and_num = 'group%d', groupclass = 'groupclass', groupstyle = 'groupstyle', groupstyle_and_num = 'group%dstyle', groupwidth = 'groupwidth', image = 'image', image_and_num = 'image%d', imageclass = 'imageclass', imageleft = 'imageleft', imageleft_and_num = 'imageleft%d', imageleftstyle = 'imageleftstyle', imagestyle = 'imagestyle', innerstyle = 'innerstyle', list1padding = 'list1padding', list_and_num = 'list%d', listclass = 'listclass', listclass_and_num = 'list%dclass', listpadding = 'listpadding', liststyle = 'liststyle', liststyle_and_num = 'list%dstyle', name = 'name', navbar = 'navbar', navboxclass = 'navboxclass', nocat = 'nocat', nowrapitems = 'nowrapitems', oddcolstyle = 'oddcolstyle', oddstyle = 'oddstyle', orphan = 'orphan', padding = 'padding', sect_and_num = 'sect%d', section_and_num = 'section%d', sectiontitlestyle_and_num = 'section%dtitlestyle', secttitlestyle = 'secttitlestyle', selected = 'selected', state = 'state', state_and_num = 'state%d', style = 'style', subgroups_and_num = {'subgroup%d', 'child%d', '%d'}, templatestyles = 'templatestyles', child_templatestyles = 'child templatestyles', title = 'title', titleclass = 'titleclass', titlestyle = 'titlestyle', tracking = 'tracking', }, -- names of navbar arguments navbar = { name = 1, fontstyle = 'fontstyle', mini = 'mini' } } hfe9tuviwm23frg4eyuetl5fcr6lsto Module:Navbox/styles.css 828 44163 307135 288459 2026-09-05T10:31:44Z Isma4l 41797 307135 sanitized-css text/css /* {{pp|small=y}} */ .navbox { box-sizing: border-box; border: 1px solid #a2a9b1; width: 100%; clear: both; font-size: 88%; text-align: center; padding: 1px; margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */ } .navbox .navbox { margin-top: 0; /* No top margin for nested navboxes */ } .navbox + .navbox-styles + .navbox, /* category positions are wrapped in an "empty" span in Parsoid [[phab:T378906]] */ .navbox + span.mw-empty-elt + .navbox-styles + .navbox { margin-top: -1px; /* Single pixel border between adjacent navboxes */ } .navbox-inner, .navbox-subgroup { width: 100%; } .navbox-group, .navbox-title, .navbox-abovebelow { padding: 0.25em 1em; line-height: 1.5em; text-align: center; } .navbox-group { white-space: nowrap; /* @noflip */ text-align: right; } .navbox, .navbox-subgroup { background-color: #fdfdfd; color:inherit; } .navbox-list { line-height: 1.5em; border-color: #fdfdfd; /* Must match background color */ } .navbox-list-with-group { text-align: left; border-left-width: 2px; border-left-style: solid; } /* cell spacing for navbox cells */ /* Borders above 2nd, 3rd, etc. rows */ /* TODO: figure out how to replace tr as structure; * with div structure it should be just a matter of first-child */ tr + tr > .navbox-abovebelow, tr + tr > .navbox-group, tr + tr > .navbox-image, tr + tr > .navbox-list { border-top: 2px solid #fdfdfd; /* Must match background color */ } .navbox-title { background-color: #ccf; /* Level 1 color */ color:inherit; } .navbox-abovebelow, .navbox-group, .navbox-subgroup .navbox-title { background-color: #ddf; /* Level 2 color */ color:inherit; } .navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow { background-color: #e6e6ff; /* Level 3 color */ color:inherit; } .navbox-even { background-color: #f7f7f7; color:inherit; } .navbox-odd { background-color: transparent; color:inherit; } /* TODO: figure out how to remove reliance on td as structure */ .navbox .hlist td dl, .navbox .hlist td ol, .navbox .hlist td ul, .navbox td.hlist dl, .navbox td.hlist ol, .navbox td.hlist ul { padding: 0.125em 0; } .navbox .navbar { display: block; font-size: 100%; } .navbox-title .navbar { /* @noflip */ float: left; /* @noflip */ text-align: left; /* @noflip */ margin-right: 0.5em; } /** T367463 */ body.skin--responsive .navbox-image img { max-width: none !important; } @media print { body.ns-0 .navbox { display: none !important; } } ku94g873nj9xaasowc6yies69ls74c5 Faze 0 44946 307119 290351 2026-09-05T04:36:29Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307119 wikitext text/x-wiki {{Infobox musical artist |image = |image_size = |name = Faze ||caption = |background = solo_singer |birth_name = Chibuzor Oji |origin = [[Delta State]], Nigeria |genre = {{hlist|[[Contemporary R&B|R&B]]|[[reggae]]|[[Nigerian hip hop]]}} |occupation = {{hlist|Fanaan | heesaa | soo saare rikoodh | jilaa}} |years_active = 1995–hadda |label = {{flatlist| *[[Diiwaanada Westside]] (2004–2006 *[[Madadaalada Madaxbannaan]](2006–hadda) }} |associated_acts = {{hlist|[[Plantashun Boyz]]|[[Ruggedman]]|[[2Baba]]|[[BlackFace Naija]]|Shiinaha Afrika |[[MC Loph]]|[[Wyclef Jean]]|[[Sound Sultan]]|[[Akon]]|[[Busta Rhymes]]|[[Mode 9]]}} |website = }} '''Chibuzor Oji''' , oo si fiican loogu yaqaan masraxa magaciisa Faze , waa muusikiiste reer Nigeria ah iyo jilaa. Waxa uu xubin ka ahaa kooxdii burburtay ee hip hop-ka Nigeria Plantashun Boiz , oo ay weheliyaan BlackFace Naija iyo 2face Idibia . Kooxdu waxay kala qaybsameen 2004tii, xubin kasta oo kooxda ka mid ahina waxa uu u dhaqaaqay inuu bilaabo xirfado keligiis ah. ==Nolosha hore== Chibuzor Oji wuxuu ku dhashay 1977 Festac Town, Lagos State , koonfur-galbeed Nigeria. Oji waa qoyskii afaraad ee ka kooban sagaal carruur ah. Dhammaan xubnaha qoyska ayaa la sheegay inay haystaan ​​heeso wanaagsan oo heeso ah oo ay ku dhammaystiran yihiin wakhtiga dheer ee lagu qaatay heeso ammaan ah inta lagu jiro salaadda. Oji wuxuu sameeyay isku daygiisii ​​ugu horreeyay ee uu ku kasbado sumcad markii uu ku guuleystay 1994 DBN Karaoke. Waxa uu ku ciyaaray sidii muusikiiste rap ah magaca Lyrical Orge ilaa uu ku biiray Plantashun Boiz . Faze waxa uu sii daayay dadaalkiisii ​​ugu horeeyay ee uu cinwaan uga dhigay "Faze Alone" rubucii u dambeeyay ee 2004. Hit songs "Faze Alone", "Angel Gabriella", "Miss U" iyo "Na True" waxay gaareen meelaha ugu sarreeya jaantusyada muusigga ee kala duwan. Astaantiisa muusigga ee loogu yeero dhadhan caalami ah - isku dhafka wanaagsan ee R&B, Reggae, Pop, Dancehall, Ragga iyo Soul, oo dhammaantood leh hal-abuur Afrikaan ah ayaa sii daayay albamka. ==Tixraac== [https://www.withinnigeria.com/entertainment/2021/02/07/fazes-amazing-records-music-career-wife-and-full-bio/ "Diiwaanka Cajiibka ah ee Faze, Xirfadda Muusiga, Xaas iyo Biyo Buuxa"] {{Wayback|url=https://www.withinnigeria.com/entertainment/2021/02/07/fazes-amazing-records-music-career-wife-and-full-bio/ |date=20231108002724 }} [https://www.sunnewsonline.com/why-i-disappeared-from-the-music-scene-faze/ "Waa maxay sababta aan uga lumay goobta muusiga - Faze"] [https://www.bellanaija.com/2011/04/amstel-malta-box-office-ambo-5-winner-ivie-okujaye-makes-her-big-screen-debut-alongside-faze-in-%e2%80%9calero%e2%80%99s-symphony%e2%80%9d/ "Amstel Malta Box Office - Guuleystaha AMBO 5, Ivie Okujaye ayaa soo bandhigtay shaashadeeda ugu horeysay oo ay weheliso Faze ee "Alero's Symphony"] 2wscvda5f75drw74dmq1gnuanjt13hy Duma Ndlovu 0 46086 307117 292343 2026-09-05T04:02:48Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307117 wikitext text/x-wiki {{Infobox person | name = Duma Ndlovu | birth_name = Duma Reggie Ndlovu | birth_date = {{Birth date and age|df=y|1954|10|12}} | birth_place = [[Taung]], [[North West (South African province)|North West]], [[South Africa]] | notable works = {{flatlist| * Sheekooyinka Bergville * Ciyaarta * Umkhokha: Habaarkii ''[[Muvhango]]'' "[[Uzalo]]" }} | nationality = Koonfur Afrika | education = Dugsiga Sare ee Sekano Ntoane | alma_mater = [[Kulliyadda Hunter]] | occupation = {{flatlist| * Soo-saare * agaasime * qoraa shaashad * gabyaa * qoraa riwaayad * wariye }} | years_active = 1992–hadda }} '''Duma Ndlovu''' (wuxuu dhashay 12 Oktoobar 1954) waa gabyaa Koonfur Afrikaan ah, filim sameeye, soo saare, wariye iyo qoraa riwaayadeed. Waa nin caan ku ah warshadaha telefishanka Koonfur Afrika, isagoo sameeyay bandhigyo abaalmarino ku guuleystay sida Muvhango , Imbewu: The Seed iyo Uzalo Intii u dhaxaysay 1996 iyo 2004 wuxuu ahaa guddoomiyaha Abaalmarinta Muusiga Koonfur Afrika . ==Nolosha hore== Duma Ndlovu wuxuu ka soo jeedaa Zulu , wuxuuna ku dhashay Taung, Waqooyi Galbeed ; si kastaba ha ahaatee, gurigii awoowayaashiis wuxuu ku yaal Bergville, KwaZulu-Natal Wuxuu dhiganayay Dugsiga Sare ee Sekano Ntoane ee Senaoane Markii uu dhammeeyay dugsiga sare wuxuu bilaabay inuu wax u qoro wargeyska The World Kadib wuxuu aasaasay Ururka Qorayaasha Medupe, oo ah koox dhiirigelisa dhalinyarada madow inay xiiseeyaan inay noqdaan qoraayaal. Wuxuu ahaa madaxweynaha ururka ilaa 1977-kii markii dowladdii midab takoorka ay mamnuucday kooxda sababtoo ah ka qaybgalkeeda miyir-qabka madow iyo dhaqdhaqaaqyada ka dhanka ah midab takoorka ==Tixraac== [https://web.archive.org/web/20210411001857/https://www.artlink.co.za/news_article.htm?contentID%3D3963&grqid=-qE2PWzx&s=1&hl=en-ZA "Duma Ndlovu wuxuu agaasimayaa Tiyaatarka Dowladda"] [http://www.kzntopbusiness.co.za/site/kzn-chamber-news-desk/view/6946/3946/2016/11/10/The_Playhouse_Company__Duma_Ndlovus_The_Game_for_Playhouse_Company_festive_season/print/&grqid=Ri03L7qV&s=1&hl=en-ZA "Shirkadda Playhouse Duma Ndlovus Ciyaarta Shirkadda Playhouse xilli ciyaareedka"] {{Wayback|url=http://www.kzntopbusiness.co.za/site/kzn-chamber-news-desk/view/6946/3946/2016/11/10/The_Playhouse_Company__Duma_Ndlovus_The_Game_for_Playhouse_Company_festive_season/print/%26grqid%3DRi03L7qV%26s%3D1%26hl%3Den-ZA |date=20210411001857 }} 6wuwqvjt8arf620foakwkcehori6ql4 Module:Portal/styles.css 828 46357 307142 292917 2026-09-05T10:54:19Z Isma4l 41797 307142 sanitized-css text/css /* {{pp-template}} */ .portalbox { padding: 0; /* Timeless adds padding */ margin: 0.5em 0; display: table; box-sizing: border-box; max-width: 175px; list-style: none; } .portalborder { border: 1px solid var(--border-color-base, #a2a9b1); padding: 0.1em; background: var(--background-color-neutral-subtle, #f8f9fa); } .portalbox-entry { display: table-row; font-size: 85%; line-height: 110%; height: 1.9em; /* sets min height */ font-style: italic; font-weight: bold; } .portalbox-image { display: table-cell; padding: 0.2em; vertical-align: middle; text-align: center; } .portalbox-link { display: table-cell; padding: 0.2em 0.2em 0.2em 0.3em; vertical-align: middle; } @media (min-width: 640px) { .portalleft { margin: 0.5em 1em 0.5em 0 } .portalright { clear: right; float: right; margin: 0.5em 0 0.5em 1em } } gszg9brt292ix6gkcvtgo2wxtp88w4f Mashruuca Dekedda Rakaabka iyo Doonta RoRo ee Zanzibar 0 47639 307123 302663 2026-09-05T07:35:55Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307123 wikitext text/x-wiki {{Infobox building | name = Zanzibar Passenger and RoRo Ferry Terminal Project | image = Zanzibar Ferry Terminal Rendering.jpg | image_size = 300px | caption = Muqaalka naqshadda dekedda la qorsheeyay, Zanzibar | location = Maruhubi (Mpigaduri), [[Unguja]], [[Zanzibar]], [[Tanzania]] | coordinates = | groundbreaking_date = November 2024 | completion_date = 2027 (la qiyaasay) | cost = US$250 milyan (Wajiga A) | developer = [https://www.zfdevco.com/ Zanzibar Ferry Development Company (ZF Devco b.v.)] | building_type = Dekedda rakaabka iyo doomaha RoRo feri | size = 29 Ha | seating_capacity = 3 milyan oo rakaab ah sanadkii | owner = [https://www.zpc.go.tz/ Zanzibar Ports Corporation] }} Mashruuca '''Zanzibar Passenger and RoRo Ferry Terminal Project''' (sidoo kale loo yaqaano '''Maruhubi Ferry Terminal Project''') waa horumarinta kaabayaasha dhaqaalaha oo ku salaysan [[public–private partnership|iskaashiga dawladda iyo gaarka loo leeyahay (PPP)]] ee Maruhubi (Mpigaduri), oo ku taal [[Unguja|Jasiiradda Unguja]], Zanzibar, Tanzania. Mashruucan waxaa hormuud ka ah shirkadda Zanzibar Ferry Development Company (ZF Devco b.v.)<ref>{{Cite web|url=https://www.zfdevco.com/|title=ZF Devco|date=October 6, 2025|website=ZF Devco}}</ref> iyadoo [[partnership|iskaashi]] la samaynaysa [[Revolutionary Government of Zanzibar|Dawladda Kacaanka ee Zanzibar]] iyada oo loo marayo Shirkadda Dekedaha Zanzibar (Zanzibar Ports Corporation).<ref>{{Cite web|url=https://www.zpc.go.tz/|title=Zanzibar Ports Cooperation|website=www.zpc.go.tz}}{{Dead link|date=Bisha Todobaad 2026 |bot=InternetArchiveBot |fix-attempted=yes }}</ref> Waa qayb ka mid ah barnaamijka ballaaran ee dawladda ee lagu casriyeynayo [[maritime transport|gaadiidka badda]] iyo in lagu hagaajiyo xiriirka ka dhexeeya Zanzibar iyo dhul-waynaha Tanzania.<ref>{{Cite magazine |date=2024-08-20 |title=Dutch entity to construct a new terminal in Zanzibar |url=https://magazine.feaffa.com/dutch-entity-to-construct-a-new-terminal-in-zanzibar/ |access-date=2025-10-10 |website=Freight Logistics Magazine |language=en-US}}</ref><ref>{{Cite news |date=2024-02-05 |title=Dutch company to build ferry terminal in Tanzania |url=https://www.constructionbriefing.com/news/dutch-company-to-build-ferry-terminal-in-tanzania/8034876.article |access-date=2025-10-10 |website=Construction Briefing |language=en}}</ref> == Taariikhda == Dawladdu waxay u qoondeysay qiyaastii US$250 milyan deked cusub oo rakaab ah oo laga dhisayo Maruhubi si loo yareeyo culeyska saaran Malindi loona u hoggaansamo heerarka caalamiga ah.<ref name="The-Guardian-Zanzibar-2025">{{cite news |title=Zanzibar sets out $250m for modernised passenger port |url=https://www.ippmedia.com/the-guardian/news/local-news/read/zanzibar-sets-out-250m-for-modernised-passenger-port-2025-08-28-083139 |publisher=The Guardian (Zanzibar) |date=28 August 2025 |access-date=6 October 2025}}</ref> Maamulka ayaa rajeynaya in marka la gaaro sanadka 2027 dhammaan hawlihii rakaabka ee hadda laga fulin jiray Malindi loo wareejin doono dekedda cusub ee Maruhubi.<ref name="Daily-News-2025">{{cite news |title=Zanzibar charts path to become EA new trade hub |url=https://dailynews.co.tz/zanzibar-charts-path-to-become-ea-new-trade-hub/ |publisher=Daily News (Tanzania) |date=30 August 2025 |access-date=6 October 2025}}</ref> == Naqshadaynta, Horumarinta iyo Isbahaysiga == Mashruucan waxaa lagu horumarinayaa habka [[public–private partnership|iskaashiga dawladda iyo gaarka loo leeyahay (PPP)]]. Billowgii sanadkii 2024, Shirkadda Dekedaha Zanzibar waxay heshiis tanaasul ah ([[Concession (contract)|concession agreement]]) la saxiixatay shirkadda ZF Devco b.v., oo ah isbahaysi ka kooban shirkado u dhashay dalka Holland iyo Tanzania, si ay u dhisaan, u maalgeliyaan, u naqshadeeyaan, u weyneeyaan, ugana hawlgalaan xarunta cusub. Shirkadda [[Clyde & Co]] ayaa bixisay adeegyo la-talin sharci oo ku saabsan heshiiskan.<ref>{{cite web |title=Clyde & Co advises ZF Devco on development of a new Passenger Ferry and Ro-Ro Terminal in Zanzibar |url=https://www.clydeco.com/en/about/news/2024/02/clyde-co-advises-zf-devco-on-new-passenger-ferry |publisher=Clyde & Co |date=1 February 2024 |access-date=6 October 2025 |archive-date=11 Bisha Sagaalaad 2025 |archive-url=https://web.archive.org/web/20250911154112/https://www.clydeco.com/en/about/news/2024/02/clyde-co-advises-zf-devco-on-new-passenger-ferry |url-status=dead }}</ref> Isbahaysiga naqshadaynta iyo qorshaynta waxaa ka mid ah shirkadaha [[C Concept Design|C Concept Design b.v.]], Rebel,<ref>{{Cite web|url=https://rebelgroup.com/nl/|title=Adviseur en investeerder voor de toekomst &#124; Rebel|date=January 8, 2024|website=Rebelgroup}}</ref> Delta Marine Consultants,<ref>{{Cite web|url=https://www.dmc.nl/|title=DMC &#124;|website=www.dmc.nl}}</ref> OrangeGaia,<ref>{{Cite web|url=https://orangegaia.com/|title=OrangeGaia - Invest with Purpose|website=orangegaia.com}}</ref> Borgh Go,<ref>{{Cite web|url=https://borghgo.com/|title=Borgh Go|website=Borgh Go}}</ref> CDR,<ref>{{Cite web|url=https://cdr-international.nl/|title=Home - CDR International}}</ref> MultiStruct,<ref>{{Cite web|url=https://www.multistruct.co.tz/|title=MultiStruct Tanzania Ltd (MSL)}}</ref> Songoro Marine Transport,<ref>{{Cite web|url=https://songoromarine.com/|title=Songoro Marine Transport LTD – Specialists in shipbuilding & marine construction|website=Songoro Marine Transport LTD}}</ref> iyo Kengo TZ.<ref>{{Cite web|url=https://www.kengo.africa/|title=Kengo Strategic Consulting Tanzania|website=Kengo}}</ref> Qorshaha guud wuxuu ka kooban yahay dekedda rakaabka, dekedda baabuurta ee [[Roll-on/roll-off|RoRo]] (roll-on/roll-off), adeegyada bulshada, hoteelo iyo meelo lagu nasto, goobo carwooyin iyo goobo ganacsi oo tafaariiq ah. Sifooyinka [[Sustainability|waara]] sida [[solar energy|tamarta qorraxda]], haynta biyaha, iyo [[Rainwater harvesting|ururinta biyaha roobka]] ayaa lagu dhex daray qorshaha. <ref>{{cite web |title=Zanzibar Ferry and RoRo Terminal |url=https://www.ccdx.nl/projects/zanzibar-ferry-and-roro-terminal |publisher=C Concept Design BV |access-date=6 October 2025}}</ref> Machadka [[Jane Goodall Institute|The Jane Goodall Institute (JGI)]] ee Zanzibar ayaa gacan ka geystay raridda iyo dhowrista dhirta [[mangrove|mungrove-ka]] (geed baddoodka) ee mashruuca.<ref>{{cite web |title=ZF Devco and Jane Goodall Institute complete successful mangrove conservation relocation in Zanzibar |url=https://zfdevco.com/press/zf-devco-and-jane-goodall-institute-complete-successful-mangrove-conservation-relocation-in-zanzibar |publisher=ZF Devco |date=2025 |access-date=6 October 2025}}</ref> == Baaxadda Mashruuca iyo Wajiyada == Goobta horumarinta waxay ku fadhidaa qiyaastii 29 hektar, oo ay ku jirto 19 hektar oo ah [[Land reclamation|dhul bad laga soo dhigay]], oo ku yaal waqooyiga [[Stone Town]] ee Maruhubi.<ref>{{cite web |title=ZF Devco and the Revolutionary Government of Zanzibar unveil partnership for the development of the Passenger and RoRo Ferry Terminal |url=https://www.zfdevco.com/press/zf-devco-and-the-revolutionary-government-of-zanzibar-rgov-unveil-partnership-for-the-development-of-the-passenger-and-roro-ferry-terminal-in-zanzibar-tanzania |publisher=ZF Devco |access-date=6 October 2025}}</ref> Wajiga A (Wajiga A.1, Wajiga A.2 iyo Wajiga A.3) wuxuu diiradda saarayaa kaabayaasha badda ee muhiimka ah: dekedda rakaabka feri (terminaalka doonta rakaabka oo qiyaastii ah 22,000 m²), dekedda RoRo (qiyaastii ah 4,000 m²), iyo tas-hiilaadka bulshada. Wajiyada dambe waxaa la filayaa in lagu kordhiyo xarun [[Logistics center|loojistiko]], goobo carwooyin, xafiisyo, hoteelo, meelo ganacsi, iyo suurtoogalnimada tas-hiilaad loogu talagalay [[water taxi|tagsiyada biyaha]] iyo [[seaplane|diyaaradaha badda ku dega]].<ref>{{cite web |title=Zanzibar signs US$400 million deal for passenger port construction |url=https://abdas.org/2024/01/31/zanzibar-signs-us400-million-deal-for-passenger-port-construction/ |publisher=African Business Development Association |date=31 January 2024 |access-date=6 October 2025 |archive-date=15 Bisha Kow iyo Tobnaad 2025 |archive-url=https://web.archive.org/web/20251115091302/https://abdas.org/2024/01/31/zanzibar-signs-us400-million-deal-for-passenger-port-construction/ |url-status=dead }}</ref> Wadarta maalgashiga dhammaan wajiyada waxaa lagu qiyaasay inta u dhaxaysa US$350 milyan iyo US$400 milyan, iyadoo Wajiga A lagu qiimeeyay ku dhawaad US$250 milyan.<ref name="KHL-2024">{{cite news |title=Dutch company to build ferry terminal in Tanzania |url=https://www.khl.com/news/dutch-company-to-build-ferry-terminal-in-tanzania/8034876.article |publisher=KHL |date=5 February 2024 |access-date=6 October 2025}}</ref> == Dhismaha == [[Construction|Dhismaha]] wuxuu si rasmi ah u bilowday bishii November 2024 iyadoo la bilaabay Wajiga A.1.<ref>{{cite web |title=Construction Begins on Zanzibar Passenger and RoRo Ferry Terminal |url=https://www.ccdx.nl/news/construction-begins-on-zanzibar-passenger-and-roro-ferry-terminal |publisher=C Concept Design BV |date=21 November 2024 |access-date=6 October 2025}}</ref> Wadarta muddada dhismaha waxaa loo proshiyeeyay 36 bilood, iyadoo la filayo in la dhammaystiro marka la gaaro 2027.<ref name="KHL-2024"/> == Saamaynta == Dekedda waxaa la filayaa inay yarayso ciriiriga ka jira Dekedda Malindi,<ref>{{Cite web |title=Malindi Port |url=https://zpc.go.tz/malindi_port.php |access-date=2025-10-10 |website=Zanzibar Ports Cooperation}}</ref> inay hagaajiso badbaadada rakaabka, iyo inay xoojiso booska Zanzibar ee xarun baddood oo ku taal galbeedka [[Indian Ocean|Badweynta Hindiya]]. Waxaa kale oo loo arkaa tillaabo muhiim ah oo horay loogu qaaday istiraatiijiyadda Dhaqaalaha Buluugga ah ee jasiiradaha iyadoo la kordhinayo awoodda [[trade|ganacsiga]] iyo [[tourism|dalxiiska]].<ref name="The-Guardian-Zanzibar-2025"/> Caqabadaha lagu xusay warbixinnada maxalliga ah iyo kuwa caalamiga ah waxaa ka mid ah baahida loo qabo in la cusriyeeyo xiriirka [[Transport in Tanzania|gaadiidka]], tas-hiilaadka [[customs|canshuuraha]] (kastamka), iyo ilaalinta deegaanka ee nidaamka deegaanka [[Mangrove forest|kaymaha mungrove-ka]] ee u dhow.<ref name="KHL-2024"/> == Mashaariicda La Xiriira == Dekedda Maruhubi waa qayb ka mid ah barnaamij ballaaran oo ku saabsan ballaarinta iyo casriyeynta dekedaha Zanzibar. Hindisayaasha kale waxaa ka mid ah horumarinta Dekedda [[Mangapwani]], ballaarinta Dekedda Kontaynarada ee [[Fumba]], iyo horumarinta tas-hiilaad cusub oo loogu talagalay maaraynta [[cargo|shixnadaha xamuulka]].<ref name="Daily-News-2025"/> == Tixraac == {{Reflist}} == Xiriirinta dibadda == *[https://www.zpc.go.tz/ Zanzibar Ports Corporation]{{Dead link|date=Bisha Todobaad 2026 |bot=InternetArchiveBot |fix-attempted=yes }} *[https://www.zfdevco.com/ ZF Devco b.v.] *{{cite web |title=Zanzibar Ferry and RoRo Terminal |url=https://www.ccdx.nl/projects/zanzibar-ferry-and-roro-terminal |publisher=C Concept Design BV |access-date=6 October 2025}} 3bjqhlffaildbscz1vmrzkh6sfztwm2 Wadi al-Jarf 0 47670 307126 299024 2026-09-05T10:13:21Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307126 wikitext text/x-wiki {{Infobox historic site |name = Wadi al-Jarf |native_names = {{native name|ar| وادي الجرف}} |other_name = Wadi al-Garf,<br/>Rod El-Khawaga |image = |alt = |caption = |map_type = Egypt |map_alt = |map_caption = |coordinates = {{coord|28|53|30|N|32|39|30|E|display=inline,title}} |location = [[Egypt|Masar]] |region = [[Red Sea Governorate|Gobolka Badda Cas]] |type = |part_of = |length = |width = |area = |height = |builder = |material = |built = |abandoned = |epochs = <!-- wuxuu u soo bandhigayaa sidii "Xilliyo" --> |cultures = |dependency_of = |occupants = |event = |excavations = |archaeologists = [[John Gardner Wilkinson|J. G. Wilkinson]] |condition = |ownership = |management = |public_access = |website = |notes = }} '''Wadi al-Jarf''' ({{langx|ar|وادي الجرف}}) waa goob ku taal xeebta [[Red Sea|Badda Cas]] ee dalka Masar, {{convert|119|km|mi|abbr=on}} koonfurta [[Suez]], taas oo ah goobta [[harbour|deked]] dabiici ah oo adduunka ugu da'da weyn ee la yaqaan, la horumariyay qiyaastii 4500 oo sano ka hor. Waxay ku taallaa afka Wadi Araba, oo ah marin isgaarsiineed oo muhiim ah oo u dhexeeya [[Nile Valley|Dooxada Niilka]] iyo [[Red Sea|Badda Cas]], oo ka gudba [[Eastern Desert|Saxaaraha Bari]]. Goobtu waxay ka soo horjeedaa [[Gulf of Suez|Gacanka Suez]] qalcad yar oo Sinai ah oo ah [[Tell Ras Budran]]. Deked hore oo xoogaa la mid ah ayaa ku taal [[Ain Sukhna]], xoogaa waqooyi ka xigta Wadi al-Jarf. Goobta waxaa markii ugu horreysay helay [[John Gardner Wilkinson|J. G. Wilkinson]] sannadkii 1832. Waxaa dib u helay koox Faransiis ah 1950-meeyadii, kuwaas oo u bixiyay '''Rod el-Khawaga'''. Shaqadii qadiimiga ahayd si dhakhso ah ayaa loo joojiyay markii uu qarxay [[Suez Crisis|Dhibaatadii Suez]] sannadkii 1956. Koox isku dhaf ah oo Faransiis iyo Masriyiin ah ayaa dib u billaabay qodista sannadkii 2011.<ref>{{Cite web|title=British Museum - Tallet|url=https://webarchive.nationalarchives.gov.uk/ukgwa/20190801105841mp_/http://www.britishmuseum.org/research/publications/online_journals/bmsaes/issue_18/tallet.aspx|access-date=2022-01-17|website=webarchive.nationalarchives.gov.uk|archive-date=2022-01-17|archive-url=https://web.archive.org/web/20220117074453/https://webarchive.nationalarchives.gov.uk/ukgwa/20190801105841mp_/http://www.britishmuseum.org/research/publications/online_journals/bmsaes/issue_18/tallet.aspx|url-status=dead}}</ref> Dekedda goobta ku taal waxay soo taxnayd ilaa [[Fourth Dynasty of Egypt|Boqortooyadii Afraad ee Masar]], qiyaastii 4,500 oo sano ka hor. Sidoo kale waxaa goobta laga helay in ka badan 100 barroosinka maraakiibta, kuwaas oo ah barroosinkii ugu horreeyay ee Boqortooyadii Hore ee laga helo xaaladdoodii asalka ahayd, iyo dheriyo kayd ah oo badan. Dheriyada waxaa lala xiriiriyay kuwo ka mid ah goob kale oo ku taal dhinaca kale ee Badda Cas, taas oo muujinaysa ganacsi u dhexeeya labada goobood. Tiro badan oo qaybo [[papyrus|baabiiro]] ah ayaa laga helay Wadi al-Jarf, taas oo bixisay aragti ku saabsan nolosha intii lagu jiray Boqortooyadii Afraad. Baabiiradaani waa kuwii ugu da'da weynaa ee abid laga helo Masar. ==Helitaankii== Dukumentigii ugu horreeyay ee la yaqaan ee qaab-dhismeedka dekedda hore ee Wadi al-Jarf wuxuu ahaa 1832, markii [[J. G. Wilkinson]] uu xusay jiritaankooda. Wuxuu helay taxane galeryo ah oo laga gooyay dhagaxa kuwaas oo uu u haystay inay yihiin [[catacombs|qabuuro]] Giriig ah.<ref name=Discovery>{{cite news|title=Most Ancient Port, Hieroglyphic Papyri Found|author=Rossella Lorenzi|work=Discovery News|date=12 April 2013|url=http://news.discovery.com/history/ancient-egypt/worlds-oldest-port-and-egyptian-papyrus-uncovered-130412.htm|access-date=21 April 2013}}</ref> 1950-meeyadii, koox dad Faransiis ah oo hiwaayad u leh cilmiga qadiimiga ayaa bilaabay inay sahamiyaan qaybo ka mid ah goobta, taas oo ay u bixiyeen Rod el-Khawaga, laakiin waxaa laga saaray intii lagu jiray [[Suez Crisis|Dhibaatadii Suez]] ee 1956. Qoraalladooda waxaa la daabacay 2008, taas oo dhiirigelisay xiisaha dib u billaabidda shaqada.<ref name=BritishMuseum>{{cite journal|title=Ayn Sukhna and Wadi el-Jarf: Two newly discovered pharaonic harbours on the Suez Gulf|journal=British Museum Studies in Ancient Egypt and Sudan|last=Tallet|first=Pierre|volume=18|year=2012|pages=147–68|issn=2049-5021|url=https://research.britishmuseum.org/PDF/Tallet.pdf|access-date=28 January 2020|archive-date=28 January 2020|archive-url=https://web.archive.org/web/20200128123352/https://research.britishmuseum.org/PDF/Tallet.pdf|url-status=bot: unknown}}</ref> Qodista nidaamsan waxaa dib u billaabay 2011 koox isku dhaf ah oo Masriyiin iyo Faransiis ah oo uu hoggaaminayay Pierre Tallet (Jaamacadda Paris IV-La Sorbonne) iyo Gregory Marouard (Machadka Bari, Chicago). Bishii Abriil 2013, khubarada qadiimiga ah ayaa ku dhawaaqay helitaanka deked hore iyo daraasiin dukumentiyo [[papyrus|baabiiro]] ah oo ku yaal goobta. Kuwaas waa baabiiradii ugu da'da weynaa ee abid laga helo Masar (qiyaastii 2560–2550 BC, dhamaadkii xukunkii [[Khufu]] ).<ref name=Huffington /> ==Farshaxanada== ===Dekedda=== Dhismaha dekeddu wuxuu ka kooban yahay qiyaastii {{convert|150|m|ft|adj=mid|-long}} [[Mole (architecture)|mole]] ama jid dhagax ah oo weli laga arki karo mowjadaha oo hooseeya ({{coord|28.8888|N|32.6815|E|type:landmark_region:EG|display=inline}}), ''alamat'' ama calaamad dhuleed oo navigation ah oo ka samaysan dhagaxyo la dhoobay, {{convert|60|x|30|m|ft|abbr=on}} dhisme shaqo aan la aqoon oo loo qaybiyay 13 qol oo dhaadheer, iyo taxane ah 25 ilaa 30 galeryo kayd ah oo lagu xardhay dhagaxa nuuradda oo sii galaya gudaha. Dhismaha shaqadiisa aan la aqoon waa dhismihii fircooniga ahaa ee ugu weynaa ee ilaa hadda la helay iyadoo ay weheliso xeebta Badda Cas. Galeryada kaydintu waa inta u dhaxaysa {{convert|16|and|34|m|ft|abbr=on}} oo dherer ah, oo badiyaa ah {{convert|3|m|ft|abbr=on}} ballac ah iyo {{convert|2.5|m|ft|abbr=on}} dherer ah.<ref name=Marouard>{{cite journal |last1=Marouard |first1=Gregory |last2=Tallet |first2=Pierre |year=2012 |title=Wadi al-Jarf - An early pharaonic harbour on the Red Sea coast |journal=Egyptian Archaeology |volume=40 |pages=40–43 |url=https://www.academia.edu/1819574 |access-date=18 April 2013}}</ref> Gudaha galeryada waxaa yaallay dhowr qaybood oo dooni iyo shiraac ah, qaar ka mid ah qoryaha doonida, iyo xabbado badan oo xadhig hore ah.<ref name=Discovery /><ref name=BritishMuseum /> Labaatan iyo shan barroosin oo dhagax ah ayaa laga helay biyaha hoostooda, 99 barroosinna waxaa laga helay dhisme kayd ah oo muuqda.<ref name=Discovery /> Helitaanka barroosinnada ee xaaladdoodii asalka ahayd waa markii ugu horreysay ee cilmiga qadiimiga ah ee Boqortooyadii Hore.<ref name=Marouard /> Qaar badan oo ka mid ah barroosinnada ayaa wata hieroglyphs, oo u badan inay matalayaan magacyada doonyaha ay ka yimaadeen.<ref name=Global /> Dekeddu waxay ahayd meesha laga bilaabo safarrada laga bilaabo dhulka weyn ee Masar ilaa hawlgallada macdanta ee Koonfurta Sinai.<ref name=BritishMuseum /> Waxaa la qiyaasayaa in dekedda laga yaabo inay sidoo kale loo isticmaalo in lagu bilaabo safarro ku wajahan "mustahriimka [[Land of Punt|Dhulka Punt]]", oo ah lammaane ganacsi oo caan ah oo Masar ah.<ref name=Huffington>{{cite news|title=Wadi El Jarf Site Reveals Oldest Harbor, Papyri Ever Found In Egypt|date=17 April 2013|url=http://www.huffingtonpost.com/2013/04/16/wadi-el-jarf-oldest--papyri_n_3094944.html|last=Davis|first=Carlo|work=Huffington Post|access-date=21 April 2013}}</ref> Dekedda waxaa la horumariyay xukunkii Fircoon [[Khufu]] (2589–2566 BC), kaas oo magaciisa lagu xardhay qaar ka mid ah blocks-ka dhagaxa nuuradda ee culus ee goobta.<ref name=Discovery /><ref name=Global>{{cite news|title=Archeologists discover oldest Egyptian harbor ever found|first=Samantha|last=Stainburn|work=Global Post|date=18 April 2013|url=http://www.globalpost.com/dispatch/news/regions/middle-east/egypt/130418/archeologists-discover-oldest-egyptian-harbor-ever-fo|access-date=21 April 2013}}</ref> Taasi waxay ka dhigan tahay in dekeddu ay ka horreyso qaab-dhismeedka labaad ee ugu da'da weyn dekedda in ka badan 1,000 oo sano.<ref name=Huffington /> Waxaa jira xoogaa caddayn raad ah oo isticmaalka intii lagu jiray qaybta hore ee [[Fifth Dynasty of Egypt|Boqortooyadii Shanaad]], ka dibna dekedda waxay u badan tahay in laga tagay.<ref name=Marouard /> ===Dheriyada kaydinta iyo baabiirada=== Dheriyo badan oo dhagax ah oo loogu talagalay cuntada iyo kaydinta biyaha, qaybo ka mid ah dharka iyo alwaaxa, iyo ururin boqollaal qaybood oo baabiir ah ayaa sidoo kale laga helay goobta.<ref name=Discovery /><ref name=Marouard /> Qaar badan oo ka mid ah dheriyada waxay wataan magacyo dad ama doonyo oo ku qoran khad cas, taas oo muujinaysa milkiilayaashooda. Dheriyada waxaa lagu gartaa halabuur aad u gaar ah oo [[marl]] ah kaas oo horey loogu aqoonsaday macnaha guud ee Boqortooyadii Afraad goobo kale, oo ay ku jiraan dhinaca kale ee [[Gulf of Suez|Gacanka Suez]] ee [[Tell Ras Budran]].<ref name=Marouard /> Toban ka mid ah baabiirada ayaa si gaar ah si wanaagsan loo ilaaliyay.<ref name=Discovery /> Inta badan dukumiintiyadan waxay soo taxan yihiin sannadkii ka dambeeyay tirinta lo'da ee 13-aad ee xukunkii Khufu waxayna sharraxayaan sida maamulka dhexe uu u diray cunto iyo sahay u socdaalayaasha Masar.<ref name=Discovery /><ref name=Global /> Hal dukumiinti ayaa ah mid xiiso gaar ah leh: [[Diary of Merer]], oo ah sarkaal ku lug leh dhismaha [[Great Pyramid of Khufu|Ahraamta Weyn ee Khufu]]. Isagoo isticmaalaya xusuus-qorka, cilmi-baarayaashu waxay dib u dhiseen saddex bilood oo noloshiisa ah, taas oo bixisay aragti cusub oo ku saabsan nolosha maalinlaha ah ee dadka Boqortooyadii Afraad.<ref name=Discovery /><ref name=Global /><ref name=MIFAO136 /> Baabiiradaani waa kuwii ugu da'da weynaa ee abid laga helo Masar.<ref name=Huffington /> ===Guryaha=== Saddex kooxood oo dhismayaal ah ayaa laga helay {{convert|500|m|ft|abbr=on}} waqooyi-galbeed ee dekedda. Dhismaha leydi-qaabaysan iyo habaynta qolalka oo loo qaybiyay qaab unug oo kale ayaa muujisay in dhismayaashu ay u adeegeen sidii meelo lagu noolaado.<ref name=Marouard /> ==Tixraacyo== {{Reflist|refs= <ref name=MIFAO136>Tallet Pierre Les papyrus de la mer Rouge I. le « Journal de Merer » (P. Jarf A et B) MIFAO 136, 2017</ref> }} ==Xiriirinta dibadda== *[https://web.archive.org/web/20200128123352/https://research.britishmuseum.org/PDF/Tallet.pdf Ayn Sukhna and Wadi el-Jarf: Two newly discovered pharaonic harbours on the Suez Gulf] - waxaa ku jira sawirro goobta ah iyo qaar ka mid ah farshaxanadii laga helay * P. Tallet, G. Marouard, D. Laisney (2012), [https://web.archive.org/web/20230312172335/https://www.ifao.egnet.net/bifao/112/24/ Un port de la IVe Dynastie au Ouadi al-Jarf, (mer Rouge).] [[Bulletin de l'Institut Français d'Archéologie Orientale|BIFAO]] 112, (2012) pp.&nbsp;399–446 * P. Tallet, G. Marouard (2012), [https://www.academia.edu/1819574/Wadi_al-Jarf_-_An_early_pharaonic_harbour_on_the_Red_Sea_coast_-_Egyptian_Archaeology_40_2012_p._40-43 ''An early pharaonic harbour on the Red Sea coast.''] academia.edu * P. Tallet, G. Marouard (2014), [https://www.academia.edu/6268371/The_Harbor_of_Khufu_on_the_Red_Sea_Coast_at_Wadi_al-Jarf_Egypt_-_NEA_77.1_2014_p._4-14 The Harbor of Khufu on the Red Sea Coast at Wadi al-Jarf Egypt] academia.edu {{Authority control}} qpkgfa6tyengewn8mikiuoqr0ovv03i Saldhigga Korontada Biyaha ee Ruo–Ndiza 0 48067 307125 301301 2026-09-05T09:10:15Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307125 wikitext text/x-wiki {{Infobox dam | name = Saldhigga Korontada Biyaha ee Ruo–Ndiza | name_official = | image = | image_size = | image_caption = | image_alt = | location_map = Malawi | location_map_size = | location_map_caption = | location_map_alt = | location_map_relief = | coordinates = {{coord|16|05|25|S|35|39|53|E|type:landmark_region:MW|display=inline,title}} | country = Malawi | location = [[Mulanje]], | purpose = P | status = O | construction_began = | opening = | demolished = | cost = | owner = | operator = Mulanje Hydro Limited | dam_type = | dam_crosses = Is-goyska [[Ruo River|Webiga Ruo]] iyo Webiga Ndiza | dam_height = | dam_height_foundation= | dam_height_thalweg = | dam_length = | dam_elevation_crest = | dam_width_crest = | dam_width_base = | dam_volume = | spillway_count = | spillway_type = | spillway_capacity = | res_name = | res_capacity_total = | res_capacity_active = | res_capacity_inactive= | res_catchment = | res_surface = | res_max_length = | res_max_width = | res_max_depth = | res_elevation = | res_tidal_range = | plant_name = | plant_coordinates = | plant_operator = | plant_commission = | plant_decommission = | plant_type = | plant_hydraulic_head = | plant_turbines = [[Pelton wheel|Pelton turbine]]<br/>2 x {{convert|3.30|MW|abbr=on}}<br/>1 x {{convert|1.65|MW|abbr=on}} | plant_capacity = {{convert|8.25|MW|abbr=on}} | plant_capacity_factor= | plant_annual_gen = | website = | extra = }} '''Saldhigga Korontada Biyaha ee Ruo–Ndiza''' waa warshad [[hydroelectric power|koronto biyood]] oo leh awood dhan {{convert|8.25|MW|0}} oo ku taalla koonfur-bari ee [[Malawi]], xadka ay la wadaagto [[Mozambique]].<ref name="1R">{{cite web |url=https://www.afrik21.africa/en/malawi-gilkes-completes-second-phase-of-ruo-ndiza-hydroelectric-project/ |title=Malawi: Gilkes completes second phase of Ruo-Ndiza hydroelectric project |publisher=Afrik21.africa |date=2 May 2020 |author=Jean Marie Takouleu |access-date=9 May 2020 |location=Paris, France |archive-date=8 Bisha Shanaad 2020 |archive-url=https://web.archive.org/web/20200508014450/https://www.afrik21.africa/en/malawi-gilkes-completes-second-phase-of-ruo-ndiza-hydroelectric-project/ |url-status=dead }}</ref> == Goobta == Saldhigga korontadu wuxuu ku yaallaa is-goyska [[Ruo River|Webiga Ruo]] iyo gacantiisa, ''Webiga Ndiza'', ee [[Mulanje District]], ee [[Southern Region, Malawi|Gobolka Koonfureed]] ee Malawi, xadka caalamiga ah ee uu la wadaago [[Republic of Mozambique|Jamhuuriyadda Mozambique]].<ref name="2R">{{cite web|title=Gilkes commissions African project, receives new order |access-date=9 May 2020 | url=https://www.waterpowermagazine.com/news/newsgilkes-commissions-african-project-7894735 |date=28 April 2020 | publisher=Waterpowermagazine.com |author=Water Power Magazine | location=Dartford, Kent, United Kingdom}}</ref> Goobtu waxay ku dhex taal ''Lujeri Tea Estate'', qiyaastii {{convert|96|km|0}}, marka loo eego jidka, koonfur-bari ee [[Blantyre]], oo ah xarunta ganacsiga iyo maaliyadda ee Malawi.<ref name="2R"/><ref name="3R">{{google maps|title=Road Distance Between Blantyre And Lujeri Tea Estate |access-date=9 May 2020 | url=https://www.google.com/maps/dir/Blantyre,+Malawi/Lujeri+Tea+Estate+Lodge,+Mulanje,+Malawi/@-15.9077179,35.0195602,10z/data=!4m14!4m13!1m5!1m1!1s0x18d84513cbc0005f:0x236358dae4d811e6!2m2!1d35.0167866!2d-15.7666707!1m5!1m1!1s0x18d9e3fe5f6611cf:0xce5112779a8b7c63!2m2!1d35.6559784!2d-16.0334259!3e0}}</ref> == Dulmar == Bishii Maarso 2018, awoodda koronto-dhalinta ee Malawi waxay ahayd {{convert|363|MW}},<ref name="4R">{{cite web|author=USAID |url=https://www.usaid.gov/powerafrica/malawi |archive-url=https://web.archive.org/web/20151001230213/https://www.usaid.gov/powerafrica/malawi |url-status=dead |archive-date=1 October 2015 |title=Malawi: Power Africa Fact Sheet |access-date=9 May 2020 |date=28 March 2018 | publisher=[[United States Agency for International Development]] (USAID) |location=Washington, DC}}</ref> Iyadoo baahida ugu sarreysa ay tahay 350 megawatt iyo koror dhan 6 boqolkiiba sannadkiiba, shabakadda Malawi ayaa leh dabacsanaan aad u yar. Tani waxay dalka u bandhigtay koronto-goyn joogto ah oo daran.<ref name="5R">{{cite web|url=http://www.engineeringnews.co.za/article/malawi-power-station-2014-05-23/rep_id:4136 |title=Chinese bank looks to finance Malawi power station |location=Johannesburg |date=23 May 2014 |author=Marcel Chimwala |publisher=Engineeringnews.co.za | access-date=9 May 2020}}</ref> Mulanje Renewable Energy Plc (sidoo kale Mulanje Hydro Limited), oo ah shirkad gaar loo leeyahay oo dhalisa tamarta, kana diiwaangashan Malawi, ayaa la qandaraas qaadatay ''Gilkes'', oo ah shirkad sameysa mishiinnada korontada ee [[United Kingdom|British]], si ay u dhisto saldhiggan korontada, muddo laba sano ah.<ref name="6R">{{cite web |title=Malawi's Mulanje US$16 million power plant to roll out March |publisher=Energycentral.com |url=https://energycentral.com/news/malawi%E2%80%99s-mulanje-us16-million-power-plant-roll-out-march |date=27 February 2019 |author=Lloyd M’bwana |access-date=8 May 2020 |format=Quoting ''The Maravi Post'' |archive-date=26 Bisha Lixaad 2026 |archive-url=https://web.archive.org/web/20260626173029/https://www.energycentral.com/news/malawi%25E2%2580%2599s-mulanje-us16-million-power-plant-roll-out-march |url-status=dead }}</ref> == Faahfaahinta farsamada == Saldhigga korontadu waa naqshad [[run-of-river]] oo aan u baahnayn [[dam|biyo-xireen]] sidaas darteedna uma baahna [[reservoir|kayd biyo]]. Waxaa jira saddex [[Pelton wheel|Pelton-type]] turbines oo mid kasta lagu qiimeeyay {{convert|3.30|MW|0}}. Mid ayaa lagu rakibay ''Webiga Ndiza'', intii lagu jiray wejigii koowaad. Sababo la xiriira xawaaraha socodka biyaha ee webigan yar, kaliya 1.65 megawatt ayaa laga soo saari karay.<ref name="1R"/> <ref name="2R"/><ref name="6R"/> Wejigii labaad wuxuu ku jiray rakibidda laba turbines oo kale oo Pelton ah oo mid kasta lagu qiimeeyay 3.3 megawatt, oo ka gudbaya Webiga Ruo, taas oo dhalisay wadar ahaan 6.6 megawatt oo tamar cusub ah. Wadarta wax-soo-saarka dhismaha korontadu waa 8.25 megawatt.<ref name="1R"/><ref name="2R"/><ref name="6R"/> == Dhismaha == Miisaaniyadda dhismaha ayaa lagu soo warramay inay tahay 16 milyan oo doolarka Maraykanka ah. Dhismaha ayaa bilaabmay Juun 2018 wuxuuna dhammaaday Abriil 2020. Korontada la soo saaro waxaa loo iibiyaa qaybiyaha korontada qaranka [[Electricity Supply Commission of Malawi]] (Escom), iyadoo la raacayo [[power purchase agreement|heshiis iibsashada tamarta]] muddada dheer ah.<ref name="7R">{{cite web| url=https://www.nyasatimes.com/16-million-power-project-on-course-in-mulanje-to-supply-electricty-to-escom-from-march/ |title=$16 Million Power Project On Course In Mulanje: To Supply Electricity To Escom From March |newspaper=[[Nyasa Times]] |date=26 February 2019 |author=Elijah Phimbi |access-date=9 May 2020 | location=Blantyre}}</ref> == Sidoo kale eeg == {{Portal|Africa|Water|Renewable energy}} * [[Liiska saldhigyada korontada ee Malawi]] == Tixraacyo == {{Reflist}} == Xiriirinta dibadda == *[http://www.pgi-uk.com/renewable-energy/our-companies/mulanje-hydro-ltd-malawi/ Sharraxaad kooban] {{Wayback|url=http://www.pgi-uk.com/renewable-energy/our-companies/mulanje-hydro-ltd-malawi/ |date=20200806101304 }} {{Authority control}} {{stack|}} {{DEFAULTSORT:Saldhigga Korontada Biyaha ee Ruo–Ndiza}} b0kutcgbrejo5l6s5rzxgsseut90nes Armsheim 0 49412 307115 302602 2026-09-05T00:55:53Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307115 wikitext text/x-wiki {{Infobox German place |image_photo = Armsheim, Bahnhofstraße.jpg |image_caption = village center |image_coa = Armsheim.jpeg |coordinates = {{coord|49|48|28|N|8|3|29|E|format=dms|display=inline,title}} |image_plan = Armsheim in AZ.svg |state = |district = Alzey-Worms |Verbandsgemeinde = Wörrstadt |elevation = 142 |area = 10.05 |postal_code = 55288 |area_code = 06734 |licence = AZ |Gemeindeschlüssel = 07 3 31 004 |website = [https://www.armsheim.de/ www.armsheim.de] |mayor = Arno Krätschmann<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/3310000000000.html Direktwahlen 2019, Landkreis Alzey-Worms], Landeswahlleiter Rheinland-Pfalz, accessed 3 August 2021.</ref> |leader_term = 2019&ndash;24 |party = }} '''Armsheim''' waa ''Ortsgemeinde'' – [[Municipalities of Germany|degmo]] ka tirsan ''[[Verbandsgemeinde]]'', nooc ka mid ah degmooyinka la isku daray – oo ku taal degmada [[Alzey-Worms]] ee [[Rhineland-Palatinate]], [[Jarmalka]]. Armsheim waxay ku taal [[Rhenish-Hessian Hills]], waxay leedahay qiyaastii 2,650 oo qof waana degmada saddexaad ee ugu weyn [[Wörrstadt (Verbandsgemeinde)|''Verbandsgemeinde'' of Wörrstadt]], oo xarunteedu tahay [[Wörrstadt|degmada isku magaca ah]]. Armsheim-ka hadda wuxuu ka samaysmay laba xarumood oo hore u ahaan jiray kuwo madaxbannaan 1969-kii, kuwaas oo la kala oran jiray Armsheim iyo Schimsheim. == Juqraafi == === Goobta === Armsheim waxay ku taal bartamaha [[Rhenish Hesse]], qiyaastii 14 km u jirta [[Alzey]], 18 km u jirta [[Bad Kreuznach]], 25 km u jirta [[Bingen am Rhein|Bingen]] iyo qiyaastii 30 km koonfur-galbeed ee [[Mainz]]. == Taariikhda == === Kahor xilligii Masiixiyadda === Muddo 40,000 oo sano ah waxaa dad ku noolaa daadka Wiesbach, 1,500 sano oo kalena, tuulooyinka Armsheim iyo Schimsheim ayaa halkan ku yaallay. Dhulka furan ee halkan, oo ay qulqulaan durdurro, waxay u fidiyeen ugaarsato-ururiye [[Old Stone Age|xilligii dhagaxa hore]] xaalado nololeed oo ku habboon. Laga soo bilaabo [[New Stone Age|xilligii dhagaxa cusub]] (ka dib 4000 BC), dhulka si joogto ah ayaa loo degay. Beeraha iyo dhaqashada xoolaha ayaa saldhig u ahaa nolosha dadka degaanka. Waxyaabo badan oo Neolithic, [[Bronze Age|xilligii naxaasta]] iyo [[Iron Age|xilligii birta]] (gaar ahaan [[La Tène culture|xilligii La Tène]]) ayaa muujinaya degitaan culus. Mid ka mid ah xarumaha dadkan waxaa sameeyay dhulal hadda ka kooban aagga horumarinta cusub. Markhaatiyada dusha sare ee xilligan hore waa [[menhir]]s, kuwaas oo, si kastaba ha ahaatee, mid ka mid ah uu weli taagan yahay meel u dhow goobtiisii asalka ahayd. Qarnigii 5aad ee BC, kursi amiir [[Celts|Celtic]] ah ayaa laga helay meesha hadda ah aagga degmada. Qabri qayb ka ahaa dhismaha ayaa la furay intii lagu jiray dhismaha [[railway|tareenka]]. Farshaxanno qaali ah oo laga soo saaray qabriga waxaa ka mid ahaa qaybo ka mid ah gaari iyo suxuun naxaas [[Etruscan civilization|Etruscan]], kuwaas oo muujinaya wax ku saabsan awoodda iyo hantida amiirradan. Maamulkooda waxaa laga yaabaa inuu ku jiray magaaladii Celtic ee Wißberg (buur u dhow). Xilligii Celtic wuxuu dhammaaday qiyaastii waqtigii bilowgii xilligii Masiixiga, markii xukunka [[Ancient Rome|Roomaanku]] bilaabmay. === Boqortooyadii Roomaanka === Afarta boqol ee sano oo ay Roomaanku haysteen, dhulka waxaa ka shaqayn jiray [[Villa rustica|beeraha ay dawladdu leedahay]]. Halkii ay beerahani ku yaalleen waxaa lagu go'aamin karaa [[Archaeology|helitaannada qadiimiga ah]] iyo magacyada goobaha, gaar ahaan kuwa ay ku jiraan ''Weiler'' (af [[German language|Jarmal Casri ah]], tani waxay la macno tahay “[[hamlet (place)|tuulo yar]]”, laakiin waxay ka timid [[Latin|Laatiinka]] ''villa'', sida ''[[villa rustica]]'', oo ahaa ereyga Laatiinka ee mid ka mid ah beerahan). Meel quduus ah oo lagu maamuusayo [[Jupiter (mythology)|Jupiter]] ayaa taagnaa meel u dhow halkii ay hadda kaniisadda Armsheim ka taagan tahay, iyo galbeedka aagga degmadana meel quduus ah oo lagu maamuusayo [[Diana (mythology)|Diana]]. Suntflur, oo ah aag miyi ah, aagga villa duug ah, oo ay calaamadeeyeen dhagaxyo xuduudeed, ayaa loo dhowray ilaa qarnigii 20-aad. Beeraha Roomaanka waxaa la dayacay dhamaadkii qarnigii 4aad ka dib markii qabaa'ilka [[Germanic peoples|Jarmalka]] ay bilaabeen inay u soo gudbaan [[Rhine]] oo ciidankii Roomaankuna ay ka baxeen. === Xilligii Frankish === Taariikhda dhabta ah ee Armsheim iyo Schimsheim waxay bilaabatay markii [[Franks|Frank-ka]] ay la wareegeen dhulka qiyaastii 500. Tuulooyinku waxay ka koobnaayeen kooxo beero ah oo ku wareegsan dhul dhexe oo leh kaniisad iyo qabuuraha, kuwaas oo milkiilayaashooda lagu magacaabay labada xarun. Beero kale ayaa laga heli karaa dibadda. Qarniyadii 12-aad iyo 13-aad ee qasabka ahaa, waa la dayacay, taasoo keentay in weli la dareemi karo ururinta tuulooyinka, kuwaas oo ay difaaceen geedo iyo godad. Koorsada ay raaceen waddooyinka iyo horumarinta dhismaha waxay bixiyaan tilmaamo muhiim ah oo ku saabsan soo bixitaanka iyo horumarinta labada tuulo. Xarunta Schimsheim waxaa hadda sameeyay labajibbaaran yar, kaas oo ay sameeyeen waddooyinka halkaas ku kulma. Waxa kale oo mar halkaas ka taagnaa geedka tuulada iyo maxkamadda, Schimsheim Elm oo halyeey ah. [[Tilia|Geedka liin dhanaanta]] ee hadda ka koraya halkan waxaa lagu beeray godka ay ka tageen elm ka dib markii uu dhintay. Asal ahaan, tani waxay ahayd duleedka tuulada; ceelkii hore weli waa la dhowray in yar oo koonfur ah. ''Kirchgasse'' (marinka kaniisadda) ee ku dhow ayaa muujinaya meeshii ay ku taallay kaniisaddii Saint Martin ka hor inta aan la burburin [[Thirty Years' War|Dagaalkii Soddonka Sano]]. Qaab-dhismeedka degitaanka Armsheim wuxuu muujinayaa aasaaska dhaqaale ee tuulada lagu dhisay, iyo sidoo kale waxa ay ahaayeen xoogagga wadista horumarkeeda. Si ka duwan horumarka aamusan ee Schimsheim, halkan waxaa lagu calaamadeeyay kor u kac degdeg ah oo horseeday ubax gaaban, oo ay ku xigtay hoos u dhac la mid ah oo degdeg ah. Laba xarumood oo degitaan ah ayaa lagu kala saari karaa, mid ku taal waqooyiga waddada dhexe oo leh ''Freier Platz'' (“Fagaaraha Xorta ah”), iyo mid koonfurta oo ku taal ''Mühlstraße'' (“Waddada Shiidka”). Wax badan ayaa soo jeedinaya in tani ay ahayd degitaan la qorsheeyay, gaar ahaan qaab-dhismeedka dhow ee ''Rosenplatz'' (“Fagaaraha Rose”), kaas oo xasuusinaya suuqa magaalada. Iyaga oo u taagan xoogagga wadista waxay ahaayeen Kaniisadda Saint Remigius (''St. Remigius-Kirche'') iyo qalcaddii sayidyadii maxalliga ah, [[County of Veldenz|Counts of Veldenz]]. Reliquary dhiigga kaniisadda wuxuu noqday yoolka [[pilgrimage|xajka]] kaas oo soo jiitay dadka cibaadaysanaya meel ka baxsan gobolka, iyo sidoo kale sababta dhismaha Kaniisadda xajka “Dhiigga Quduuska ah” (1431), kaas oo lagu tiriyo mid ka mid ah kuwa ugu muhiimsan [[Gothic architecture|dhismayaasha Gothic]] ee [[Rhine Gorge]]. Kursiga Counts wuxuu ahaa xarunta hantidooda ee aaggan. Tuulada waxaa la siiyay xuquuqda magaalada ugu dambayn 1349 waxaana lagu xoojiyay darbiyo iyo munaarado. Armsheim waxaa la sheegay inay ahayd magaalada ugu fiican ee la xoojiyay ee Nahegau. Qaybo ka mid ah gidaarkii hore ayaa la dhowray inta u dhaxaysa kaniisadda iyo Neugasse (marinka), sida ay yihiin ''Bielgraben'' (dyke) iyo marinnada dhulka hoostiisa ah. Saddex guri oo waardiyayaasha iridda ah ayaa aasaasaya ballaarinta degitaanka muddo dheer. Cabbirka iyo quruxda kaniisadda Gothic waxay muujinayaan wax intaas ka sii badan oo ku saabsan muhiimadda Armsheim oo ah meel xaj iyo magaalo Veldenz ah. Markii qoyska Veldenz ay dhinteen oo [[Protestant Reformation|Dib-u-habaynta Protestant-ka]] la soo bandhigay, horumarkani wuu dhammaaday: Magaaladu waxay u gudubtay [[Electoral Palatinate]] 1471, darbiyadii iyo munaaradihii waa la dumiyay, magaaladii waa laga qaaday xuquuqdii magaalada, waxaana loo xilsaaray ''[[Amt (country subdivision)|Oberamt]]'' ee Alzey. Dib-u-habayntu waxay keentay burburinta gudaha kaniisadda iyo dhammaadka xajka. Raadadka burburka ayaa lagu arki karaa dhagaxa qabriga ee Aabbaha Odenkemmer ee chancel-ka kaniisadda iyo tirada jabay ee quduuska ah, kaas oo lagu derbigay hanti ku taal waddada weyn. Fagaaraha yar, oo mar ka taagnaa foornada wadaagga ah, waxaa loo tixgelin karaa inuu yahay xarunta tuulada Armsheim. Meel fog kama fogayn [[pranger]], ka dibna [[Weighing scale|miisaanka]] wadaagga ah. Meel fog kama kor taagna hoolka magaalada duugga ah, kaas oo laga soo saaray heerka cabbirka, birta [[ell]]wand, kaas oo hadda lagu xiray vestibule-ka [[Evangelical Church in Germany|Evangelical]] kaniisadda. Sidoo kale, hudheelka ugu weyn tuulada kama fogayn. Tuulada dibaddeeda, waddada loo maro Schimsheim, waxaa ku yaallay cisbitaalkii bukaannada leprosy, ''Gutleuthaus'', waddada loo marona Alzey waxaa ku yaallay guriga hangman-ka. Magaca ''Galgenberg'' (“Buurta Gallows”) ee koonfurta [[railway station|steshanka tareenka]] wuxuu tixraacayaa goobta fulinta ee hore. Armsheim kaliya kuma lumin muhiimaddeeda sidii kursi maamul iyo xarun xaj, laakiin sidoo kale ma jirin ganacsi ama ganacsi kale. Waxa maqan waxay ahayd xiriirka shabakadda waddooyinka masaafada dheer. Waddada ka timaadda Worms ee loo maro Bingen, ''Hohe Straße'' (“Waddada Sare”), waxay ku hoggaamisay Flonheim, galbeedka tuulada, iyadoo gebi ahaanba seegtay, halka ''Alte Straße'' (“Waddada Duugga ah”) ee ka timaadda Alzey ee loo maro Ingelheim ay ku orday xagga bari, xoogaa iyada oo raacaysa safka tareenka ee hadda jira. Intaa waxaa dheer, taariikhda maxalliga ah ee qarniyadii 17-aad iyo 18-aad waxaa lagu calaamadeeyay burburin iyo boob soo noqnoqday. Wax yar ayaa hadhay ka dib [[Nine Years' War|Dagaalkii Sagaal Sano]] iyo burburka ka dhashay Palatinate ee ciidammada Boqor [[Louis XIV]]. Mid ka mid ah ballaarinta nidaamsan ee ugu horreysay ee tuulada ayaa timid qarnigii 18-aad ee godka la buuxiyay (''Neugasse'' – “Marinka Cusub”), laakiin ma ahayn ilaa qarnigii 19-aad ee hore in waddadani ay gaartay waddada weyn. === Laga soo bilaabo qarnigii 19-aad iyo wixii ka dambeeyay === Xilli cusub oo horumarka tuulada ayaa bilaabmay ballaarinta shabakadda waddooyinka Rhenish-Hessian ee 1830-meeyadii iyo dhismaha khadka [[railway|tareenka]] Bingen-Worms (''Rheinhessenbahn'') 1870, khadka Mainz-Alzey (1871) iyo khadka Armsheim-Wendelsheim (1871–1895). Degitaankii ka soo baxay ka dib 1870 ee [[railway station|steshanka tareenka]] wuxuu ku salaysnaa ganacsiga khamriga, dhuxusha iyo xoolaha iyo sidoo kale [[Cooper (profession)|cooperage]]. Horumarinta dhismaha ee ka soo baxay ''Bahnhofstraße'' (“Waddada Steshanka Tareenka”, oo hore loogu yaqaanay ''Sauweg'' – “Waddada Doofaarka”) waxay ka tarjumaysaa muhiimadda tareenka ee tuulada in ka badan boqol sano. Ballaarinta kale ee tuulada ayaa timid qaab horumarin magaalo-cusub ah, oo la bilaabay 1983, taas oo mideysay labada tuulo, kuwaas oo siyaasad ahaan ahaa mid tan iyo 1969. Wajiyada taariikhda maxalliga ah laga bilaabo qarnigii 16-aad wixii ka dambeeyay si fudud ayaa looga soo ururin karaa horumarinta qaababka guriga iyo homestead. Homesteads-ka Frankish-ka caadiga ah waxay ka hadlayaan nolol beerasho, qayb ahaan oo lagu daray farshaxan. Ka dib 1870 guryaha waxay muujinayaan dhismayaashooda sida dadka cusub ee magaalada, kuwaas oo inta badan ka yimid miyiga, ay u raadinayeen nolol shaqaale kiraysan iyo dhinacyada beeraha (gaar ahaan aagga steshanka tareenka). Guryaha ka yimid wajiga saddexaad ma muujinayaan qaab gobolleed oo waxaa loogu talagalay nolol magaalada, iyagoon wax tilmaam ah ka bixin nolosha waddanka, taariikhda maxalliga ah ama beeraha, taasoo keenaysa taariikhda maxalliga ah waji adag. Degmada maanta waxay timid 7 Juun 1969 iyada oo loo marayo midaynta labada xarun ee Armsheim iyo Schimsheim. == Wiilal iyo gabdho ka tirsan magaalada == [[File:Disputation.jpg|thumb|Christian and Jewish scholars in a dispute (woodcut 1483); Johannes Schnitzer]] *Johannes Schnitzer oo ka socda Armsheim, khariidad-sameeyaha [[Geography (Ptolemy)|Geography]] ee [[Ptolemy]] == Siyaasadda == === Golaha degmada === Goluhu wuxuu ka kooban yahay 20 xubnood, iyo duqa magaalada oo ah guddoomiye sharaf leh. Doorashadii degmada ee dhacday 7 Juun 2009 waxay keentay natiijooyinkan soo socda:<ref>[http://wahlen.rlp.de/kw/wahlen/2009/gemeinderatswahlen/ergebnisse/3310600400.html Kommunalwahl Rheinland-Pfalz 2009, Gemeinderat]</ref> {| border="0" cellpadding="2" cellspacing="0" width="550" |- bgcolor="#eeeeee" align="center" | || [[Social Democratic Party of Germany|SPD]] || FL e.V. || W.A.S || Pro Armsheim || '''Wadarta''' |- align="center" | 2009 || 7 || 8 || 3 || 2 || 20 kursi |} === Duqa magaalada === * Larius Frensrep qiyaastii 1618 * Philipus Maul qiyaastii 1618 * Christoph Wallrab Jan. 1791 - 1797 * Johannes Schöfer qiyaastii 1796 * Ernst Wallrab 1801 - 1808 * Philipp Hausmann 1808 - 1818 * Ludwig Bayer ee Armsheim, Schimsheim iyo Eichloch 1818 - 1822 * Johann Gerlach Jan. 1822 - 1837 * Ludwig Göttelmann 1837 - 1843 * Friedrich Krug 1843 - 1856 * Jakob Zimlich Jan. 1856 - 1875 * Johann Gerlach Mar. 1875 - 1889 * Peter Eibach Apr. 1890 - 1911 * Philipp Feldmann Jul. 1911 - 1933 * Johann Weintz 1933 - 1945 * Georg Link 1945 - 1946 * Ernst Feldmann 1946 - 1948 * Robert Heinrich Eichberger 1948 - 1952, wiilka gabayaa iyo sculptor-kii caanka ahaa ee Mainz Theodor Eichberger. * Karl Feldmann Jan. 1952 - 1964 * Wilhelm Corell 1964 - 1984 * Lothar Müller 1984 - 1994 * Herbert Feldmann 1994 - 1999 * Udo Nehrbaß-Ahles - SPD (1999–2005) * Peter Starck - DFL (2005–2014) * Axel Spieckermann - SPD (2014–2019) * Arno Krätschmann (tan iyo 2019) === Iskaashiga magaalada === *{{flagicon|France}} [[Fléville-devant-Nancy]], [[Meurthe-et-Moselle]], [[France]] tan iyo 1988 Fléville-devant-Nancy waxay leedahay qiyaastii 2,900 oo qof, magaceeduna soo jeediyay, waxay ku taal meel u dhow [[Nancy, France|Nancy]]. === Astaanta degmada === [[Coat of arms|Astaanta]] degmada waxaa lagu tilmaami karaa sidan: Per fess sable a demi-lion rampant Or armed, langued and crowned gules, and argent a dexter arm naked embowed lopped of the third. [[charge (heraldry)|Astaanta]] sare waa Palatine Lion. Astaanta hoose waa [[Canting arms|canting]], taas oo soo jeedinaysa magaca degmada (“Arm” wuxuu la macno yahay isku mid af [[German language|Jarmal]] ah sida [[English language|Ingiriisi]] ah). Shaabadihii magaalada ugu da'da weyn waxay ka soo jeedaan horraantii qarnigii 15-aad oo mar horeba waxay muujinayaan labadan astaamood. Waqti ka mid ah, gacantu waxay haysatay [[bunch of grapes|farabadan canab ah]], taasoo astaan u ah [[winegrowing|beerista khamriga]], laakiin tani waa la tuuray qarnigii 19-aad.<ref>[http://www.ngw.nl/int/dld/a/armsheim.htm Description and explanation of Armsheim’s arms]</ref> == Dhaqaalaha iyo kaabayaasha == === Gaadiidka === Iyada oo leh [[railway station|steshanka tareenka]], Armsheim waxay ka dhigan tahay xarun muhiim ah oo ku taal [[Rhenish Hesse]]. Waxaa halkan ka gudbaya labada khad ee tareenka: [[Alzey–Mainz railway]] iyo [[Rheinhessen Railway]] (''Rheinhessenbahn'') oo ka yimid [[Bingen (Rhein) Stadt station|Bingen am Rhein]] ee loo maro [[Worms Central Station|Worms]]. Hore waxaa u jiray sidoo kale khad ka soo baxay ''Wiesbachtalbahn'' ee loo maro [[Wendelsheim]] iyada oo loo marayo [[Flonheim]], taas oo aragtay dhammaadka rakaabkeeda 1966. Dhammaadka usbuuca iyo ciidaha, waxaa suurtogal ah in loo safrido ''Elsass-Express'' (“Alsace Express”) ee loo maro [[Wissembourg]]. == Dhaqanka iyo goobaha dalxiiska == === Dhismayaasha === *''Kirche “Zum Heiligen Blut”'' (Kaniisadda “Dhiigga Quduuska ah”). Kaniisadda [[Evangelical Church in Germany|Evangelical]] waa mid ka mid ah kaniisadaha tuulada [[Gothic architecture|Gothic]] ee ugu quruxda badan Rhenish Hesse. Kaniisadda weli waxaa loo yaqaan ''Zum Heiligen Blut Christi'' (“Dhiigga Quduuska ah ee Masiixa”) xitaa maanta. Waxaa la dhisay 1431 “caabudidda dhiigga yaabka leh ee Masiixa”. Xitaa maanta waxaa loo yaqaan “Kaniisadda tuulada ugu quruxda badan Rhenish Hesse”. Jawharad gaar ah waa [[organ (music)|xusuusta xubinta]], kaas oo si gaar ah u mudan in la ilaaliyo, oo uu dhisay dhisaha xubinta caanka ah Johann Michael Stumm 1739. Sannad kasta, xubnaha aadka u fiican waxay ku qabtaan taxanaha riwaayadda ''Armsheimer Orgelsommer'' (“xagaaga xubinta”). Inta lagu jiro hakadka, concertgoers waxaa lagu daaweeyaa ''Orgeltropfen'' (“dhibicda xubinta”), dhalada sanadlaha ah ee khamriga Armsheim, ee beerta kaniisadda xagaaga. Soojiidasho gaar ah oo xoog leh oo loogu talagalay dadka jecel farshaxanka ee gobolka oo dhan waa mashruuca ''Kunst und Kirche'' (“Farshaxanka iyo Kaniisadda”). Sannad kasta, waxaa jira ugu yaraan hal bandhig oo ah abuurista farshaxanka diimeed ee casriga ah ee kaniisadda xajka ee duugga ah. 2001, farshaxan wada jir ah ayaa la sameeyay: ''Dietrich Bonhoeffer - Versuch einer Annäherung'' (“[[Dietrich Bonhoeffer]] – Isku dayga Is-waafajinta”), iyadoo la isticmaalayo sawirro, ereyo iyo muusig. Iyadoo hoggaanka Professor Guido Ludes ee Mainz, farshaxanada hal-abuurka leh ee kala duwan waxay isku arkeen inay wada shaqeynayaan mashruucan iskaashiga ah. Aqoonsi gaar ah waxaa lagu siiyay iyada oo loo marayo iskaashiga ''Ministerpräsident'' Kurt Beck. *''St. Remigius-Kirche'' (Kaniisadda Saint Remigius) *Schloss Veldenz (Qalcadda Veldenz) == Trivia == * Taekwondo und Allkampf Club Armsheim e.V. ([[Taekwondo]] iyo farshaxanka dagaalka isku dhafan) * TSV Armsheim-Schimsheim 1886 e.V. (kooxda jimicsiga iyo isboortiga) == Tixraacyo == {{reflist}} == Xiriirinta dibadda == *[https://www.armsheim.de/ Bogga rasmiga ah ee degmada] {{in lang|de}} *[https://www.regionalgeschichte.net/rheinhessen/region/orte/orte-a/armsheim.html Taariikhda Armsheim] {{Wayback|url=https://www.regionalgeschichte.net/rheinhessen/region/orte/orte-a/armsheim.html |date=20110930075127 }} {{in lang|de}} {{Authority control}} 75bu11d7rq7o9l2037za6qvrdlxd7cl Bechtheim 0 49709 307116 303467 2026-09-05T01:42:05Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307116 wikitext text/x-wiki {{Infobox German location |image_coa = Wappen von Bechtheim.png |coordinates = {{coord|49|43|40|N|8|17|32|E|format=dms|display=inline,title}} |image_plan = Bechtheim in AZ.svg |state = |district = Alzey-Worms |Verbandsgemeinde = Wonnegau |elevation = 131 |area = 13.34 |postal_code = 67595 |area_code = 06242 |licence = AZ |Gemeindeschlüssel = 07 3 31 006 |website = [https://www.bechtheim.de/ www.bechtheim.de] |mayor = Jutta Schick<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/3310000000000.html Direktwahlen 2019, Landkreis Alzey-Worms], Landeswahlleiter Rheinland-Pfalz, accessed 3 August 2021.</ref> |leader_term = 2019&ndash;24 |party = }} '''Bechtheim''' waa ''Ortsgemeinde'' – [[Municipalities of Germany|munisipaliteet]] ka tirsan ''[[Verbandsgemeinde]]'', oo ah meel ay ku midoobeen munisipaliteetooyin – oo ku taalla degmada [[Alzey-Worms]] ee [[Rhineland-Palatinate]], [[Germany|Jarmalka]]. Waxay ka tirsan tahay [[Wonnegau|''Verbandsgemeinde'' ee Wonnegau]], oo xarunteedu ku taallo [[Osthofen]]. == Taariikhda == Ablayska [[Franks|Faransiisada ah]] ee Bero ayaa la rumeysan yahay inuu xaruntiisa madaxnimo ka samaystay halkan qarnigii 6aad oo uu aasaasay “Beroheim” (''–heim'' waxay ka dhigan tahay “guri”), oo ay ka baxday Bechtheim. Basiliko [[Lambert of Maastricht|Saint Lambert]] waxaa aasaasay qarnigii 8aad [[Prince-Bishopric of Liège|Aasaaska Katidral ee Liège]], oo ay munisipaliteetka lafteedu ku jirtay lahaanshiheeda markaas. Sannadkii 793, Bechtheim waxay lahayd xusuusteedii ugu horreysay ee dokumanti ka timid [[Fulda Abbey]]. Dokumantiga [[Lorsch codex]] goobta waxaa lagu magacaabay 1070. Marka hore Madaxda Bolanden ka dibna, laga bilaabo 1267, [[House of Leiningen|Tirada Leiningen]] waxay lahaayeen hantida lahaanshaha ee Bechtheim. Dhallinyarada dambe waxay dhowr jeer dhigteen hantidooda. Sannadkii 1700, waxa loogu yeero [[Simultaneum]] ayaa sidoo kale lagu soo bandhigay Bechtheim, kaas oo kaniisadaha [[Protestantism|Purotestanka]] sidoo meelaha loo isticmaali karo [[Roman Catholicism|Kastooliga]], inkastoo taasi ay dhaliyeen muranno u dhaxeeya labada qaybood. Sannadkii 1722, Bechtheim waxaa la siiyay xaqqa suuqa. Sannadkii 1934, “isashaqayn canab” ayaa lagu soo gabagabeeyay [[Erfurt]]. Sannadkii 1964, iyada oo loo marayo ururka ''Heimattreue Erfurter'' (“Dhallinyarada Erfurt oo daacad u ah dalka” – oo ay ka kooban yihiin kuwa ka soo jeeda Erfurt oo ku nool [[West Germany|Jarmalka Galbeed]]), xiriirka Bechtheim ayaa cusboonaysiin lagu sameeyay. Hubaal ahaantii, ''Martinsfest'' ee 10 iyo 11 Nofeembar waxaa laga bilaabo markaas si wadajir ah loogu helday Bechtheim. Ka dib [[German reunification|dib-u-midoobiddii Jarmalka]] ee 1990, Magaalada Erfurt waxay sidoo kale si rasmi ah u soo celisay isashaqaynta. Aagga miyiga toponimada ''Pilgerpfad'' (“Jidka Xajka”) waxaa markii ugu horreysay la dokumanteeyay 1392 sida {{lang|de|an dem bilgerim phade}},<ref>S. Thiebes: ''Jakobspilger'' S: 11 ff mit urkundlichen Belegen zu 1392</ref> oo xusuusinaysa jidka waqooyi-koonfur (ka bilaabanaya Bingen ilaa Speyer) ee [[Way of St. James|Jidka Saint James]]. == Siyaasadda == === Golaha munisipaliteetka === Golaha wuxuu ka kooban yahay 16 xubnood oo golaha ah oo lagu doortay [[proportional representation|wakiilnimada saamiga]] iyo duqa sharafta leh oo ah guddoomiye. Doorashadii munisipaliteetka ee dhacday 7 Juun 2009 waxay bixisay natiijooyinkan soo socda:<ref>[http://wahlen.rlp.de/kw/wahlen/2009/gemeinderatswahlen/ergebnisse/3310400600.html Der Landeswahlleiter Rheinland-Pfalz: Kommunalwahl 2009, Stadt- und Gemeinderatswahlen]</ref> {| class="wikitable" width="400" ! Sannadka || [[Social Democratic Party of Germany|SPD]] || [[Christian Democratic Union of Germany|CDU]] || [[Free Voters|FWG]] || Wadarta |- align="center" | 2009 || 3 || 7 || 6 || 16 kuraasta |- align="center" | 2004 || 4 || 7 || 5 || 16 kuraasta |} === Duqyada === * 1984 - 2009 ''Ortsbürgermeister'' Wolfgang Thomas (FWG) * 2009–present ''Ortsbürgermeisterin'' Jutta Schick (FWG) === Calaamadda dharka === Munisipaliteetka [[Coat of arms|Calaamaddeeda dharka]] waxaa loo muujin karaa caddaan ahaan: Azure oo ah baraf kacsan oo argent ah oo hubaysan, oo carrabkiisa iyo cunahiisu gules yihiin, oo gacmihiisa ku haysa ushiisa Or oo loo hayo palewise. Muudka ugu dambeeya ee Bechtheim ka bilaabo 1500 wuxuu muujinayaa isku midka [[charge (heraldry)|lacagta]] sida calaamada maanta, oo sida dhammaan kuwa kale tan iyo kii ugu horreeyay ee la yaqaanay ay sameeyeen, inkasta oo qaabeynta ayan ahayn mid isku mid ah. Tusaale ahaan, dhamaadkii qarnigii 19aad, calaamadaha waxay ahayd Argent oo ah baraf kacsan oo sable oo hubaysan oo carrabkiisa gules yahay (taas oo ah, baraf madow oo ku yaal dhabarka lacagta leh carrab iyo ciddiyo ku jira, oo aan lahayn kullar iyo ushiisa). Sannadaha oo dhan, barafka wuxuu ka helay jeeri oo ku jira afkiisa, oo hadda maqan, iyo sidoo kale kullarka iyo ushiisa. Waxaa suurtogal ah in barafka uu yahay [[Canting arms|muruq ka taagan]] qaabkii zamankii hore ee magaca munisipaliteetka, ''Berchtheim'' (“Baraf” waa ''Bär'' ee [[German language|Luqadda Jarmalka]], oo loo dhawaaqo sida saddexda dhawaaq ee ugu horreeya ee magaca zamankii hore). Calaamaddaha dharka ee qaabkooda maanta waxaa la siiyay 1958.<ref>[http://www.ngw.nl/int/dld/b/bechthei.htm Description and explanation of Bechtheim’s arms]</ref> == Dhaqaalaha iyo kabayaasha == === Beerida canabka === Bechtheim waxaa lagu go'aamiyaa xaddiga weyn iyada oo loo marayo [[winegrowing|beerida canabka]], oo leh 654&nbsp;ha oo beeraha canabka ah oo la beero, 70.2% leh noocyada [[white wine|khamriga caddaan]] iyo 29.8% leh [[Red wine|khamriga gaduud]]. Ka dib [[Worms, Germany|Worms]] (1&nbsp;490&nbsp;ha), [[Nierstein]] (783&nbsp;ha), [[Alzey]] (769&nbsp;ha), [[Westhofen]] (764&nbsp;ha) iyo [[Alsheim]] (704&nbsp;ha), Bechtheim waa munisipaliteetka lixaad ee ugu weyn ee beerida canabka ee [[Rheinhessen (wine region)|Rhenish Hesse]], iyo mid ka mid ah kuwa ugu weyn ee [[Rhineland-Palatinate]]. === Gaadiidka === Waxaa mar ku tiillay lainka [[railway|tareenka]] ee u dhaxeeya Osthofen iyo Gau Odernheim. == Dadka caanka ah == * Jean-Valentin Bender (1801–1873), maamulaha fanka iyo laxamiistaha * [[Siegmund Mayer]] (1842–1910), [[Physiology|fiisiyoolajiiste]] * [[Joseph Simon (politician)|Joseph Simon]] (1851–1935), siyaasi [[United States|Maraykan]] ah ([[Republican Party (United States)|Xisbiga Jamhuuriga]]) == Akhris dheeraad ah == * Johannes Sommer: ''Bechtheim - St. Lambertus.'' Königstein i. Ts. 1980, {{ISBN|978-3-7845-0202-1}} == Tixraac == {{reflist}} == Xiriirinta dibadda == * {{Official website}} {{in lang|de}} * [http://www.regionalgeschichte.net/rheinhessen/region/orte/orte-b/bechtheim.html Taariikhda gobolka] {{Wayback|url=http://www.regionalgeschichte.net/rheinhessen/region/orte/orte-b/bechtheim.html |date=20110930075142 }} {{in lang|de}} {{Authority control}} l8opw1evqqfp0jzq2wnuzhl6533pnzm Elstertrebnitz 0 50557 307118 304792 2026-09-05T04:15:54Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307118 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = Wappen Elstertrebnitz.svg |coordinates = {{coord|51|9|N|12|14|E|format=dms|display=inline,title}} |image_plan = Elstertrebnitz in L.svg |state = |district = Leipzig |Verwaltungsgemeinschaft = Pegau |elevation = 129 |area = 11.66 |postal_code = 04523 |area_code = 034296 |licence = L, BNA, GHA, GRM, MTL, WUR |Gemeindeschlüssel = 14729100 |divisions = 7 |mayor = David Zühlke<ref>[https://wahlen.sachsen.de/download/Buergermeister/statistik-sachsen_wahlen_buergermeister_uebersicht_aktuell.xlsx Gewählte Bürgermeisterinnen und Bürgermeister im Freistaat Sachsen, Stand: 17. Juli 2022], Statistisches Landesamt des Freistaates Sachsen.</ref> |leader_term = 2022&ndash;29 |party = CDU }} '''Elstertrebnitz''' waa degmo ka tirsan [[Saxony]], oo jiirta koonfur-galbeed ka Leipzig iyo waqooyi-bari ka [[Zeitz]]. == Juqraafi == Elstertrebnitz waxay ku taal koonfurta Leipzig, oo ku taal dooxo hooseaysa oo qiyaastii 15 km waqooyi-bari ka ah Zeitz. === Degmooyinka la deriska ah === Elstertrebnitz waxay xuduud la leedahay xagga waqooyiga magaalada [[Pegau]], xagga waqooyi-bari magaalada [[Groitzsch]], gobolka [[Elsteraue]] ee koonfurta iyo gobolka [[Hohenmölsen]] ee galbeedka. Gobollada Elstertrebnitz iyo Hohenmölsen waxaa kala saara macdanta furan ee Profen. == Dhaqaalaha == Degmadu waa mid inta badan beeraha ku xiran. === Elstermühlgraben === Elstermühlgraben waa magaca [[flume|biyo mareen]] laga leexiyay wabiga Elster. Elstermühlgraben waxay wadday mashiinnadii warshadaha ee ka yimid Elstertrebnitz ilaa [[Kleindalzig]] ilaa qarnigii 20-aad. Warshado aad u yar ayaa maanta shaqeeya. Wax walba ka sarreeya, biyo mareenku wuxuu u adeegeynayay reer miyiga dabbaasha iyo il biyo ah oo loogu talagalay biyaha lagu mayro ee la rabay. Musqulaha Pegauer, oo si toos ah u ag yaal Elstermühlgraben, ayaa nadiifiyey oo u isticmaalay biyaha xaruntooda. Laakiin biyo mareenka waxaa sidoo kale loo isticmaalayay waddo gaadiid oo loogu talagalay isticmaal kala duwan. == Tixraac == {{reflist}} == Xiriirinta dibadda == * [http://www.elstertrebnitz.de/ Town of Elstertrebnitz in German] {{Wayback|url=http://www.elstertrebnitz.de/ |date=20150925015925 }} {{Authority control}} fv9u2ct8qm92beoc4hzz81778fte4rf Hettingen 0 51224 307120 306092 2026-09-05T05:40:58Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307120 wikitext text/x-wiki {{Infobox German location |type = Stadt |image_photo = |image_coa = Hettingen Wappen.png |coordinates = {{coord|48|12|58|N|9|13|53|E|format=dms|display=inline,title}} |image_plan = Karte Hettingen.png |state = |region = Tübingen |district = Sigmaringen |elevation = 644 |area = 46.06 |postal_code = 72513 |area_code = 07574 |licence = SIG |Gemeindeschlüssel = 08 4 37 047 |divisions = 2 |website = [http://www.hettingen.de/ www.hettingen.de] |mayor = Daniel Eiffler<ref>[https://www.staatsanzeiger.de/wahl/buergermeisterwahl-hettingen-2024/ Bürgermeisterwahl Hettingen 2024], Staatsanzeiger. Retrieved 12 June 2024.</ref> |leader_term = 2024&ndash;32 |party = }} '''Hettingen''' ({{IPA|de|ˈhɛtɪŋən|-|De-Hettingen.ogg}}) waa magaalo ka tirsan degmada [[Sigmaringen (district)|Sigmaringen]], ee gobolka [[Baden-Württemberg]], dalka [[Germany|Jarmalka]]. Waxay ku taal 14 km waqooyi ka xigta [[Sigmaringen]]. Hettingen waxay liqday degmadii hore ee madax-bannaanayd ee Inneringen sanadkii 1975. [[File:KircheundDorfmitteInneringen.jpg|thumb|left|Kaniisadda St. Martin Inneringen]] == Duqeyda Magaalada == Uwe Bühler waxaa loo doortay duqa magaalada Oktoober 2008.<ref>''Uwe Bühler waa duqa cusub ee Hettingen''. In: ''Schwäbische Zeitung'' vom 13.&nbsp;Oktober 2008</ref> Bühler wuxuu geeriyooday 2011 isagoo 50 jir ah cudurka kansarka awgii,<ref>{{Cite web |title=www.schwaebische.de |url=http://www.schwaebische.de/region/sigmaringen-tuttlingen/gammertingen/rund-um-gammertingen_artikel,-Schock-Uwe-Buehler-erliegt-seinem-Krebsleiden-_arid,5141403.html |access-date=2026-08-28 |archive-date=2011-10-06 |archive-url=https://web.archive.org/web/20111006192649/http://www.schwaebische.de/region/sigmaringen-tuttlingen/gammertingen/rund-um-gammertingen_artikel,-Schock-Uwe-Buehler-erliegt-seinem-Krebsleiden-_arid,5141403.html |url-status=dead }}</ref> Febraayo 2012 Dagmar Kuster waxaa loo doortay duqa magaalada. Duqeyda Hettingen * ilaa 1974: Johann Knaus (CDU) Duqeyda Inneringen * 1905–1933: Josef Kempf * 1933–1945: Wilhelm Fritz * 1945–1948: Johann Georg Ott * 1949–1974: Johann Georg Brandstetter Duqeyda Hettingen ka dib mideyntii Inneringen * 1975–1999: Johannes Müller (CDU) * 1999–2008: Stefan Bubeck (CDU) * 2008–2011: Uwe Bühler (CDU) * 2012–2024: Dagmar Kuster * tan iyo 2024: Daniel Eiffler == Tixraacyo == {{Reflist}} {{Authority control}} d0374w340qth6sq2xuoncayyg0kggnf Impflingen 0 51752 307078 2026-09-04T13:14:19Z Isma4l 41797 /* */ 307078 wikitext text/x-wiki {{Infobox German location |image_photo = Dorfstrasse Impflingen.jpg |image_coa = DEU Impflingen COA.svg |coordinates = {{coord|49|09|51|N|8|06|51|E|format=dms|display=inline,title}} |image_plan = Impflingen in SÜW.svg |state = |district = Südliche Weinstraße |Verbandsgemeinde = Landau-Land |elevation = 157 |area = 5.18 |postal_code = 76831 |area_code = 06341 |licence = SÜW |Gemeindeschlüssel = 07 3 37 043 |website = [http://www.impflingen.de/ www.impflingen.de] |mayor = Holger Kurz<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/3370000000000.html Direktwahlen 2019, Landkreis Südliche Weinstraße], Landeswahlleiter Rheinland-Pfalz, accessed 10 August 2021.</ref> |leader_term = 2019&ndash;24 |party = FWG }} '''Impflingen''' ({{IPA|de|ˈɪmpflɪŋən|-|De-Impflingen.ogg}}) waa degmo ka tirsan degmada [[Südliche Weinstraße]], ee [[Rhineland-Palatinate]], galbeedka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} j1hag9od47w3vhoql8flc0tjim7dt78 Imsbach 0 51753 307079 2026-09-04T13:15:55Z Isma4l 41797 /* */ 307079 wikitext text/x-wiki {{Infobox German location |image_photo = Imsbach.JPG |image_caption = Imsbach |image_coa = DEU Imsbach COA.svg |coordinates = {{coord|49|34|59|N|7|52|57|E|format=dms|display=inline,title}} |image_plan = Imsbach in KIB.svg |state = |district = Donnersbergkreis |Verbandsgemeinde = Winnweiler |elevation = 293 |area = 8.89 |postal_code = 67817 |area_code = 06302, 06357 |licence = KIB |Gemeindeschlüssel = 07 3 33 033 |mayor = Oliver Krupp<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/3330000000000.html Direktwahlen 2019, Donnersbergkreis], Landeswahlleiter Rheinland-Pfalz, accessed 9 August 2021.</ref> |leader_term = 2019&ndash;24 }} '''Imsbach''' waa degmo ka tirsan degmada [[Donnersbergkreis]], ee [[Rhineland-Palatinate]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} cxdd0rk0g62kgde3flk9s0k3la5rvq2 Imsweiler 0 51754 307080 2026-09-04T13:17:50Z Isma4l 41797 /* */ 307080 wikitext text/x-wiki {{Infobox German location |image_photo = Imsweiler, Alsenzstraße 20170827.jpg |image_caption = ''Alsenzstraße'' |image_coa = DEU Imsweiler COA.svg |coordinates = {{coord|49|36|10|N|7|48|01|E|format=dms|display=inline,title}} |image_plan = Imsweiler in KIB.svg |state = |district = Donnersbergkreis |Verbandsgemeinde = Nordpfälzer Land |elevation = 216 |area = 9.90 |postal_code = 67808 |area_code = 06361, 06363 |licence = KIB |Gemeindeschlüssel = 07 3 33 034 |mayor = Peter Ziepser<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/3330000000000.html Direktwahlen 2019, Donnersbergkreis], Landeswahlleiter Rheinland-Pfalz, accessed 9 August 2021.</ref> |leader_term = 2019&ndash;24 }} '''Imsweiler''' waa degmo ka tirsan degmada [[Donnersbergkreis]], ee [[Rhineland-Palatinate]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 7tle3odio39gzt14sj36uv3ibp44wyf Inchenhofen 0 51755 307081 2026-09-04T13:19:31Z Isma4l 41797 /* */ 307081 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Inchenhofen COA.svg |image_flag = DEU Inchenhofen Flag.png |coordinates = {{coord|48|31|N|11|7|E|format=dms|display=inline,title}} |image_plan = Inchenhofen in AIC.svg |state = |region = Schwaben |district = Aichach-Friedberg |elevation = 460-485 |area = 27.55 |postal_code = 86570 |area_code = 08257 |licence = AIC |Gemeindeschlüssel = 09 7 71 141 |mayor = Anton Schoder<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = |website = [http://www.inchenhofen.de www.inchenhofen.de] }} '''Inchenhofen''' (oo sidoo kale looga yaqaan ''Leahad'' luqadda maxalliga ah) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Aichach-Friedberg]] ee gobolka [[Bavaria|Bavaria]] ee dalka [[Germany|Jarmalka]]. ''Leahad'' waxay tilmaamaysaa xaqiiqda ah inay tahay goob xaj ama barakaysan oo loogu talagalay Saint [[Leonard of Noblac]]. Illaa iyo xilligii [[Secularisation|Hagardaamada/Secularisation]], waxay ahayd goobta xajka ee ugu muhiimsan ee quduuskan ku taalla bartamaha Yurub. ==Tixraacyo== {{Reflist}} {{Authority control}} t34egjsl0imyvodum63ea6s61k8er0p Ingendorf 0 51756 307082 2026-09-04T13:21:16Z Isma4l 41797 /* */ 307082 wikitext text/x-wiki {{Infobox German location |name = Ingendorf |type = |image_photo = |imagesize = |image_caption = |image_coa = Wappen Ingendorf.png |coordinates = {{coord|49|56|02|N|6|27|22|E|format=dms|display=inline,title}} |image_plan = Ingendorf in BIT.svg |state = |district = Eifelkreis Bitburg-Prüm |Verbandsgemeinde = Bitburger Land |elevation = 250 |area = 3.32 |postal_code = 54636 |area_code = 06568 |licence = BIT |Gemeindeschlüssel = 07 2 32 062 |website = [http://www.bitburgerland.de/index.php?id=360 Ingendorf at the Bitburger Land website www.bitburgerland.de] |mayor = Dirk Wagner<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/2320000000000.html Direktwahlen 2019, Eifelkreis Bitburg-Prüm], Landeswahlleiter Rheinland-Pfalz, accessed 6 August 2021.</ref> |leader_term = 2019&ndash;24 |Bürgermeistertitel = Ortsbürgermeister }} '''Ingendorf''' waa degmo ka tirsan [[Bitburg-Prüm|degmada Bitburg-Prüm]], ee [[Rhineland-Palatinate]], galbeedka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{authority control}} oii3ryevlokcgy96cgc147gmn97a6de Ingersleben 0 51757 307083 2026-09-04T13:22:56Z Isma4l 41797 /* */ 307083 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = DEU Ingersleben (Nesse-Apfelstädt) COA.svg |coordinates = {{coord|52|13|N|11|07|E|format=dms|display=inline,title}} |image_plan = Ingersleben in BK.png |state = |district = Börde |Verbandsgemeinde = Flechtingen |elevation = |area = 31.27 |postal_code = 39343 |area_code = 039400, 039050, 039052 |licence = BK, OK |Gemeindeschlüssel = 15083323 |website = [https://www.elbe-heide.de www.elbe-heide.de] |mayor = David Wieter<ref name=mayor>[https://wahlergebnisse.sachsen-anhalt.de/wahlen/bmbm/index.html Bürgermeisterwahlen in den Gemeinden, Endgültige Ergebnisse], [[Statistisches Landesamt Sachsen-Anhalt]], accessed 3 February 2022.</ref> |leader_term = 2021&ndash;28 |party = }} '''Ingersleben''' waa degmo ka tirsan degmada [[Börde (district)|Börde]] ee gobolka [[Saxony-Anhalt]], [[Germany|Jarmalka]]. Waxaa la aasaasay Janaayo 1, 2010 iyadoo la midoobiyey degmooyinkii hore ee [[Alleringersleben]], [[Eimersleben]], [[Morsleben]] iyo [[Ostingersleben]].<ref>[https://www.destatis.de/DE/Themen/Laender-Regionen/Regionales/Gemeindeverzeichnis/Namens-Grenz-Aenderung/2010.html Gebietsänderungen vom 01. Januar bis 31. Dezember 2010], [[Statistisches Bundesamt]]</ref> == Tixraacyo == {{reflist}} {{Authority control}} lp2ph66xp4jl5j9ruiy2uix007o0z3m Ingoldingen 0 51758 307084 2026-09-04T13:24:36Z Isma4l 41797 /* */ 307084 wikitext text/x-wiki {{Infobox German place |image_coa = Wappen Ingoldingen.svg |image_photo = Ingoldingen - Winterstettenstadt nördl - Sportpl - Ingoldingen v S 02.jpg |coordinates = {{coord|48|1|33|N|9|44|31|E|format=dms|display=inline,title}} |image_plan = Ingoldingen in BC.svg |state = |region = Tübingen |district = Biberach |elevation = 551 |area = 44.24 |postal_code = 88456 |area_code = 07355 |licence = BC |Gemeindeschlüssel = 08 4 26 062 |website = [http://www.ingoldingen.de/ www.ingoldingen.de] |mayor = Jürgen Schnell<ref>[https://www.staatsanzeiger.de/staatsanzeiger/wahlen/buergermeisterwahlen/ Aktuelle Wahlergebnisse], Staatsanzeiger, accessed 11 September 2021.</ref> |leader_term = 2019&ndash;27 }} '''Ingoldingen''' ({{IPA|de|ˈɪngɔldɪŋən}}) waa degmo ku taal degmada [[Biberach (district)|Biberach]] ee gobolka [[Baden-Württemberg]] ee dalka [[Germany|Jarmalka]]. Waxay ku taallaa qiyaastii 9&nbsp;km koonfur-galbeed ee magaalada [[Biberach an der Riß]]. ==Tixraacyo== {{Reflist}} ==Xiriirinta dibadda== *{{Commons category-inline}} {{Authority control}} 52mlyvs5qs5bsjx8h4iixzieoe7y9n7 Insheim 0 51759 307085 2026-09-04T13:26:10Z Isma4l 41797 /* */ 307085 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = DEU Insheim COA.svg |coordinates = {{coord|49|09|55|N|8|08|50|E|format=dms|display=inline,title}} |image_plan = Insheim in SÜW.svg |state = |district = Südliche Weinstraße |Verbandsgemeinde = Herxheim |elevation = 149 |area = 8 |postal_code = 76865 |area_code = 06341 |licence = SÜW |Gemeindeschlüssel = 07 3 37 044 |website = [http://www.insheim.de/ www.insheim.de] |mayor = Martin Baumstark<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/3370000000000.html Direktwahlen 2019, Landkreis Südliche Weinstraße], Landeswahlleiter Rheinland-Pfalz, accessed 10 August 2021.</ref> |leader_term = 2019&ndash;24 |party = CDU }} '''Insheim''' ({{IPA|de|ˈɪnshaɪm}}) waa degmo ka tirsan [[Verbandsgemeinde]] [[Herxheim (Verbandsgemeinde)|Herxheim]] ee degmada [[Südliche Weinstraße]] ee gobolka [[Rhineland-Palatinate]]. ==Juqraafiga== Insheim waa qayb ka mid ah [[Südpfalz]]. Degmadani waxay hoos tagtaa [[Verbandsgemeinde]] [[Herxheim (Verbandsgemeinde)|Herxheim]]. Degmooyinka la deriska ah Insheim - iyaga oo u socda dhanka saacadda - waa - [[Landau in der Pfalz]], [[Herxheim bei Landau/Pfalz]], [[Erlenbach bei Kandel]], [[Steinweiler]], [[Rohrbach (Pfalz)]] iyo [[Impflingen]]. [[File:Rathaus Insheim 04.jpg|thumb|Hoolka magaalada Insheim]] ==Tixraacyo== {{Commonscat}} {{Reflist}} ==Xiriirinta dibadda== * [http://www.insheim.de/ www.insheim.de] {{Authority control}} tjteed6c6ldncgvrjz4hf6hzkr0meqg Insingen 0 51760 307086 2026-09-04T13:27:40Z Isma4l 41797 /* */ 307086 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Insingen COA.svg |coordinates = {{coord|49|17|N|10|10|E|format=dms|display=inline,title}} |image_plan = Insingen in AN.svg |state = |region = Mittelfranken |district = Ansbach |Verwaltungsgemeinschaft = Rothenburg ob der Tauber |elevation = 399 |area = 21.32 |postal_code = 91610 |area_code = 09869 |licence = AN |Gemeindeschlüssel = 09 5 71 169 |divisions = 9 [[Ortsteil]]e |website = [http://www.insingen.de/ www.insingen.de] |mayor = Peter Köhnlechner<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = }} '''Insingen''' ({{IPA|de|ˈɪnzɪŋən}}) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Ansbach (district)|Ansbach]] ee gobolka [[Bavaria|Bavaria]] ee dalka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} e3drboffzegxdx515k38p2o5ux8b0h6 Irndorf 0 51761 307087 2026-09-04T13:29:59Z Isma4l 41797 /* */ 307087 wikitext text/x-wiki {{Infobox German place |image_coa = Wappen Irndorf.png |coordinates = {{coord|48|03|59|N|08|58|22|E|format=dms|display=inline,title}} |image_plan = Irndorf in TUT.svg |state = |region = Freiburg |district = Tuttlingen |elevation = 820 |area = 14.56 |postal_code = 78597 |area_code = 07466 |licence = TUT |Gemeindeschlüssel = 08 3 27 027 |website = [http://www.irndorf.de/ www.irndorf.de] |mayor = Thomas Blazko<ref>[https://www.staatsanzeiger.de/wahl/buergermeisterwahl-in-irndorf-2024/ Bürgermeisterwahl in Irndorf 2024], Staatsanzeiger. Retrieved 12 June 2024.</ref> |leader_term = 2024&ndash;32 |party = }} '''Irndorf''' waa degmo ka tirsan degmada [[Tuttlingen (district)|Tuttlingen]] ee gobolka [[Baden-Württemberg]] ee dalka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} qoooqkmtg11y98mrsb0ob6w1b260d3r Irrel 0 51762 307088 2026-09-04T13:31:41Z Isma4l 41797 /* */ 307088 wikitext text/x-wiki {{Infobox German location |type = Ortsgemeinde |image_coa = DEU Irrel COA.png |coordinates = {{coord|49|50|50|N|06|27|22|E|format=dms|display=inline,title}} |image_plan = Irrel in BIT.svg |state = |district = Eifelkreis Bitburg-Prüm |Verbandsgemeinde = Südeifel |elevation = 170 |area = 7.05 |postal_code = 54666 |area_code = 06525 |licence = BIT |Gemeindeschlüssel = 07 2 32 063 |divisions = |website = [http://www.suedeifelinfo.de/index.php/2014-04-02-10-51-07/gemeinden-der-vg-suedeifel Irrel at site www.suedeifelinfo.de] |mayor = Herbert Theis<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/2320000000000.html Direktwahlen 2019, Eifelkreis Bitburg-Prüm], Landeswahlleiter Rheinland-Pfalz, accessed 6 August 2021.</ref> |leader_term = 2019&ndash;24 |Bürgermeistertitel = Ortsbürgermeister |party = }} '''Irrel''' waa degmo ka tirsan degmada [[Bitburg-Prüm]], ee [[Rhineland-Palatinate]], [[Germany|Jarmalka]]. Waxay ku taal gobolka [[Eifel]], oo u dhow xadka [[Luxembourg]], isgoyska ay ku kulmaan webiyada [[Prüm River|Prüm]] iyo [[Nims (river)|Nims]]. Waxay u jirtaa qiyaastii 15&nbsp;km koonfur-galbeed ee magaalada [[Bitburg]] iyo 5&nbsp;km waqooyi-bari ee [[Echternach]]. Irrel waxay ahayd xaruntii hore ee ''[[Verbandsgemeinde]]'' ("degmada wadajirka ah") [[Irrel (Verbandsgemeinde)|Irrel]]. Laga soo bilaabo 1 Luulyo 2014 waxay qayb ka tahay ''Verbandsgemeinde'' [[Südeifel (Verbandsgemeinde)|Südeifel]].<ref>{{cite web |url=http://www.suedeifelinfo.de/index.php/2014-04-02-10-51-07/die-verbandsgemeinde-suedeifel |title=Die Verbandsgemeinde Südeifel |publisher=Verbandsgemeinde Südeifel |language=German |date=July 2014 |access-date=5 May 2015}}</ref> == Goobaha Dalxiiska == * [[Devil's Gorge (Eifel)|Devil's Gorge]] ==Tixraacyo== {{Reflist}} {{Authority control}} 9xvjvrhq2n1lwyfpst67vb1bzaeytm5 307121 307088 2026-09-05T05:59:41Z InternetArchiveBot 28368 Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5 307121 wikitext text/x-wiki {{Infobox German location |type = Ortsgemeinde |image_coa = DEU Irrel COA.png |coordinates = {{coord|49|50|50|N|06|27|22|E|format=dms|display=inline,title}} |image_plan = Irrel in BIT.svg |state = |district = Eifelkreis Bitburg-Prüm |Verbandsgemeinde = Südeifel |elevation = 170 |area = 7.05 |postal_code = 54666 |area_code = 06525 |licence = BIT |Gemeindeschlüssel = 07 2 32 063 |divisions = |website = [http://www.suedeifelinfo.de/index.php/2014-04-02-10-51-07/gemeinden-der-vg-suedeifel Irrel at site www.suedeifelinfo.de] |mayor = Herbert Theis<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/2320000000000.html Direktwahlen 2019, Eifelkreis Bitburg-Prüm], Landeswahlleiter Rheinland-Pfalz, accessed 6 August 2021.</ref> |leader_term = 2019&ndash;24 |Bürgermeistertitel = Ortsbürgermeister |party = }} '''Irrel''' waa degmo ka tirsan degmada [[Bitburg-Prüm]], ee [[Rhineland-Palatinate]], [[Germany|Jarmalka]]. Waxay ku taal gobolka [[Eifel]], oo u dhow xadka [[Luxembourg]], isgoyska ay ku kulmaan webiyada [[Prüm River|Prüm]] iyo [[Nims (river)|Nims]]. Waxay u jirtaa qiyaastii 15&nbsp;km koonfur-galbeed ee magaalada [[Bitburg]] iyo 5&nbsp;km waqooyi-bari ee [[Echternach]]. Irrel waxay ahayd xaruntii hore ee ''[[Verbandsgemeinde]]'' ("degmada wadajirka ah") [[Irrel (Verbandsgemeinde)|Irrel]]. Laga soo bilaabo 1 Luulyo 2014 waxay qayb ka tahay ''Verbandsgemeinde'' [[Südeifel (Verbandsgemeinde)|Südeifel]].<ref>{{cite web |url=http://www.suedeifelinfo.de/index.php/2014-04-02-10-51-07/die-verbandsgemeinde-suedeifel |title=Die Verbandsgemeinde Südeifel |publisher=Verbandsgemeinde Südeifel |language=German |date=July 2014 |access-date=5 May 2015 |archive-date=2015-06-03 |archive-url=https://web.archive.org/web/20150603055252/http://www.suedeifelinfo.de/index.php/2014-04-02-10-51-07/die-verbandsgemeinde-suedeifel |url-status=dead }}</ref> == Goobaha Dalxiiska == * [[Devil's Gorge (Eifel)|Devil's Gorge]] ==Tixraacyo== {{Reflist}} {{Authority control}} gexja1rf8ar77p6hm4iietqgd6rcgyc Irrhausen 0 51763 307089 2026-09-04T13:33:29Z Isma4l 41797 /* */ 307089 wikitext text/x-wiki {{Infobox German location |name = Irrhausen |type = |image_photo = |imagesize = |image_caption = |image_coa = Wappen Irrhausen.gif |coordinates = {{coord|50|04|50|N|6|12|45|E|format=dms|display=inline,title}} |image_plan = Irrhausen in BIT.svg |state = |district = Eifelkreis Bitburg-Prüm |Verbandsgemeinde = Arzfeld |elevation = 370 |area = 7.19 |postal_code = 54689 |area_code = 06550 |licence = BIT |Gemeindeschlüssel = 07 2 32 245 |website = [http://www.irrhausen.de/ www.irrhausen.de] |mayor = Edgar Krings<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/2320000000000.html Direktwahlen 2019, Eifelkreis Bitburg-Prüm], Landeswahlleiter Rheinland-Pfalz, accessed 6 August 2021.</ref> |leader_term = 2019&ndash;24 }} '''Irrhausen''' waa degmo ka tirsan [[Bitburg-Prüm|degmada Bitburg-Prüm]], ee [[Rhineland-Palatinate]], galbeedka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} jg58ptygabf7c0yt50g1cf5hs7rtyq9 Isselbach 0 51764 307090 2026-09-04T13:35:11Z Isma4l 41797 /* */ 307090 wikitext text/x-wiki {{Infobox German location |image_photo = Isselbach2.jpg |image_coa = DEU Isselbach COA.svg |coordinates = {{coord|50|23|23|N|7|53|30|E|format=dms|display=inline,title}} |image_plan = Isselbach in EMS.svg |state = |district = Rhein-Lahn-Kreis |Verbandsgemeinde = Diez |elevation = 165 |area = 7.19 |postal_code = 65558 |area_code = 06439 |licence = EMS, DIZ, GOH |Gemeindeschlüssel = 07 1 41 064 |divisions = 3 |website = [https://www.vgdiez.de/ www.vgdiez.de] |mayor = Ulrich Jürgens<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/1410000000000.html Direktwahlen 2019, Rhein-Lahn-Kreis], Landeswahlleiter Rheinland-Pfalz, accessed 4 August 2021.</ref> |leader_term = 2019&ndash;24 |party = }} '''Isselbach''' waa degmo ka tirsan [[Rhein-Lahn|degmada Rhein-Lahn]], ee [[Rhineland-Palatinate]], galbeedka [[Germany|Jarmalka]]. Waxay ka tirsan tahay ururka degmooyinka ee [[Diez (Verbandsgemeinde)|Diez]]. == Gaadiidka == Isselbach waxay ku taal ururka gaadiidka ee Verkehrsverbund Rhein-Mosel (VRM), lambarka aagga 519 waxaana u adeega khadadka basaska maxalliga ah 453, 458, 577 iyo 578. ==Tixraacyo== {{Reflist}} {{Authority control}} lq4402g7h0asjo2yho63f3qonc31vke Issigau 0 51765 307091 2026-09-04T13:36:41Z Isma4l 41797 /* */ 307091 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Issigau COA.svg |image_photo = Issigau-von-SO.jpg |image_caption = Issigau |coordinates = {{coord|50|22|N|11|43|E|format=dms|display=inline,title}} |image_plan = Issigau in HO.svg |state = |region = Oberfranken |Verwaltungsgemeinschaft = Lichtenberg, Bavaria |district = Hof |elevation = 524 |area = 18.69 |postal_code = 95188 |area_code = 09293 |licence = HO |Gemeindeschlüssel = 09 4 75 137 |divisions = 10 [[Ortsteil]]e |website = [http://www.issigau.de/ www.issigau.de] |mayor = Dieter Gemeinhardt<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = CSU }} '''Issigau''' waa [[Municipalities of Germany|degmo]] ku taal [[Franconia|Franconia]] sare oo ka tirsan degmada [[Hof (district)|Hof]] ee gobolka [[Bavaria|Bavaria]] ee dalka [[Germany|Jarmalka]]. Waxay ku taal webiga [[Issig|Issig]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 3nvlmwexwve3a799tafu7wq4aft0uue Jabel 0 51766 307092 2026-09-04T13:38:53Z Isma4l 41797 /* */ 307092 wikitext text/x-wiki {{Infobox German location |image_coa = File:Coa Jabel.svg |coordinates = {{coord|53|32|12|N|12|32|48|E|format=dms|display=inline,title}} |image_plan = Jabel in MBS.svg |image_photo = Jabel.jpg |imagesize = |image_caption = Jabel |state = |district = Mecklenburgische Seenplatte |Amt = Seenlandschaft Waren |elevation = 72 |area = 80.02 |postal_code = 17194 |area_code = 039929 |licence = MÜR |Gemeindeschlüssel = 13 0 71 069 |website = {{url|https://www.amt-slw.de/}} |mayor = Johannes Güssmer }} '''Jabel''' ({{IPA|de|ˈjaːbl̩}}) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Mecklenburgische Seenplatte (district)|Mecklenburgische Seenplatte]], ee gobolka [[Mecklenburg-Vorpommern]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{authority control}} imvfmoostoj0qd7bbkxf67pt5lf0t1a Jardelund 0 51767 307093 2026-09-04T13:40:29Z Isma4l 41797 /* */ 307093 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = DEU Jardelund COA.svg |coordinates = {{coord|54|49|N|9|11|E|format=dms|display=inline,title}} |image_plan = Jardelund in SL.PNG |state = |district = Schleswig-Flensburg |Amt = Schafflund |elevation = 32 |area = 16.63 |postal_code = 24994 |area_code = 04605 |licence = SL |Gemeindeschlüssel = 01 0 59 129 |website = [http://www.amt-schafflund.de/ www.amt-<br />schafflund.de] |mayor = Stefan Kunz |party = }} '''Jardelund''' waa degmo ka tirsan degmada [[Schleswig-Flensburg]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{authority control}} flibkqu4gz0p7a72bexvq1y7b6kr2xs Jelmstorf 0 51768 307094 2026-09-04T13:42:03Z Isma4l 41797 /* */ 307094 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Jelmstorf COA.svg |coordinates = {{coord|53|06|08|N|10|31|29|E|format=dms|display=inline,title}} |image_plan = Jelmstorf in UE.svg |state = |district = Uelzen |Samtgemeinde = Bevensen-Ebstorf |elevation = 44 |area = 13.71 |postal_code = 29585 |area_code = 05821 |licence = UE |Gemeindeschlüssel = 03 3 60 012 |divisions = 3 |mayor = Norbert Brandl |party = CDU }} '''Jelmstorf''' waa degmo ka tirsan degmada [[Uelzen (district)|Uelzen]], ee gobolka [[Lower Saxony|Hooseysa Saxony (Niedersachsen)]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 90iy81vjpkuymqno9ous88xsoziqjqb Jerrishoe 0 51769 307095 2026-09-04T13:43:46Z Isma4l 41797 /* */ 307095 wikitext text/x-wiki {{Infobox German location |name = Jerrishoe<br><small>Jerrishøj</small> |image_photo = |image_coa = DEU Jerrishoe COA.svg |coordinates = {{coord|54|39|32|N|9|22|25|E|format=dms|display=inline,title}} |image_plan = Jerrishoe in SL.PNG |state = |district = Schleswig-Flensburg |Amt = Eggebek |elevation = 20 |area = 16.00 |postal_code = 24963 |area_code = 04638 |licence = SL |Gemeindeschlüssel = 01 0 59 131 |website = [http://www.amt-eggebek.de/ www.amt-eggebek.de] |mayor = Heike Schmidt |party = }} '''Jerrishoe''' ({{langx|da|Jerrishøj}}) waa degmo ka tirsan degmada [[Schleswig-Flensburg]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{authority control}} tc3wtdei2ayhe1uzi47oommu98c90jg Jersbek 0 51770 307096 2026-09-04T13:45:13Z Isma4l 41797 /* */ 307096 wikitext text/x-wiki {{Infobox German place | image_coa = DEU Jersbek COA.svg | image_photo = Herrenhaus Jersbek.JPG | image_caption = Jersbek Manor | coordinates = {{coord|53|44|27|N|10|13|21|E|format=dms|display=inline,title}} | image_plan = Jersbek in OD.svg | state = | district = Stormarn | Amt = Bargteheide-Land | elevation = 20-55 | area = 17.92 | postal_code = 22941 | area_code = 04532 | licence = OD | Gemeindeschlüssel = 01 0 62 036 | website = [http://www.bargteheide-land.de/ www.bargteheide-<br />land.de] | mayor = Herbert Sczech | party = }} '''Jersbek''' waa degmo ka tirsan degmada [[Stormarn (district)|Stormarn]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. Waxay ka kooban tahay tuulooyinka Jersbek, Klein Hansdorf iyo Timmerhorn.<ref>{{Cite web |date=2017-01-18 |title=Gemeinde Jersbek |url=http://www.jersbek.de/gemeinde-jersbek/ |access-date=2025-12-08 |website=Gemeinde Jersbek |language=de-DE}}</ref> Bulshadu waxay si weyn ugu soo caan baxday beerta barookada qarnigii 18-aad, oo uu aasaasay Bendix von Ahlefeld (1678–1757).<ref>{{Cite web |title=Historisches und Eiskeller - Jersbeker Park |url=https://www.jersbeker-park.de/index.php/historisches |access-date=2025-12-08 |website=www.jersbeker-park.de}}</ref> Tan iyo 1913, waa hoyga kooxda ciyaaraha ee SSV Jersbek, oo bixisa hawlo ay ka mid yihiin kubbadda cagta, Zumba, Judo & Ju Jitsu, kubbadda laliska, gantaallada (darts), ciyaaraha carruurta iyo jirdhiska.<ref>{{Cite web |title=Spiel- und Sportverein Jersbek von 1913 e.V. - Startseite |url=https://ssvjersbek.de/Startseite/ |access-date=2026-04-10 |website=ssvjersbek.de |language=de}}</ref> ==Tixraacyo== {{Reflist}} {{Authority control}} cp481qz9drq76keuvh59mvpcpmcuoc0 Jetzendorf 0 51771 307097 2026-09-04T13:47:10Z Isma4l 41797 /* */ 307097 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Jetzendorf COA.svg |coordinates = {{coord|48|25|N|11|25|E|format=dms|display=inline,title}} |image_plan = Jetzendorf in PAF.svg |state = |region = Oberbayern |district = Pfaffenhofen a.d.Ilm |elevation = 481 |area = 21.74 |postal_code = 85305 |area_code = 08137 |licence = PAF |Gemeindeschlüssel = 09 1 86 132 |website = [http://www.jetzendorf.de www.jetzendorf.de] |mayor = Tobias Endres<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]]. Retrieved 13 June 2024.</ref> |leader_term = 2024&ndash;30 |party = }} '''Jetzendorf''' ({{IPA|de|ˈjɛtsn̩ˌdɔʁf}}) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Pfaffenhofen (district)|Pfaffenhofen]] ee gobolka [[Bavaria|Bavaria]] ee dalka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} ijd66ive8k2xip92tt41988gzem45b3 Jevenstedt 0 51772 307098 2026-09-04T13:48:54Z Isma4l 41797 /* */ 307098 wikitext text/x-wiki {{Infobox German location |image_photo = |image_flag = Flagge Jevenstedt.png |image_coa = DEU Jevenstedt COA.svg |coordinates = {{coord|54|13|54|N|9|40|18|E|format=dms|display=inline,title}} |image_plan = Jevenstedt in RD.png |state = |district = Rendsburg-Eckernförde |Amt = Jevenstedt |elevation = 6 |area = 45.48 |postal_code = 24808 |area_code = 04337 |licence = RD |Gemeindeschlüssel = 01 0 58 086 |website = {{url|http://www.amt-jevenstedt.de/}} |mayor = Dieter Backhaus |party = SPD }} '''Jevenstedt''' waa degmo ka tirsan degmada [[Rendsburg-Eckernförde]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. Waxay ku taal qiyaastii 8&nbsp;km koonfur ka xigta magaalada [[Rendsburg]]. Jevenstedt waxay ahayd xaruntii ''[[Amt (subnational entity)|Amt]]'' ("degmada wadajirka ah") [[Jevenstedt (Amt)|Jevenstedt]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 4l9u0ryedi3rwwb9e266lg6przfiyuy Jonaswalde 0 51773 307099 2026-09-04T13:50:35Z Isma4l 41797 /* */ 307099 wikitext text/x-wiki {{Infobox German place |image_photo = |image_coa = |coordinates = {{coord|50|50|21|N|12|17|16|E|format=dms|display=inline,title}} |image_plan = Jonaswalde in ABG.png |state = |district = Altenburger Land |Verwaltungsgemeinschaft = Oberes Sprottental |elevation = 190 |area = 6.65 |postal_code = 04626 |area_code = 034496 |licence = ABG |Gemeindeschlüssel = 16 0 77 018 |divisions = 2 |website = [http://www.jonaswalde.de/ www.jonaswalde.de] |mayor = André Vohs<ref>[https://wahlen.thueringen.de/datenbank/wahl1/wahl.asp?wahlart=BM&wJahr=0000&zeigeErg=LAND&auswertung=2 Gewählte Bürgermeister - aktuelle Landesübersicht], Freistaat Thüringen. Retrieved 25 June 2024.</ref> |leader_term = 2024&ndash;30 |party = }} '''Jonaswalde''' waa degmo ka tirsan gobolka [[Thuringia|Thuringia]] ee degmada [[Altenburger Land]]. Waxay ka tirsan tahay [[Verwaltungsgemeinschaft]] ee [[Oberes Sprottental]]. ==Juqraafiga== ===Degmooyinka la deriska ah=== Degmooyinka u dhow waa [[Heukewalde]], [[Thonhausen]], iyo [[Vollmershain]] oo ka tirsan degmada Altenburger Land; [[Rückersdorf, Thuringia|Rückersdorf]] oo ka tirsan degmada [[Greiz (district)|Greiz]]; iyo sidoo kale magaalada [[Crimmitschau]] ee degmada [[Saxony|Saxon]] ee [[Zwickauer Land]]. ===Habaysnta degmada=== Bulshada waxay u qaybsantaa laba qaybood oo hoose: Jonaswalde iyo Nischwitz. ==Taariikhda== Laga soo bilaabo 1826 ilaa 1920, Jonaswalde waxay qayb ka ahayd [[Saxe-Altenburg]]. ==Tixraacyo== {{Reflist}} ==Xiriirinta dibadda== *{{in lang|de}} [http://www.jonaswalde.de/ a private website from Jonaswalde] *{{in lang|de}} [http://www.fosavis.de/ FOSAVIS, a private website from Dirk Salomon, Jonaswalde] {{Authority control}} 8dw8wnilmwqwucm5sd9m97ykr9bms3e Jübek 0 51774 307100 2026-09-04T13:52:03Z Isma4l 41797 /* */ 307100 wikitext text/x-wiki {{Infobox German location |name = Jübek<br><small>Jydbæk</small> |image_photo = Jübek - Ort - 2019 05 19 - 2.jpg |image_coa = DEU Jübek COA.svg |coordinates = {{coord|54|32|N|9|24|E|format=dms|display=inline,title}} |image_plan = Juebek in SL.PNG |state = |district = Schleswig-Flensburg |Amt = Arensharde |elevation = 13 |area = 15.58 |postal_code = 24855 |area_code = 04625 |licence = SL |Gemeindeschlüssel = 01 0 59 044 |website = |mayor = Herbert Will |party = }} '''Jübek''' ({{langx|da|Jydbæk}}) waa degmo ka tirsan degmada [[Schleswig-Flensburg]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} {{DEFAULTSORT:Jubek}} pxmf3qbpk9u0fg3fn7qgcsp1mww4z9d Juliusburg 0 51775 307101 2026-09-04T13:53:50Z Isma4l 41797 /* */ 307101 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = kein |coordinates = {{coord|53|25|N|10|30|E|format=dms|display=inline,title}} |image_plan = Juliusburg in RZ.svg |state = |district = Herzogtum Lauenburg |Amt = Lütau |elevation = 31 |area = 6.04 |postal_code = 21483 |area_code = 04153 |licence = RZ |Gemeindeschlüssel = 01 0 53 058 |website = [http://www.lauenburg.de/ www.lauenburg.de] |mayor = Eckhard Porth }} '''Juliusburg''' waa degmo ka tirsan degmada [[Lauenburg (district)|Lauenburg]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. Tirada dadku waxay ahayd 170 qof sanadkii 2020. ==Tixraacyo== {{Reflist}} {{Authority control}} hd6yqgb20h91cl2ghiwpo4q4hm6uwfa Kaaks 0 51776 307102 2026-09-04T13:55:47Z Isma4l 41797 /* */ 307102 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = DEU Kaaks COA.svg |coordinates = {{coord|53|59|N|9|28|E|format=dms|display=inline,title}} |image_plan = Kaaks in IZ.png |state = |district = Steinburg |Amt = Itzehoe-Land |elevation = 15 |area = 8.56 |postal_code = 25582 |area_code = 04893 |licence = IZ |Gemeindeschlüssel = 01 0 61 047 |website = [http://www.amtitzehoe-land.de/ www.amtitzehoe-<br />land.de] |mayor = Klaus-Wilhelm Rohwedder |party = }} '''Kaaks''' ({{IPA|de|kaːks}}) waa degmo ka tirsan degmada [[Steinburg]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Commons category|Kaaks}} {{Reflist}} {{authority control}} keefxqrv5md5ks421xwa3oiitfzfrqv Kalbsrieth 0 51777 307103 2026-09-04T13:57:52Z Isma4l 41797 /* */ 307103 wikitext text/x-wiki {{Infobox German location |image_photo = Kalbsrieth-Schloss.jpg |image_caption = Kalbsrieth Castle |image_coa = |coordinates = {{coord|51|20|34|N|11|20|13|E|format=dms|display=inline,title}} |image_plan = Kalbsrieth in KYF.png |state = |district = Kyffhäuserkreis |elevation = 121 |area = 11.94 |postal_code = 06556 |area_code = 0 34 66 |licence = KYF |Gemeindeschlüssel = 16 0 65 042 |mayor = Uwe Ludwig<ref>[https://wahlen.thueringen.de/datenbank/wahl1/wahl.asp?wahlart=BM&wJahr=0000&zeigeErg=LAND&auswertung=2 Gewählte Bürgermeister - aktuelle Landesübersicht], Freistaat Thüringen, accessed 10 November 2022.</ref> |leader_term = 2022&ndash;28 }} '''Kalbsrieth''' waa degmo ka tirsan degmada [[Kyffhäuserkreis]], ee gobolka [[Thuringia|Thüringen]], [[Germany|Jarmalka]]. ==Taariikhda== {{Empty section|date=June 2019}} == Tirakoobka Dadweynaha == Tirada dadweynaha laga soo bilaabo 31 Disembar: {| border="1" cellpadding="2" cellspacing="0" | valign="top" width="20%" | * 1994 – 908 * 1995 – 908 * 1996 – 901 * 1997 – 888 * 1998 – 844 * 1999 – 847 | valign="top" width="20%" | * 2000 – 839 * 2001 – 839 * 2002 – 826 * 2003 – 813 * 2004 – 797 * 2005 – 796 | valign="top" width="20%" | * 2006 – 789 * 2007 – 785 * 2008 – 789 * 2009 – 758 * 2010 – 749 * 2011 – 705 | valign="top" width="20%" | * 2012 – 690 * 2013 – 681 * 2014 – 662 * 2015 – 656 * 2016 – 645 |} :<small>Xogta waxaa laga helay: Xafiiska Tirakoobka Gobolka Thüringen</small> [[File:Kirche Kalbsrieth.JPG|thumb|St. Johannis, Village Chapel]] [[File:Kalbsrieth_Park_2017-09-22.jpg|thumb|Trees in the castle park]] ==Tixraacyo== {{Reflist}} {{Authority control}} nzqx6oqy93snnwlmse7pe1jfr09reg5 Kaltenholzhausen 0 51778 307104 2026-09-04T13:59:31Z Isma4l 41797 /* */ 307104 wikitext text/x-wiki {{Infobox German location |type = Ortsgemeinde |image_coa = DEU Kaltenholzhausen COA.svg |coordinates = {{coord|50|18|6|N|8|6|26|E|format=dms|display=inline,title}} |image_plan = Kaltenholzhausen in EMS.svg |state = |district = Rhein-Lahn-Kreis |Verbandsgemeinde = Aar-Einrich |elevation = 235 |area = 6.06 |postal_code = 65558 |area_code = 06430 |licence = EMS, DIZ, GOH |Gemeindeschlüssel = 07 1 41 065 |website = |mayor = Christian Neeb<ref>[https://www.wahlen.rlp.de/de/kw/wahlen/kd/gebiete/1410000000000.html Direktwahlen 2019, Rhein-Lahn-Kreis], Landeswahlleiter Rheinland-Pfalz, accessed 5 August 2021.</ref> |leader_term = 2019&ndash;24 |party = }} '''Kaltenholzhausen''' waa degmo ka tirsan [[Rhein-Lahn|degmada Rhein-Lahn]], ee [[Rhineland-Palatinate]], galbeedka [[Germany|Jarmalka]]. Waxay ka tirsan tahay ururka degmooyinka ee [[Aar-Einrich|Aar-Einrich]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 9ssdq5fjup7ngbsx2hl85xxen0hq217 Kaltental 0 51779 307105 2026-09-04T14:01:11Z Isma4l 41797 /* */ 307105 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Kaltental COA.svg |image_photo = Aufkirch01.jpg |image_caption = Panorama view of the municipal part of Aufkirch |coordinates = {{coord|47|54|N|10|45|E|format=dms|display=inline,title}} |image_plan = Kaltental in OAL.svg |state = |region = Schwaben |elevation = 710 |area = 22.15 |postal_code = 87662 |area_code = 08345, 08344 |licence = OAL |Gemeindeschlüssel = 09 7 77 141 |mayor = Manfred Hauser<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = |website = {{url|https://www.markt-kaltental.de/}} }} '''Kaltental''' ({{IPA|de|ˈkaltn̩taːl}}) waa degmo suuq ah iyo degmo ka tirsan [[Ostallgäu (district)|Ostallgäu]] ee gobolka [[Bavaria|Bavaria]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} jytij6wxjdfpvd9anp49n5ht3s0d8f4 307106 307105 2026-09-04T14:01:40Z Isma4l 41797 /* */ 307106 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Kaltental COA.svg |image_photo = Aufkirch01.jpg |image_caption = Muuqaalka qaybta degmada ee Aufkirch |coordinates = {{coord|47|54|N|10|45|E|format=dms|display=inline,title}} |image_plan = Kaltental in OAL.svg |state = |region = Schwaben |elevation = 710 |area = 22.15 |postal_code = 87662 |area_code = 08345, 08344 |licence = OAL |Gemeindeschlüssel = 09 7 77 141 |mayor = Manfred Hauser<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = |website = {{url|https://www.markt-kaltental.de/}} }} '''Kaltental''' ({{IPA|de|ˈkaltn̩taːl}}) waa degmo suuq ah iyo degmo ka tirsan [[Ostallgäu (district)|Ostallgäu]] ee gobolka [[Bavaria|Bavaria]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} h2qlr22ggczt16h7ldmeb8as30b1vn7 Kalübbe 0 51780 307107 2026-09-04T14:03:27Z Isma4l 41797 /* */ 307107 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = Kaluebbe Wappen.png |coordinates = {{coord|54|7|N|10|17|E|format=dms|display=inline,title}} |image_plan = Kaluebbe in PLOE.png |state = |district = Plön |Amt = Großer Plöner See |elevation = 44 |area = 11.8 |postal_code = 24326 |area_code = 04526 |licence = PLÖ |Gemeindeschlüssel = 01 0 57 032 |website = [http://www.amt-grosser-ploener-see.de/ www.amt-grosser-<br />ploener-see.de] |mayor = Barbara Semleith |party = }} '''Kalübbe''' waa degmo ka tirsan degmada [[Plön (district)|Plön]], ee gobolka [[Schleswig-Holstein]], [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{authority control}} {{DEFAULTSORT:Kalubbe}} 4985ny59dx8lhdmql67ai3r1vrwwmzy Kamern 0 51781 307108 2026-09-04T14:05:02Z Isma4l 41797 /* */ 307108 wikitext text/x-wiki {{Infobox German location |image_photo = |image_coa = |coordinates = {{coord|52|45|N|12|7|E|format=dms|display=inline,title}} |image_plan = Kamern in SDL.png |state = |district = Stendal |Verbandsgemeinde = Elbe-Havel-Land |elevation = 25 |area = 67.83 |postal_code = 39524 |area_code = 039382, 039383 |licence = SDL |Gemeindeschlüssel = 15 0 90 285 |website = [http://www.kamern.de www.kamern.de] |mayor = Arno Brandt<ref>[https://wahlergebnisse.sachsen-anhalt.de/wahlen/bmbm/index.html Bürgermeisterwahlen in den Gemeinden, Endgültige Ergebnisse], [[Statistisches Landesamt Sachsen-Anhalt]], accessed 8 July 2021.</ref> |leader_term = 2021&ndash;28 }} '''Kamern''' ({{IPA|de|ˈkaːmɐn}}) waa degmo ka tirsan degmada [[Stendal (district)|Stendal]], ee gobolka [[Saxony-Anhalt|Sachsen-Anhalt]], [[Germany|Jarmalka]]. Bishii Janaayo 2010 waxay la midoobday degmooyinkii hore ee [[Schönfeld, Saxony-Anhalt|Schönfeld]] iyo [[Wulkau]].<ref>[https://www.destatis.de/DE/Themen/Laender-Regionen/Regionales/Gemeindeverzeichnis/Namens-Grenz-Aenderung/2010.html Gebietsänderungen vom 01. Januar bis 31. Dezember 2010], [[Statistisches Bundesamt]]</ref> ==Tixraacyo== {{Reflist}} jb2petzlhm157712q87xvlunv0e3rz0 Kammeltal 0 51782 307109 2026-09-04T14:07:06Z Isma4l 41797 /* */ 307109 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Kammeltal COA.svg |coordinates = {{coord|48|23|N|10|22|E|format=dms|display=inline,title}} |image_plan = Kammeltal in GZ.svg |state = |region = Schwaben |district = Günzburg |elevation = 400-470 |area = 41.72 |postal_code = 89358 |area_code = 08223, 08222, 08225 |licence = GZ |Gemeindeschlüssel = 09 7 74 145 |mayor = Thorsten Wick<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = |website = [https://www.kammeltal.de/ www.kammeltal.de] }} '''Kammeltal''' ({{IPA|de|ˈkaml̩taːl}}, {{lit|Dooxada [[Kammel]]}}) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Günzburg (district)|Günzburg]] ee gobolka [[Bavaria|Bavaria]] ee dalka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 1p9x2oo6dqtp9ih6j32dgkgfnb6nrv1 Kammerstein 0 51783 307110 2026-09-04T14:08:52Z Isma4l 41797 /* */ 307110 wikitext text/x-wiki {{Infobox German location |type = Gemeinde |name = Kammerstein |image_coa = DEU Kammerstein COA.svg |coordinates = {{coord|49|17|N|10|58|E|format=dms|display=inline,title}} |image_plan = Kammerstein in RH.svg |state = |region = Mittelfranken |district = Roth |elevation = 424 |area = 37.08 |postal_code = 91126 |area_code = 09122, 09178 |licence = RH |Gemeindeschlüssel = 09 5 76 128 |divisions = 16 districts |website = [https://www.kammerstein.de/ www.kammerstein.de] |mayor = Wolfram Göll<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = CSU }} '''Kammerstein''' ({{IPA|de|ˈkamɐʃtaɪn}}) waa [[Municipalities in Germany|degmo]] ka tirsan degmada [[Roth (district)|Roth]] ee gobolka [[Bavaria|Bavaria]] ee dalka [[Germany|Jarmalka]]. ==Tixraacyo== {{Reflist}} {{Commons category}} {{Authority control}} h4vm66c9ynu4yomdjvqwjf479wyq99b Kamminke 0 51784 307111 2026-09-04T14:10:38Z Isma4l 41797 /* */ 307111 wikitext text/x-wiki {{Infobox German location |image_coa = kein |image_photo = Kamminke.jpg |image_caption = [[Thatched roof]]s in Kamminke |coordinates = {{coord|53|52|N|14|12|E|format=dms|display=inline,title}} |image_plan =Kamminke_in_VG.svg |state = |district = Vorpommern-Greifswald |Amt = Usedom-Süd |elevation = 2 |area = 2.96 |postal_code = 17419 |area_code = 038376 |licence = VG |Gemeindeschlüssel = 13 0 75 056 |website = |mayor = Uwe Hartmann }} '''Kamminke''' ({{IPA|de|kaˈmɪŋkə}}) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Vorpommern-Greifswald]], ee gobolka Mecklenburg-Vorpommern, ee dalka Jarmalka, oo ku taal [[German-Polish border|xadka Jarmalka iyo Poland]]. ==Fiiri kalaba== * [[Golm War Cemetery]] ==Tixraacyo== {{Reflist}} ==Xiriirinta dibadda== {{Commons category-inline}} {{Authority control}} q2n3he8qh7y471yqai0ggzp9893lwm4 307112 307111 2026-09-04T14:11:42Z Isma4l 41797 /* */ 307112 wikitext text/x-wiki {{Infobox German location |image_coa = kein |image_photo = Kamminke.jpg |image_caption =Saqafyada cawska ah ee ku yaal Kamminke |coordinates = {{coord|53|52|N|14|12|E|format=dms|display=inline,title}} |image_plan =Kamminke_in_VG.svg |state = |district = Vorpommern-Greifswald |Amt = Usedom-Süd |elevation = 2 |area = 2.96 |postal_code = 17419 |area_code = 038376 |licence = VG |Gemeindeschlüssel = 13 0 75 056 |website = |mayor = Uwe Hartmann }} '''Kamminke''' ({{IPA|de|kaˈmɪŋkə}}) waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Vorpommern-Greifswald]], ee gobolka Mecklenburg-Vorpommern, ee dalka Jarmalka, oo ku taal [[German-Polish border|xadka Jarmalka iyo Poland]]. ==Fiiri kalaba== * [[Golm War Cemetery]] ==Tixraacyo== {{Reflist}} ==Xiriirinta dibadda== {{Commons category-inline}} {{Authority control}} 2k5hns4i7nb75ajs3wncoxyjzrbnucb Kammlach 0 51785 307113 2026-09-04T14:13:25Z Isma4l 41797 /* */ 307113 wikitext text/x-wiki {{Infobox German location |image_coa = DEU Kammlach COA.svg |coordinates = {{coord|48|3|N|10|25|E|format=dms|display=inline,title}} |image_plan = Kammlach in MN.svg |state = |region = Schwaben |district = Unterallgäu |Verwaltungsgemeinschaft = Erkheim |elevation = 600 |area = 26.73 |postal_code = 87754 |area_code = 08261 |licence = MN |Gemeindeschlüssel = 09 7 78 180 |mayor = Birgit Steudter-Adl Amini<ref>[https://www.statistik.bayern.de/wahlen/kommunalwahlen/bgm/ Liste der ersten Bürgermeister/Oberbürgermeister in kreisangehörigen Gemeinden], [[Bayerisches Landesamt für Statistik]], 15 July 2021.</ref> |leader_term = 2020&ndash;26 |party = }} '''Kammlach''' waa [[Municipalities of Germany|degmo]] ka tirsan degmada [[Unterallgäu]] ee gobolka [[Bavaria|Bavaria]], [[Germany|Jarmalka]]. Degmadani waxay xiriir la leedahay ururka degmooyinka ee [[Municipal association (Germany)|Verwaltungsgemeinschaft]] ee [[Erkheim]]. ==Tixraacyo== {{Reflist}} {{Authority control}} 51inys3k27ul3x5qrrrc8n0kcimo880 Template:Sfrac/styles.css 10 51786 307128 2026-09-05T10:16:12Z Isma4l 41797 Bog cusub: .sfrac { white-space: nowrap; } .sfrac.tion, .sfrac .tion { display: inline-block; vertical-align: -0.5em; font-size: 85%; text-align: center; margin-left: .1em; margin-right: .1em; } .sfrac .num { display: block; border-bottom: 1px solid; } .sfrac .den { display: block; line-height: 1.5em; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); /* removed from CSS */ clip-path: polygon(0px 0px, 0... 307128 sanitized-css text/css .sfrac { white-space: nowrap; } .sfrac.tion, .sfrac .tion { display: inline-block; vertical-align: -0.5em; font-size: 85%; text-align: center; margin-left: .1em; margin-right: .1em; } .sfrac .num { display: block; border-bottom: 1px solid; } .sfrac .den { display: block; line-height: 1.5em; } /* [[Template:Screen reader-only]] is canonical implementation onwiki */ .sr-only { border: 0; clip: rect(0, 0, 0, 0); /* removed from CSS */ clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; /* white-space: nowrap; /* already have nowrap above */ } 7d25wvpc5ls6eyr1t4bukg8ocz5ro1h Template:BSsplit 10 51787 307129 2026-09-05T10:17:03Z Isma4l 41797 /* */ 307129 wikitext text/x-wiki <includeonly><templatestyles src="Routemap/styles.css"/>{{#invoke:Routemap|BSsplit}}</includeonly><noinclude> {{documentation}} </noinclude> kiftgjl8g40oamfuofubmy9k1lqkxup Template:Sub 10 51788 307131 2026-09-05T10:21:51Z Isma4l 41797 /* */ 307131 wikitext text/x-wiki <includeonly><sub>{{{1}}}</sub></includeonly><noinclude> {{documentation}} </noinclude> jggufnsli6psi2kevbuec4rnlca84p0 Module:Navbox with collapsible groups 828 51789 307132 2026-09-05T10:25:52Z Isma4l 41797 Bog cusub: -- This module implements {{Navbox with collapsible groups}} local Navbox = require('Module:Navbox') return { _navbox = function (frame) return Navbox._withCollapsibleGroups(frame) end, navbox = function (frame) return Navbox['with collapsible groups'](frame) end } 307132 Scribunto text/plain -- This module implements {{Navbox with collapsible groups}} local Navbox = require('Module:Navbox') return { _navbox = function (frame) return Navbox._withCollapsibleGroups(frame) end, navbox = function (frame) return Navbox['with collapsible groups'](frame) end } ng0la1ph7wj8dsi20vxiv6krwhshvkh Module:Format TemplateData 828 51790 307136 2026-09-05T10:40:14Z Isma4l 41797 Bog cusub: local TemplateData = { item = 46997995, serial = "2025-02-07", suite = "TemplateData" } local Failsafe = TemplateData local Config = { -- Multiple option names mapped into unique internal fields. basicCnf = { catProblem = "strange", classMultiColumns = "selMultClm", classNoNumTOC = "suppressTOCnum", classTable = "classTable", cssParWrap = "cssTabWrap", cssParams = "cssTable", docpageCreate = "suffix", docpageDetect = "subpage", help... 307136 Scribunto text/plain local TemplateData = { item = 46997995, serial = "2025-02-07", suite = "TemplateData" } local Failsafe = TemplateData local Config = { -- Multiple option names mapped into unique internal fields. basicCnf = { catProblem = "strange", classMultiColumns = "selMultClm", classNoNumTOC = "suppressTOCnum", classTable = "classTable", cssParWrap = "cssTabWrap", cssParams = "cssTable", docpageCreate = "suffix", docpageDetect = "subpage", helpAliases = "supportAliases", helpBoolean = "support4boolean", helpContent = "support4content", helpDate = "support4date", helpDefault = "support4default", helpFile = "support4wiki-file-name", helpFormat = "supportFormat", helpLine = "support4line", helpNumber = "support4number", helpPage = "support4wiki-page-name", helpString = "support4string", helpTemplate = "support4wiki-template-name", helpURL = "support4url", helpUser = "support4wiki-user-name", msgDescMiss = "solo", tStylesMultiColumns = "stylesMultClm", tStylesTOCnum = "stylesTOCnum" }, classTable = { "wikitable" }, -- Classes for params table cssTable = false, -- Styles for params table cssTabWrap = false, -- Styles for params table wrapper debug = false, debugmultilang = "#c0c0c0", jsonDebug = "json-code-lint", -- Class for jsonDebug tool loudly = false, -- Show exported element, etc. solo = false, -- Complaint on missing description strange = false, -- Title of maintenance category subpage = false, -- Pattern to identify subpage suffix = false, -- Subpage creation scheme suppressTOCnum = false -- Class for TOC number suppression } local Data = { div = false, -- <div class="mw-templatedata-doc-wrap"> got = false, -- table, initial templatedata object heirs = false, -- table, params that are inherited jump = false, -- source position at end of "params" less = false, -- main description missing lasting = false, -- old syntax encountered lazy = false, -- doc mode; do not generate effective <templatedata> leading = false, -- show TOC -- low = false, -- 1= mode order = false, -- parameter sequence params = false, -- table, exported parameters scream = false, -- error messages sibling = false, -- TOC juxtaposed slang = nil, -- project/user language code slim = false, -- JSON reduced to plain source = false, -- JSON input strip = false, -- <templatedata> evaluation tag = false, -- table, exported root element title = false, -- page tree = false -- table, rewritten templatedata object } local Permit = { builder = { after = "block", align = "block", block = "block", compressed = "block", dense = "block", grouped = "inline", half = "inline", indent = "block", inline = "inline", last = "block", lead = "block", newlines = "*", spaced = "inline" }, colors = { bg = "var(--background-color-base, #fff)", deprecated = "#ffcbcb", fg = "var(--color-base, #000)", optional = "#eaecf0", required = "#eaf3ff", suggested = "#fff", tableheadbg = "var(--background-color-progressive-subtle, #b3b7ff)" }, params = { aliases = "table", autovalue = "string", default = "string table I18N nowiki", deprecated = "boolean string I18N", description = "string table I18N", example = "string table I18N nowiki", inherits = "string", label = "string table I18N", required = "boolean", style = "string table", suggested = "boolean", suggestedvalues = "string table number boolean", type = "string" }, root = { description = "string table I18N", format = "string", maps = "table", paramOrder = "table", params = "table", sets = "table" }, search = "[{,]%%s*(['\"])%s%%1%%s*:%%s*%%{", types = { boolean = true, content = true, date = true, line = true, number = true, string = true, unknown = true, url = true, ["string/line"] = "line", ["string/wiki-page-name"] = "wiki-page-name", ["string/wiki-user-name"] = "wiki-user-name", ["unbalanced-wikitext"] = true, ["wiki-file-name"] = true, ["wiki-page-name"] = true, ["wiki-template-name"] = true, ["wiki-user-name"] = true } } local function Fault(alert) -- Memorize error message. -- Parameter: -- alert -- string, error message if Data.scream then Data.scream = string.format("%s *** %s", Data.scream, alert) else Data.scream = alert end end -- Fault() local function Fetch(ask, allow) -- Fetch module. -- Parameter: -- ask -- string, with name -- "/global" -- "JSONutil" -- "Multilingual" -- "Text" -- "WLink" -- allow -- true: no error if unavailable -- Returns table of module -- Error: Module not available local sign = ask local r, stem if sign:sub(1, 1) == "/" then sign = TemplateData.frame:getTitle() .. sign else stem = sign sign = "Module:" .. stem end if TemplateData.extern then r = TemplateData.extern[sign] else TemplateData.extern = {} end if not r then local lucky, g = pcall(require, sign) if type(g) == "table" then if stem and type(g[stem]) == "function" then r = g[stem]() else r = g end TemplateData.extern[sign] = r elseif not allow then error(string.format("Fetch(%s) %s", sign, g), 0) end end return r end -- Fetch() local function Foreign() -- Guess human language, returns slang or not. if type(Data.slang) == "nil" then local Multilingual = Fetch("Multilingual", true) if Multilingual and type(Multilingual.userLangCode) == "function" then Data.slang = Multilingual.userLangCode() else Data.slang = mw.language.getContentLanguage():getCode():lower() end end if Data.slang and mw.ustring.codepoint(Data.slang, 1, 1) > 122 then Data.slang = false end return Data.slang end -- Foreign() local function facet(ask, at) -- Find physical position of parameter definition in JSON. -- Parameter: -- ask -- string, parameter name -- at -- number, physical position within definition -- Returns number or nil. local seek = string.format(Permit.search, ask:gsub("%%", "%%%%"):gsub("([%-.()+*?^$%[%]])", "%%%1")) local i, k, r, slice, source if not Data.jump then Data.jump = Data.source:find("params", 2) if Data.jump then Data.jump = Data.jump + 7 else Data.jump = 1 end end i, k = Data.source:find(seek, at + Data.jump) while i and not r do source = Data.source:sub(k + 1) slice = source:match('^%s*"([^"]+)"s*:') if not slice then slice = source:match("^%s*'([^']+)'%s*:") end if (slice and Permit.params[slice]) or source:match("^%s*%}") then r = k else i, k = Data.source:find(seek, k) end end -- while i return r end -- facet() local function facilities(apply) -- Retrieve details of suggestedvalues. -- Parameter: -- apply -- table, with plain or enhanced values -- .suggestedvalues -- table|string|number, or more -- Returns -- 1 -- table, with suggestedvalues -- 2 -- table, with CSS map, or not -- 3 -- string, with class, or not -- 4 -- string, with templatestyles, or not local elements = apply.suggestedvalues local s = type(elements) local r1, r2, r3, r4 if s == "table" then local values = elements.values if type(values) == "table" then r1 = values if type(elements.scroll) == "string" then r2 = r2 or {} r2.height = apply.scroll r2.overflow = "auto" end if type(elements.minwidth) == "string" then local s = type(elements.maxcolumns) r2 = r2 or {} r2["column-width"] = elements.minwidth if s == "string" or s == "number" then s = tostring(elements.maxcolumns) r2["column-count"] = s end if type(Config.selMultClm) == "string" then r3 = Config.selMultClm end if type(Config.stylesMultClm) == "string" then local src = Config.stylesMultClm .. "/styles.css" r4 = TemplateData.frame:extensionTag("templatestyles", nil, { src = src }) end end elseif elements and elements ~= "" then r1 = elements end elseif s == "string" then s = mw.text.trim(about) if s ~= "" then r1 = {} table.insert(r1, { code = s }) end elseif s == "number" then r1 = {} table.insert(r1, { code = tostring(elements) }) end return r1, r2, r3, r4 end -- facilities() local function factory(adapt) -- Retrieve localized text from system message. -- Parameter: -- adapt -- string, message ID after "templatedata-" -- Returns string, with localized text local o = mw.message.new("templatedata-" .. adapt) if Foreign() then o:inLanguage(Data.slang) end return o:plain() end -- factory() local function faculty(adjust) -- Test template argument for Boolean. -- adjust -- string or nil -- Returns boolean. local s = type(adjust) local r if s == "string" then r = mw.text.trim(adjust) r = (r ~= "" and r ~= "0") elseif s == "boolean" then r = adjust else r = false end return r end -- faculty() local function failures() -- Retrieve error collection and category, returns string. local r if Data.scream then local e = mw.html.create("span"):addClass("error"):wikitext(Data.scream) r = tostring(e) mw.addWarning("'''TemplateData'''<br />" .. Data.scream) if Config.strange then r = string.format("%s[[category:%s]]", r, Config.strange) end else r = "" end return r end -- failures() local function fair(adjust) -- Reduce text to one line of plain text, or noexport wikitext blocks. -- adjust -- string -- Returns string with adjusted text. local f = function(a) return a:gsub("%s*\n%s*", " "):gsub("%s%s+", " ") end local tags = { { start = "<noexport>", stop = "</noexport>", }, { start = "<exportonly>", stop = "</exportonly>", l = false, }, } local r = adjust local i, j, k, s, tag for m = 1, 2 do tag = tags[m] if r:find(tag.start, 1, true) then s = r r = "" i = 1 tag.l = true j, k = s:find(tag.start, i, true) while j do if j > 1 then r = r .. f(s:sub(i, j - 1)) end i = k + 1 j, k = s:find(tag.stop, i, true) if j then if m == 1 then r = r .. s:sub(i, j - 1) end i = k + 1 j, k = s:find(tag.start, i, true) else Fault("missing " .. tag.stop) end end -- while j r = r .. s:sub(i) elseif m == 1 then r = f(r) end end -- for m if tags[2].l then r = r:gsub("<exportonly>.*</exportonly>", "") end return r end -- fair() local function fancy(advance, alert) -- Present JSON source. -- Parameter: -- advance -- true, for nice -- alert -- true, for visible -- Returns string. local r if Data.source then local support = Config.jsonDebug local css if advance then css = { height = "6em", resize = "vertical", } r = { [1] = "syntaxhighlight", [2] = Data.source, lang = "json", style = table.concat(css, ";"), } if alert then r.class(support) end r = TemplateData.frame:callParserFunction("#tag", r) else css = { ["font-size"] = "0.77em", ["line-height"] = "1.35", } if alert then css.resize = "vertical" else css.display = "none" end r = mw.html.create("pre"):addClass(support):css(css):wikitext(mw.text.encode(Data.source)) r = tostring(r) end r = "\n" .. r else r = "" end return r end -- fancy() local function faraway(alternatives) -- Retrieve best language version from multilingual text. -- Parameter: -- alternatives -- table, to be evaluated -- Returns -- 1 -- string, with best match -- 2 -- table of other versions, if any local n = 0 local variants = {} local r1, r2 for k, v in pairs(alternatives) do if type(v) == "string" then v = mw.text.trim(v) if v ~= "" and type(k) == "string" then k = k:lower() variants[k] = v n = n + 1 end end end -- for k, v if n > 0 then local Multilingual = Fetch("Multilingual", true) if Multilingual and type(Multilingual.i18n) == "function" then local show, slang = Multilingual.i18n(variants) if show then r1 = show variants[slang] = nil r2 = variants end end if not r1 then Foreign() for k, v in pairs(variants) do if n == 1 then r1 = v elseif Data.slang == k then variants[k] = nil r1 = v r2 = variants end end -- for k, v end if r2 and Multilingual then for k, v in pairs(r2) do if v and not Multilingual.isLang(k, true) then Fault(string.format("%s <code>lang=%s</code>", "Invalid", k)) end end -- for k, v end end return r1, r2 end -- faraway() local function fashioned(about, asked, assign) -- Create description head. -- Parameter: -- about -- table, supposed to contain description -- asked -- true, if mandatory description -- assign -- <block>, if to be equipped -- Returns <block> with head, or nil. local para = assign or mw.html.create("div") local plus, r if about and about.description then if type(about.description) == "string" then para:wikitext(about.description) else para:wikitext(about.description[1]) plus = mw.html.create("ul") plus:css("text-align", "left") for k, v in pairs(about.description[2]) do plus:node( mw.html .create("li") :node(mw.html.create("code"):wikitext(k)) :node(mw.html.create("br")) :wikitext(fair(v)) ) end -- for k, v if Config.loudly then plus = mw.html .create("div") :css("background-color", Config.debugmultilang) :css("color", "inherit") :node(plus) else plus:addClass("templatedata-maintain"):css("display", "none") end end elseif Config.solo and asked then para:addClass("error"):wikitext(Config.solo) Data.less = true else para = false end if para then if plus then r = mw.html.create("div"):node(para):node(plus) else r = para end end return r end -- fashioned() local function fatten(access) -- Create table row for subheadline. -- Parameter: -- access -- string, with name -- Returns <tr>. local param = Data.tree.params[access] local sub, sort = access:match("(=+)%s*(%S.*)$") local headline = mw.html.create(string.format("h%d", #sub)) local r = mw.html.create("tr") local td = mw.html.create("td"):attr("colspan", "5"):attr("data-sort-value", "!" .. sort) local s if param.style then s = type(param.style) if s == "table" then td:css(param.style) elseif s == "string" then td:cssText(param.style) end end s = fashioned(param, false, headline) if s then headline = s else headline:wikitext(sort) end td:node(headline) r:node(td) return r end -- fatten() local function fathers() -- Merge parameters with inherited values. local n = 0 local p = Data.params local t = Data.tree.params local p2, t2 for k, v in pairs(Data.heirs) do n = n + 1 end -- for k, v for i = 1, n do if Data.heirs then for k, v in pairs(Data.heirs) do if v and not Data.heirs[v] then n = n - 1 t[k].inherits = nil Data.heirs[k] = nil p2 = {} t2 = {} if p[v] then for k2, v2 in pairs(p[v]) do p2[k2] = v2 end -- for k2, v2 if p[k] then for k2, v2 in pairs(p[k]) do if type(v2) ~= "nil" then p2[k2] = v2 end end -- for k2, v2 end p[k] = p2 for k2, v2 in pairs(t[v]) do t2[k2] = v2 end -- for k2, v2 for k2, v2 in pairs(t[k]) do if type(v2) ~= "nil" then t2[k2] = v2 end end -- for k2, v2 t[k] = t2 else Fault("No params[] inherits " .. v) end end end -- for k, v end end -- i = 1, n if n > 0 then local s for k, v in pairs(Data.heirs) do if v then if s then s = string.format("%s &#124; %s", s, k) else s = "Circular inherits: " .. k end end end -- for k, v Fault(s) end end -- fathers() local function favorize() -- Local customization issues. local boole = { ["font-size"] = "1.25em" } local l, cx = pcall(mw.loadData, TemplateData.frame:getTitle() .. "/config") local scripting, style TemplateData.ltr = not mw.language.getContentLanguage():isRTL() if TemplateData.ltr then scripting = "left" else scripting = "right" end boole["margin-" .. scripting] = "3em" Permit.boole = { [false] = { css = boole, lead = true, show = "&#x2610;", }, [true] = { css = boole, lead = true, show = "&#x2611;", }, } Permit.css = {} for k, v in pairs(Permit.colors) do if k == "tableheadbg" then k = "tablehead" end if k == "fg" then style = "color" else style = "background-color" end Permit.css[k] = {} Permit.css[k][style] = v end -- for k, v if type(cx) == "table" then local c, s if type(cx.permit) == "table" then if type(cx.permit.boole) == "table" then if type(cx.permit.boole[true]) == "table" then Permit.boole[false] = cx.permit.boole[false] end if type(cx.permit.boole[true]) == "table" then Permit.boole[true] = cx.permit.boole[true] end end if type(cx.permit.css) == "table" then for k, v in pairs(cx.permit.css) do if type(v) == "table" then Permit.css[k] = v end end -- for k, v end end for k, v in pairs(Config.basicCnf) do s = type(cx[k]) if s == "string" or s == "table" then Config[v] = cx[k] end end -- for k, v end if type(Config.subpage) ~= "string" or type(Config.suffix) ~= "string" then local got = mw.message.new("templatedata-doc-subpage") local suffix if got:isDisabled() then suffix = "doc" else suffix = got:plain() end if type(Config.subpage) ~= "string" then Config.subpage = string.format("/%s$", suffix) end if type(Config.suffix) ~= "string" then Config.suffix = string.format("%%s/%s", suffix) end end end -- favorize() local function feasible(all, at, about) -- Deal with suggestedvalues within parameter. -- Parameter: -- all -- parameter details -- .default -- .type -- at -- string, with parameter name -- about -- suggestedvalues -- table, -- value and possibly description -- table may have elements: -- .code -- mandatory -- .label -- table|string -- .support -- table|string -- .icon -- string -- .class -- table|string -- .css -- table -- .style -- string -- .less -- true: suppress code -- Returns -- 1: mw.html object <ul> -- 2: sequence table with values, or nil local h = {} local e, r1, r2, s, v if #about > 0 then for i = 1, #about do e = about[i] s = type(e) if s == "table" then if type(e.code) == "string" then s = mw.text.trim(e.code) if s == "" then e = nil else e.code = s end else e = nil s = string.format("params.%s.%s[%d] %s", at, "suggestedvalues", i, "MISSING 'code:'") end elseif s == "string" then s = mw.text.trim(e) if s == "" then e = nil s = string.format("params.%s.%s[%d] EMPTY", at, "suggestedvalues", i) Fault(s) else e = { code = s } end elseif s == "number" then e = { code = tostring(e) } else s = string.format("params.%s.%s[%d] INVALID", at, "suggestedvalues", i) Fault(s) e = false end if e then v = v or {} table.insert(v, e) if h[e.code] then s = string.format("params.%s.%s REPEATED %s", at, "suggestedvalues", e.code) Fault(s) else h[e.code] = true end end end -- for i else Fault(string.format("params.%s.suggestedvalues %s", at, "NOT AN ARRAY")) end if v then local code, d, k, less, story, swift, t, u r1 = mw.html.create("ul") r2 = {} for i = 1, #v do u = mw.html.create("li") e = v[i] table.insert(r2, e.code) story = false less = (e.less == true) if not less then swift = e.code if e.support then local scream, support s = type(e.support) if s == "string" then support = e.support elseif s == "table" then support = faraway(e.support) else scream = "INVALID" end if support then s = mw.text.trim(support) if s == "" then scream = "EMPTY" elseif s:find("[%[%]|%<%>]") then scream = "BAD PAGE" else support = s end end if scream then s = string.format("params.%s.%s[%d].support %s", at, "suggestedvalues", i, scream) Fault(s) else swift = string.format("[[:%s|%s]]", support, swift) end end if all.type:sub(1, 5) == "wiki-" and swift == e.code then local rooms = { file = 6, temp = 10, user = 2, } local ns = rooms[all.type:sub(6, 9)] or 0 t = mw.title.makeTitle(ns, swift) if t and t.exists then swift = string.format("[[:%s|%s]]", t.prefixedText, swift) end end if e.code == all.default then k = 800 else k = 300 end code = mw.html.create("code"):css("font-weight", tostring(k)):css("white-space", "nowrap"):wikitext(swift) u:node(code) end if e.class then s = type(e.class) if s == "string" then u:addClass(e.class) elseif s == "table" then for k, s in pairs(e.class) do u:addClass(s) end -- for k, s else s = string.format("params.%s.%s[%d].class INVALID", at, "suggestedvalues", i) Fault(s) end end if e.css then if type(e.css) == "table" then u:css(e.css) else s = string.format("params.%s.%s[%d].css INVALID", at, "suggestedvalues", i) Fault(s) end end if e.style then if type(e.style) == "string" then u:cssText(e.style) else s = string.format("params.%s.%s[%d].style INVALID", at, "suggestedvalues", i) Fault(s) end end if all.type == "wiki-file-name" and not e.icon then e.icon = e.code end if e.label then s = type(e.label) if s == "string" then s = mw.text.trim(e.label) if s == "" then s = string.format("params.%s.%s[%d].label %s", at, "suggestedvalues", i, "EMPTY") Fault(s) else story = s end elseif s == "table" then story = faraway(e.label) else s = string.format("params.%s.%s[%d].label INVALID", at, "suggestedvalues", i) Fault(s) end end s = false if type(e.icon) == "string" then t = mw.title.makeTitle(6, e.icon) if t and t.file.exists then local g = mw.html.create("span") s = string.format("[[%s|16px]]", t.prefixedText) g:attr("role", "presentation"):wikitext(s) s = tostring(g) end end if not s and not less and e.label then s = mw.ustring.char(0x2013) end if s then d = mw.html.create("span"):wikitext(s) if TemplateData.ltr then if not less then d:css("margin-left", "0.5em") end if story then d:css("margin-right", "0.5em") end else if not less then d:css("margin-right", "0.5em") end if story then d:css("margin-left", "0.5em") end end u:node(d) end if story then u:wikitext(story) end r1:newline():node(u) end -- for i end if not r1 and v ~= false then Fault(string.format("params.%s.suggestedvalues INVALID", at)) r1 = mw.html.create("code"):addClass("error"):wikitext("INVALID") end return r1, r2 end -- feasible() local function feat() -- Check and store parameter sequence. if Data.source then local i = 0 local s for k, v in pairs(Data.tree.params) do if i == 0 then Data.order = {} i = 1 s = k else i = 2 break -- for k, v end end -- for k, v if i > 1 then local pointers = {} local points = {} local given = {} for k, v in pairs(Data.tree.params) do i = facet(k, 1) if type(v) == "table" then if type(v.label) == "string" then s = mw.text.trim(v.label) if s == "" then s = k end else s = k end if given[s] then if given[s] == 1 then local scream = "Parameter label '%s' detected multiple times" Fault(string.format(scream, s)) given[s] = 2 end else given[s] = 1 end end if i then table.insert(points, i) pointers[i] = k i = facet(k, i) if i then s = "Parameter '%s' detected twice" Fault(string.format(s, k)) end else s = "Parameter '%s' not detected" Fault(string.format(s, k)) end end -- for k, v table.sort(points) for i = 1, #points do table.insert(Data.order, pointers[points[i]]) end -- i = 1, #points elseif s then table.insert(Data.order, s) end end end -- feat() local function feature(access) -- Create table row for parameter, check and display violations. -- Parameter: -- access -- string, with name -- Returns <tr>. local mode, s, status local fine = function(a) s = mw.text.trim(a) return a == s and a ~= "" and not a:find("%|=\n") and not a:find("%s%s") end local begin = mw.html.create("td") local code = mw.html.create("code") local desc = mw.html.create("td") local eager = mw.html.create("td") local legal = true local param = Data.tree.params[access] local ranking = { "required", "suggested", "optional", "deprecated" } local r = mw.html.create("tr") local styles = "mw-templatedata-doc-param-" local sort, typed for k, v in pairs(param) do if v == "" then param[k] = false end end -- for k, v -- label sort = param.label or access if sort:match("^%d+$") then begin:attr("data-sort-value", string.format("%05d", tonumber(sort))) end begin:css("font-weight", "700"):wikitext(sort) -- name and aliases code:css("font-size", "0.92em"):css("white-space", "nowrap"):wikitext(access) if not fine(access) then code:addClass("error") Fault(string.format("Bad ID params.<code>%s</code>", access)) legal = false begin:attr("data-sort-value", " " .. sort) end code = mw.html.create("td"):addClass(styles .. "name"):node(code) if access:match("^%d+$") then code:attr("data-sort-value", string.format("%05d", tonumber(access))) end if type(param.aliases) == "table" then local lapsus, syn for k, v in pairs(param.aliases) do code:tag("br") if type(v) == "string" then if not fine(v) then lapsus = true code:node(mw.html.create("span"):addClass("error"):css("font-style", "italic"):wikitext("string")) :wikitext(s) else if Config.supportAliases then s = string.format("[[%s|%s]]", Config.supportAliases, mw.text.nowiki(s)) end syn = mw.html.create("span"):addClass(styles .. "alias"):css("white-space", "nowrap"):wikitext(s) code:node(syn) end else lapsus = true code:node(mw.html.create("code"):addClass("error"):wikitext(type(v))) end end -- for k, v if lapsus then s = string.format("params.<code>%s</code>.aliases", access) Fault(factory("invalid-value"):gsub("$1", s)) legal = false end end -- description etc. s = fashioned(param) if s then desc:node(s) end if param.style then s = type(param.style) if s == "table" then desc:css(param.style) elseif s == "string" then desc:cssText(param.style) end end if param.suggestedvalues or param.default or param.example or param.autovalue then local details = { "suggestedvalues", "default", "example", "autovalue", } local dl = mw.html.create("dl") local dd, section, show for i = 1, #details do s = details[i] show = param[s] if show then dd = mw.html.create("dd") section = factory("doc-param-" .. s) if s == "default" and Config.support4default then section = string.format("[[%s|%s]]", Config.support4default, mw.text.nowiki(section)) end if param.type == "boolean" and (show == "0" or show == "1") then local boole = Permit.boole[(show == "1")] if boole.lead == true then dd:node(mw.html.create("code"):wikitext(show)):wikitext(" ") end if type(boole.show) == "string" then local v = mw.html.create("span"):attr("aria-hidden", "true"):wikitext(boole.show) if boole.css then v:css(boole.css) end dd:node(v) end if type(boole.suffix) == "string" then dd:wikitext(boole.suffix) end if boole.lead == false then dd:wikitext(" "):node(mw.html.create("code"):wikitext(show)) end elseif s == "suggestedvalues" then local v, css, class, ts = facilities(param) if v then local ul ul, v = feasible(param, access, v) if v then dd:newline():node(ul) if css then dd:css(css) if class then dd:addClass(class) end if ts then dd:newline() dd:node(ts) end end Data.params[access].suggestedvalues = v end end else dd:wikitext(show) end dl:node(mw.html.create("dt"):wikitext(section)):node(dd) end end -- i = 1, #details desc:node(dl) end -- type if type(param.type) == "string" then param.type = mw.text.trim(param.type) if param.type == "" then param.type = false end end if param.type then s = Permit.types[param.type] typed = mw.html.create("td"):addClass(styles .. "type") if s then if s == "string" then Data.params[access].type = s typed:wikitext(factory("doc-param-type-" .. s)):tag("br") typed:node(mw.html.create("span"):addClass("error"):wikitext(param.type)) Data.lasting = true else local support = Config["support4" .. param.type] s = factory("doc-param-type-" .. param.type) if support then s = string.format("[[%s|%s]]", support, s) end typed:wikitext(s) end else Data.params[access].type = "unknown" typed:addClass("error"):wikitext("INVALID") s = string.format("params.<code>%s</code>.type", access) Fault(factory("invalid-value"):gsub("$1", s)) legal = false end else typed = mw.html.create("td"):wikitext(factory("doc-param-type-unknown")) Data.params[access].type = "unknown" if param.default then Data.params[access].default = nil Fault("Default value requires <code>type</code>") legal = false end end typed:addClass("navigation-not-searchable") -- status if param.required then mode = 1 if param.autovalue then Fault(string.format("autovalued <code>%s</code> required", access)) legal = false end if param.default then Fault(string.format("Defaulted <code>%s</code> required", access)) legal = false end if param.deprecated then Fault(string.format("Required deprecated <code>%s</code>", access)) legal = false end elseif param.deprecated then mode = 4 elseif param.suggested then mode = 2 else mode = 3 end status = ranking[mode] ranking = factory("doc-param-status-" .. status) if mode == 1 or mode == 4 then ranking = mw.html.create("span"):css("font-weight", "700"):wikitext(ranking) if type(param.deprecated) == "string" then ranking:tag("br") ranking:wikitext(param.deprecated) end if param.suggested and mode == 4 then s = string.format("Suggesting deprecated <code>%s</code>", access) Fault(s) legal = false end end eager :attr("data-sort-value", tostring(mode)) :node(ranking) :addClass(string.format("%sstatus-%s %s", styles, status, "navigation-not-searchable")) -- <tr> r:attr("id", "templatedata:" .. mw.uri.anchorEncode(access)) :css(Permit.css[status]) :addClass(styles .. status) :node(begin) :node(code) :node(desc) :node(typed) :node(eager) :newline() if not legal then r:css("border", "3px solid #f00") end return r end -- feature() local function features() -- Create <table> for parameters. -- Returns <table>, or nil. local r if Data.tree and Data.tree.params then local tbl = mw.html.create("table") local tr = mw.html.create("tr") feat() if Data.order and #Data.order > 1 then tbl:addClass("sortable") end if type(Config.classTable) == "table" then for k, v in pairs(Config.classTable) do tbl:addClass(v) end -- for k, v end if type(Config.cssTable) == "table" then tbl:css(Config.cssTable) end tr:addClass("navigation-not-searchable") :node( mw.html.create("th"):attr("colspan", "2"):css(Permit.css.tablehead):wikitext(factory("doc-param-name")) ) :node(mw.html.create("th"):css(Permit.css.tablehead):wikitext(factory("doc-param-desc"))) :node(mw.html.create("th"):css(Permit.css.tablehead):wikitext(factory("doc-param-type"))) :node(mw.html.create("th"):css(Permit.css.tablehead):wikitext(factory("doc-param-status"))) tbl :newline() -- :node( mw.html.create( "thead" ) :node(tr) -- ) :newline() if Data.order then local leave, s for i = 1, #Data.order do s = Data.order[i] if s:sub(1, 1) == "=" then leave = true tbl:node(fatten(s)) Data.order[i] = false elseif s:match("[=|]") then Fault(string.format("Bad param <code>%s</code>", s)) else tbl:node(feature(s)) end end -- for i = 1, #Data.order if leave then for i = #Data.order, 1, -1 do if not Data.order[i] then table.remove(Data.order, i) end end -- for i = #Data.order, 1, -1 end Data.tag.paramOrder = Data.order end if Config.cssTabWrap or Data.scroll then r = mw.html.create("div") if type(Config.cssTabWrap) == "table" then r:css(Config.cssTabWrap) elseif type(Config.cssTabWrap) == "string" then -- deprecated r:cssText(Config.cssTabWrap) end if Data.scroll then r:css("height", Data.scroll):css("overflow", "auto") end r:node(tbl) else r = tbl end end return r end -- features() local function fellow(any, assigned, at) -- Check sets[] parameter and issue error message, if necessary. -- Parameter: -- any -- should be number -- assigned -- parameter name -- at -- number, of set local s if type(any) ~= "number" then s = "<code>sets[%d].params[%s]</code>??" Fault(string.format(s, at, mw.text.nowiki(tostring(any)))) elseif type(assigned) == "string" then if not Data.got.params[assigned] then s = "<code>sets[%d].params %s</code> is undefined" Fault(string.format(s, at, assigned)) end else s = "<code>sets[%d].params[%d] = %s</code>??" Fault(string.format(s, k, type(assigned))) end end -- fellow() local function fellows() -- Check sets[] and issue error message, if necessary. local s if type(Data.got.sets) == "table" then if type(Data.got.params) == "table" then for k, v in pairs(Data.got.sets) do if type(k) == "number" then if type(v) == "table" then for ek, ev in pairs(v) do if ek == "label" then s = type(ev) if s ~= "string" and s ~= "table" then s = "<code>sets[%d].label</code>??" Fault(string.format(s, k)) end elseif ek == "params" and type(ev) == "table" then for pk, pv in pairs(ev) do fellow(pk, pv, k) end -- for pk, pv else ek = mw.text.nowiki(tostring(ek)) s = "<code>sets[%d][%s]</code>??" Fault(string.format(s, k, ek)) end end -- for ek, ev else k = mw.text.nowiki(tostring(k)) v = mw.text.nowiki(tostring(v)) s = string.format("<code>sets[%s][%s]</code>??", k, v) Fault(s) end else k = mw.text.nowiki(tostring(k)) s = string.format("<code>sets[%s]</code> ?????", k) Fault(s) end end -- for k, v else s = "<code>params</code> required for <code>sets</code>" Fault(s) end else s = "<code>sets</code> needs to be of <code>object</code> type" Fault(s) end end -- fellows() local function finalize(advance) -- Wrap presentation into frame. -- Parameter: -- advance -- true, for nice -- Returns string. local r, lapsus if Data.div then r = tostring(Data.div) elseif Data.strip then r = Data.strip else lapsus = true r = "" end r = r .. failures() if Data.source then local live = (advance or lapsus) if not live then live = TemplateData.frame:preprocess("{{REVISIONID}}") live = (live == "") end if live then r = r .. fancy(advance, lapsus) end end return r end -- finalize() local function find() -- Find JSON data within page source (title). -- Returns string, or nil. local s = Data.title:getContent() local i, j = s:find("<templatedata>", 1, true) local r if i then local k = s:find("</templatedata>", j, true) if k then r = mw.text.trim(s:sub(j + 1, k - 1)) end end return r end -- find() local function flat(adjust) -- Remove formatting from text string for VisualEditor. -- Parameter: -- arglist -- string, to be stripped, or nil -- Returns string, or nil. local r if adjust then r = adjust:gsub("\n", " ") if r:find("<noexport>", 1, true) then r = r:gsub("<noexport>.*</noexport>", "") end if r:find("<exportonly>", 1, true) then r = r:gsub("</?exportonly>", "") end if r:find("''", 1, true) then r = r:gsub("'''", ""):gsub("''", "") end if r:find("<", 1, true) then local Text = Fetch("Text") r = r:gsub("<br */?>", "\r\n"):gsub("<sup>2</sup>", "&sup2;"):gsub("<sup>3</sup>", "&sup3;") r = Text.getPlain(r) end if r:find("[", 1, true) then local WLink = Fetch("WLink") if WLink.isBracketedURL(r) then r = r:gsub("%[([hf]tt?ps?://%S+) [^%]]+%]", "%1") end r = WLink.getPlain(r) end if r:find("&", 1, true) then r = mw.text.decode(r) if r:find("&shy;", 1, true) then r = r:gsub("&shy;", "") end end end return r end -- flat() local function flush() -- JSON encode narrowed input; obey unnamed (numerical) parameters. -- Returns <templatedata> JSON string. local r if Data.tag then r = mw.text.jsonEncode(Data.tag):gsub("%}$", ",") else r = "{" end r = r .. '\n"params":{' if Data.order then local sep = "" local s for i = 1, #Data.order do s = Data.order[i] r = string.format("%s%s\n%s:%s", r, sep, mw.text.jsonEncode(s), mw.text.jsonEncode(Data.params[s])) sep = ",\n" end -- for i = 1, #Data.order end r = r .. "\n}\n}" return r end -- flush() local function focus(access) -- Check components; focus multilingual description, build trees. -- Parameter: -- access -- string, name of parameter, nil for root local f = function(a, at) local r if at then r = string.format("<code>params.%s</code>", at) else r = "''root''" end if a then r = string.format("%s<code>.%s</code>", r, a) end return r end local parent if access then parent = Data.got.params[access] else parent = Data.got end if type(parent) == "table" then local elem, permit, s, scope, slot, tag, target if access then permit = Permit.params if type(access) == "number" then slot = tostring(access) else slot = access end else permit = Permit.root end for k, v in pairs(parent) do scope = permit[k] if scope then s = type(v) if s == "string" and k ~= "format" then v = mw.text.trim(v) end if scope:find(s, 1, true) then if scope:find("I18N", 1, true) then if s == "string" then elem = fair(v) elseif s == "table" then local translated v, translated = faraway(v) if v then if translated and k == "description" then elem = { [1] = fair(v), [2] = translated, } else elem = fair(v) end else elem = false end end if type(v) == "string" then if k == "deprecated" then if v == "1" then v = true elseif v == "0" then v = false end elem = v elseif scope:find("nowiki", 1, true) then elem = mw.text.nowiki(v) elem = elem:gsub("&#13;" .. string.char(10), "<br>") v = v:gsub(string.char(13), "") else v = flat(v) end elseif s == "boolean" then if scope:find("boolean", 1, true) then elem = v else s = "Type <code>boolean</code> bad for " .. f(k, slot) Fault(s) end end else if k == "params" and not access then v = nil elem = nil elseif k == "format" and not access then elem = mw.text.decode(v) v = nil elseif k == "inherits" then elem = v if not Data.heirs then Data.heirs = {} end Data.heirs[slot] = v v = nil elseif k == "style" then elem = v v = nil elseif s == "string" then v = mw.text.nowiki(v) elem = v else elem = v end end if type(elem) ~= "nil" then if not target then if access then if not Data.tree.params then Data.tree.params = {} end Data.tree.params[slot] = {} target = Data.tree.params[slot] else Data.tree = {} target = Data.tree end end target[k] = elem elem = false end if type(v) ~= "nil" then if not tag then if access then if type(v) == "string" and v.sub(1, 1) == "=" then v = nil else if not Data.params then Data.params = {} end Data.params[slot] = {} tag = Data.params[slot] end else Data.tag = {} tag = Data.tag end end if type(v) ~= "nil" and k ~= "suggestedvalues" then tag[k] = v end end else s = string.format("Type <code>%s</code> bad for %s", scope, f(k, slot)) Fault(s) end else Fault("Unknown component " .. f(k, slot)) end end -- for k, v if not access and Data.got.sets then fellows() end else Fault(f() .. " needs to be of <code>object</code> type") end end -- focus() local function format() -- Build formatted element. -- Returns <inline>. local source = Data.tree.format:lower() local r, s if source == "inline" or source == "block" then r = mw.html.create("i"):wikitext(source) else local code if source:find("|", 1, true) then local scan = "^[\n ]*%{%{[\n _]*|[\n _]*=[\n _]*%}%}[\n ]*$" if source:match(scan) then code = source:gsub("\n", "N") else s = mw.text.nowiki(source):gsub("\n", "&#92;n") s = tostring(mw.html.create("code"):wikitext(s)) Fault("Invalid format " .. s) source = false end else local words = mw.text.split(source, "%s+") local show, start, support, unknown for i = 1, #words do s = words[i] if i == 1 then start = s end support = Permit.builder[s] if support == start or support == "*" then Permit.builder[s] = true elseif s:match("^[1-9]%d?") and Permit.builder.align then Permit.builder.align = tonumber(s) else if unknown then unknown = string.format("%s %s", unknown, s) else unknown = s end end end -- i = 1, #words if unknown then s = tostring(mw.html.create("code"):css("white-space", "nowrap"):wikitext(s)) Fault("Unknown/misplaced format keyword " .. s) source = false start = false end if start == "inline" then if Permit.builder.half == true then show = "inline half" code = "{{_ |_=_}}" elseif Permit.builder.grouped == true then show = "inline grouped" code = "{{_ | _=_}}" elseif Permit.builder.spaced == true then show = "inline spaced" code = "{{_ | _ = _ }}" end if Permit.builder.newlines == true then show = show or "inline" code = code or "{{_|_=_}}" show = show .. " newlines" code = string.format("N%sN", code) end elseif start == "block" then local space = "" -- amid "|" and name local spaced = " " -- preceding "=" local spacer = " " -- following "=" local suffix = "N" -- closing "}}" on new line show = "block" if Permit.builder.indent == true then start = " " show = "block indent" else start = "" end if Permit.builder.compressed == true then spaced = "" spacer = "" show = show .. " compressed" if Permit.builder.last == true then show = show .. " last" else suffix = "" end else if Permit.builder.lead == true then show = show .. " lead" space = " " end if type(Permit.builder.align) ~= "string" then local n s = " align" if Permit.builder.align == true then n = 0 if type(Data.got) == "table" and type(Data.got.params) == "table" then for k, v in pairs(Data.got.params) do if type(v) == "table" and not v.deprecated and type(k) == "string" then k = mw.ustring.len(k) if k > n then n = k end end end -- for k, v end else n = Permit.builder.align if type(n) == "number" and n > 1 then s = string.format("%s %d", s, n) else n = 0 -- How come? end end if n > 1 then spaced = string.rep("_", n - 1) .. " " end show = show .. s elseif Permit.builder.after == true then spaced = "" show = show .. " after" elseif Permit.builder.dense == true then spaced = "" spacer = "" show = show .. " dense" end if Permit.builder.last == true then suffix = spacer show = show .. " last" end end code = string.format("N{{_N%s|%s_%s=%s_%s}}N", start, space, spaced, spacer, suffix) if show == "block" then show = "block newlines" end end if show then r = mw.html.create("span"):wikitext(show) end end if code then source = code:gsub("N", "\n") code = mw.text.nowiki(code):gsub("N", "&#92;n") code = mw.html.create("code"):css("margin-left", "1em"):css("margin-right", "1em"):wikitext(code) if r then r = mw.html.create("span"):node(r):node(code) else r = code end end end if source and Data.tag then Data.tag.format = source end return r end -- format() local function formatter() -- Build presented documentation. -- Returns <div>. local r = mw.html.create("div") local x = fashioned(Data.tree, true, r) local s if x then r = x end if Data.leading then local toc = mw.html.create("div") local shift if Config.suppressTOCnum then toc:addClass(Config.suppressTOCnum) if type(Config.stylesTOCnum) == "string" then local src = Config.stylesTOCnum .. "/styles.css" s = TemplateData.frame:extensionTag("templatestyles", nil, { src = src }) r:newline():node(s) end end toc:addClass("navigation-not-searchable"):css("margin-top", "0.5em"):wikitext("__TOC__") if Data.sibling then local block = mw.html.create("div") if TemplateData.ltr then shift = "right" else shift = "left" end block:css("float", shift):wikitext(Data.sibling) r:newline():node(block):newline() end r:newline():node(toc):newline() if shift then r:node(mw.html.create("div"):css("clear", shift)):newline() end end s = features() if s then if Data.leading then r:node(mw.html.create("h" .. Config.nested):wikitext(factory("doc-params"))):newline() end r:node(s) end if Data.shared then local global = mw.html.create("div"):attr("id", "templatedata-global") local shift if TemplateData.ltr then shift = "right" else shift = "left" end global:css("float", shift):wikitext(string.format("[[%s|%s]]", Data.shared, "Global")) r:newline():node(global) end if Data.tree and Data.tree.format then local e = format() if e then local show = "Format" if Config.supportFormat then show = string.format("[[%s|%s]]", Config.supportFormat, show) end r:node(mw.html.create("p"):addClass("navigation-not-searchable"):wikitext(show .. ": "):node(e)) end end return r end -- formatter() local function free() -- Remove JSON comment lines. if Data.source:find("//", 1, true) then Data.source:gsub("([{,\"'])(%s*\n%s*//.*\n%s*)([{},\"'])", "%1%3") end end -- free() local function full() -- Build survey table from JSON data, append invisible <templatedata>. Data.div = mw.html.create("div"):addClass("mw-templatedata-doc-wrap") if Permit.css.bg then Data.div:css(Permit.css.bg) end if Permit.css.fg then Data.div:css(Permit.css.fg) end focus() if Data.tag then if type(Data.got.params) == "table" then for k, v in pairs(Data.got.params) do focus(k) end -- for k, v if Data.heirs then fathers() end end end Data.div:node(formatter()) if not Data.lazy then Data.slim = flush() if TemplateData.frame then local div = mw.html.create("div") local tdata = { [1] = "templatedata", [2] = Data.slim, } Data.strip = TemplateData.frame:callParserFunction("#tag", tdata) div:wikitext(Data.strip) if Config.loudly then Data.div:node(mw.html.create("hr"):css({ height = "7ex" })) else div:css("display", "none") end Data.div:node(div) end end if Data.lasting then Fault("deprecated type syntax") end if Data.less then Fault(Config.solo) end end -- full() local function furnish(adapt, arglist) -- Analyze transclusion. -- Parameter: -- adapt -- table, #invoke parameters -- arglist -- table, template parameters -- Returns string. local source favorize() -- deprecated: for k, v in pairs(Config.basicCnf) do if adapt[k] and adapt[k] ~= "" then Config[v] = adapt[k] end end -- for k, v if arglist.heading and arglist.heading:match("^[3-6]$") then Config.nested = arglist.heading else Config.nested = "2" end Config.loudly = faculty(arglist.debug or adapt.debug) Data.lazy = faculty(arglist.lazy) and not Config.loudly Data.leading = faculty(arglist.TOC) if Data.leading and arglist.TOCsibling then Data.sibling = mw.text.trim(arglist.TOCsibling) end if arglist.lang then Data.slang = arglist.lang:lower() elseif adapt.lang then Data.slang = adapt.lang:lower() end if arglist.JSON then source = arglist.JSON elseif arglist.Global then source = TemplateData.getGlobalJSON(arglist.Global, arglist.Local) elseif arglist[1] then local s = mw.text.trim(arglist[1]) local start = s:sub(1, 1) if start == "<" then Data.strip = s elseif start == "{" then source = s elseif mw.ustring.sub(s, 1, 8) == mw.ustring.char(127, 39, 34, 96, 85, 78, 73, 81) then Data.strip = s end end if type(arglist.vertical) == "string" and arglist.vertical:match("^%d*%.?%d+[emprx]+$") then Data.scroll = arglist.vertical end if not source then Data.title = mw.title.getCurrentTitle() source = find() if not source and not Data.title.text:match(Config.subpage) then local s = string.format(Config.suffix, Data.title.prefixedText) Data.title = mw.title.new(s) if Data.title.exists then source = find() end end end if not Data.lazy then if not Data.title then Data.title = mw.title.getCurrentTitle() end Data.lazy = Data.title.text:match(Config.subpage) end if type(source) == "string" then TemplateData.getPlainJSON(source) end return finalize(faculty(arglist.source)) end -- furnish() Failsafe.failsafe = function(atleast) -- Retrieve versioning and check for compliance. -- Precondition: -- atleast -- string, with required version -- or wikidata|item|~|@ or false -- Postcondition: -- Returns string -- with queried version/item, also if problem -- false -- if appropriate -- 2024-03-01 local since = atleast local last = (since == "~") local linked = (since == "@") local link = (since == "item") local r if last or link or linked or since == "wikidata" then local item = Failsafe.item since = false if type(item) == "number" and item > 0 then local suited = string.format("Q%d", item) if link then r = suited else local entity = mw.wikibase.getEntity(suited) if type(entity) == "table" then local seek = Failsafe.serialProperty or "P348" local vsn = entity:formatPropertyValues(seek) if type(vsn) == "table" and type(vsn.value) == "string" and vsn.value ~= "" then if last and vsn.value == Failsafe.serial then r = false elseif linked then if mw.title.getCurrentTitle().prefixedText == mw.wikibase.getSitelink(suited) then r = false else r = suited end else r = vsn.value end end end end elseif link then r = false end end if type(r) == "nil" then if not since or since <= Failsafe.serial then r = Failsafe.serial else r = false end end return r end -- Failsafe.failsafe() TemplateData.getGlobalJSON = function(access, adapt) -- Retrieve TemplateData from a global repository (JSON). -- Parameter: -- access -- string, with page specifier (on WikiMedia Commons) -- adapt -- JSON string or table with local overrides -- Returns true, if succeeded. local plugin = Fetch("/global") local r if type(plugin) == "table" and type(plugin.fetch) == "function" then local s, got = plugin.fetch(access, adapt) if got then Data.got = got Data.order = got.paramOrder Data.shared = s r = true full() else Fault(s) end end return r end -- TemplateData.getGlobalJSON() TemplateData.getPlainJSON = function(adapt) -- Reduce enhanced JSON data to plain text localized JSON. -- Parameter: -- adapt -- string, with enhanced JSON -- Returns string, or not. if type(adapt) == "string" then -- local JSONutil = Fetch("JSONutil", true) -- DON'T check for Module:JSONutil. (doesn't exist in English WP, blocked from creation.) local JSONutil = nil -- DO act as if Fetch() failed. Data.source = adapt free() if JSONutil then local Multilingual = Fetch("Multilingual", true) local f if Multilingual then f = Multilingual.i18n end Data.got = JSONutil.fetch(Data.source, true, f) else local lucky lucky, Data.got = pcall(mw.text.jsonDecode, Data.source) end if type(Data.got) == "table" then full() elseif not Data.strip then local scream = type(Data.got) if scream == "string" then scream = Data.got else scream = "Data.got: " .. scream end Fault("fatal JSON error: " .. scream) end end return Data.slim end -- TemplateData.getPlainJSON() TemplateData.test = function(adapt, arglist) TemplateData.frame = mw.getCurrentFrame() return furnish(adapt, arglist) end -- TemplateData.test() -- Export. local p = {} p.f = function(frame) -- Template call. local lucky, r TemplateData.frame = frame lucky, r = pcall(furnish, frame.args, frame:getParent().args) if not lucky then Fault("INTERNAL: " .. r) r = failures() end return r end -- p.f p.failsafe = function(frame) -- Versioning interface. local s = type(frame) local since if s == "table" then since = frame.args[1] elseif s == "string" then since = frame end if since then since = mw.text.trim(since) if since == "" then since = false end end return Failsafe.failsafe(since) or "" end -- p.failsafe p.TemplateData = function() -- Module interface. return TemplateData end setmetatable(p, { __call = function(func, ...) setmetatable(p, nil) return Failsafe end, }) return p 2dd3b90kpdohdijcui9w39wr2ft47sq Module:Format TemplateData/config 828 51791 307137 2026-09-05T10:40:56Z Isma4l 41797 Bog cusub: --[=[ Configuration for [[Module:Format TemplateData]] on enwiki mw.loadData() ]=] local Serial = "2026-01-25" return { catProblem = "Templates with TemplateData errors", classMultiColumns = "column-multiple", classNoNumTOC = "nonumtoc", classTable = { "wikitable", "templatedata-params" }, cssParams = { ["border"] = "thin solid var(--background-color-progressive-subtle, #b3b7ff)", ["margin-left"] = "auto",... 307137 Scribunto text/plain --[=[ Configuration for [[Module:Format TemplateData]] on enwiki mw.loadData() ]=] local Serial = "2026-01-25" return { catProblem = "Templates with TemplateData errors", classMultiColumns = "column-multiple", classNoNumTOC = "nonumtoc", classTable = { "wikitable", "templatedata-params" }, cssParams = { ["border"] = "thin solid var(--background-color-progressive-subtle, #b3b7ff)", ["margin-left"] = "auto", ["margin-right"] = "auto" }, docpageCreate = "%s/doc", docpageDetect = "/doc$", failsafe = Serial, helpAliases = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#aliases", helpBoolean = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#boolean", helpContent = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#Content", helpDate = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#date", helpDefault = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#default", helpFile = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#wiki-file-name", helpFormat = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#format", helpLine = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#line", helpNumber = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#number", helpPage = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#wiki-page-name", helpString = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#string", helpTemplate = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#wiki-template-name", helpURL = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#url", helpUser = "mediawikiwiki:Special:MyLanguage/Help:TemplateData#wiki-user-name", msgDescMiss = "missing <code>description</code>", permit = { boole = { [true] = { css = { ["color"] = "var(--color-content-added, #050)", ["font-weight"] = "700" }, lead = false, show = "True" }, [false] = { css = { ["color"] = "var(--color-content-removed, #610)", ["font-weight"] = "700" }, lead = false, show = "False" } }, css = { bg = {}, deprecated = { ["background-color"] = "var(--background-color-destructive-subtle, #fdd)", ["border-left"] = "3px dotted var(--color-error, red)", ["color"] = "var(--color-base, #000)" }, fg = {}, optional = { ["border-left"] = "3px solid #ccc", ["color"] = "var(--color-base, #000)" }, required = { ["border-left"] = "3px solid #000", ["color"] = "var(--color-base, #000)" }, suggested = { ["border-left"] = "3px solid var(--border-color-subtle, #888)", ["color"] = "var(--color-base, #000)" }, tableheadbg = { ["background-color"] = "var(--background-color-progressive-subtle, #b3b7ff)", ["color"] = "var(--color-base, #000)" } } }, serial = Serial, tStylesMultiColumns = "column-multiple", tStylesTOCnum = "TOC nonum" } n89gwq7t3gsq9p5a5i3eevisuxrxfab Module:Format TemplateData/global 828 51792 307138 2026-09-05T10:41:30Z Isma4l 41797 Bog cusub: local Export = { item = 51435481, serial = "2020-08-01", subpages = "TemplateData", suffix = "tab", suite = "TemplateDataGlobal" } --[=[ Retrieve TemplateData from Commons:Data (or other global source). require() Inspired by [[de:User:Yurik]]. ]=] local Failsafe = Export local failsafe = function(atleast) -- Retrieve versioning and check for compliance. -- Precondition: -- atleast -- string, with required version -- or "wikidata"... 307138 Scribunto text/plain local Export = { item = 51435481, serial = "2020-08-01", subpages = "TemplateData", suffix = "tab", suite = "TemplateDataGlobal" } --[=[ Retrieve TemplateData from Commons:Data (or other global source). require() Inspired by [[de:User:Yurik]]. ]=] local Failsafe = Export local failsafe = function(atleast) -- Retrieve versioning and check for compliance. -- Precondition: -- atleast -- string, with required version -- or "wikidata" or "~" or "@" or false -- Postcondition: -- Returns string -- with queried version/item, also if problem -- false -- if appropriate local last = (atleast == "~") local link = (atleast == "@") local since = atleast local r if last or link or since == "wikidata" then local item = Failsafe.item since = false if type(item) == "number" and item > 0 then local suited = string.format("Q%d", item) local entity = mw.wikibase.getEntity(suited) if type(entity) == "table" then local seek = Failsafe.serialProperty or "P348" local vsn = entity:formatPropertyValues(seek) if type(vsn) == "table" and type(vsn.value) == "string" and vsn.value ~= "" then if last and vsn.value == Failsafe.serial then r = false elseif link then if mw.title.getCurrentTitle().prefixedText == mw.wikibase.getSitelink(suited) then r = false else r = suited end else r = vsn.value end end end end end if type(r) == "nil" then if not since or since <= Failsafe.serial then r = Failsafe.serial else r = false end end return r end -- failsafe() local function fair(already, adapt, append) -- Merge local definitions into global base. -- Parameter: -- already -- global item -- adapt -- local override item -- append -- append to sequence table -- Returns merged item local r if already and adapt then if type(already) == "table" and type(adapt) == "table" then r = already if append then for i = 1, #adapt do table.insert(r, adapt[i]) end -- for i else for k, v in pairs(adapt) do r[k] = v end -- for k, v end else r = adapt end else r = already or adapt end return r end -- fair() local function feed(apply) -- Retrieve override from JSON code. -- Parameter: -- apply -- string, with JSON -- Returns string, with error message, or table local lucky, r = pcall(mw.text.jsonDecode, apply) if not lucky then r = "fatal JSON error in LOCAL override" end return r end -- feed() local function find(access) -- Fetch data from page. -- Parameter: -- access -- string, with core page name -- Returns -- 1. string, with prefixed page name -- 2. table with JSON data, or error message local storage = access local lucky, r if Export.suffix and not storage:find(".", 2, true) then local k = -1 - #Export.suffix if storage:sub(k) ~= "." .. Export.suffix then storage = string.format("%s.%s", storage, Export.suffix) end end if Export.subpages and not storage:find("/", 1, true) then storage = string.format("%s/%s", Export.subpages, storage) end lucky, r = pcall(mw.ext.data.get, storage, "_") storage = "Data:" .. storage if mw.site.siteName ~= "Wikimedia Commons" then storage = "commons:" .. storage end if type(r) ~= "table" and type(r) ~= "string" then r = "INVALID" end return storage, r end -- find() local function flat(apply) -- Convert tabular data into TemplateData. -- Parameter: -- apply -- table, with tabular data -- Returns string, with error message, or table, with TemplateData local r, scream local function failed(at, alert) if scream then scream = string.format("%s * #%d: %s", scream, at, alert) else scream = add end end -- failed() if type(apply.schema) == "table" and type(apply.schema.fields) == "table" and type(apply.data) == "table" then local order = {} local entry, got, params, parOrder, s, sign, td, v for k, v in pairs(apply.schema.fields) do if type(v) == "table" then table.insert(order, v.name) end end -- for k, v for i = 1, #apply.data do entry = apply.data[i] if type(entry) == "table" then got = {} sign = false for j = 1, #entry do s = order[j] v = entry[j] if type(v) == "string" then v = mw.text.trim(v) if v == "" then v = false end end if v then if s == "name" then sign = v elseif s == "aliases" then if type(v) == "string" then got.aliases = mw.text.split(v, "%s*|%s*") else failed(i, "aliases not a string") end else got[s] = v end end end -- for j if sign == "|" then if td then failed(i, "root repeated") else td = {description = got.description} if type(got.type) == "string" then td.format = got.type:gsub("N", "\n") end end elseif sign then if params then if params[sign] then failed(i, "name repeated: " .. sign) end else params = {} parOrder = {} end params[sign] = got table.insert(parOrder, sign) else failed(i, "missing name") end else failed(i, "invalid component") end end -- for i r = td or {} r.params = params r.paramOrder = parOrder else r = "bad tabular structure" end return scream or r or "EMPTY" end -- flat() local function flush(assembly, avoid) -- Remove element from sequence table. -- Parameter: -- assembly -- sequence table -- avoid -- element for i = 1, #assembly do if assembly[i] == avoid then table.remove(assembly, i) break -- for i end end -- for i end -- flush() local function fold(already, adapt) -- Merge local parameter definitions into global base. -- Parameter: -- already -- table, with global data -- adapt -- sequence table, with local params overrides -- Returns string, with error message, or table, with TemplateData local order = {} local params = {} local r = already local entry, override, s r.params = r.params or {} r.paramOrder = r.paramOrder or {} for i = 1, #adapt do override = adapt[i] if type(override) ~= "table" then r = string.format("No object at LOCAL params[%d]", i) break -- for i elseif type(override.global) == "string" then s = override.global entry = r.params[s] if type(entry) == "table" then flush(r.paramOrder, s) if type(override["local"]) == "string" then s = override["local"] override["local"] = nil elseif override["local"] == false then entry = nil end if entry then override.global = nil for k, v in pairs(override) do entry[k] = fair(entry[k], override[k], (k == "aliases")) end -- for k, v table.insert(order, s) end params[s] = entry else r = string.format("No GLOBAL params %s for LOCAL [%d]", s, i) break -- for i end elseif type(override["local"]) == "string" then s = override["local"] override["local"] = nil params[s] = override table.insert(order, s) else r = string.format("No name for LOCAL params[%d]", i) break -- for i end end -- for i if type(r) == "table" then for i = 1, #r.paramOrder do s = r.paramOrder[i] params[s] = r.params[s] table.insert(order, s) end -- for i r.params = params r.paramOrder = order end return r end -- fold() local function fork(already, adapt) -- Merge local definitions into global base. -- Parameter: -- already -- table, with global data -- adapt -- table, with local overrides -- Returns string, with error message, or table, with TemplateData local root = {"description", "format", "maps", "sets", "style"} local r = already for k, v in pairs(root) do if adapt[v] then r[v] = fair(r[v], adapt[v]) end end -- for k, v if type(adapt.params) == "table" then r = fold(r, adapt.params) end return r end -- fork() local function furnish(apply, at, adapt) -- Convert external data into TemplateData. -- Parameter: -- apply -- table, with external data -- at -- string, with page name -- adapt -- JSON string or table or not, with local overrides -- Returns string, with error message, or table, with TemplateData local r if at:sub(-4) == ".tab" then r = flat(apply) else r = "Unknown page format: " .. at end if adapt and type(r) == "table" then local override = adapt if type(adapt) == "string" then override = feed(adapt) if type(override) == "string" then r = override end end if type(override) == "table" then r = fork(r, override) end end return r end -- furnish() Export.failsafe = function(frame) -- Versioning interface. local s = type(frame) local since if s == "table" then since = frame.args[1] elseif s == "string" then since = frame end if since then since = mw.text.trim(since) if since == "" then since = false end end return failsafe(since) or "" end -- Export.failsafe() Export.fetch = function(access, adapt) -- Fetch data from site. -- Parameter: -- access -- string, with page specification -- adapt -- JSON string or table or not, with local overrides -- Returns -- 1. string, with error message or prefixed page name -- 2. table with TemplateData, or not local storage, t = find(access) local s if type(t) == "table" then t = furnish(t, storage, adapt) if type(t) ~= "table" then s = t end else s = t end if type(t) ~= "table" then storage = string.format("[[%s]]", storage) if s then storage = string.format("%s * %s", storage, s) end t = false end return storage, t end -- Export.fetch() return Export 9xih3teg4ngek2mmmeo439peiwk3vq3 Module:Multilingual 828 51793 307139 2026-09-05T10:42:24Z Isma4l 41797 Bog cusub: local Multilingual = { suite = "Multilingual", serial = "2020-12-10", item = 47541920, globals = { ISO15924 = 71584769, WLink = 19363224 } } --[=[ Utilities for multilingual texts and ISO 639 (BCP47) issues etc. * fair() * fallback() * findCode() * fix() * format() * getBase() * getLang() * getName() * i18n() * int() * isLang() * isLangWiki() * isM... 307139 Scribunto text/plain local Multilingual = { suite = "Multilingual", serial = "2020-12-10", item = 47541920, globals = { ISO15924 = 71584769, WLink = 19363224 } } --[=[ Utilities for multilingual texts and ISO 639 (BCP47) issues etc. * fair() * fallback() * findCode() * fix() * format() * getBase() * getLang() * getName() * i18n() * int() * isLang() * isLangWiki() * isMinusculable() * isRTL() * message() * sitelink() * tabData() * userLang() * userLangCode() * wikibase() * failsafe() loadData: Multilingual/config Multilingual/names ]=] local Failsafe = Multilingual local GlobalMod = Multilingual local GlobalData = Multilingual local User = { sniffer = "showpreview" } Multilingual.globals.Multilingual = Multilingual.item Multilingual.exotic = { simple = true, no = true } Multilingual.prefer = { cs = true, de = true, en = true, es = true, fr = true, it = true, nl = true, pt = true, ru = true, sv = true } local foreignModule = function ( access, advanced, append, alt, alert ) -- Fetch global module -- Precondition: -- access -- string, with name of base module -- advanced -- true, for require(); else mw.loadData() -- append -- string, with subpage part, if any; or false -- alt -- number, of wikidata item of root; or false -- alert -- true, for throwing error on data problem -- Postcondition: -- Returns whatever, probably table -- 2020-01-01 local storage = access local finer = function () if append then storage = string.format( "%s/%s", storage, append ) end end local fun, lucky, r, suited if advanced then fun = require else fun = mw.loadData end GlobalMod.globalModules = GlobalMod.globalModules or { } suited = GlobalMod.globalModules[ access ] if not suited then finer() lucky, r = pcall( fun, "Module:" .. storage ) end if not lucky then if not suited and type( alt ) == "number" and alt > 0 then suited = string.format( "Q%d", alt ) suited = mw.wikibase.getSitelink( suited ) GlobalMod.globalModules[ access ] = suited or true end if type( suited ) == "string" then storage = suited finer() lucky, r = pcall( fun, storage ) end if not lucky and alert then error( "Missing or invalid page: " .. storage ) end end return r end -- foreignModule() local fetchData = function ( access ) -- Retrieve translated keyword from commons:Data:****.tab -- Precondition: -- access -- string, with page identification on Commons -- Returns table, with data, or string, with error message -- 2019-12-05 local storage = access local r if type( storage ) == "string" then local s storage = mw.text.trim( storage ) s = storage:lower() if s:sub( 1, 2 ) == "c:" then storage = mw.text.trim( storage:sub( 3 ) ) s = storage:lower() elseif s:sub( 1, 8 ) == "commons:" then storage = mw.text.trim( storage:sub( 9 ) ) s = storage:lower() end if s:sub( 1, 5 ) == "data:" then storage = mw.text.trim( storage:sub( 6 ) ) s = storage:lower() end if s == "" or s == ".tab" then storage = false elseif s:sub( -4 ) == ".tab" then storage = storage:sub( 1, -5 ) .. ".tab" else storage = storage .. ".tab" end end if type( storage ) == "string" then local data if type( GlobalData.TabDATA ) ~= "table" then GlobalData.TabDATA = { } end data = GlobalData.TabDATA[ storage ] if data then r = data else local lucky lucky, data = pcall( mw.ext.data.get, storage, "_" ) if type( data ) == "table" then data = data.data if type( data ) == "table" then GlobalData.TabDATA[ storage ] = data else r = string.format( "%s [[%s%s]]", "INVALID Data:*.tab", "commons:Data:", storage ) end else r = "BAD PAGE Data:*.tab &#8211; commons:" .. storage end if r then GlobalData.TabDATA[ storage ] = r data = false else r = data end end else r = "BAD PAGE commons:Data:*.tab" end return r end -- fetchData() local favorites = function () -- Provide fallback codes -- Postcondition: -- Returns table with sequence of preferred languages -- * ahead elements -- * user (not yet accessible) -- * page content language (not yet accessible) -- * page name subpage -- * project -- * en local r = Multilingual.polyglott if not r then local self = mw.language.getContentLanguage():getCode():lower() local sub = mw.title.getCurrentTitle().subpageText local f = function ( add ) local s = add for i = 1, #r do if r[ i ] == s then s = false break -- for i end end -- for i if s then table.insert( r, s ) end end r = { } if sub:find( "/", 2, true ) then sub = sub:match( "/(%l%l%l?)$" ) if sub then table.insert( r, sub ) end elseif sub:find( "^%l%l%l?%-?%a?%a?%a?%a?$" ) and mw.language.isSupportedLanguage( sub ) then table.insert( r, sub ) end f( self ) f( "en" ) Multilingual.polyglott = r end return r end -- favorites() local feasible = function ( ask, accept ) -- Is ask to be supported by application? -- Precondition: -- ask -- lowercase code -- accept -- sequence table, with offered lowercase codes -- Postcondition: -- nil, or true local r for i = 1, #accept do if accept[ i ] == ask then r = true break -- for i end end -- for i return r end -- feasible() local fetch = function ( access, append ) -- Attach config or library module -- Precondition: -- access -- module title -- append -- string, with subpage part of this; or false -- Postcondition: -- Returns: table, with library, or false local got, sign if append then sign = string.format( "%s/%s", access, append ) else sign = access end if type( Multilingual.ext ) ~= "table" then Multilingual.ext = { } end got = Multilingual.ext[ sign ] if not got and got ~= false then local global = Multilingual.globals[ access ] local lib = ( not append or append == "config" ) got = foreignModule( access, lib, append, global ) if type( got ) == "table" then if lib then local startup = got[ access ] if type( startup ) == "function" then got = startup() end end else got = false end Multilingual.ext[ sign ] = got end return got end -- fetch() local fetchISO639 = function ( access ) -- Retrieve table from commons:Data:ISO639/***.tab -- Precondition: -- access -- string, with subpage identification -- Postcondition: -- Returns table, with data, even empty local r if type( Multilingual.iso639 ) ~= "table" then Multilingual.iso639 = { } end r = Multilingual.iso639[ access ] if type( r ) == "nil" then local raw = fetchData( "ISO639/" .. access ) if type( raw ) == "table" then local t r = { } for i = 1, #raw do t = raw[ i ] if type( t ) == "table" and type( t[ 1 ] ) == "string" and type( t[ 2 ] ) == "string" then r[ t[ 1 ] ] = t[ 2 ] else break -- for i end end -- for i else r = false end Multilingual.iso639[ access ] = r end return r or { } end -- fetchISO639() local fill = function ( access, alien, frame ) -- Expand language name template -- Precondition: -- access -- string, with language code -- alien -- language code for which to be generated -- frame -- frame, if available -- Postcondition: -- Returns string local template = Multilingual.tmplLang local r if type( template ) ~= "table" then local cnf = fetch( "Multilingual", "config" ) if cnf then template = cnf.tmplLang end end if type( template ) == "table" then local source = template.title local f, lucky, s Multilingual.tmplLang = template if type( source ) ~= "string" and type( template.namePat ) == "string" and template.namePat:find( "%s", 1, true ) then source = string.format( template.namePat, access ) end if type( source ) == "string" then if not Multilingual.frame then if frame then Multilingual.frame = frame else Multilingual.frame = mw.getCurrentFrame() end end f = function ( a ) return Multilingual.frame:expandTemplate{ title = a } end lucky, s = pcall( f, source ) if lucky then r = s end end end return r end -- fill() local find = function ( ask, alien ) -- Derive language code from name -- Precondition: -- ask -- language name, downcased -- alien -- language code of ask -- Postcondition: -- nil, or string local codes = mw.language.fetchLanguageNames( alien, "all" ) local r for k, v in pairs( codes ) do if mw.ustring.lower( v ) == ask then r = k break -- for k, v end end -- for k, v if not r then r = Multilingual.fair( ask ) end return r end -- find() local fold = function ( frame ) -- Merge template and #invoke arglist -- Precondition: -- frame -- template frame -- Postcondition: -- table, with combined arglist local r = { } local f = function ( apply ) if type( apply ) == "table" and type( apply.args ) == "table" then for k, v in pairs( apply.args ) do v = mw.text.trim( v ) if v ~= "" then r[ tostring( k ) ] = v end end -- for k, v end end -- f() f( frame:getParent() ) f( frame ) return r end -- fold() User.favorize = function ( accept, frame ) -- Guess user language -- Precondition: -- accept -- sequence table, with offered ISO 639 etc. codes -- frame -- frame, if available -- Postcondition: -- Returns string with best code, or nil if not ( User.self or User.langs ) then if not User.trials then User.tell = mw.message.new( User.sniffer ) if User.tell:exists() then User.trials = { } if not Multilingual.frame then if frame then Multilingual.frame = frame else Multilingual.frame = mw.getCurrentFrame() end end User.sin = Multilingual.frame:callParserFunction( "int", User.sniffer ) else User.langs = true end end if User.sin then local order = { } local post = { } local three = { } local unfold = { } local s, sin for i = 1, #accept do s = accept[ i ] if not User.trials[ s ] then if #s > 2 then if s:find( "-", 3, true ) then table.insert( unfold, s ) else table.insert( three, s ) end else if Multilingual.prefer[ s ] then table.insert( order, s ) else table.insert( post, s ) end end end end -- for i for i = 1, #post do table.insert( order, post[ i ] ) end -- for i for i = 1, #three do table.insert( order, three[ i ] ) end -- for i for i = 1, #unfold do table.insert( order, unfold[ i ] ) end -- for i for i = 1, #order do s = order[ i ] sin = User.tell:inLanguage( s ):plain() if sin == User.sin then User.self = s break -- for i else User.trials[ s ] = true end end -- for i end end return User.self end -- User.favorize() Multilingual.fair = function ( ask ) -- Format language specification according to RFC 5646 etc. -- Precondition: -- ask -- string or table, as created by .getLang() -- Postcondition: -- Returns string, or false local s = type( ask ) local q, r if s == "table" then q = ask elseif s == "string" then q = Multilingual.getLang( ask ) end if q and q.legal and mw.language.isKnownLanguageTag( q.base ) then r = q.base if q.n > 1 then local order = { "extlang", "script", "region", "other", "extension" } for i = 1, #order do s = q[ order[ i ] ] if s then r = string.format( "%s-%s", r, s ) end end -- for i end end return r or false end -- Multilingual.fair() Multilingual.fallback = function ( able, another ) -- Is another language suitable as replacement? -- Precondition: -- able -- language version specifier to be supported -- another -- language specifier of a possible replacement, -- or not to retrieve a fallback table -- Postcondition: -- Returns boolean, or table with fallback codes local r if type( able ) == "string" and #able > 0 then if type( another ) == "string" and #another > 0 then if able == another then r = true else local s = Multilingual.getBase( able ) if s == another then r = true else local others = mw.language.getFallbacksFor( s ) r = feasible( another, others ) end end else local s = Multilingual.getBase( able ) if s then r = mw.language.getFallbacksFor( s ) if r[ 1 ] == "en" then local d = fetchISO639( "fallback" ) if type( d ) == "table" and type( d[ s ] ) == "string" then r = mw.text.split( d[ s ], "|" ) table.insert( r, "en" ) end end end end end return r or false end -- Multilingual.fallback() Multilingual.findCode = function ( ask ) -- Retrieve code of local (current project or English) language name -- Precondition: -- ask -- string, with presumable language name -- A code itself will be identified, too. -- Postcondition: -- Returns string, or false local seek = mw.text.trim( ask ) local r = false if #seek > 1 then if seek:find( "[", 1, true ) then local wlink = fetch( "WLink" ) if wlink and type( wlink.getPlain ) == "function" then seek = wlink.getPlain( seek ) end end seek = mw.ustring.lower( seek ) if Multilingual.isLang( seek ) then r = Multilingual.fair( seek ) else local collection = favorites() for i = 1, #collection do r = find( seek, collection[ i ] ) if r then break -- for i end end -- for i end end return r end -- Multilingual.findCode() Multilingual.fix = function ( attempt ) -- Fix frequently mistaken language code -- Precondition: -- attempt -- string, with presumable language code -- Postcondition: -- Returns string with correction, or false if no problem known local r = fetchISO639( "correction" )[ attempt:lower() ] return r or false end -- Multilingual.fix() Multilingual.format = function ( apply, alien, alter, active, alert, frame, assembly, adjacent, ahead ) -- Format one or more languages -- Precondition: -- apply -- string with language list or item -- alien -- language of the answer -- -- nil, false, "*": native -- -- "!": current project -- -- "#": code, downcased, space separated -- -- "-": code, mixcase, space separated -- -- any valid code -- alter -- capitalize, if "c"; downcase all, if "d" -- capitalize first item only, if "f" -- downcase every first word only, if "m" -- active -- link items, if true -- alert -- string with category title in case of error -- frame -- if available -- assembly -- string with split pattern, if list expected -- adjacent -- string with list separator, else assembly -- ahead -- string to prepend first element, if any -- Postcondition: -- Returns string, or false if apply empty local r = false if apply then local slang if assembly then local bucket = mw.text.split( apply, assembly ) local shift = alter local separator if adjacent then separator = adjacent elseif alien == "#" or alien == "-" then separator = " " else separator = assembly end for k, v in pairs( bucket ) do slang = Multilingual.format( v, alien, shift, active, alert ) if slang then if r then r = string.format( "%s%s%s", r, separator, slang ) else r = slang if shift == "f" then shift = "d" end end end end -- for k, v if r and ahead then r = ahead .. r end else local single = mw.text.trim( apply ) if single == "" then r = false else local lapsus, slot slang = Multilingual.findCode( single ) if slang then if alien == "-" then r = slang elseif alien == "#" then r = slang:lower() else r = Multilingual.getName( slang, alien ) if active then slot = fill( slang, false, frame ) if slot then local wlink = fetch( "WLink" ) if wlink and type( wlink.getTarget ) == "function" then slot = wlink.getTarget( slot ) end else lapsus = alert end end end else r = single if active then local title = mw.title.makeTitle( 0, single ) if title.exists then slot = single end end lapsus = alert end if not r then r = single elseif alter == "c" or alter == "f" then r = mw.ustring.upper( mw.ustring.sub( r, 1, 1 ) ) .. mw.ustring.sub( r, 2 ) elseif alter == "d" then if Multilingual.isMinusculable( slang, r ) then r = mw.ustring.lower( r ) end elseif alter == "m" then if Multilingual.isMinusculable( slang, r ) then r = mw.ustring.lower( mw.ustring.sub( r, 1, 1 ) ) .. mw.ustring.sub( r, 2 ) end end if slot then if r == slot then r = string.format( "[[%s]]", r ) else r = string.format( "[[%s|%s]]", slot, r ) end end if lapsus and alert then r = string.format( "%s[[Category:%s]]", r, alert ) end end end end return r end -- Multilingual.format() Multilingual.getBase = function ( ask ) -- Retrieve base language from possibly combined ISO language code -- Precondition: -- ask -- language code -- Postcondition: -- Returns string, or false local r if ask then local slang = ask:match( "^%s*(%a%a%a?)-?%a*%s*$" ) if slang then r = slang:lower() else r = false end else r = false end return r end -- Multilingual.getBase() Multilingual.getLang = function ( ask ) -- Retrieve components of a RFC 5646 language code -- Precondition: -- ask -- language code with subtags -- Postcondition: -- Returns table with formatted subtags -- .base -- .region -- .script -- .suggest -- .year -- .extension -- .other -- .n local tags = mw.text.split( ask, "-" ) local s = tags[ 1 ] local r if s:match( "^%a%a%a?$" ) then r = { base = s:lower(), legal = true, n = #tags } for i = 2, r.n do s = tags[ i ] if #s == 2 then if r.region or not s:match( "%a%a" ) then r.legal = false else r.region = s:upper() end elseif #s == 4 then if s:match( "%a%a%a%a" ) then r.legal = ( not r.script ) r.script = s:sub( 1, 1 ):upper() .. s:sub( 2 ):lower() elseif s:match( "20%d%d" ) or s:match( "1%d%d%d" ) then r.legal = ( not r.year ) r.year = s else r.legal = false end elseif #s == 3 then if r.extlang or not s:match( "%a%a%a" ) then r.legal = false else r.extlang = s:lower() end elseif #s == 1 then s = s:lower() if s:match( "[tux]" ) then r.extension = s for k = i + 1, r.n do s = tags[ k ] if s:match( "^%w+$" ) then r.extension = string.format( "%s-%s", r.extension, s ) else r.legal = false end end -- for k else r.legal = false end break -- for i else r.legal = ( not r.other ) and s:match( "%a%a%a" ) r.other = s:lower() end if not r.legal then break -- for i end end -- for i if r.legal then r.suggest = Multilingual.fix( r.base ) if r.suggest then r.legal = false end end else r = { legal = false } end if not r.legal then local cnf = fetch( "Multilingual", "config" ) if cnf and type( cnf.scream ) == "string" then r.scream = cnf.scream end end return r end -- Multilingual.getLang() Multilingual.getName = function ( ask, alien ) -- Which name is assigned to this language code? -- Precondition: -- ask -- language code -- alien -- language of the answer -- -- nil, false, "*": native -- -- "!": current project -- -- any valid code -- Postcondition: -- Returns string, or false local r if ask then local slang = alien local tLang if slang then if slang == "*" then slang = Multilingual.fair( ask ) elseif slang == "!" then slang = favorites()[ 1 ] else slang = Multilingual.fair( slang ) end else slang = Multilingual.fair( ask ) end if not slang then slang = ask or "?????" end slang = slang:lower() tLang = fetch( "Multilingual", "names" ) if tLang then tLang = tLang[ slang ] if tLang then r = tLang[ ask ] end end if not r then if not Multilingual.ext.tMW then Multilingual.ext.tMW = { } end tLang = Multilingual.ext.tMW[ slang ] if tLang == nil then tLang = mw.language.fetchLanguageNames( slang ) if tLang then Multilingual.ext.tMW[ slang ] = tLang else Multilingual.ext.tMW[ slang ] = false end end if tLang then r = tLang[ ask ] end end if not r then r = mw.language.fetchLanguageName( ask:lower(), slang ) if r == "" then r = false end end else r = false end return r end -- Multilingual.getName() Multilingual.i18n = function ( available, alt, frame ) -- Select translatable message -- Precondition: -- available -- table, with mapping language code ./. text -- alt -- string|nil|false, with fallback text -- frame -- frame, if available -- Returns -- 1. string|nil|false, with selected message -- 2. string|nil|false, with language code local r1, r2 if type( available ) == "table" then local codes = { } local trsl = { } local slang for k, v in pairs( available ) do if type( k ) == "string" and type( v ) == "string" then slang = mw.text.trim( k:lower() ) table.insert( codes, slang ) trsl[ slang ] = v end end -- for k, v slang = Multilingual.userLang( codes, frame ) if slang and trsl[ slang ] then r1 = mw.text.trim( trsl[ slang ] ) if r1 == "" then r1 = false else r2 = slang end end end if not r1 and type( alt ) == "string" then r1 = mw.text.trim( alt ) if r1 == "" then r1 = false end end return r1, r2 end -- Multilingual.i18n() Multilingual.int = function ( access, alien, apply ) -- Translated system message -- Precondition: -- access -- message ID -- alien -- language code -- apply -- nil, or sequence table with parameters $1, $2, ... -- Postcondition: -- Returns string, or false local o = mw.message.new( access ) local r if o:exists() then if type( alien ) == "string" then o:inLanguage( alien:lower() ) end if type( apply ) == "table" then o:params( apply ) end r = o:plain() end return r or false end -- Multilingual.int() Multilingual.isLang = function ( ask, additional ) -- Could this be an ISO language code? -- Precondition: -- ask -- language code -- additional -- true, if Wiki codes like "simple" permitted -- Postcondition: -- Returns boolean local r, s if additional then s = ask else s = Multilingual.getBase( ask ) end if s then r = mw.language.isKnownLanguageTag( s ) if r then r = not Multilingual.fix( s ) elseif additional then r = Multilingual.exotic[ s ] or false end else r = false end return r end -- Multilingual.isLang() Multilingual.isLangWiki = function ( ask ) -- Could this be a Wiki language version? -- Precondition: -- ask -- language version specifier -- Postcondition: -- Returns boolean local r local s = Multilingual.getBase( ask ) if s then r = mw.language.isSupportedLanguage( s ) or Multilingual.exotic[ ask ] else r = false end return r end -- Multilingual.isLangWiki() Multilingual.isMinusculable = function ( ask, assigned ) -- Could this language name become downcased? -- Precondition: -- ask -- language code, or nil -- assigned -- language name, or nil -- Postcondition: -- Returns boolean local r = true if ask then local cnf = fetch( "Multilingual", "config" ) if cnf then local s = string.format( " %s ", ask:lower() ) if type( cnf.stopMinusculization ) == "string" and cnf.stopMinusculization:find( s, 1, true ) then r = false end if r and assigned and type( cnf.seekMinusculization ) == "string" and cnf.seekMinusculization:find( s, 1, true ) and type( cnf.scanMinusculization ) == "string" then local scan = assigned:gsub( "[%(%)]", " " ) .. " " if not scan:find( cnf.scanMinusculization ) then r = false end end end end return r end -- Multilingual.isMinusculable() Multilingual.isRTL = function ( ask ) -- Check whether language is written right-to-left -- Precondition: -- ask -- string, with language (or script) code -- Returns true, if right-to-left local r Multilingual.rtl = Multilingual.rtl or { } r = Multilingual.rtl[ ask ] if type( r ) ~= "boolean" then local bib = fetch( "ISO15924" ) if type( bib ) == "table" and type( bib.isRTL ) == "function" then r = bib.isRTL( ask ) else r = mw.language.new( ask ):isRTL() end Multilingual.rtl[ ask ] = r end return r end -- Multilingual.isRTL() Multilingual.message = function ( arglist, frame ) -- Show text in best match of user language like system message -- Precondition: -- arglist -- template arguments -- frame -- frame, if available -- Postcondition: -- Returns string with appropriate text local r if type( arglist ) == "table" then local t = { } local m, p, save for k, v in pairs( arglist ) do if type( k ) == "string" and type( v ) == "string" then v = mw.text.trim( v ) if v ~= "" then if k:match( "^%l%l" ) then t[ k ] = v elseif k:match( "^%$%d$" ) and k ~= "$0" then p = p or { } k = tonumber( k:match( "^%$(%d)$" ) ) p[ k ] = v if not m or k > m then m = k end end end end end -- for k, v if type( arglist[ "-" ] ) == "string" then save = arglist[ arglist[ "-" ] ] end r = Multilingual.i18n( t, save, frame ) if p and r and r:find( "$", 1, true ) then t = { } for i = 1, m do t[ i ] = p[ i ] or "" end -- for i r = mw.message.newRawMessage( r, t ):plain() end end return r or "" end -- Multilingual.message() Multilingual.sitelink = function ( all, frame ) -- Make link at local or other site with optimal linktext translation -- Precondition: -- all -- string or table or number, item ID or entity -- frame -- frame, if available -- Postcondition: -- Returns string with any helpful internal link, or plain text local s = type( all ) local object, r if s == "table" then object = all elseif s == "string" then object = mw.wikibase.getEntity( all ) elseif s == "number" then object = mw.wikibase.getEntity( string.format( "Q%d", all ) ) end if type( object ) == "table" then local collection = object.sitelinks local entry s = false if type( collection ) == "table" then Multilingual.site = Multilingual.site or mw.wikibase.getGlobalSiteId() entry = collection[ Multilingual.site ] if entry then s = ":" .. entry.title elseif collection.enwiki then s = "w:en:" .. collection.enwiki.title end end r = Multilingual.wikibase( object, "labels", frame ) if s then if s == ":" .. r then r = string.format( "[[%s]]", s ) else r = string.format( "[[%s|%s]]", s, r ) end end end return r or "" end -- Multilingual.sitelink() Multilingual.tabData = function ( access, at, alt, frame ) -- Retrieve translated keyword from commons:Data:****.tab -- Precondition: -- access -- string, with page identification on Commons -- at -- string, with keyword -- alt -- string|nil|false, with fallback text -- frame -- frame, if available -- Returns -- 1. string|nil|false, with selected message -- 2. language code, or "error" local data = fetchData( access ) local r1, r2 if type( data ) == "table" then if type( at ) == "string" then local seek = mw.text.trim( at ) if seek == "" then r1 = "EMPTY Multilingual.tabData key" else local e, poly for i = 1, #data do e = data[ i ] if type( e ) == "table" then if e[ 1 ] == seek then if type( e[ 2 ] ) == "table" then poly = e[ 2 ] else r1 = "INVALID Multilingual.tabData bad #" .. tostring( i ) end break -- for i end else break -- for i end end -- for i if poly then data = poly else r1 = "UNKNOWN Multilingual.tabData key: " .. seek end end else r1 = "INVALID Multilingual.tabData key" end else r1 = data end if r1 then r2 = "error" elseif data then r1, r2 = Multilingual.i18n( data, alt, frame ) r2 = r2 or "error" end return r1, r2 end -- Multilingual.tabData() Multilingual.userLang = function ( accept, frame ) -- Try to support user language by application -- Precondition: -- accept -- string or table -- space separated list of available ISO 639 codes -- Default: project language, or English -- frame -- frame, if available -- Postcondition: -- Returns string with appropriate code local s = type( accept ) local codes, r, slang if s == "string" then codes = mw.text.split( accept:lower(), "%s+" ) elseif s == "table" then codes = { } for i = 1, #accept do s = accept[ i ] if type( s ) == "string" and s ~= "" then table.insert( codes, s:lower() ) end end -- for i end slang = User.favorize( codes, frame ) if slang then if feasible( slang, codes ) then r = slang elseif slang:find( "-", 1, true ) then slang = Multilingual.getBase( slang ) if feasible( slang, codes ) then r = slang end end if not r then local others = mw.language.getFallbacksFor( slang ) for i = 1, #others do slang = others[ i ] if feasible( slang, codes ) then r = slang break -- for i end end -- for i end end if not r then local back = favorites() for i = 1, #back do slang = back[ i ] if feasible( slang, codes ) then r = slang break -- for i end end -- for i if not r and codes[ 1 ] then r = codes[ 1 ] end end return r or favorites()[ 1 ] end -- Multilingual.userLang() Multilingual.userLangCode = function () -- Guess a user language code -- Postcondition: -- Returns code of current best guess return User.self or favorites()[ 1 ] end -- Multilingual.userLangCode() Multilingual.wikibase = function ( all, about, attempt, frame ) -- Optimal translation of wikibase component -- Precondition: -- all -- string or table, object ID or entity -- about -- boolean, true "descriptions" or false "labels" -- attempt -- string or not, code of preferred language -- frame -- frame, if available -- Postcondition: -- Returns -- 1. string, with selected message -- 2. string, with language code, or not local s = type( all ) local object, r, r2 if s == "table" then object = all elseif s == "string" then object = mw.wikibase.getEntity( all ) end if type( object ) == "table" then if about and about ~= "labels" then s = "descriptions" else s = "labels" end object = object[ s ] if type( object ) == "table" then if object[ attempt ] then r = object[ attempt ].value r2 = attempt else local poly for k, v in pairs( object ) do poly = poly or { } poly[ k ] = v.value end -- for k, v if poly then r, r2 = Multilingual.i18n( poly, nil, frame ) end end end end return r or "", r2 end -- Multilingual.wikibase() Failsafe.failsafe = function ( atleast ) -- Retrieve versioning and check for compliance -- Precondition: -- atleast -- string, with required version -- or wikidata|item|~|@ or false -- Postcondition: -- Returns string -- with queried version/item, also if problem -- false -- if appropriate -- 2020-08-17 local since = atleast local last = ( since == "~" ) local linked = ( since == "@" ) local link = ( since == "item" ) local r if last or link or linked or since == "wikidata" then local item = Failsafe.item since = false if type( item ) == "number" and item > 0 then local suited = string.format( "Q%d", item ) if link then r = suited else local entity = mw.wikibase.getEntity( suited ) if type( entity ) == "table" then local seek = Failsafe.serialProperty or "P348" local vsn = entity:formatPropertyValues( seek ) if type( vsn ) == "table" and type( vsn.value ) == "string" and vsn.value ~= "" then if last and vsn.value == Failsafe.serial then r = false elseif linked then if mw.title.getCurrentTitle().prefixedText == mw.wikibase.getSitelink( suited ) then r = false else r = suited end else r = vsn.value end end end end end end if type( r ) == "nil" then if not since or since <= Failsafe.serial then r = Failsafe.serial else r = false end end return r end -- Failsafe.failsafe() -- Export local p = { } p.fair = function ( frame ) -- Format language code -- 1 -- language code local s = mw.text.trim( frame.args[ 1 ] or "" ) return Multilingual.fair( s ) or "" end -- p.fair p.fallback = function ( frame ) -- Is another language suitable as replacement? -- 1 -- language version specifier to be supported -- 2 -- language specifier of a possible replacement local s1 = mw.text.trim( frame.args[ 1 ] or "" ) local s2 = mw.text.trim( frame.args[ 2 ] or "" ) local r = Multilingual.fallback( s1, s2 ) if type( r ) == "table" then r = r[ 1 ] else r = r and "1" or "" end return r end -- p.fallback p.findCode = function ( frame ) -- Retrieve language code from language name -- 1 -- name in current project language local s = mw.text.trim( frame.args[ 1 ] or "" ) return Multilingual.findCode( s ) or "" end -- p.findCode p.fix = function ( frame ) local r = frame.args[ 1 ] if r then r = Multilingual.fix( mw.text.trim( r ) ) end return r or "" end -- p.fix p.format = function ( frame ) -- Format one or more languages -- 1 -- language list or item -- slang -- language of the answer, if not native -- * -- native -- ! -- current project -- any valid code -- shift -- capitalize, if "c"; downcase, if "d" -- capitalize first item only, if "f" -- link -- 1 -- link items -- scream -- category title in case of error -- split -- split pattern, if list expected -- separator -- list separator, else split -- start -- prepend first element, if any local r local link if frame.args.link == "1" then link = true end r = Multilingual.format( frame.args[ 1 ], frame.args.slang, frame.args.shift, link, frame.args.scream, frame, frame.args.split, frame.args.separator, frame.args.start ) return r or "" end -- p.format p.getBase = function ( frame ) -- Retrieve base language from possibly combined ISO language code -- 1 -- code local s = mw.text.trim( frame.args[ 1 ] or "" ) return Multilingual.getBase( s ) or "" end -- p.getBase p.getName = function ( frame ) -- Retrieve language name from ISO language code -- 1 -- code -- 2 -- language to be used for the answer, if not native -- ! -- current project -- * -- native -- any valid code local s = mw.text.trim( frame.args[ 1 ] or "" ) local slang = frame.args[ 2 ] local r Multilingual.frame = frame if slang then slang = mw.text.trim( slang ) end r = Multilingual.getName( s, slang ) return r or "" end -- p.getName p.int = function ( frame ) -- Translated system message -- 1 -- message ID -- lang -- language code -- $1, $2, ... -- parameters local sysMsg = frame.args[ 1 ] local r if sysMsg then sysMsg = mw.text.trim( sysMsg ) if sysMsg ~= "" then local n = 0 local slang = frame.args.lang local i, params, s if slang == "" then slang = false end for k, v in pairs( frame.args ) do if type( k ) == "string" then s = k:match( "^%$(%d+)$" ) if s then i = tonumber( s ) if i > n then n = i end end end end -- for k, v if n > 0 then local s params = { } for i = 1, n do s = frame.args[ "$" .. tostring( i ) ] or "" table.insert( params, s ) end -- for i end r = Multilingual.int( sysMsg, slang, params ) end end return r or "" end -- p.int p.isLang = function ( frame ) -- Could this be an ISO language code? -- 1 -- code local s = mw.text.trim( frame.args[ 1 ] or "" ) local lucky, r = pcall( Multilingual.isLang, s ) return r and "1" or "" end -- p.isLang p.isLangWiki = function ( frame ) -- Could this be a Wiki language version? -- 1 -- code -- Returns non-empty, if possibly language version local s = mw.text.trim( frame.args[ 1 ] or "" ) local lucky, r = pcall( Multilingual.isLangWiki, s ) return r and "1" or "" end -- p.isLangWiki p.isRTL = function ( frame ) -- Check whether language is written right-to-left -- 1 -- string, with language code -- Returns non-empty, if right-to-left local s = mw.text.trim( frame.args[ 1 ] or "" ) return Multilingual.isRTL( s ) and "1" or "" end -- p.isRTL() p.message = function ( frame ) -- Translation of text element return Multilingual.message( fold( frame ), frame ) end -- p.message p.sitelink = function ( frame ) -- Make link at local or other site with optimal linktext translation -- 1 -- item ID local s = mw.text.trim( frame.args[ 1 ] or "" ) local r if s:match( "^%d+$") then r = tonumber( s ) elseif s:match( "^Q%d+$") then r = s end if r then r = Multilingual.sitelink( r, frame ) end return r or s end -- p.sitelink p.tabData = function ( frame ) -- Retrieve best message text from Commons Data -- 1 -- page identification on Commons -- 2 -- keyword -- alt -- fallback text local suite = frame.args[ 1 ] local seek = frame.args[ 2 ] local salt = frame.args.alt local r = Multilingual.tabData( suite, seek, salt, frame ) return r end -- p.tabData p.userLang = function ( frame ) -- Which language does the current user prefer? -- 1 -- space separated list of available ISO 639 codes local s = mw.text.trim( frame.args[ 1 ] or "" ) return Multilingual.userLang( s, frame ) end -- p.userLang p.wikibase = function ( frame ) -- Optimal translation of wikibase component -- 1 -- object ID -- 2 -- 1 for "descriptions", 0 for "labels". -- or either "descriptions" or "labels" local r local s = mw.text.trim( frame.args[ 1 ] or "" ) if s ~= "" then local s2 = mw.text.trim( frame.args[ 2 ] or "0" ) local slang = mw.text.trim( frame.args.lang or "" ) local large = ( s2 ~= "" and s2 ~= "0" ) if slang == "" then slang = false end r = Multilingual.wikibase( s, large, slang, frame ) end return r or "" end -- p.wikibase p.failsafe = function ( frame ) -- Versioning interface local s = type( frame ) local since if s == "table" then since = frame.args[ 1 ] elseif s == "string" then since = frame end if since then since = mw.text.trim( since ) if since == "" then since = false end end return Failsafe.failsafe( since ) or "" end -- p.failsafe() p.Multilingual = function () return Multilingual end -- p.Multilingual return p d1zm42sep4ytfi0dl3dok26gecqprzg Module:HS listed building row 828 51794 307145 2026-09-05T11:12:42Z Isma4l 41797 Bog cusub: require('strict') local genBuffer = require('Module:OutputBuffer') local getArgs = require('Module:Arguments').getArgs local delink = require('Module:Delink')._delink local coord -- lazily loaded local p = {} function p.row(frame) local getBuffer, print, printf = genBuffer() local args = getArgs(frame, {wrappers = 'Template:HS listed building row'}) local delinkedName = delink{args.name} printf('|- class="vcard %s;text-align:center"\n', args.image and 'with_image' or 'witho... 307145 Scribunto text/plain require('strict') local genBuffer = require('Module:OutputBuffer') local getArgs = require('Module:Arguments').getArgs local delink = require('Module:Delink')._delink local coord -- lazily loaded local p = {} function p.row(frame) local getBuffer, print, printf = genBuffer() local args = getArgs(frame, {wrappers = 'Template:HS listed building row'}) local delinkedName = delink{args.name} printf('|- class="vcard %s;text-align:center"\n', args.image and 'with_image' or 'without_image') printf('| class="fn org" | %s\n', args.name or '') printf('| class="label" | %s\n', args.location or '') printf('| %s\n', args.date_listed or '') local coordText if args.lat then if not coord then coord = require('Module:Coordinates')._coord end coordText = coord{args.lat, args.lon, format = 'dms', display = 'inline', name = delinkedName} else coordText = '' end printf('| %s\n', coordText) printf('| class="note" | %s\n', args.notes or '') if args.category then printf('| style="text-align:center" | %s\n', args.category or '') end printf('| class="uid" style="text-align:center" | [https://portal.historicenvironment.scot/designation/LB%s %s]\n', args.hb or args.hbnum or '', args.hb or args.hbnum or '') if args.image then printf( ' |[[File:%s|150x150px|%s]]<p class="plainlinks" style="margin: 0 auto;"><small>[https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&campaign=wlm-gb-sct&id=%s&descriptionlang=en&description=%s&lat=%s&lon=%s&categories=%s Upload another image]</small><br><small>%s</small></p>\n', args.image or '', args.name or '', mw.uri.encode(args.hb or args.hbnum or ''), mw.uri.encode(delinkedName), args.lat or '', args.lon or '', mw.uri.encode(args.commonscat or ''), args.commonscat and ('[[:commons:Category:' .. args.commonscat .. '|See more images]]') or '' ) else printf('| style="vertical-align:middle;text-align:center" | %s\n', frame:expandTemplate{title = 'Template:UploadCampaignLink', args = {campaign = 'wlm-gb-sct', id = args.hb, description = delinkedName, lat = args.lat, lon = args.lon}} ) end return getBuffer() end return p ok7avfbqc42ge7tiix8ell5e7vqvj1k Template:UploadCampaignLink 10 51795 307146 2026-09-05T11:14:44Z Isma4l 41797 /* */ 307146 wikitext text/x-wiki [[File:{{{image|Missing-monuments-image.svg}}}|{{{size|60}}}px|link=]]<br/>[https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&campaign={{{campaign|}}}&id={{urlencode:{{{id|}}}}}&id2={{urlencode:{{{id2|}}}}}&descriptionlang={{{descriptionlang|en}}}&description={{urlencode:{{{description|}}}}}&lat={{{lat|}}}&lon={{{lon|}}}&categories={{urlencode:{{{categories|}}}}} Soo geli sawirka]<noinclude>{{documentation}}</noinclude> fskb2g5805phjazcxqdhsmbx0vgpm40 Template:HS listed building row 10 51796 307147 2026-09-05T11:14:56Z Isma4l 41797 /* */ 307147 wikitext text/x-wiki {{#invoke:HS listed building row|row}}<noinclude>{{documentation}}</noinclude> hle9fm8dvth24zk3cno4m6qhv9yafs3 Module:FindYDCportal 828 51797 307150 2026-09-05T11:26:50Z Isma4l 41797 Bog cusub: --[[ For a given 3- or 4-digit year or decade, find the most specific portal which actually exists. Takes one parameter, which must be either a year (e.g. "1879", "1123") or a decade (e.g. "1940s", "790s"). If a portal is found, return its name without the namespace prefix (e.g. for "Portal:1980s" return "1980s"); otherwise return an empty string. If the parameter is missing, empty, or does not fit the required format, an empty string is returned" ]] loca... 307150 Scribunto text/plain --[[ For a given 3- or 4-digit year or decade, find the most specific portal which actually exists. Takes one parameter, which must be either a year (e.g. "1879", "1123") or a decade (e.g. "1940s", "790s"). If a portal is found, return its name without the namespace prefix (e.g. for "Portal:1980s" return "1980s"); otherwise return an empty string. If the parameter is missing, empty, or does not fit the required format, an empty string is returned" ]] local p = {} -- This table of existing decade portals is the first check of whether a portal -- exists for a given decade. -- If the decade is listed in this table, then a system call is made to verify its existence -- This approach has two advantages: -- 1/ It reduces server load by reducing the number of expensive system calls -- 2/ It avoids creating backlinks to non-existing portals, because a each .exists check -- generates a backlink local existingDecadePortals = { ["1920s"] = true, ["1950s"] = true, ["1960s"] = true, ["1970s"] = true, ["1980s"] = true, ["1990s"] = true, ["2000s"] = true, ["2010s"] = true, ["2020s"] = true } -- check for the existence of a portal with the given name -- if it exists, returns the name -- otherwise returns nil function doesPortalExist(portalName) local portalPage = mw.title.new( portalName, "Portal" ) if (portalPage.exists) then return portalName end return nil end -- check for the existence of a portal with the name of that year -- if it exists, returns the year -- otherwise calls decadeCheck, and returns that result -- otherwise returns nil function checkYear(yearParam) -- myDecade = the year, with the last digit stripped -- e.g. "1694" → "1690" -- Note that a decade is written as usually written "YYY0s" local myDecade = mw.ustring.gsub(yearParam, "%d$", "") return checkDecade(myDecade) end -- check for the existence of a portal with the name of that decade -- if it exists, returns the year -- otherwise calls decadeCheck, and returns that result -- otherwise returns nil function checkDecade(decadeParam) local mydecade = decadeParam .. "0s" if (existingDecadePortals[mydecade] == true) then if doesPortalExist(mydecade) then return mydecade end end end -- check for the existence of a portal with the name of that century -- if it exists, returns the century -- otherwise returns an empty string function checkCentury(centuryParam) local myCenturyString = ordinal_numbers(centuryParam) .. " century" if doesPortalExist(myCenturyString) then return myCenturyString end return "" end -- converts a string number to an string ordinal -- e.g. 21 → 21st -- 17 → 17th -- code copied from https://stackoverflow.com/questions/20694133/how-to-to-add-th-or-rd-to-the-date (original license:CC BY-SA 3.0) function ordinal_numbers(n) local ordinal, digit = {"st", "nd", "rd"}, string.sub(n, -1) if tonumber(digit) > 0 and tonumber(digit) <= 3 and string.sub(n,-2) ~= 11 and string.sub(n,-2) ~= 12 and string.sub(n,-2) ~= 13 then return n .. ordinal[tonumber(digit)] else return n .. "th" end end function trim(s) return s:match "^%s*(.-)%s*$" end function p.findydcportal(frame) -- Expects one parameter -- {{{1}}} = a 3- or 4-digit year or deacde -- e.g. 1916 -- 1504 -- 1630s -- 920s local arg1 = frame.args[1] if arg1 == nil then return "" end arg1 = trim(arg1) -- strip leading and trailing spaces if (mw.ustring.match(arg1, "^%d%d%d%d?$")) then -- it's a 3- or 4-digit-year return checkYear(arg1) elseif (mw.ustring.match(arg1, "^%d%d%d?0s$")) then -- it's a 3- or 4-digit decade -- so strip the trailing "0s" local decadeArg = mw.ustring.gsub(arg1, "0s$", "") return checkDecade(decadeArg) end -- If we get here, then arg1 was neither a year nor a decade -- This is going to be a helper template, and diagnostics woud be intrusive -- So just return an empty string return "" end return p misf3rgcyrg2r60h8mwlx34vmxwlhk3 Module:Check for conflicting parameters 828 51798 307152 2026-09-05T11:36:40Z Isma4l 41797 Bog loo bedeley [[Module:Check for clobbered parameters]] 307152 Scribunto text/plain return require [[Module:Check for clobbered parameters]] sy1hatzjag9o7ons95ycx1v6szgsli0