ویکیپدیا
mznwiki
https://mzn.wikipedia.org/wiki/%DA%AF%D8%AA_%D8%B5%D9%81%D8%AD%D9%87
MediaWiki 1.48.0-wmf.3
first-letter
مدیا
شا
گپ
کارور
کارور گپ
ویکیپدیا
ویکیپدیا گپ
پرونده
پرونده گپ
مدیاویکی
مدیاویکی گپ
شابلون
شابلون گپ
رانما
رانما گپ
رج
رج گپ
پورتال
پورتال گپ
پروژه
پروژه گپ
TimedText
TimedText talk
ماژول
ماژول گپ
Event
Event talk
زمر
0
2456
416916
221724
2026-11-08T21:59:12Z
Atcovi
8467
mujawwad --> murattal
416916
wikitext
text/x-wiki
[[پرونده:Chapter 39, Az-Zumar (Murattal) - Recitation of the Holy Qur'an.mp3|بندانگشتی|زمر]]
اینتا سوره ۷۵ تا آیه داینه .
== وابسته جستارون ==
* [[قرآن]]
* [[قرآن ِسوره ئون]]
== دییه لینکون ==
* [https://web.archive.org/web/20060613072353/http://quran.al-shia.com/ قرآن کریم ره تخصصی پایگاه]
{{قرآن ِسوره ئون}}
[[رج:قرآن]]
10at7dqrxzvaq1hbrp7va5nf5f4dz4h
این میلار
0
23742
416904
120135
2026-11-08T21:25:57Z
محک
1023
416904
wikitext
text/x-wiki
{{صندخ/شخص}}
'''این میلار''' {{انگلیسی جه|Ian Millar}} (بزائه ۱۹۴۷) اتا [[ورزش]]کار هسته که تا الآن ۱۰بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[کانادا]] وسّه، [[اسبسواری]] رشته دله، بازی کانده و سالئون ۱۹۷۲ تا ۱۹۷۶ و ۱۹۸۴ تا ۲۰۱۲ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۵ و ۶۵ بییه.
== منابع ==
{{تلمبار-رج|Ian Millar}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:کانادا ورزشکارون|این میلار]]
[[رج:اسبسواری ورزشکارون|این میلار]]
[[رج:المپیک مدال بیتهئون]]
t5axmn6w5sxzq21ex789jnt04zry7v9
هیوبرت راوداسچل
0
23743
416914
117410
2026-11-08T21:32:19Z
محک
1023
416914
wikitext
text/x-wiki
{{صندخ/شخص}}
'''هیوبرت راوداسچل''' {{انگلیسی جه|Hubert Raudaschl}} (بزائه ۱۹۴۲) اتا [[ورزش]]کار هسته که تا الآن ۹بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[اتریش]] وسّه، [[کشتیرانی]] رشته دله، بازی کانده و سالئون ۱۹۶۴ تا ۱۹۹۶ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۲ تا ۵۴ بییه. وه هنتا هم بازی کانده. هیوبرت راوداسچل بتونسته دِتا نقره المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Hubert Raudaschl}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:اتریش ورزشکارون|هیوبرت راوداسچل]]
[[رج:کشتیرانی ورزشکارون|هیوبرت راوداسچل]]
[[رج:المپیک مدال بیتهئون]]
7es4p940pk79ydmv5inuldletd737ex
افاناسییس کوزمینس
0
23744
416902
117411
2026-11-08T21:24:58Z
محک
1023
416902
wikitext
text/x-wiki
{{صندخ/شخص}}
'''افاناسییس کوزمینس''' {{انگلیسی جه|Afanasijs Kuzmins}} (بزائه ۱۹۴۷) اتا [[ورزش]]کار هسته که تا الآن ۹بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[لتونی]] وسّه، [[تیراندازی]] رشته دله، بازی کانده و سالئون ۱۹۷۶ تا ۱۹۸۰ و ۱۹۸۸ تا ۲۰۱۲ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۹ تا ۶۵ بییه. وه هنتا هم بازی کانده. افاناسییس کوزمینس بتونسته اتا طلا و اتا برنز المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Afanasijs Kuzmins}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:لتونی ورزشکارون|افاناسییس کوزمینس]]
[[رج:تیراندازی ورزشکارون|افاناسییس کوزمینس]]
[[رج:المپیک مدال بیتهئون]]
f8n9h3pm3yejdhdya29anaz4znj0082
پییرو دلا فرنچسکا د ینزو
0
23745
416900
117413
2026-11-08T21:23:50Z
محک
1023
416900
wikitext
text/x-wiki
{{صندخ/شخص}}
'''پییرو دلا فرنچسکا د ینزو''' {{انگلیسی جه|Piero d'Inzeo}} (بزائه ۱۹۲۳) اتا [[ورزش]]کار هسته که تا الآن ۸بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[ایتالیا]] وسّه، [[اسبسواری]] رشته دله، بازی کانده و سالئون ۱۹۴۸ تا ۱۹۷۶ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۵ تا ۵۳ بییه. وه اسا دیگه بازی نکانده. پییرو دلا فرنچسکا د ینزو بتونسته دِتا نقره و چارتا برنز المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Piero d'Inzeo}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:ایتالیا ورزشکارون|پییرو دلا فرنچسکا د ینزو]]
[[رج:اسبسواری ورزشکارون|پییرو دلا فرنچسکا د ینزو]]
[[رج:المپیک مدال بیتهئون]]
fk2rynrjy5p82gcekx9htfkthg4vpky
رایمندو د ینزو
0
23746
416899
117415
2026-11-08T21:23:26Z
محک
1023
416899
wikitext
text/x-wiki
{{صندخ/شخص}}
'''رایمندو د ینزو''' {{انگلیسی جه|Raimondo d'Inzeo}} (بزائه ۱۹۲۵) اتا [[ورزش]]کار هسته که تا الآن ۸بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[ایتالیا]] وسّه، [[اسبسواری]] رشته دله، بازی کانده و سالئون ۱۹۴۸ تا ۱۹۷۶ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۳ تا ۵۱ بییه. وه اسا دیگه بازی نکانده. رایمندو د ینزو بتونسته اتا طلا، دِتا نقره و سهتا برنز المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Raimondo d'Inzeo}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:ایتالیا ورزشکارون|رایمندو د ینزو]]
[[رج:اسبسواری ورزشکارون|رایمندو د ینزو]]
[[رج:المپیک مدال بیتهئون]]
iewwr6l9hwi94ax1rkxey3p24shqzrd
پل الوستروم
0
23748
416908
117419
2026-11-08T21:27:53Z
محک
1023
416908
wikitext
text/x-wiki
{{صندخ/شخص}}
'''پل الوستروم''' {{انگلیسی جه|Paul Elvstrøm}} (بزائه ۱۹۲۸) اتا [[ورزش]]کار هسته که تا الآن ۸بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[دانمارک]] وسّه، [[قایقرانی]] رشته دله، بازی کانده و سالئون ۱۹۴۸ تا ۱۹۶۰، ۱۹۶۸ تا ۱۹۷۲ و ۱۹۸۴ تا ۱۹۸۸ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۰ تا ۶۰ بییه. وه اسا دیگه بازی نکانده. پل الوستروم بتونسته چارتا طلا المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Paul Elvstrøm}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:دانمارک ورزشکارون|پل الوستروم]]
[[رج:قایقرانی ورزشکارون|پل الوستروم]]
[[رج:المپیک مدال بیتهئون]]
eudr3d4qhutjugyrkzjz9i60r5lb2xp
رایمند دبوک
0
23749
416911
117420
2026-11-08T21:30:44Z
محک
1023
416911
wikitext
text/x-wiki
{{صندخ/شخص}}
'''رایمند دبوک''' {{انگلیسی جه|Rajmond Debevec}} (بزائه ۱۹۶۳) اتا [[ورزش]]کار هسته که تا الآن ۸بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[اسلوونی]] وسّه، [[تیراندازی]] رشته دله، بازی کانده و سالئون ۱۹۸۴ و ۲۰۱۲ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۱ تا ۴۹ بییه. وه هنتا هم بازی کانده. رایمند دبوک بتونسته اتا طلا و دِتا برنز المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Rajmond Debevec}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:اسلوونی ورزشکارون|رایمند دبوک]]
[[رج:تیراندازی ورزشکارون|رایمند دبوک]]
[[رج:المپیک مدال بیتهئون]]
3hhvvg1wfx2788kus8p0usy3sycdj1k
یسفا آیدم گورینی
0
23750
416901
117422
2026-11-08T21:24:18Z
محک
1023
416901
wikitext
text/x-wiki
{{صندخ/شخص}}
'''یسفا آیدم گورینی''' {{انگلیسی جه|Josefa Idem Guerrini}} (بزائه ۱۹۶۴) اتا [[ورزش]]کار هسته که تا الآن ۸بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[ایتالیا]] وسّه، [[قایقرانی]] رشته دله، بازی کانده و سالئون ۱۹۸۴ و ۲۰۱۲ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۰ تا ۴۸ بییه. وه هنتا هم بازی کانده. یسفا آیدم گورینی بتونسته اتا طلا، دِتا نقره و دِتا برنز المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Josefa Idem Guerrini}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:ایتالیا ورزشکارون|یسفا آیدم گورینی]]
[[رج:قایقرانی ورزشکارون|یسفا آیدم گورینی]]
[[رج:المپیک مدال بیتهئون]]
px3ovedz0er5j48lq1yenixz97f0rm8
ایوان سییر
0
23751
416907
117423
2026-11-08T21:27:33Z
محک
1023
416907
wikitext
text/x-wiki
{{صندخ/شخص}}
'''ایوان سییر''' {{انگلیسی جه|Ivan Osiier}} (بزائه ۱۸۸۸- بمرده ۱۹۶۵) اتا [[ورزش]]کار هسته که تا الآن ۷بار [[المپیک]] دله شرکت هاکرده. وه ویشته کشور [[دانمارک]] وسّه، [[شمشیربازی]] رشته دله، بازی کانده و سالئون ۱۹۰۸، ۱۹۳۲ و ۱۹۴۸ مسابقات دله دَیییه، که این گادِر ونه سن بین ۲۰ تا ۶۰ بییه. وه اسا دیگه بازی نکانده. ایوان سییر بتونسته اتا نقره المپیک مسابقات دله، تا الآن، بَییره.
== منابع ==
{{تلمبار-رج|Ivan Osiier}}
* [[:en:List of athletes with the most appearances at Olympic Games|انگلیسی ویکیپدیا]]
{{پهنویس}}
[[رج:دانمارک ورزشکارون|ایوان سییر]]
[[رج:شمشیربازی ورزشکارون|ایوان سییر]]
[[رج:المپیک مدال بیتهئون]]
jjnxkabawsoftf5yd0xk9s3dfokf1r9
رئال مادرید
0
28223
416896
278621
2026-11-08T18:08:23Z
حیار دراگون
47514
/* */
416896
wikitext
text/x-wiki
{{جعبه اطلاعات تیم فوتبال
| تصویر = [[پرونده:Logo Real Madrid.png|160px]]
| توضیحات =
| نام کامل باشگاه = Real Madrid Club de Fútbol<ref>{{یادکرد وب| نشانی = http://www.lfp.es/Default.aspx?tabid=78&IDParam=15| عنوان = Real Madrid C.F.| تاریخ بازدید = ۲۲ فوریه ۲۰۰۹| ناشر = lpf.es| زبان = اسپانیایی| پیوند بایگانی = http://www.webcitation.org/67YePQeyn | تاریخ بایگانی = ۱۰ مه ۲۰۱۲}}</ref>
| لقب (ها) = اسپهئون {{سخ}}خامهایها {{سخ}} اسپه قوئون {{سخ}}کهکشانیها {{سخ}}کرکسها {{سخ}}وایکینگها {{سخ}}اشباح
| شعار =!Hala Madrid¡
| نام غیر رسمی = رئال (Real)
| تاریخ تأسیس = {{تولد و سن|۱۹۰۲|۳|۶}}<ref name="Real Madrid turns 106 (I)">
{{یادکرد وب
| نشانی =http://www.realmadrid.com/cs/Satellite/en/1202730681095/noticia/Noticia/Real_Madrid_turns_106_(I).htm
| عنوان = Pre-history and first official عنوان (1900–1910)
| تاریخ بازدید = ۱۲ ژوئیه ۲۰۰۸
| نویسنده = Luís Miguel González
| پیوند بایگانی = http://www.webcitation.org/67YeRWW0j | تاریخ بایگانی = ۱۰ مه ۲۰۱۲}}</ref>
| تاریخ انحلال =
| نام ورزشگاه = [[سانتیاگو برنابئو]]
| گنجایش = ۸۵٫۳۵۴
| مالک =
| مدیرعامل = {{flagicon|ESP}} [[فلورنتینو پرز]]
| سرمربی = {{flagicon|FRA}} [[زین الدین زیدان]]
| لیگ = [[لالیگا]]
| فصل = ۲۰۱۹-۲۰۲۰
|الگوی دست چپ۱ = _realmadridcf2324h
|الگوی بدن۱ = _realmadridcf2324h
|الگوی دست راست۱ = _realmadridcf2324h
|الگوی شلوارک۱ = _realmadridcf2324h
|الگوی جوراب۱ = _realmadridcf2324hl
|دست چپ۱ = FFFFFF
|بدن۱ = FFFFFF
|دست راست۱ = FFFFFF
|شلوارک۱ = FFFFFF
|جوراب۱ = FFFFFF
|الگوی دست چپ۲ = _realmadridcf2324a
|الگوی بدن۲ = _realmadridcf2324a
|الگوی دست راست۲ = _realmadridcf2324a
|الگوی شلوارک۲ =_realmadridcf2324a
|الگوی جوراب۲ =_realmadridcf2324al
|دست چپ۲ = 021748
|بدن۲ = 021748
|دست راست۲ = 021748
|شلوارک۲ = 021748
|جوراب۲ = 021748
|الگوی دست چپ۳ = _realmadridcf2324t
|الگوی بدن۳ = _realmadridcf2324t
|الگوی دست راست۳ = _realmadridcf2324t
|الگوی شلوارک۳ = _realmadridcf2324t
|الگوی جوراب۳ = _realmadridcf2324tl
|دست چپ۳ = 00CC99
|بدن۳ = 00CC99
|دست راست۳ = 00CC99
|شلوارک۳ = 00AA80
|جوراب۳ = 00CC99
|نخستین بازی =رئال مادرید۱-۳بارسلونا
| پرگلترین برد =۴۸-۰مقابل بارسلونا
| بدترین باخت =۹-۱مقابل بایرن مونیخ
| بهترین گلزن تاریخ = کریستیانو رونالدو
| گروه هوادارها = مادریدیستا
| افتخارات =۱۵چمپیونزلیگ ۳۶ لالیگا ۶سوپر کاپ و غیره
|آدرس اینترنتی = [http://www.realmadrid.com www.realmadrid.com]
| فصل جاری =۲۰۲۶-۲۷
}}
'''رئال مادرید فوتوال تیم''' (ایسپانیولی جه: '''''Real Madrid Club de Fútbol''''') اتا [[ایسپانیا]]یی [[فوتوال]] تیم هسته که [[مادرید]] شهر ِشِنِه. رئال [[لالیگا|ایسپانیا]] و [[اروپا]]ی موفقترین تیم [[قرن ۲۰]] هسته. وشون رکورد ۳۲ بار قهرمونی [[لالیگا]]، ۱۹ قهرمونی [[کوپا دل ری]] (حذفی کاپ)، ۹ [[ایسپانیا سوپرکاپ]]، ۱۵ بار قهرمونی [[اروپا چمپیونزلیگ]]، ۲ [[یوفا کاپ]]، ۱ [[اروپا سوپرکاپ]] و ۳ قهرمونی [[جهون باشگاهئون جام]] دله ره دارنه. ''رئال'' ِکلمه [[ایسپانیولی زوون]] دله، «سلطنتی» معنی دِنه، این لقب ره [[آلفونسو سیزهم]] سال ۱۹۲۰ این تیم سر بِشته. همون سال، اتا تاج شکل هم وشون آرم سر قرار بییته. ''Real Madrid Club de Fútbol'' عبارتی هسته که ایسپانیولی جه ''مادرید پادشائی فوتوال تیم'' معنی ره دِنه.
== منابع ==
{{پانویس}}
{{لالیگا}}
[[رج:ایسپانیا فوتوال تیمون]]
[[رج:رئال مادرید| ]]
gddztlulkwebtphu4udts3w8x9hhmka
416897
416896
2026-11-08T18:38:44Z
محک
1023
اونچی که [[Special:Contributions/حیار دراگون|حیار دراگون]] ([[User talk:حیار دراگون|گپ]]) دچی بییه، دگارسته بیه همونتایی که [[User:HenryThe|HenryThe]] این ولگه دله، اواخر بنویشت بییه.
278621
wikitext
text/x-wiki
{{جعبه اطلاعات تیم فوتبال
| تصویر = [[پرونده:Logo Real Madrid.png|160px]]
| توضیحات =
| نام کامل باشگاه = Real Madrid Club de Fútbol<ref>{{یادکرد وب| نشانی = http://www.lfp.es/Default.aspx?tabid=78&IDParam=15| عنوان = Real Madrid C.F.| تاریخ بازدید = ۲۲ فوریه ۲۰۰۹| ناشر = lpf.es| زبان = اسپانیایی| پیوند بایگانی = http://www.webcitation.org/67YePQeyn | تاریخ بایگانی = ۱۰ مه ۲۰۱۲}}</ref>
| لقب (ها) = اسپهئون {{سخ}}خامهایها {{سخ}} اسپه قوئون {{سخ}}کهکشانیها {{سخ}}کرکسها {{سخ}}وایکینگها {{سخ}}اشباح
| شعار =!Hala Madrid¡
| نام غیر رسمی = رئال (Real)
| تاریخ تأسیس = {{تولد و سن|۱۹۰۲|۳|۶}}<ref name="Real Madrid turns 106 (I)">
{{یادکرد وب
| نشانی =http://www.realmadrid.com/cs/Satellite/en/1202730681095/noticia/Noticia/Real_Madrid_turns_106_(I).htm
| عنوان = Pre-history and first official عنوان (1900–1910)
| تاریخ بازدید = ۱۲ ژوئیه ۲۰۰۸
| نویسنده = Luís Miguel González
| پیوند بایگانی = http://www.webcitation.org/67YeRWW0j | تاریخ بایگانی = ۱۰ مه ۲۰۱۲}}</ref>
| تاریخ انحلال =
| نام ورزشگاه = [[سانتیاگو برنابئو]]
| گنجایش = ۸۵٫۳۵۴
| مالک =
| مدیرعامل = {{flagicon|ESP}} [[فلورنتینو پرز]]
| سرمربی = {{flagicon|FRA}} [[زین الدین زیدان]]
| لیگ = [[لالیگا]]
| فصل = ۲۰۱۹-۲۰۲۰
|الگوی دست چپ۱ = _realmadridcf2324h
|الگوی بدن۱ = _realmadridcf2324h
|الگوی دست راست۱ = _realmadridcf2324h
|الگوی شلوارک۱ = _realmadridcf2324h
|الگوی جوراب۱ = _realmadridcf2324hl
|دست چپ۱ = FFFFFF
|بدن۱ = FFFFFF
|دست راست۱ = FFFFFF
|شلوارک۱ = FFFFFF
|جوراب۱ = FFFFFF
|الگوی دست چپ۲ = _realmadridcf2324a
|الگوی بدن۲ = _realmadridcf2324a
|الگوی دست راست۲ = _realmadridcf2324a
|الگوی شلوارک۲ =_realmadridcf2324a
|الگوی جوراب۲ =_realmadridcf2324al
|دست چپ۲ = 021748
|بدن۲ = 021748
|دست راست۲ = 021748
|شلوارک۲ = 021748
|جوراب۲ = 021748
|الگوی دست چپ۳ = _realmadridcf2324t
|الگوی بدن۳ = _realmadridcf2324t
|الگوی دست راست۳ = _realmadridcf2324t
|الگوی شلوارک۳ = _realmadridcf2324t
|الگوی جوراب۳ = _realmadridcf2324tl
|دست چپ۳ = 00CC99
|بدن۳ = 00CC99
|دست راست۳ = 00CC99
|شلوارک۳ = 00AA80
|جوراب۳ = 00CC99
|نخستین بازی =
| پرگلترین برد =۱۱-۱ در برابر بارسلونا
| بدترین باخت =
| بهترین گلزن تاریخ = کریستیانو رونالدو
| گروه هوادارها = مادریدیستا
| افتخارات =
|آدرس اینترنتی = [http://www.realmadrid.com www.realmadrid.com]
| فصل جاری =
}}
'''رئال مادرید فوتوال تیم''' (ایسپانیولی جه: '''''Real Madrid Club de Fútbol''''') اتا [[ایسپانیا]]یی [[فوتوال]] تیم هسته که [[مادرید]] شهر ِشِنِه. رئال [[لالیگا|ایسپانیا]] و [[اروپا]]ی موفقترین تیم [[قرن ۲۰]] هسته. وشون رکورد ۳۲ بار قهرمونی [[لالیگا]]، ۱۹ قهرمونی [[کوپا دل ری]] (حذفی کاپ)، ۹ [[ایسپانیا سوپرکاپ]]، ۱۵ بار قهرمونی [[اروپا چمپیونزلیگ]]، ۲ [[یوفا کاپ]]، ۱ [[اروپا سوپرکاپ]] و ۳ قهرمونی [[جهون باشگاهئون جام]] دله ره دارنه. ''رئال'' ِکلمه [[ایسپانیولی زوون]] دله، «سلطنتی» معنی دِنه، این لقب ره [[آلفونسو سیزهم]] سال ۱۹۲۰ این تیم سر بِشته. همون سال، اتا تاج شکل هم وشون آرم سر قرار بییته. ''Real Madrid Club de Fútbol'' عبارتی هسته که ایسپانیولی جه ''مادرید پادشائی فوتوال تیم'' معنی ره دِنه.
== منابع ==
{{پانویس}}
{{لالیگا}}
[[رج:ایسپانیا فوتوال تیمون]]
[[رج:رئال مادرید| ]]
6uc2rj2qqa7iceiglf853mm11phej8q
ماژول:Params
828
112844
416898
416732
2026-11-08T21:10:27Z
Grufo
45757
Update from [[d:Special:GoToLinkedPage/mediawikiwiki/Q122696746|master]] using [[mw:Synchronizer| #Synchronizer]]
416898
Scribunto
text/plain
require[[strict]]
--- ---
--- PRIVATE ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Abstract utilities ]]--
----------------------------
-- Helper function for `string.gsub()` (for managing zero-padded numbers)
local function zero_padded (str)
return ('%03d%s'):format(#str, str)
end
-- Helper function for `table.sort()` (for natural sorting)
local function natural_sort (var1, var2)
return var1:gsub('%d+', zero_padded) < var2:gsub('%d+', zero_padded)
end
-- Return a copy or a reference to a table
local function copy_or_ref_table (src, refonly)
if refonly then return src end
local newtab = {}
for key, val in pairs(src) do newtab[key] = val end
return newtab
end
-- Copy at most N items (of all kinds) from `src` to `dest` and return `dest`
local function copy_table_maxn (dest, src, len)
local idx = 1
for key, val in pairs(src) do
dest[key], idx = val, idx + 1
if idx > len then break end
end
return dest
end
-- Remove some numeric elements from a table, shifting everything to the left
local function remove_numeric_keys (tbl, idx, len)
local cache, tmp = {}, idx + len - 1
for key, val in pairs(tbl) do
if type(key) == 'number' and key >= idx then
if key > tmp then cache[key - len] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
-- Make a reduced copy of a table (shifting in both directions if necessary)
local function copy_table_reduced (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
elseif key > tmp then ret[key - len] = val end
end
elseif tmp > 0 then
local nshift = 1 - idx
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > tmp then ret[key - tmp] = val
elseif key < idx then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
elseif key < idx then ret[key + len] = val end
end
end
return ret
end
-- Make an expanded copy of a table (shifting in both directions if necessary)
local function copy_table_expanded (tbl, idx, len)
local ret, tmp = {}, idx + len - 1
if idx > 0 then
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key < idx then
ret[key] = val
else ret[key + len] = val end
end
elseif tmp > 0 then
local nshift = idx - 1
for key, val in pairs(tbl) do
if type(key) ~= 'number' then ret[key] = val
elseif key > 0 then ret[key + tmp] = val
elseif key < 1 then ret[key + nshift] = val end
end
else
for key, val in pairs(tbl) do
if type(key) ~= 'number' or key > tmp then
ret[key] = val
else ret[key - len] = val end
end
end
return ret
end
-- Given a table, create two new tables containing the sorted list of keys
local function get_sorted_key_list (tbl, sort_fn)
local nums, words, nn, nw = {}, {}, 1, 1
for key, val in pairs(tbl) do
if type(key) == 'number' then nums[nn], nn = key, nn + 1
else words[nw], nw = key, nw + 1 end
end
table.sort(nums)
table.sort(words, sort_fn)
return nums, words, nn - 1, nw - 1
end
-- Parse a parameter name string and return it as a string or a number
local function get_param_name (par_str)
local ret = par_str:match'^%s*(.-)%s*$'
if ret ~= '0' and ret:find'^%-?[1-9]%d*$' == nil then return ret end
return tonumber(ret)
end
-- Move a key from a table to another, but only if under a different name and
-- always parsing numeric strings as numbers
local function steal_if_renamed (val, src, skey, dest, dkey)
local realkey = get_param_name(dkey)
if skey ~= realkey then dest[realkey], src[skey] = val, nil end
end
--[[ Public strings ]]--
------------------------
-- Special match keywords (functions and modifiers MUST avoid these names)
local mkeywords = {
['or'] = 0,
pattern = 1,
plain = 2,
strict = 3
}
-- Sort functions (functions and modifiers MUST avoid these names)
local sortfunctions = {
alphabetically = false,
naturally = natural_sort
}
-- Callback styles for the `mapping_*` and `renaming_*` class of modifiers
-- (functions and modifiers MUST avoid these names)
--[[
Meanings of the columns:
col[1] = Loop type (0-3)
col[2] = Number of module arguments that the style requires (1-3)
col[3] = Minimum number of sequential parameters passed to the callback
col[4] = Name of the callback parameter where to place each parameter name
col[5] = Name of the callback parameter where to place each parameter value
col[6] = Argument in the modifier's invocation that will override `col[4]`
col[7] = Argument in the modifier's invocation that will override `col[5]`
A value of `-1` indicates that no meaningful value is stored (i.e. `nil`)
]]--
local mapping_styles = {
names_and_values = { 3, 2, 2, 1, 2, -1, -1 },
values_and_names = { 3, 2, 2, 2, 1, -1, -1 },
values_only = { 1, 2, 1, -1, 1, -1, -1 },
names_only = { 2, 2, 1, 1, -1, -1, -1 },
names_and_values_as = { 3, 4, 0, -1, -1, 2, 3 },
names_only_as = { 2, 3, 0, -1, -1, 2, -1 },
values_only_as = { 1, 3, 0, -1, -1, -1, 2 },
blindly = { 0, 2, 0, -1, -1, -1, -1 }
}
-- Memory slots (functions and modifiers MUST avoid these names)
local memoryslots = {
h = 'header',
f = 'footer',
i = 'itersep',
l = 'lastsep',
n = 'ifngiven',
p = 'pairsep',
s = 'oxfordsep'
}
-- Possible trimming modes for the `parsing` modifier
local trim_parse_opts = {
trim_none = { false, false },
trim_positional = { false, true },
trim_named = { true, false },
trim_all = { true, true }
}
-- Possible string modes for the iteration separator in the `parsing` and
-- `reinterpreting` modifiers
local isep_parse_opts = {
splitter_pattern = false,
splitter_string = true
}
-- Possible string modes for the key-value separator in the `parsing` and
-- `reinterpreting` modifiers
local psep_parse_opts = {
setter_pattern = false,
setter_string = true
}
-- Possible position references for the `splicing` modifier
local position_references = {
add_nothing = 0,
add_smallest_number = 1,
add_last_of_sequence = 2,
add_largest_number = 3
}
-- Possible modes for the `reassigning` modifier
local a_modes = {
transfer = 0,
clone = 1,
rename = 2,
copy = 3,
sacrifice = 4,
provide = 5,
spare = 7
}
-- Functions and modifiers MUST avoid these names too: `here`, `in_substack`,
-- `let`, `expose`, `use`, `with_flushed_glue`, `without_flushed_glue`
-- `without_sorting`
--[[ Private constants ]]--
---------------------------
-- Hard-coded name of the module (to avoid going through `frame:getTitle()`)
local modulename = 'Module:Params'
-- The functions listed here declare that they don't need the
-- `frame:getParent().args` metatable to be copied into a regular table; if
-- they are modifiers they also guarantee that they will make their own
-- (modified) copy available
local refparams = {
call_for_each_group = true,
combining = true,
combining_by_calling = true,
combining_values = true,
concat_and_call = true,
concat_and_invoke = true,
concat_and_magic = true,
count = true,
grouping_by_calling = true,
mixing_names_and_values = true,
keeping_at_most = true,
renaming_by_mixing = true,
renaming_to_sequence = true,
renaming_to_uppercase = true,
renaming_to_lowercase = true,
shifting = true,
splicing = true,
value_of = true,
with_name_matching = true
}
-- Maximum number of numeric parameters that can be filled, if missing (we
-- chose an arbitrary number for this constant; you can discuss about its
-- optimal value at Module talk:Params)
local maxfill = 1024
-- The private table of functions
local library = {}
-- Functions and modifiers that can only be invoked in first position
local static_iface = {}
--[[ Private functions ]]--
---------------------------
-- Create a new context
local function context_new (child_frame, first_fn_name)
local main_frame, tpipe = child_frame:getParent(), { first_fn_name }
for key, val in pairs(child_frame.args) do
if type(key) == 'number' and key > 0 then tpipe[key + 1] = val
else tpipe[key] = val end
end
return {
frame = main_frame,
pipe = tpipe,
oparams = main_frame.args,
firstposonly = static_iface,
iterfunc = pairs,
fnpos = 1,
sorttype = 0,
n_parents = 0,
n_children = 0,
n_available = maxfill
}
end
-- Move to the next action within the user-given list
local function context_iterate (ctx, next_fn_pos, trimmed_fname)
local fname = trimmed_fname or ctx.pipe[next_fn_pos] and
ctx.pipe[next_fn_pos]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
': You must specify a function to call', 0) end
if library[fname] == nil then
if ctx.firstposonly[fname] == nil then error(modulename ..
': The function ‘' .. fname .. '’ does not exist', 0)
else error(modulename .. ': The ‘' .. fname ..
'’ directive can only appear in first position', 0)
end
end
ctx.fnpos = next_fn_pos
return library[fname]
end
-- Main loop
local function main_loop (ctx, start_with)
local fn = start_with
repeat fn = fn(ctx) until not fn
if ctx.n_parents > 0 then error(modulename ..
': One or more ‘merging_substack’ directives are missing', 0) end
if ctx.n_children > 0 then error(modulename ..
', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end
end
-- Load a `setting`-like directive string into the `dest` table
local function set_strings_from_opts (dest, opts, offs)
local cmd
if opts[offs] == nil then return offs - 1 end
cmd = opts[offs]:gsub('%s+', ''):gsub('/+', '/'):match'^/*(.*[^/])'
if cmd == nil then return offs end
local vname, chr
local amap, sep, argc = {}, string.byte('/'), offs + 1
for idx = 1, #cmd do
chr = cmd:byte(idx)
if chr == sep then
for key, val in ipairs(amap) do
dest[val], amap[key] = opts[argc], nil
end
argc = argc + 1
else
vname = memoryslots[string.char(chr)]
if vname == nil then error(modulename ..
', ‘setting’: Unknown slot ‘' .. string.char(chr) .. '’', 0) end
table.insert(amap, vname)
end
end
for key, val in ipairs(amap) do dest[val] = opts[argc] end
return argc
end
-- Add a new stack of parameters to `ctx.children`
local function new_substack (ctx)
local currsnap, newparams = ctx.n_children + 1, {}
if ctx.children == nil then ctx.children = { newparams }
else ctx.children[currsnap] = newparams end
ctx.n_children = currsnap
return newparams
end
-- Parse a raw argument containing a `sortfunctions` directive, or
-- `'without_sorting'`, or `nil`
local function load_sort_opt (raw_arg)
local trarg
if raw_arg ~= nil then trarg = raw_arg:match'^%s*(.*%S)' end
if trarg == nil then return nil, 1, false, nil end
if trarg == 'without_sorting' then return nil, 2, false, nil end
local tmp = sortfunctions[trarg]
if tmp == nil then return nil, 1, false, trarg end
return tmp or nil, 2, true, nil
end
-- Parse optional user arguments of type `...|[let/use]|[...]|[let/use]|[...]|
-- [number of additional parameters]|[parameter 1]|[parameter 2]|[...]`
local function load_child_opts (src, start_from, append_after, params)
local tnamed, tmp1, tmp2
local pin, tbl, mem = start_from, {}, {}
while src[pin] ~= nil and src[pin + 1] ~= nil do
tmp1 = src[pin]:match'^%s*(.*%S)'
if tmp1 == 'let' and src[pin + 2] ~= nil then
tmp1 = get_param_name(src[pin + 1])
tbl[tmp1], pin = src[pin + 2], pin + 3
--[[
elseif tmp1 == 'expose' then
tmp1 = get_param_name(src[pin + 1])
tmp2 = params[tmp1]
mem[tmp1], tbl[tmp1], pin = tmp2, tmp2, pin + 2
]]--
elseif tmp1 == 'use' and src[pin + 2] ~= nil then
tmp1 = get_param_name(src[pin + 2])
tmp2 = params[tmp1]
mem[tmp1], tbl[get_param_name(src[pin + 1])], pin =
tmp2, tmp2, pin + 3
else break end
end
local tnew = copy_or_ref_table(params, next(mem) == nil)
for key in pairs(mem) do tnew[key] = nil end
if pin ~= start_from then tnamed, tbl = tbl, {} end
tmp1 = tonumber(src[pin])
if tmp1 ~= nil and math.floor(tmp1) == tmp1 then
if tmp1 < 0 then tmp1 = -1 end
tmp2 = append_after - pin
for idx = pin + 1, pin + tmp1 do tbl[idx + tmp2] = src[idx] end
pin = pin + tmp1 + 1
end
if tnamed ~= nil then
for key, val in pairs(tnamed) do tbl[key] = val end
end
return tbl, pin, tnew, mem
end
-- Load the optional arguments of some of the `mapping_*` and `renaming_*`
-- class of modifiers
local function load_callback_opts (src, start_from, default_style, params)
local style, shf
local tmp = src[start_from + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then style, shf = default_style, start_from - 1
else shf = start_from end
local n_exist, karg, varg = style[3], style[4], style[5]
tmp = style[6]
if tmp > -1 then
karg = src[tmp + shf]:match'^%s*(.-)%s*$'
if karg == '0' or karg:find'^%-?[1-9]%d*$' ~= nil then
karg = tonumber(karg)
n_exist = math.max(n_exist, karg)
end
end
tmp = style[7]
if tmp > -1 then
varg = src[tmp + shf]:match'^%s*(.-)%s*$'
if varg == '0' or varg:find'^%-?[1-9]%d*$' ~= nil then
varg = tonumber(varg)
n_exist = math.max(n_exist, varg)
end
end
tmp = style[1]
local dest, argc, tnew, mem = load_child_opts(src, style[2] + shf,
n_exist, params)
if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then
tmp = tmp - 2 end
if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then
tmp = tmp - 1 end
return dest, argc, tmp, karg, varg, tnew, mem
end
-- Parse the arguments of some of the `mapping_*` and `renaming_*` class of
-- modifiers
local function load_replace_args (opts, offs, whoami)
if opts[offs + 1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No pattern string was given', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘' .. whoami .. '’: No replacement string was given', 0) end
local tn, flg
local ptn, repl, nmax, argc =
opts[offs + 1], opts[offs + 2], tonumber(opts[offs + 3]), 3
if nmax ~= nil then argc = 4
elseif opts[offs + 3] ~= nil then
tn = opts[offs + 3]:match'^%s*(.*%S)'
if tn == nil then argc = 4 end
end
if tn == nil and opts[offs + argc] ~= nil then
tn = opts[offs + argc]:match'^%s*(.*%S)'
end
if tn ~= nil then
flg = mkeywords[tn]
if flg ~= nil then tn = nil end
end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg, offs + argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl), tn
end
-- Parse the arguments of the `with_*_matching` class of modifiers
local function load_pattern_args (opts, offs, whoami)
local tn, kwid
local ptns, arg, state, nptns, idx = {}, opts[offs + 1], 0, 0, offs + 2
while arg ~= nil do
if state == 0 then
nptns, state = nptns + 1, -1
ptns[nptns] = { arg, false, false }
else
tn = arg:match'^%s*(.*%S)'
kwid = tn and mkeywords[tn]
if kwid == nil or (state > 0 and kwid > 0) then break
else
state = kwid
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
arg, idx = opts[idx], idx + 1
end
if state == 0 then error(modulename ..
', ‘' .. whoami .. '’: No pattern was given', 0) end
return ptns, nptns, idx - 1, kwid == nil and tn or nil
end
-- Load the optional arguments of the `parsing`, `reinterpreting` and
-- `evaluating` modifiers
local function load_parse_opts (opts, offs, isp, psp)
local tn, tmp
local optslots, noptslots, argc, trimn, trimu, iplain, pplain =
{ true, true, true }, 3, offs, true, false, true, true
repeat
noptslots, tmp = noptslots - 1, opts[argc]
tn = tmp and tmp:match'^%s*(.*%S)'
if tn == nil then break end
if optslots[1] ~= nil and trim_parse_opts[tn] ~= nil then
tmp = trim_parse_opts[tn]
trimn, trimu, optslots[1] = tmp[1], tmp[2], nil
elseif optslots[2] ~= nil and isep_parse_opts[tn] ~= nil then
argc = argc + 1
iplain, isp, optslots[2] = isep_parse_opts[tn],
opts[argc], nil
elseif optslots[3] ~= nil and psep_parse_opts[tn] ~= nil then
argc = argc + 1
pplain, psp, optslots[3] = psep_parse_opts[tn],
opts[argc], nil
else break end
argc, tn = argc + 1, nil
until noptslots < 1
return isp, iplain, psp, pplain, trimn, trimu, argc, tn
end
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
end
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
margs[karg] = key
tbl[key] = fn()
end
end,
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg], margs[varg] = key, val
tbl[key] = fn()
end
end
}
-- Private table for `map_names()`
local name_thieves = {
[0] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg], rargs[varg] = key, val
steal_if_renamed(val, tbl, key, cache, fn())
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numeric
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local prefix, gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
if type(key) == 'string' then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else prefix, gid = '', key end
if groups[gid] == nil then groups[gid] = {} end
if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then
prefix = tonumber(prefix)
if prefix < 1 then prefix = prefix - 1 end
end
groups[gid][prefix] = val
end
return groups
end
-- Split into parts a string containing the `$#` and `$@` placeholders and
-- return the information as a skeleton table, a canvas table and a length
local function parse_placeholder_string (target)
local skel, canvas, idx, s_pos, e_pos =
{}, {}, 1, 1, string.find(target, '%$[@#]', 1, false)
while e_pos ~= nil do
canvas[idx], skel[idx + 1] =
target:sub(s_pos, e_pos - 1),
target:sub(e_pos, e_pos + 1) == '$@'
idx, s_pos = idx + 2, e_pos + 2
e_pos = string.find(target, '%$[@#]', s_pos, false)
end
if (s_pos > target:len()) then idx = idx - 1
else canvas[idx] = target:sub(s_pos) end
return skel, canvas, idx
end
-- Populate a table by parsing a parameter string (heavy lifting for `parsing`,
-- `reinterpreting` and `evaluating`)
local function parse_parameter_string (tbl, str, isp, ipl, psp, ppl, trn, tru)
local key, val, spos1, spos2, pos1, pos2
local pos3, idx, lenplone = 0, 1, #str + 1
if isp == nil or isp == '' then
if psp == nil or psp == '' then
if tru then tbl[idx] = str:match'^%s*(.-)%s*$'
else tbl[idx] = str end
return
end
spos1, spos2 = str:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = str:match'^%s*(.-)%s*$'
else val = str end
else
key = get_param_name(str:sub(1, spos1 - 1))
val = str:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
return
end
if psp == nil or psp == '' then
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
if tru then val = val:match'^%s*(.-)%s*$' end
tbl[idx], idx = val, idx + 1
until pos2 == nil
return
end
repeat
pos1 = pos3 + 1
pos2, pos3 = str:find(isp, pos1, ipl)
val = str:sub(pos1, (pos2 or lenplone) - 1)
spos1, spos2 = val:find(psp, 1, ppl)
if spos1 == nil then
key = idx
if tru then val = val:match'^%s*(.-)%s*$' end
idx = idx + 1
else
key = get_param_name(val:sub(1, spos1 - 1))
val = val:sub(spos2 + 1)
if trn then val = val:match'^%s*(.-)%s*$' end
end
tbl[key] = val
until pos2 == nil
return
end
-- Heavy lifting for `snapshotting` and `remembering`
local function make_child (ctx, src, whoami)
local len = tonumber(ctx.pipe[ctx.fnpos + 1])
if len == nil or len == 0 then
local stack = new_substack(ctx)
for key, val in pairs(src) do stack[key] = val end
return len == nil and 1 or 2
end
if len < 0 or math.floor(len) ~= len then error(modulename .. ', ‘' ..
whoami .. '’: The number of parameters to copy must be an integer greater than zero', 0) end
copy_table_maxn(new_substack(ctx), src, len)
return 2
end
-- Heavy lifting for `setting_by_flushing`, `combining` and `combining_values`
local function set_strings_from_substack (ctx, dest, whoami)
if ctx.n_children < 1 then error(modulename ..
', ‘' .. whoami .. '’: There are no substacks to flush', 0) end
local currsnap = ctx.n_children
local stack = ctx.children[currsnap]
for key, val in pairs(memoryslots) do
if stack[key] ~= nil then dest[val] = stack[key] end
end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
end
-- Heavy lifting for `combining` and `combining_values`
local function combine_parameters (ctx, keyval_fn, whoami)
-- NOTE: `ctx.params` might be the original metatable! This function
-- MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No parameter name was provided', 0) end
local argc
local tbl, vars = ctx.params, {}
local sortfn, ivar0, dosort, tmp = load_sort_opt(opts[offs + 2])
if ivar0 == 2 then
tmp = opts[offs + 3] ~= nil and opts[offs + 3]:match'^%s*(.*%S)'
end
ivar0 = ivar0 + offs
if tmp == 'with_flushed_glue' then
ivar0 = ivar0 + 1
argc = set_strings_from_opts(vars, opts, ivar0 + 1)
set_strings_from_substack(ctx, vars, whoami)
else
if tmp == 'without_flushed_glue' then ivar0 = ivar0 + 1 end
argc = set_strings_from_opts(vars, opts, ivar0 + 1)
end
if argc < ivar0 then error(modulename ..
', ‘' .. whoami .. '’: No setting directive was given', 0) end
if next(tbl) == nil then
if vars.ifngiven ~= nil then ctx.params =
{ [get_param_name(opts[offs + 1])] = vars.ifngiven }
elseif tbl == ctx.oparams then ctx.params = {} end
return argc + 1
end
local cache, len
if dosort then
local words
cache, words, len, tmp = get_sorted_key_list(tbl, sortfn)
for idx = 1, tmp do cache[len + idx] = words[idx] end
len = len + tmp
else
cache, len = {}, 1
for key in pairs(tbl) do cache[len], len = key, len + 1 end
len = len - 1
end
local pmap, nss, kvs, pps =
{}, 0, vars.pairsep or '', vars.itersep or ''
for idx = 1, len do
tmp, pmap[nss + 1] = cache[idx], pps
pmap[nss + 2] = keyval_fn(tmp, tbl[tmp], kvs)
nss = nss + 2
end
tmp = vars.oxfordsep or vars.lastsep
if tmp ~= nil and nss > 4 then pmap[nss - 1] = tmp
elseif nss > 2 and vars.lastsep ~= nil then
pmap[nss - 1] = vars.lastsep
end
pmap[1] = vars.header or ''
if vars.footer ~= nil then pmap[nss + 1] = vars.footer end
ctx.params = { [get_param_name(opts[offs + 1])] = table.concat(pmap) }
return argc + 1
end
-- Concatenate the numeric keys from the table of parameters to the numeric
-- keys from the table of options; non-numeric keys from the table of options
-- will prevail over colliding non-numeric keys from the table of parameters
local function concat_params (ctx, offs)
local tbl, retval, cache, nmax = ctx.params, {}, {}, 0
for key, val in pairs(ctx.pipe) do
if type(key) == 'number' then
if key < 1 then cache[key] = val
elseif key > offs then cache[key - offs] = val end
if key > nmax then nmax = key end
else cache[key] = val end
end
nmax = nmax - offs
if ctx.subset == 1 then
-- We need only the sequence
for key, val in ipairs(tbl) do retval[key + nmax] = val end
else
if ctx.subset == -1 then
for key in ipairs(tbl) do tbl[key] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
retval[key + nmax] = val
else retval[key] = val end
end
end
for key, val in pairs(cache) do retval[key] = val end
return retval
end
-- Flush the parameters by calling a custom function for each value (after this
-- function has been invoked `ctx.params` will be no longer usable)
local function flush_params (ctx, fn)
local tmp
local tbl = ctx.params
if ctx.subset == -1 then
for key, val in ipairs(tbl) do tbl[key] = nil end
elseif ctx.subset == 1 then
if ctx.pins == nil then
for key, val in ipairs(tbl) do fn(key, val) end
return
end
tmp = {}
for key, val in ipairs(tbl) do tmp[key] = val end
tbl = tmp
end
if ctx.pins ~= nil then
local marker = ctx.sorttype < 1 and ctx.subset ~= -1 or nil
for idx = 1, #ctx.pins do
tmp = ctx.pins[idx]
if tbl[tmp] ~= nil then
fn(tmp, tbl[tmp])
tbl[tmp] = marker
end
end
if ctx.subset == 1 then
for key, val in ipairs(tbl) do
if val ~= true then fn(key, val) end
end
return
end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw =
get_sorted_key_list(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
return
end
for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end
for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end
return
end
if ctx.subset == -1 or ctx.pins == nil then
for key, val in ipairs(tbl) do
fn(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn(key, val) end
return
end
for key, val in ipairs(tbl) do
if val ~= true then fn(key, val) end
tbl[key] = nil
end
for key, val in pairs(tbl) do
if val ~= true then fn(key, val) end
end
end
-- Flush the parameters by calling one of two custom functions for each value
-- (after this function has been invoked `ctx.params` will be no longer usable)
local function mixed_flush_params (ctx, fn_seq, fn_oth)
if ctx.subset == 1 then
flush_params(ctx, fn_seq)
return
end
if ctx.subset == -1 then
flush_params(ctx, fn_oth)
return
end
local tbl = ctx.params
if ctx.pins == nil and ctx.sorttype < 1 then
for key, val in ipairs(tbl) do
fn_seq(key, val)
tbl[key] = nil
end
for key, val in pairs(tbl) do fn_oth(key, val) end
return
end
local tseq = {}
for key, val in ipairs(tbl) do tseq[key] = val end
if ctx.pins ~= nil then
local tmp
local marker = ctx.sorttype < 1 or nil
for idx = 1, #ctx.pins do
tmp = ctx.pins[idx]
if tseq[tmp] ~= nil then
fn_seq(tmp, tbl[tmp])
tbl[tmp], tseq[tmp] = nil, marker
elseif tbl[tmp] ~= nil then
fn_oth(tmp, tbl[tmp])
tbl[tmp] = nil
end
end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw =
get_sorted_key_list(tbl, natural_sort)
if ctx.sorttype == 2 then
for idx = 1, nw do
fn_oth(words[idx], tbl[words[idx]])
end
end
for idx = 1, nn do
if tseq[nums[idx]] ~= nil then
fn_seq(nums[idx], tseq[nums[idx]])
else fn_oth(nums[idx], tbl[nums[idx]]) end
end
if ctx.sorttype ~= 2 then
for idx = 1, nw do
fn_oth(words[idx], tbl[words[idx]])
end
end
return
end
for key, val in ipairs(tseq) do
if val ~= true then
fn_seq(key, val)
tbl[key] = nil
end
end
for key, val in pairs(tbl) do fn_oth(key, val) end
end
-- Finalize and return a concatenated list
local function finalize_and_return_concatenated_list (ctx, lst, len, modsize)
if len > 0 then
local tmp = ctx.oxfordsep or ctx.lastsep
if tmp ~= nil and len > modsize * 2 then
lst[len - modsize + 1] = tmp
elseif len > modsize and ctx.lastsep ~= nil then
lst[len - modsize + 1] = ctx.lastsep
end
lst[1] = ctx.header or ''
if ctx.footer ~= nil then lst[len + 1] = ctx.footer end
ctx.text = table.concat(lst)
else ctx.text = ctx.ifngiven or '' end
end
--- ---
--- PUBLIC ENVIRONMENT ---
--- ________________________________ ---
--- ---
--[[ Modifiers ]]--
-------------------
-- Syntax: #invoke:params|sequential|pipe to
library.sequential = function (ctx)
if ctx.subset == 1 then error(modulename ..
': The ‘sequential’ directive has been provided more than once', 0) end
if ctx.subset == -1 then error(modulename ..
': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end
if ctx.sorttype > 0 then error(modulename ..
': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end
ctx.iterfunc, ctx.subset = ipairs, 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|non-sequential|pipe to
library['non-sequential'] = function (ctx)
if ctx.subset == -1 then error(modulename ..
': The ‘non-sequential’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end
ctx.iterfunc, ctx.subset = pairs, -1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|all_sorted|pipe to
library.all_sorted = function (ctx)
if ctx.sorttype == 1 then error(modulename ..
': The ‘all_sorted’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 2 then error(modulename ..
': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end
ctx.sorttype = 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|reassorted|pipe to
library.reassorted = function (ctx)
if ctx.sorttype == 2 then error(modulename ..
': The ‘reassorted’ directive has been provided more than once', 0) end
if ctx.subset == 1 then error(modulename ..
': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end
if ctx.sorttype == 1 then error(modulename ..
': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end
ctx.sorttype = 2
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|pinned_until|sentinel|[parameter name 1]|[parameter
-- name 2]|...|parameter name N|sentinel|pipe to
library.pinned_until = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘pinned_until’: No sentinel was provided', 0) end
local tmp, bucket, curr, ncurr
local sntl, idx = opts[offs + 1]:match'^%s*(.-)%s*$', 2
if ctx.pin_bucket == nil then
bucket, curr, ncurr = {}, {}, 0
ctx.pin_bucket, ctx.pins = bucket, curr
else bucket, curr, ncurr = ctx.pin_bucket, ctx.pins, ctx.npins end
while opts[offs + idx] ~= nil do
tmp = opts[offs + idx]:match'^%s*(.-)%s*$'
if tmp == sntl then
if idx == 2 then error(modulename ..
', ‘pinned_until’: No parameters to pin were provided', 0) end
ctx.npins = ncurr + idx - 2
return context_iterate(ctx, offs + idx + 1)
end
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
if bucket[tmp] then error(modulename ..
', ‘pinned_until’: Duplicate pinned parameter ‘' .. tostring(tmp) .. '’', 0) end
curr[ncurr + idx - 1], bucket[tmp], idx = tmp, true, idx + 1
end
error(modulename .. ', ‘pinned_until’: Missing sentinel in position #' .. tostring(idx), 0)
end
-- Syntax: #invoke:params|setting|directives|...|pipe to
library.setting = function (ctx)
local new_offs = set_strings_from_opts(ctx, ctx.pipe, ctx.fnpos + 1)
if new_offs - ctx.fnpos < 2 then error(modulename ..
', ‘setting’: No directive was given', 0) end
return context_iterate(ctx, new_offs + 1)
end
-- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to
library.scoring = function (ctx)
local opts, offs, retval = ctx.pipe, ctx.fnpos, 0
if opts[offs + 1] == nil then error(modulename ..
', ‘scoring’: No parameter name was provided', 0) end
for _ in pairs(ctx.params) do retval = retval + 1 end
local tn = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if tn == 'in_substack' then
new_substack(ctx)[get_param_name(opts[offs + 1])] =
tostring(retval)
return context_iterate(ctx, offs + 3)
end
ctx.params[get_param_name(opts[offs + 1])] = tostring(retval)
return tn == 'here' and context_iterate(ctx, offs + 3) or
context_iterate(ctx, offs + 2, tn)
end
-- Syntax: #invoke:params|squeezing|pipe to
library.squeezing = function (ctx)
local store, indices, tbl, newlen = {}, {}, ctx.params, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
newlen = newlen + 1
indices[newlen], store[key], tbl[key] = key, val, nil
end
end
table.sort(indices)
for idx = 1, newlen do tbl[idx] = store[indices[idx]] end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|filling_the_gaps|pipe to
library.filling_the_gaps = function (ctx)
local newval, tbl, tmp, nmin, nmax, nnums =
ctx.pipe[ctx.fnpos + 1], ctx.params, {}, 1, nil, -1
if newval == nil then error(modulename ..
', ‘filling_the_gaps’: No value was provided', 0) end
for key, val in pairs(tbl) do
if type(key) == 'number' then
if nmax == nil then
if key < nmin then nmin = key end
nmax = key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
tmp[key], nnums = val, nnums + 1
end
end
if nmax ~= nil and nmax - nmin > nnums then
ctx.n_available = ctx.n_available + nmin + nnums - nmax
if ctx.n_available < 0 then error(modulename ..
', ‘filling_the_gaps’: It is possible to fill at most ' .. tostring(maxfill) .. ' parameters', 0) end
for idx = nmin, nmax do tbl[idx] = newval end
for key, val in pairs(tmp) do tbl[key] = val end
end
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|clearing|pipe to
library.clearing = function (ctx)
local tbl, numerics = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key], tbl[key] = val, nil
end
end
for key, val in ipairs(numerics) do tbl[key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local lcut = tonumber(opts[offs + 1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cutting’: Left cut must be an integer number', 0) end
local rcut = tonumber(opts[offs + 2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cutting’: Right cut must be an integer number', 0) end
local tbl = ctx.params
local len = #tbl
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
local tot = lcut + rcut
if tot > 0 then
local cache = {}
if tot >= len then
for key in ipairs(tbl) do tbl[key] = nil end
tot = len
else
for idx = len - rcut + 1, len do tbl[idx] = nil end
for idx = 1, lcut do tbl[idx] = nil end
end
for key, val in pairs(tbl) do
if type(key) == 'number' and key > 0 then
if key > len then cache[key - tot] = val
else cache[key - lcut] = val end
tbl[key] = nil
end
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local lcut = tonumber(opts[offs + 1])
if lcut == nil or math.floor(lcut) ~= lcut then error(modulename ..
', ‘cropping’: Left crop must be an integer number', 0) end
local rcut = tonumber(opts[offs + 2])
if rcut == nil or math.floor(rcut) ~= rcut then error(modulename ..
', ‘cropping’: Right crop must be an integer number', 0) end
local tbl = ctx.params
local nmin, nmax
for key in pairs(tbl) do
if type(key) == 'number' then
if nmin == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
if nmin ~= nil then
local len = nmax - nmin + 1
if lcut < 0 then lcut = len + lcut end
if rcut < 0 then rcut = len + rcut end
if lcut + rcut - len > -1 then
for key in pairs(tbl) do
if type(key) == 'number' then tbl[key] = nil end
end
elseif lcut + rcut > 0 then
for idx = nmax - rcut + 1, nmax do tbl[idx] = nil end
for idx = nmin, nmin + lcut - 1 do tbl[idx] = nil end
local lshift = nmin + lcut - 1
if lshift > 0 then
for idx = lshift + 1, nmax do
tbl[idx - lshift], tbl[idx] =
tbl[idx], nil
end
end
end
end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|purging|start offset|length|pipe to
library.purging = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local idx = tonumber(opts[offs + 1])
if idx == nil or math.floor(idx) ~= idx then error(modulename ..
', ‘purging’: Start offset must be an integer number', 0) end
local len = tonumber(opts[offs + 2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘purging’: Length must be an integer number', 0) end
local tbl = ctx.params
if len < 1 then
len = len + table.maxn(tbl)
if idx > len then return context_iterate(ctx, offs + 3) end
len = len - idx + 1
end
ctx.params = copy_table_reduced(tbl, idx, len)
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local last = tonumber(opts[offs + 1])
if last == nil or math.floor(last) ~= last then error(modulename ..
', ‘backpurging’: Start offset must be an integer number', 0) end
local len = tonumber(opts[offs + 2])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘backpurging’: Length must be an integer number', 0) end
local idx
local tbl = ctx.params
if len > 0 then idx = last - len + 1
else
for key in pairs(tbl) do
if type(key) == 'number' and (idx == nil or
key < idx) then idx = key end
end
if idx == nil then return context_iterate(ctx, offs + 3) end
idx = idx - len
if last < idx then return context_iterate(ctx, offs + 3) end
len = last - idx + 1
end
ctx.params = copy_table_reduced(ctx.params, idx, len)
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|shifting|addend|pipe to
library.shifting = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local nshift = tonumber(ctx.pipe[ctx.fnpos + 1])
if nshift == nil or nshift == 0 or math.floor(nshift) ~= nshift then
error(modulename .. ', ‘shifting’: A non-zero integer number must be provided', 0) end
local tbl = {}
for key, val in pairs(ctx.params) do
if type(key) == 'number' then tbl[key + nshift] = val
else tbl[key] = val end
end
ctx.params = tbl
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|reversing_numeric_names|pipe to
library.reversing_numeric_names = function (ctx)
local tbl, numerics, nmax = ctx.params, {}, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key], tbl[key] = val, nil
if key > nmax then nmax = key end
end
end
for key, val in pairs(numerics) do tbl[nmax - key + 1] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|pivoting_numeric_names|pipe to
--[[
library.pivoting_numeric_names = function (ctx)
local tbl = ctx.params
local shift = #tbl + 1
if shift < 2 then return library.reversing_numeric_names(ctx) end
local tmp = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then tmp[key], tbl[key] = val, nil end
end
for key, val in pairs(tmp) do tbl[shift - key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
]]--
-- Syntax: #invoke:params|mirroring_numeric_names|pipe to
--[[
library.mirroring_numeric_names = function (ctx)
local nmax, nmin
local tbl, tmp = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
tmp[key], tbl[key] = val, nil
if nmax == nil then nmin, nmax = key, key
elseif key > nmax then nmax = key
elseif key < nmin then nmin = key end
end
end
for key, val in pairs(tmp) do tbl[nmax + nmin - key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
]]--
-- Syntax: #invoke:params|swapping_numeric_names|pipe to
--[[
library.swapping_numeric_names = function (ctx)
local tmp
local tbl, cache, nsize = ctx.params, {}, 1
for key in pairs(tbl) do
if type(key) == 'number' then
cache[nsize], nsize = key, nsize + 1
end
end
table.sort(cache)
for idx = math.floor((nsize - 1) / 2), 1, -1 do
tmp = tbl[cache[idx] ]
tbl[cache[idx] ] = tbl[cache[nsize - idx] ]
tbl[cache[nsize - idx] ] = tmp
end
return context_iterate(ctx, ctx.fnpos + 1)
end
]]--
-- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function (ctx)
local sortfn
local opts, offs = ctx.pipe, ctx.fnpos
local tn = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tn ~= nil then sortfn = sortfunctions[tn] end
if sortfn then table.sort(ctx.params, sortfn)
else table.sort(ctx.params) end -- i.e. either `false` or `nil`
if sortfn == nil then return context_iterate(ctx, offs + 1, tn) end
return context_iterate(ctx, offs + 2)
end
-- Syntax: #invoke:params|splicing|[add to position]|position|increment|
-- [number of elements to write]|...|pipe to
library.splicing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp2, argc, pos, refp
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local tmp1 = opts[offs + 1]
if tmp1 ~= nil then
tmp2 = tonumber(tmp1)
if tmp2 == nil or math.floor(tmp2) ~= tmp2 then
pos, argc, tmp2 = tonumber(opts[offs + 2]), offs + 4,
tmp1:match'^%s*(.*%S)'
if tmp2 ~= nil then
refp = position_references[tmp2]
if refp == nil then error(modulename ..
', ‘splicing’: ‘' .. tostring(tmp2) .. '’ is not a valid first argument', 0) end
else refp = 0 end
else pos, argc, refp = tmp2, offs + 3, 0 end
else pos, argc, refp = tonumber(opts[offs + 2]), offs + 4, 0 end
if pos == nil or math.floor(pos) ~= pos then error(modulename ..
', ‘splicing’: The position must be an integer number', 0) end
local len = tonumber(opts[argc - 1])
if len == nil or math.floor(len) ~= len then error(modulename ..
', ‘splicing’: The increment must be an integer number', 0) end
local insn = tonumber(opts[argc])
if len == 0 and (insn == nil or insn < 1) then error(modulename ..
', ‘splicing’: When the increment is zero the number of elements to write cannot be zero', 0) end
if refp == 2 then
for _ in ipairs(tbl) do pos = pos + 1 end
refp = 0
end
tmp1, tmp2 = nil, nil
if refp ~= 0 or len ~= 0 then
for key, val in pairs(tbl) do
if type(key) == 'number' then
if tmp1 == nil then tmp1, tmp2 = key, key
elseif key < tmp1 then tmp1 = key
elseif key > tmp2 then tmp2 = key end
end
end
end
if tmp2 == nil then len = 0
elseif refp == 3 then pos = pos + tmp2
elseif refp == 1 then pos = pos + tmp1 end
if len > 0 and pos + len > tmp1 and pos <= tmp2 then
tbl = copy_table_expanded(tbl, pos, len)
elseif len < 0 and pos - len > tmp1 and pos <= tmp2 then
tbl = copy_table_reduced(tbl, pos, -len)
else tbl = copy_or_ref_table(tbl, tbl ~= ctx.oparams) end
ctx.params = tbl
if insn == nil or insn < 0 or math.floor(insn) ~= insn then
return context_iterate(ctx, argc)
end
tmp1 = argc - offs - pos + 1
for key = pos, pos + insn - 1 do tbl[key] = opts[offs + key + tmp1] end
return context_iterate(ctx, argc + insn + 1)
end
-- Syntax: #invoke:params|imposing|name|value|pipe to
library.imposing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘imposing’: Missing parameter name to impose', 0) end
ctx.params[get_param_name(opts[offs + 1])] = opts[offs + 2]
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = get_param_name(opts[offs + 1])
if ctx.params[key] == nil then ctx.params[key] = opts[offs + 2] end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|reassigning|source|destination|[mode]|pipe to
library.reassigning = function (ctx)
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘reassigning’: Missing source parameter', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘reassigning’: Missing destination parameter', 0) end
local mode, argc
local src, tn = get_param_name(opts[offs + 1]),
opts[offs + 3] ~= nil and opts[offs + 3]:match'^%s*(.*%S)'
local val = tbl[src]
if tn ~= nil then mode = a_modes[tn] end
if mode == nil then mode, argc = 0, offs + 3
else argc, tn = offs + 4, nil end
if val == nil and mode > 1 then
return context_iterate(ctx, argc, tn)
end
local dest = get_param_name(opts[offs + 2])
local tmp = tbl[dest] == nil
if mode % 2 == 0 or (mode == 7 and tmp) then tbl[src] = nil end
if tmp or mode < 4 then tbl[dest] = val end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘discarding’: Missing parameter name to discard', 0) end
local len = tonumber(opts[offs + 2])
if len == nil then
ctx.params[get_param_name(opts[offs + 1])] = nil
return context_iterate(ctx, offs + 2)
end
local key = tonumber(opts[offs + 1])
if key == nil or math.floor(key) ~= key then error(modulename ..
', ‘discarding’: A range was provided, but the initial parameter name is not an integer number', 0) end
if len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘discarding’: A range can only be an integer number greater than zero', 0) end
for idx = key, key + len - 1 do ctx.params[idx] = nil end
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|excluding_non-numeric_names|pipe to
library['excluding_non-numeric_names'] = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) ~= 'number' then tmp[key] = nil end
end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|excluding_numeric_names|pipe to
library.excluding_numeric_names = function (ctx)
local tmp = ctx.params
for key, val in pairs(tmp) do
if type(key) == 'number' then tmp[key] = nil end
end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|with_name_matching|target 1|[plain flag 1]|[or]|
-- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_name_matching = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tmp, ptn
local tbl, newparams, opts, offs = ctx.params, {}, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_name_matching')
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
tmp = ptn[1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
newparams[tmp] = tbl[tmp]
else
for key, val in pairs(tbl) do
if tostring(key):find(ptn[1], 1, ptn[2]) then
newparams[key] = val
end
end
end
end
ctx.params = newparams
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]|
-- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_name_not_matching = function (ctx)
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_name_not_matching')
if nptns == 1 and targets[1][3] then
local tmp = targets[1][1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tbl[tonumber(tmp)] = nil
else tbl[tmp] = nil end
return context_iterate(ctx, argc, tn)
end
local yesmatch, ptn
for key in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if tostring(key) ~= ptn[1] then
yesmatch = false
break
end
elseif not tostring(key):find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]|
-- [target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_value_matching = function (ctx)
local nomatch, ptn
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_value_matching')
for key, val in pairs(tbl) do
nomatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val == ptn[1] then
nomatch = false
break
end
elseif val:find(ptn[1], 1, ptn[2]) then
nomatch = false
break
end
end
if nomatch then tbl[key] = nil end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]|
-- [and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_value_not_matching = function (ctx)
local yesmatch, ptn
local tbl, opts, offs = ctx.params, ctx.pipe, ctx.fnpos
local targets, nptns, argc, tn = load_pattern_args(opts, offs,
'with_value_not_matching')
for key, val in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val ~= ptn[1] then
yesmatch = false
break
end
elseif not val:find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|keeping_at_most|number of parameters to pick|pipe to
library.keeping_at_most = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local len = tonumber(ctx.pipe[ctx.fnpos + 1])
if len == nil or len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘keeping_at_most’: The number of parameters to keep must be an integer greater than zero', 0) end
ctx.params = copy_table_maxn({}, ctx.params, len)
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|trimming_values|pipe to
library.trimming_values = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|mapping_to_lowercase|pipe to
library.mapping_to_lowercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:lower() end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|mapping_to_uppercase|pipe to
library.mapping_to_uppercase = function (ctx)
local tbl = ctx.params
for key, val in pairs(tbl) do tbl[key] = val:upper() end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|mapping_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.values_only,
ctx.params)
local model = { title = tname, args = margs }
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_invoking|module name|function name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘mapping_by_invoking’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 2, mapping_styles.values_only,
ctx.params)
local model = { title = 'Module:' .. mname, args = margs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end
value_maps[looptype](tbl, margs, karg, varg, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.values_only,
ctx.params)
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die, tn =
load_replace_args(ctx.pipe, ctx.fnpos, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc, tn) end
local tbl = ctx.params
if flg == 3 then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to
library.mapping_by_mixing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘mapping_by_mixing’: No mixing string was provided', 0) end
local tbl, mix = ctx.params, opts[offs + 1]
if mix == '$#' then
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, offs + 2)
end
local skel, cnv, n_parts = parse_placeholder_string(mix)
for key, val in pairs(tbl) do
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
tbl[key] = table.concat(cnv)
end
return context_iterate(ctx, offs + 2)
end
-- Syntax: #invoke:params|renaming_to_lowercase|pipe to
library.renaming_to_lowercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:lower()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|renaming_to_uppercase|pipe to
library.renaming_to_uppercase = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache = {}
for key, val in pairs(ctx.params) do
if type(key) == 'string' then cache[key:upper()] = val else
cache[key] = val end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to
library.renaming_to_sequence = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache, len
local tbl = ctx.params
local sortfn, argc, dosort, tn = load_sort_opt(ctx.pipe[ctx.fnpos + 1])
if dosort then
local words, wl
cache, words, len, wl = get_sorted_key_list(tbl, sortfn)
for idx = 1, len do cache[idx] = tbl[cache[idx]] end
for idx = 1, wl do cache[len + idx] = tbl[words[idx]] end
else
cache, len = {}, 1
for _, val in pairs(tbl) do cache[len], len = val, len + 1 end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + argc, tn)
end
-- Syntax: #invoke:params|renaming_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.names_only,
ctx.params)
local model = { title = tname, args = rargs }
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_invoking|module name|function
-- name|[call style]|[let/use]|[...]|[let/use]|[...]|[number of
-- additional arguments]|[argument 1]|[argument 2]|[...]|[argument
-- N]|pipe to
library.renaming_by_invoking = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘renaming_by_invoking’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 2, mapping_styles.names_only,
ctx.params)
local model = { title = 'Module:' .. mname, args = rargs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘renaming_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end
map_names(tbl, rargs, karg, varg, looptype, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.renaming_by_magic = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, offs + 1, mapping_styles.names_only,
ctx.params)
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:callParserFunction(magic, rargs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die, tn =
load_replace_args(ctx.pipe, ctx.fnpos, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc, tn) end
local tbl = ctx.params
if flg == 3 then
ptn = get_param_name(ptn)
local val = tbl[ptn]
if val ~= nil then
tbl[ptn], tbl[get_param_name(repl)] = nil, val
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to
library.renaming_by_mixing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local mix = ctx.pipe[ctx.fnpos + 1]
if mix == nil then error(modulename ..
', ‘renaming_by_mixing’: No mixing string was provided', 0) end
local cache = {}
mix = mix:match'^%s*(.-)%s*$'
if mix == '$@' then
for _, val in pairs(ctx.params) do
cache[get_param_name(val)] = val
end
else
local skel, canvas, n_parts = parse_placeholder_string(mix)
for key, val in pairs(ctx.params) do
for idx = 2, n_parts, 2 do
if skel[idx] then canvas[idx] = val
else canvas[idx] = tostring(key) end
end
cache[get_param_name(table.concat(canvas))] = val
end
end
ctx.params = cache
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|grouping_by_calling|template
-- name|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.grouping_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local tmp, argc, tbl, mem =
load_child_opts(opts, offs + 2, 0, ctx.params)
local gargs = {}
for key, val in pairs(tmp) do
if type(key) == 'number' and key < 1 then gargs[key - 1] = val
else gargs[key] = val end
end
tmp = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tmp == nil then error(modulename ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local groups = make_groups(tbl)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0], model.args = gid, group
groups[gid] = ctx.frame:expandTemplate(model)
end
for key, val in pairs(mem) do groups[key] = val end
ctx.params = groups
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.parsing = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘parsing’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc, tn =
load_parse_opts(opts, offs + 2, '|', '=')
parse_parameter_string(ctx.params, opts[offs + 1], isep, iplain, psep,
pplain, trimnamed, trimunnamed)
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim
-- flag]|[iteration delimiter setter]|[...]|[key-value delimiter
-- setter]|[...]|pipe to
library.reinterpreting = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc, tn =
load_parse_opts(opts, offs + 2, '|', '=')
local tbl, tmp = ctx.params, get_param_name(opts[offs + 1])
local str = tbl[tmp]
if str ~= nil then
tbl[tmp] = nil
parse_parameter_string(tbl, str, isep, iplain, psep, pplain,
trimnamed, trimunnamed)
end
return context_iterate(ctx, argc, tn)
end
-- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.evaluating = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘evaluating’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, repos, tn =
load_parse_opts(opts, offs + 2, '!', ':')
if opts[offs + 1]:match'^%s*(.*%S)' == nil then
remove_numeric_keys(opts, offs, repos - offs)
return context_iterate(ctx, offs, tn)
end
local new_opts, cache = {}, {}
parse_parameter_string(cache, opts[offs + 1], isep, iplain, psep,
pplain, trimnamed, trimunnamed)
local shift = #cache + offs - repos + 1
for key, val in pairs(opts) do
if type(key) ~= 'number' or key < offs then new_opts[key] = val
elseif key >= repos then new_opts[key + shift] = val end
end
for key, val in pairs(cache) do
if type(key) ~= 'number' or key < 1 then new_opts[key] = val
else new_opts[key + offs] = val end
end
ctx.pipe = new_opts
return context_iterate(ctx, offs + 1)
end
-- Syntax: #invoke:params|mixing_names_and_values|mixing string|pipe to
library.mixing_names_and_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end
local tmp
local cache, mix_k, mix_v =
{}, opts[offs + 1]:match'^%s*(.-)%s*$', opts[offs + 2]
if mix_k == '$@' and mix_v == '$@' then
for _, val in pairs(ctx.params) do
cache[get_param_name(val)] = val
end
elseif mix_k == '$@' and mix_v == '$#' then
for key, val in pairs(ctx.params) do
cache[get_param_name(val)] = tostring(key)
end
elseif mix_k == '$#' and mix_v == '$#' then
for key in pairs(ctx.params) do cache[key] = tostring(key) end
else
local skel_k, cnv_k, n_parts_k = parse_placeholder_string(mix_k)
local skel_v, cnv_v, n_parts_v = parse_placeholder_string(mix_v)
for key, val in pairs(ctx.params) do
tmp = tostring(key)
for idx = 2, n_parts_k, 2 do
if skel_k[idx] then cnv_k[idx] = val
else cnv_k[idx] = tmp end
end
for idx = 2, n_parts_v, 2 do
if skel_v[idx] then cnv_v[idx] = val
else cnv_v[idx] = tmp end
end
cache[get_param_name(table.concat(cnv_k))] =
table.concat(cnv_v)
end
end
ctx.params = cache
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|combining|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return key .. kvs .. val end,
'combining'
))
end
-- Syntax: #invoke:params|combining_values|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return val end,
'combining_values'
))
end
-- Syntax: #invoke:params|combining_by_calling|template name|new parameter
-- name|pipe to
library.combining_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘combining_by_calling’: No template name was provided', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘combining_by_calling’: No parameter name was provided', 0) end
ctx.params = {
[get_param_name(opts[offs + 2])] = ctx.frame:expandTemplate{
title = tname,
args = ctx.params
}
}
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|combining_by_invoking|module name|function name|new
-- parameter name|pipe to
library.combining_by_invoking = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘combining_by_invoking’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘combining_by_invoking’: No function name was provided', 0) end
if opts[offs + 3] == nil then error(modulename ..
', ‘combining_by_invoking’: No parameter name was provided', 0) end
local model = { title = 'Module:' .. mname, args = ctx.params }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end
ctx.params = {
[get_param_name(opts[offs + 3])] =
tostring(mfunc(ctx.frame:newChild(model)))
}
return context_iterate(ctx, offs + 4)
end
-- Syntax: #invoke:params|combining_by_magic|parser function|new parameter
-- name|pipe to
library.combining_by_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘combining_by_magic’: No parser function was provided', 0) end
if opts[offs + 2] == nil then error(modulename ..
', ‘combining_by_magic’: No parameter name was provided', 0) end
ctx.params = {
[get_param_name(opts[offs + 2])] =
ctx.frame:callParserFunction(magic, ctx.params)
}
return context_iterate(ctx, offs + 3)
end
-- Syntax: #invoke:params|snapshotting|[maximum number]|pipe to
library.snapshotting = function (ctx)
return context_iterate(ctx, ctx.fnpos +
make_child(ctx, ctx.params, 'snapshotting'))
end
-- Syntax: #invoke:params|remembering|[maximum number]|pipe to
library.remembering = function (ctx)
return context_iterate(ctx, ctx.fnpos +
make_child(ctx, ctx.oparams, 'remembering'))
end
-- Syntax: #invoke:params|entering_substack|[new]|pipe to
library.entering_substack = function (ctx)
local tbl, opts, offs, ncurrparent =
ctx.params, ctx.pipe, ctx.fnpos, ctx.n_parents + 1
local tn = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if ctx.parents == nil then ctx.parents = { tbl }
else ctx.parents[ncurrparent] = tbl end
ctx.n_parents = ncurrparent
if tn == 'new' then
ctx.params = {}
return context_iterate(ctx, offs + 2)
end
local currsnap = ctx.n_children
if currsnap > 0 then
ctx.params, ctx.children[currsnap], ctx.n_children =
ctx.children[currsnap], nil, currsnap - 1
else
local newparams = {}
for key, val in pairs(tbl) do newparams[key] = val end
ctx.params = newparams
end
return context_iterate(ctx, offs + 1, tn)
end
-- Syntax: #invoke:params|pulling|parameter name|pipe to
library.pulling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘pulling’: No parameter to pull was provided', 0) end
local tmp = ctx.n_parents
local parent = tmp < 1 and ctx.oparams or ctx.parents[tmp]
tmp = get_param_name(opts[offs + 1])
if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|recalling|parameter name|pipe to
library.recalling = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘recalling’: No parameter to recall was provided', 0) end
local arg = get_param_name(opts[offs + 1])
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, ctx.fnpos + 2)
end
-- Syntax: #invoke:params|finding|parameter name|pipe to
--[[
library.finding = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘finding’: No parameter to find was provided', 0) end
local arg = get_param_name(opts[offs + 1])
local parent
for idx = ctx.n_parents, 1, -1 do
parent = ctx.parents[idx]
if parent[arg] ~= nil then
ctx.params[arg] = parent[arg]
return context_iterate(ctx, offs + 2)
end
end
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, offs + 2)
end
]]--
-- Syntax: #invoke:params|picking|number of parameters to pick|pipe to
--[[
library.picking = function (ctx)
local len = tonumber(ctx.pipe[ctx.fnpos + 1])
if len == nil or len < 1 or math.floor(len) ~= len then error(modulename ..
', ‘picking’: The number of parameters to pick must be an integer greater than zero', 0) end
if ctx.n_parents < 1 then copy_table_maxn(ctx.params, ctx.oparams, len)
else copy_table_maxn(ctx.params, ctx.parents[ctx.n_parents], len) end
return context_iterate(ctx, ctx.fnpos + 2)
end
]]--
-- Syntax: #invoke:params|detaching_substack|pipe to
library.detaching_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘detaching_substack’: No substacks have been created', 0) end
local parent = ctx.parents[ncurrparent]
for key in pairs(ctx.params) do parent[key] = nil end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|dropping_substack|pipe to
library.dropping_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘dropping_substack’: No substacks have been created', 0) end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents =
ctx.parents[ncurrparent], nil, ncurrparent - 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|leaving_substack|pipe to
library.leaving_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘leaving_substack’: No substacks have been created', 0) end
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { ctx.params }
else ctx.children[currsnap] = ctx.params end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents, ctx.n_children =
ctx.parents[ncurrparent], nil, ncurrparent - 1, currsnap
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|merging_substack|pipe to
library.merging_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘merging_substack’: No substack has been created', 0) end
local parent, child = ctx.parents[ncurrparent], ctx.params
ctx.params, ctx.parents[ncurrparent], ctx.n_parents = parent, nil,
ncurrparent - 1
for key, val in pairs(child) do parent[key] = val end
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|rearranging_substacks|...|pipe to
library.rearranging_substacks = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tmp = tonumber(opts[offs + 1])
if tmp == nil then error(modulename ..
', ‘rearranging_substacks’: You must specify at least one substack', 0) end
local argc
local oldchdn, newchdn, ntot, sid = ctx.children, {}, ctx.n_children, 1
repeat
if tmp > ntot or tmp < 1 or math.floor(tmp) ~= tmp then error(modulename ..
', ‘rearranging_substacks’: Substack #' .. tostring(tmp) .. ' does not exist', 0) end
if oldchdn[ntot - tmp + 1] == nil then error(modulename ..
', ‘rearranging_substacks’: Substack #' .. tostring(tmp) .. ' appears multiple times', 0) end
newchdn[ntot - sid + 1], oldchdn[ntot - tmp + 1], sid =
oldchdn[ntot - tmp + 1], nil, sid + 1
tmp = tonumber(opts[offs + sid])
until tmp == nil
ctx.children, argc, sid = newchdn, offs + sid, 1
for idx = 1, ntot do
tmp = oldchdn[idx]
if tmp ~= nil then newchdn[sid], sid = tmp, sid + 1 end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|flushing|pipe to
library.flushing = function (ctx)
if ctx.n_children < 1 then error(modulename ..
', ‘flushing’: There are no substacks to flush', 0) end
local parent, currsnap = ctx.params, ctx.n_children
for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
return context_iterate(ctx, ctx.fnpos + 1)
end
-- Syntax: #invoke:params|setting_by_flushing|pipe to
library.setting_by_flushing = function (ctx)
set_strings_from_substack(ctx, ctx, 'setting_by_flushing')
return context_iterate(ctx, ctx.fnpos + 1)
end
--[[ Functions ]]--
-----------------------------
-- Syntax: #invoke:params|count
library.count = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local retval = 0
for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end
if ctx.subset == -1 then retval = retval - #ctx.params end
ctx.text = retval
return false
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]|
-- [...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘concat_and_call’: No template name was provided', 0) end
ctx.text = ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx, offs + 1)
}
return false
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘concat_and_invoke’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘concat_and_invoke’: No function name was provided', 0) end
local mfunc = require('Module:' .. mname)[fname]
if mfunc == nil then error(modulename ..
', ‘concat_and_invoke’: The function ‘' .. fname .. '’ does not exist', 0) end
ctx.text = mfunc(ctx.frame:newChild{
title = 'Module:' .. mname,
args = concat_params(ctx, offs + 2)
})
return false
end
-- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend
-- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
-- value n]|[...]
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘concat_and_magic’: No parser function was provided', 0) end
ctx.text = ctx.frame:callParserFunction(magic,
concat_params(ctx, offs + 1))
return false
end
-- Syntax: #invoke:params|value_of|parameter name
library.value_of = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
if opts[offs + 1] == nil then error(modulename ..
', ‘value_of’: No parameter name was provided', 0) end
local val
local key = opts[offs + 1]:match'^%s*(.-)%s*$'
if key == '0' or key:find'^%-?[1-9]%d*$' ~= nil then
key = tonumber(key)
val = ctx.params[key]
-- No worries: #ctx.params is unused when the modifier is in
-- first position (and therefore `ctx.params` is a metatable)
if val ~= nil and (
ctx.subset ~= -1 or key > #ctx.params or key < 1
) and (
ctx.subset ~= 1 or (key <= #ctx.params and key > 0)
) then
ctx.text = (ctx.header or '') .. val ..
(ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
else
val = ctx.params[key]
if ctx.subset ~= 1 and val ~= nil then ctx.text = (ctx.header
or '') .. val .. (ctx.footer or '')
else ctx.text = ctx.ifngiven or '' end
end
return false
end
-- Syntax: #invoke:params|list
library.list = function (ctx)
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
flush_params(ctx, function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3], ret[nss + 4], nss =
pps, key, kvs, val, nss + 4
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|list_values
library.list_values = function (ctx)
-- NOTE: `library.coins()` and `library.unique_coins()` rely on us
local ret, nss, pps = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
ret[nss + 1], ret[nss + 2], nss = pps, val, nss + 2
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|list_maybe_with_names
library.list_maybe_with_names = function (ctx)
local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or ''
mixed_flush_params(
ctx,
function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3],
ret[nss + 4], nss = pps, '', '', val, nss + 4
end,
function (key, val)
ret[nss + 1], ret[nss + 2], ret[nss + 3],
ret[nss + 4], nss = pps, key, kvs, val, nss + 4
end
)
finalize_and_return_concatenated_list(ctx, ret, nss, 4)
return false
end
-- Syntax: #invoke:params|for_each|wikitext
library.for_each = function (ctx)
local ret, nss, pps, txt =
{}, 0, ctx.itersep or '', ctx.pipe[ctx.fnpos + 1] or ''
local skel, cnv, n_parts = parse_placeholder_string(txt)
flush_params(ctx, function (key, val)
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
ret[nss + 1], nss = pps, nss + 2
ret[nss] = table.concat(cnv)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]|
-- [...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘call_for_each’: No template name was provided', 0) end
local cargs = copy_table_reduced(opts, 1, offs - 1)
local model, ret, nss, ccs =
{ title = tname, args = cargs }, {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
cargs[1], cargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|
-- [named param n=value n]|[...]
library.invoke_for_each = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘invoke_for_each’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘invoke_for_each’: No function name was provided', 0) end
local iargs = copy_table_reduced(ctx.pipe, 1, offs)
local model = { title = 'Module:' .. mname, args = iargs }
local mfunc, ret, nss, ccs =
require(model.title)[fname], {}, 0, ctx.itersep or ''
if mfunc == nil then error(modulename ..
', ‘invoke_for_each’: The function ‘' .. fname .. '’ does not exist', 0) end
flush_params(ctx, function (key, val)
iargs[1], iargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.magic_for_each = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘magic_for_each’: No parser function was provided', 0) end
local ret, nss, ccs, cargs = {}, 0, ctx.itersep or '',
copy_table_reduced(opts, 1, offs - 1)
flush_params(ctx, function (key, val)
cargs[1], cargs[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, cargs)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_value = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local tname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tname == nil then error(modulename ..
', ‘call_for_each_value’: No template name was provided', 0) end
local cargs = copy_table_reduced(ctx.pipe, 1, offs)
local model = { title = tname, args = cargs }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
cargs[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each_value|module name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.invoke_for_each_value = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local mname = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if mname == nil then error(modulename ..
', ‘invoke_for_each_value’: No module name was provided', 0) end
local fname = opts[offs + 2] and opts[offs + 2]:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
', ‘invoke_for_each_value’: No function name was provided', 0) end
local iargs = copy_table_reduced(ctx.pipe, 1, offs + 1)
local model = { title = 'Module:' .. mname, args = iargs }
local mfunc, ret, nss, ccs =
require(model.title)[fname], {}, 0, ctx.itersep or ''
if mfunc == nil then error(modulename ..
', ‘invoke_for_each_value’: The function ‘' .. fname .. '’ does not exist', 0) end
flush_params(ctx, function (key, val)
iargs[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each_value|parser function|[append 1]|
-- [append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named
-- param n=value n]|[...]
library.magic_for_each_value = function (ctx)
local opts, offs = ctx.pipe, ctx.fnpos
local magic = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if magic == nil then error(modulename ..
', ‘magic_for_each_value’: No parser function was provided', 0) end
local cargs, ret, nss, ccs =
copy_table_reduced(opts, 1, offs), {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
cargs[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, cargs)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_group|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_group = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local opts, offs = ctx.pipe, ctx.fnpos
local tmp = opts[offs + 1] and opts[offs + 1]:match'^%s*(.*%S)'
if tmp == nil then error(modulename ..
', ‘call_for_each_group’: No template name was provided', 0) end
local model = { title = tmp }
local bargs, ret, nss, ccs = {}, {}, 0, ctx.itersep or ''
for key, val in pairs(opts) do
if type(key) ~= 'number' then bargs[key] = val
elseif key > offs then bargs[key - offs - 1] = val
elseif key < 1 then bargs[key - 1] = val end
end
ctx.params = make_groups(ctx.params)
flush_params(ctx, function (gid, group)
for key, val in pairs(bargs) do group[key] = val end
group[0], model.args, ret[nss + 1], nss = gid, group, ccs,
nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
--[[ First-position-only modifiers ]]--
---------------------------------------
-- Syntax: #invoke:params|new|pipe to
static_iface.new = function (child_frame)
local ctx = context_new(child_frame, 'new')
ctx.params = {}
main_loop(ctx, context_iterate(ctx, 2))
return ctx.text
end
--[[ First-position-only functions ]]--
---------------------------------------
-- Syntax: #invoke:params|self
static_iface.self = function (child_frame)
return child_frame:getParent():getTitle()
end
--[[ Public metatable of functions ]]--
---------------------------------------
return setmetatable({}, {
__index = function (_, query)
local fname = query:match'^%s*(.*%S)'
if fname == nil then error(modulename ..
': You must specify a function to call', 0) end
local func = static_iface[fname]
if func ~= nil then return func end
func = library[fname]
if func == nil then error(modulename ..
': The function ‘' .. fname .. '’ does not exist', 0) end
return function (child_frame)
local ctx = context_new(child_frame, fname)
ctx.params = copy_or_ref_table(ctx.oparams,
refparams[fname])
main_loop(ctx, func)
return ctx.text
end
end
})
edjjks8ayvjip4tl4xpkdb2en7irkcr
علیرضا یوسفی
0
184240
416918
413669
2026-11-09T07:08:01Z
محک
1023
416918
wikitext
text/x-wiki
{{Infobox sportsperson
| headercolor = #90EE90
| image = Victory Ceremony Boys +85 kg Weightlifting 2018 YOG 24.jpg
| caption = ونه نوجوونی عکس
| nationality = {{IRN}}
| birth_date = {{تاریخ تولد و سن|2003|8|27|df=y}}
| birth_place = [[قائمشهر]], [[مازرون اوستان]], ایران
| weight = {{Convert|191|kg|lb|0|abbr=on}}
| country = {{IRN}}
| sport = [[Olympic weightlifting|وزنهبرداری]]
| event = +109 کگ
| personal_best = {{فهرست ناگلولهای|یک ضرب: 194 کگ (2024)|د ضرب: 262 کگ (2024)|مجموع: 456 کگ (2024)}}
| medaltemplates =
{{MedalCountry | {{IRI}}}}
{{MedalSport | مردونه [[وزنه برداری]]}}
{{Medal|Competition| [[World Weightlifting Championships|World Championships]] }}
{{Medal|Bronze| [[2024 World Weightlifting Championships|2024 Manama]] | [[2024 World Weightlifting Championships – Men's +109 kg|+109 kg]] }}
{{MedalSilver|[[2026 World Weightlifting Championships|2026 Ningbo]]|[[2026 World Weightlifting Championships – Men's +110 kg|+110 kg]]}}
{{MedalCompetition|[[Asian Weightlifting Championships|Asian Championships]]}}
{{MedalSilver|[[2026 Asian Weightlifting Championships|2026 Gandhinagar]]|+110 kg}}
{{MedalCompetition|[[Islamic Solidarity Games]]}}
{{MedalSilver|[[Weightlifting at the 2021 Islamic Solidarity Games|2021 Konya]]|+109 kg}}
{{MedalCompetition|[[World Juniors Weightlifting Championships|World Junior Championships]]}}
{{MedalGold|[[2022 Junior World Weightlifting Championships|2022 Heraklion]]|+109 kg}}
{{MedalGold|[[2023 Junior World Weightlifting Championships|2023 Guadalajara]]|+109 kg}}
{{مدال برنز|[[2019 Junior World Weightlifting Championships|2019 Suva]]|+109 kg}}
{{MedalCompetition|[[Youth Olympic Games]]}}
{{MedalGold|[[2018 Youth Olympic Games|2018 Buenos Aires]]|[[Weightlifting at the 2018 Summer Youth Olympics – Boys' +85 kg|+85 kg]]}}
{{MedalCompetition|Asian Youth Championships|Asian Youth Championships}}
{{MedalGold|2018 Urgench|+94 kg}}
}}
'''علیرضا یوسفی''' اتا [[توری مردمون|مازرونی]] و [[قائمشهر|قائمشهری]] وزنهبردار هسته که سنگینوزن وزنه زنده و جهون ِرکوددار و قهرمون هسته.
وه اولین جهونی مدال ره ۲۰۱۸ سال، بوینس آیرس جوونون المپیک دله بهیته.<ref>Multiple sources:
*{{cite web |title=Iran's Yousefi wins weightlifting gold by great comeback |date=14 October 2018 |url=https://en.mehrnews.com/news/138656/Iran-s-Yousefi-wins-weightlifting-gold-by-great-comeback |archiveurl=https://web.archive.org/web/20190528214954/https://en.mehrnews.com/news/138656/Iran-s-Yousefi-wins-weightlifting-gold-by-great-comeback |archivedate=28 May 2019}}
*{{cite web |title=Yousefi Alireza (IRI) – last youth Olympic champion in Buenos Aires |url=https://www.iwf.net/2018/10/14/yousefi-alireza-iri-last-youth-olympic-champion-buenos-aires/ |website=iwf.net|date=14 October 2018 }}
*{{cite web |title=Iranian weightlifter snatches gold medal in Buenos Aires |url=https://en.irna.ir/news/83065511/Iranian-weightlifter-snatches-gold-medal-in-Buenos-Aires |website=IRNA|date=14 October 2018 }}
*{{cite web |title=Results |url=https://www.buenosaires2018.com/results/resYOG2018/pdf/YOG2018/WLF/YOG2018_WLF_C73_WLFMO85KG-------------------------.pdf |website=buenosaires2018.com |archiveurl=https://web.archive.org/web/20181014053156/https://www.buenosaires2018.com/results/resYOG2018/pdf/YOG2018/WLF/YOG2018_WLF_C73_WLFMO85KG-------------------------.pdf |archivedate=14 October 2018}}
*{{cite web |title=Khamhaeng dominates and Yousefi seals stunning weightlifting win |url=https://www.olympic.org/news/khamhaeng-dominates-and-yousefi-seals-stunning-weightlifting-win |website=olympic.org|date=6 February 2019 }}</ref>
وه ۲۰۱۹، جوونون مسابقات وسه بورده ۱۰۹ کگ رج دله و هرچی رکورد دیّه ره بزو.<ref>{{cite web |title=2019 IWF Junior World Championships – Results Book |url=https://www.iwf.net/wp-content/uploads/downloads/2019/06/Results_book.pdf}}</ref> أی ۲۰۲۲ سوپر-سنگین رج دله هم جوونون رکورد ره جابجا هاکرده.<ref>{{Cite web |date=16 May 2022 |title=زندگینامه: علیرضا یوسفی (۱۳۸۲-) |url=https://www.hamshahrionline.ir/news/676903/زندگینامه-علیرضا-یوسفی-۱۳۸۲ |access-date=16 May 2022 |website=همشهری آنلاین |language=fa}}</ref><ref>{{Cite web |date=16 May 2022 |title=خط و نشان بچهغول ایرانی برای قوی ترین مرد جهان {{!}} اذیتش خواهم کرد! |url=https://www.hamshahrionline.ir/news/676787/خط-و-نشان-بچه-غول-ایرانی-برای-قوی-ترین-مرد-جهان-اذیتش-خواهم |access-date=16 May 2022 |website=همشهری آنلاین |language=fa}}</ref>
یوسفی ۲۰۲۴, گتسالون جهونی مسابقات دله دیّه و برنز مجموع ره بیته و دِ ضرب دله ۲۶۲ کگ ره بزو. وه ۲۰۲۵ شه لینگِ زانی ره عمل هاکرده و اتگال ورزش جه کناره گیته.<ref>{{Cite web |date=27 January 2025 |title=Weightlifter Yousefi sidelined for six months |url=https://www.tehrantimes.com/news/509118/Weightlifter-Yousefi-sidelined-for-six-months |access-date=8 February 2025 |website=Tehran Times |language=en}}</ref> یوسفی أی ۲۰۲۶ فوریه ایرانِ لیگ دله شرکت هاکرده و اول بیه.<ref>{{Cite web |title=Heavyweight prodigy Yousefi makes commanding comeback to stage |url=https://newspaper.irandaily.ir/8056/6/22046 |access-date=2026-02-27 |website=Iran Daily}}</ref>
یوسفی ۲۰۲۶ آسیایی مسابقه دله، ۲۶۱ کگ ره دِ ضرب راست هاکرده که دنیایِ رکورد ره بالا بکشییه و شه اولین گتآدم رکورد ره ثبت هاکرده. ولی ۴۴۵ کگ جه مجموع ره طلا نئیته و دوم بیه.<ref>{{Cite web |date=2026-05-17 |title=Iran’s Alireza Yousefi breaks world record, dedicates medal to strike victims |url=https://indianexpress.com/article/sports/iran-alireza-yousefi-world-record-gandhinagar-asian-weightlifting-championships-us-war-strike-victims-10694643/ |access-date=2026-05-17 |website=The Indian Express |language=en}}</ref> همین سال دله، چین جهونی مسابقات دله دِ ضرب رکورد ره بزو و سرجمع نقره بیته. <ref>[https://www.irib-news.ir/fa/news/5960758/%D8%AF%D8%B1%D8%AE%D8%B4%D8%B4-%D9%BE%D9%88%D9%84%D8%A7%D8%AF%D9%85%D8%B1%D8%AF-%D9%85%D8%A7%D8%B2%D9%86%D8%AF%D8%B1%D8%A7%D9%86%DB%8C-%D8%AF%D8%B1-%D9%82%D9%87%D8%B1%D9%85%D8%A7%D9%86%DB%8C-%D8%AC%D9%87%D8%A7%D9%8 صدا سیما]</ref>
== نتایج ==
<ref>{{cite web |title=Weightlifting – Alireza Yousefi |url=https://www.the-sports.org/alireza-yousefi-weightlifting-spf539508.html |website=TheSports.org}}</ref><ref>{{cite web |title=Yousefi Alireza |url=http://www.iwrp.net/component/cwyniki/?view=contestant&id_zawodnik=43852 |website=iwrp.net}}</ref>
{|class="wikitable" style="text-align:center;"
! rowspan=2 width=40|سال
! rowspan=2 width=250|شهر
! rowspan=2 width=60|وزنه
!colspan=4| یکضرب (kg)
!colspan=4| دِ ضرب (kg)
!rowspan=2 width=40| مجموع
!rowspan=2 width=40| رتبه
|-
! width=40|1
! width=40|2
! width=40|3
! width=40|Rank
! width=40|1
! width=40|2
! width=40|3
! width=40|Rank
|-
! colspan=13 | [[World Weightlifting Championships|World Championships]]
|-
|[[2021 World Weightlifting Championships|2021]] || align=left| {{پرچمئون|UZB}} [[تاشکند]], [[اوزبکسون]] || [[2021 World Weightlifting Championships – Men's +109 kg|+109 kg]] || 173 || 178||'''183'''||7|| 230 ||'''238'''||<s>245</s>||5 ||'''421'''||'''7'''
|-
|[[2024 World Weightlifting Championships|2024]]
|align=left| {{پرچمئون|Bahrain}} [[منامه]], [[بحرین]]
|[[2024 World Weightlifting Championships – Men's +109 kg|+109 kg]]
|184
|<s>191</s>
|'''194'''
|5
|248
|258
|'''262'''
|{{Gold1}}
|'''456'''
|{{Bronze3}}
|-
! colspan=13|[[Asian Weightlifting Championships|Asian Championships]]
|-
|[[2023 Asian Weightlifting Championships|2023]] || align=left| {{پرچمئون|KOR}} [[جینجو]], [[جنوبی کره]]|| +109 kg || 176||184||'''190'''||4||236||'''246 [[List of junior world records in Olympic weightlifting|JWR]]'''||<s>249</s>||{{Silver2}}|| '''436'''||'''4'''
|-
|[[2026 Asian Weightlifting Championships|2026]]
| align="left" |{{پرچمئون|IND}} [[گاندینگر]], [[هند]]
| +110 kg
|177
|'''184'''
|<s>189</s>
|{{Bronze3}}
|248
|<s>261</s>
|'''261 [[World record progression men's weightlifting|WR]]'''
|{{Gold1}}
|'''445'''
|{{Silver2}}
|-
!colspan=13|[[Islamic Solidarity Games]]
|-
|[[2021 Islamic Solidarity Games|2022]]|| align=left| {{پرچمئون|TUR}} [[قونیه]], [[تورکیه]] || +109 kg ||171||176||'''181'''||{{Bronze3}} ||'''230'''||<s>241</s>||<s>241</s>||{{Silver2}}||'''411'''||{{Silver2}}
|-
! colspan=13|[[IWF Junior World Weightlifting Championships|Junior World Championships]]
|-
|[[2019 Junior World Weightlifting Championships|2019]] || align=left| {{پرچمئون|FIJ}} [[سووا]], [[فیجی]] ||+109 kg ||156||163||'''171'''||4||212||'''225'''||<s>233</s>||{{Silver2}}||'''396'''||{{Bronze3}}
|-
|[[2022 Junior World Weightlifting Championships|2022]] || align=left| {{پرچمئون|GRE}} [[هراکلیون]], [[یونان]] ||+109 kg ||166||171||'''177'''||{{Gold1}}||215||<s>239</s>||'''239'''||{{Gold1}}||'''416'''||{{Gold1}}
|-
|[[2023 Junior World Weightlifting Championships|2023]] || align=left| {{پرچمئون|MEX}} [[گوادالاخارا]], [[مکزیک]] ||+109 kg||173||'''180'''||--||{{Gold1}}||225||<s>240</s>||'''240'''||{{Gold1}}||'''420'''||{{Gold1}}
|-
! colspan=13|[[Weightlifting at the Youth Olympic Games|Youth Olympic Games]]
|-
|[[Weightlifting at the 2018 Summer Youth Olympics|2018]] || align=left| {{پرچمئون|ARG}} [[بوینس آیرس]], [[آرجونتین]] ||[[Weightlifting at the 2018 Summer Youth Olympics – Boys' +85 kg|+85 kg]]||150||156||'''162'''||3||202||211||'''218'''||1||'''380'''||'''{{Gold1}}'''
|-
! colspan=13|Asian Youth Championships
|-
|2018 || align=left| {{پرچمئون|UZB}} [[اورگنج]], [[اوزبکسون]] || +94 kg ||136||141||'''144'''||'''{{Gold1}}'''||176||'''186'''||<s>195</s>||'''{{Gold1}}'''||'''330'''||'''{{Gold1}}'''
|}
== منابع ==
{{بنبنویشت|۲}}
== بریم بگردستن ==
{{Social links}}
{{مرجعون کنترل}}
[[رج:مازرون وزنهبردارون]]
[[رج:۲۰۰۳ بزائهئون]]
[[رج:زننه آدمون]]
[[رج:قائمشهر گت آدمون]]
ac2hjt1sk5ix36jo30czny47vp7shg0
پورتال:اسایی دکتهئون/دکتهئون ۸ نوامبر ۲۰۲۶
100
184544
416895
2026-11-08T14:43:54Z
محک
1023
اتا نو ولگ بساته که ونه دله «* منابع طبیعی سازمان بائوته [[گلستون اوستان]] وری، [[مازرون دریا]] تا ۴ کیلومتر پئی بورده. اینتی گته، مازرون و گیلان دله ۵۰۰ تا ۸۰۰ متر عقب هنیشته.» دره
416895
wikitext
text/x-wiki
* منابع طبیعی سازمان بائوته [[گلستون اوستان]] وری، [[مازرون دریا]] تا ۴ کیلومتر پئی بورده. اینتی گته، مازرون و گیلان دله ۵۰۰ تا ۸۰۰ متر عقب هنیشته.
r6h9qqvv819kcqc6an3f0tb0d4nypd9
رج:لتونی ورزشکارون
14
184545
416903
2026-11-08T21:25:26Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:لاتویا گت آدمون]] [[رج:ورزشکارون، مملکت په]]» دره
416903
wikitext
text/x-wiki
[[رج:لاتویا گت آدمون]]
[[رج:ورزشکارون، مملکت په]]
a1ctbpphlrelqidcz6t9zl54b4ztbis
رج:کانادا ورزشکارون
14
184546
416905
2026-11-08T21:26:42Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:کانادا گت آدمون|و]] [[رج:ورزشکارون، مملکت په|ک]] [[fa:رده:ورزشکاران اهل کانادا]]» دره
416905
wikitext
text/x-wiki
[[رج:کانادا گت آدمون|و]]
[[رج:ورزشکارون، مملکت په|ک]]
[[fa:رده:ورزشکاران اهل کانادا]]
8b4ya2ndt5kz8dch8tub1t6qbcuh7lt
رج:دانمارک ورزشکارون
14
184547
416906
2026-11-08T21:27:14Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:دانمارک گت آدمون|و]] [[رج:ورزشکارون، مملکت په]] [[fa:رده:ورزشکاران اهل دانمارک]]» دره
416906
wikitext
text/x-wiki
[[رج:دانمارک گت آدمون|و]]
[[رج:ورزشکارون، مملکت په]]
[[fa:رده:ورزشکاران اهل دانمارک]]
smtsymyn6k64701q6k375gnahgpvsol
رج:باهاما ورزشکارون
14
184548
416909
2026-11-08T21:28:17Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:باهاما گت آدمون|و]] [[رج:ورزشکارون، مملکت په]] [[fa:رده:ورزشکاران اهل باهاما]]» دره
416909
wikitext
text/x-wiki
[[رج:باهاما گت آدمون|و]]
[[رج:ورزشکارون، مملکت په]]
[[fa:رده:ورزشکاران اهل باهاما]]
k8ar0jzpt2ujfi7dkq6t2afg8688bgl
رج:باهاما گت آدمون
14
184549
416910
2026-11-08T21:28:52Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:باهاما]] [[رج:مردمون، مملکت په|باهاما]] [[fa:رده:اهالی باهاما]]» دره
416910
wikitext
text/x-wiki
[[رج:باهاما]]
[[رج:مردمون، مملکت په|باهاما]]
[[fa:رده:اهالی باهاما]]
73vikjzysd5r6bhl9qni3rmjcz9li71
رج:اسلوونی ورزشکارون
14
184550
416912
2026-11-08T21:31:05Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:اسلوونی گت آدمون|و]] [[رج:ورزشکارون، مملکت په]] [[fa:رده:ورزشکاران اهل اسلوونی]]» دره
416912
wikitext
text/x-wiki
[[رج:اسلوونی گت آدمون|و]]
[[رج:ورزشکارون، مملکت په]]
[[fa:رده:ورزشکاران اهل اسلوونی]]
83wso2slgtxmvrb7jpzhi46hj4pmdpw
رج:اسلوونی گت آدمون
14
184551
416913
2026-11-08T21:31:38Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:اسلوونی]] [[رج:مردمون، مملکت په]] [[fa:رده:اهالی اسلوونی]]» دره
416913
wikitext
text/x-wiki
[[رج:اسلوونی]]
[[رج:مردمون، مملکت په]]
[[fa:رده:اهالی اسلوونی]]
rb2ez53kfbesk41dgstveb3j8tyyyh0
رج:اتریش ورزشکارون
14
184552
416915
2026-11-08T21:32:33Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:اتریش گت آدمون|و]] [[رج:ورزشکارون، مملکت په]] [[fa:رده:ورزشکاران اهل اتریش]]» دره
416915
wikitext
text/x-wiki
[[رج:اتریش گت آدمون|و]]
[[رج:ورزشکارون، مملکت په]]
[[fa:رده:ورزشکاران اهل اتریش]]
tw3we93v2yst5dl96lgw2hneoz988e0
پورتال:اسایی دکتهئون/دکتهئون ۹ نوامبر ۲۰۲۶
100
184553
416917
2026-11-09T07:03:55Z
محک
1023
اتا نو ولگ بساته که ونه دله «* [[علیرضا یوسفی]] وزنهبرداریِ جهانی مسابقات دله، که چین درون برگزار بییه، دِ ضرب رکورد ره بزو و ۲۶۳ کیلوگرم وزنه ره راست هاکرده و طلا بیته. ولی تکضرب وسه چاروم بیه و سرجمع نقره بیته. ([https://www.irib-news.ir/fa/news/5960758/%D8%AF%D8%B1%D8%AE%D8%B4%D8%B4-%D9%BE%D9%88%D9%84%D8%A7%D8...» دره
416917
wikitext
text/x-wiki
* [[علیرضا یوسفی]] وزنهبرداریِ جهانی مسابقات دله، که چین درون برگزار بییه، دِ ضرب رکورد ره بزو و ۲۶۳ کیلوگرم وزنه ره راست هاکرده و طلا بیته. ولی تکضرب وسه چاروم بیه و سرجمع نقره بیته. ([https://www.irib-news.ir/fa/news/5960758/%D8%AF%D8%B1%D8%AE%D8%B4%D8%B4-%D9%BE%D9%88%D9%84%D8%A7%D8%AF%D9%85%D8%B1%D8%AF-%D9%85%D8%A7%D8%B2%D9%86%D8%AF%D8%B1%D8%A7%D9%86%DB%8C-%D8%AF%D8%B1-%D9%82%D9%87%D8%B1%D9%85%D8%A7%D9%86%DB%8C-%D8%AC%D9%87%D8%A7%D9%8 صداسیما])
7g0tn67nu1jxfl2jn3qy9qc8ilpvj7k