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(' ')
: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 .. '¶ms='
--[[ 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"> / </span>'
.. '<span class="' .. displayDefault(coordinateSpec["default"], "dec" ) .. '">';
if not args["name"] then
inner = inner .. geodechtml
.. '<span style="display:none"> / ' .. geonumhtml .. '</span></span>'
else
inner = inner .. '<span class="vcard">' .. geodechtml
.. '<span style="display:none"> / ' .. geonumhtml .. '</span>'
.. '<span style="display:none"> (<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"> (<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],
'(¶ms=[^&"<>%[%] ]*) ',
'%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">⁠{{#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><!--
-->⁠</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 | Rebel|date=January 8, 2024|website=Rebelgroup}}</ref> Delta Marine Consultants,<ref>{{Cite web|url=https://www.dmc.nl/|title=DMC ||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. 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–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–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 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 490 ha), [[Nierstein]] (783 ha), [[Alzey]] (769 ha), [[Westhofen]] (764 ha) iyo [[Alsheim]] (704 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–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–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. 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–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–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–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–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–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–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–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 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–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–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–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–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 km koonfur-galbeed ee magaalada [[Bitburg]] iyo 5 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–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 km koonfur-galbeed ee magaalada [[Bitburg]] iyo 5 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–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–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–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–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 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–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–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–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–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–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–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–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–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–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 | %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 = "☐",
},
[true] = {
css = boole,
lead = true,
show = "☑",
},
}
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>", "²"):gsub("<sup>3</sup>", "³")
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("­", 1, true) then
r = r:gsub("­", "")
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(" " .. 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", "\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", "\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 – 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