ویکیپدیا
mznwiki
https://mzn.wikipedia.org/wiki/%DA%AF%D8%AA_%D8%B5%D9%81%D8%AD%D9%87
MediaWiki 1.47.0-wmf.12
first-letter
مدیا
شا
گپ
کارور
کارور گپ
ویکیپدیا
ویکیپدیا گپ
پرونده
پرونده گپ
مدیاویکی
مدیاویکی گپ
شابلون
شابلون گپ
رانما
رانما گپ
رج
رج گپ
پورتال
پورتال گپ
پروژه
پروژه گپ
TimedText
TimedText talk
ماژول
ماژول گپ
Event
Event talk
لهر
0
4948
390679
196192
2026-07-24T07:33:07Z
HenryThe
27142
390679
wikitext
text/x-wiki
'''لهر''' اتا روستای نوم هسه که [[لاریجان سفلی]] دهستون دله دره. اینتا روستا [[لاریجان]] بخش دله،[[آمل]] شهرستون دله دره.
==جوغرافی==
==ایقتصاد==
==منبع==
*[http://www.sci.org.ir/content/userfiles/_census85/census85/natayej/abadifil/02.xls ایران آمار مرکز]
{{بالا لاریجان دهستون}}
{{آمل دهستونون}}
{{مازرون اوستان}}
{{ناقص}}
[[رج:آمل شهرستان روستائون]]
nukf74gl52qml6uwi3l8hv4a0y65xjz
شابلون:امروز واری روز
10
6247
390673
188703
2026-07-23T22:38:01Z
محک
1023
این اتا لینک وسه صرف نکنده ات پشته مقاله بساجیم
390673
wikitext
text/x-wiki
امروز {{CURRENTDAYNAME}}، [[{{CURRENTDAY}} {{CURRENTMONTHNAME}}]] [[{{CURRENTYEAR}}]] میلادی برابر [[{{شابلون:روز تبری به حروف}}|{{روز تبری}}]] [[{{CURRENTYEAR}}|{{امسال تبری}}]] [[تبری تقویم|تبری]] هسته.
{{ویکیپدیا:امروز واری روز/{{CURRENTDAY}} {{CURRENTMONTHNAME}}}}
</div>
<noinclude>
{{توضیحات}}
[[رج:تاریخ شابلون]]</noinclude>
eh875rsoucfebnkjzuu9qi79cmcsj91
شابلون:SelAnnivFooter
10
6255
390674
277911
2026-07-23T22:41:05Z
محک
1023
390674
wikitext
text/x-wiki
<div align="left">
<small>'''[[ویکیپدیا:امروز واری روز/{{{ماه}}}|تلمبار]]''' – '''[[ویکیپدیا:امروز واری روز/تلمبار|تقویم ره هارشین]]'''</small>
</div>
g2keqbfcjz2spwnwgp7knibywdrj1vl
بارسلونا
0
8127
390663
278137
2026-07-23T17:11:37Z
~2026-41075-86
46175
چون من یه کهکشانی ام Hala Madrid
390663
wikitext
text/x-wiki
{{For|بارسلونا}}
{{شابلون:جعبه اطلاعات تیم فوتوال
| نام باشگاه = باشگاه فوتوال بارسلونا
| تصویر = [[پرونده:FCBLogo.svg.png|200px]]
| توضیحات =
| نام کامل باشگاه = باشگاه فوتوال بارسلونا {{سخ}} (Fútbol Club Barcelona)
| لقب (ها) = حسرت 15سال UCL
| شعار =
| نام غیر رسمی = بارسا (Barça)، آبی و اناریئون (Blaugranes)
| تاریخ تأسیس = ۲۹ نوامبر ۱۸۹۹
| تاریخ انحلال =
| نام ورزشگاه = [[نیوکمپ]]
| گنجایش = ۹۹٫۳۵۴
| مالک =
| مدیرعامل = [[سندرو راسل]]
| سرمربی = {{flagicon|ESP}} [[ارنستو والورده]]
| لیگ = [[لالیگا]]
| فصل =
| جایگاه =
|فصل جاری =
|الگوی دست چپ۱ = _fcbarcelona1920h
|الگوی بدن۱ = _fcbarcelona1920h
|الگوی دست راست۱ = _fcbarcelona1920h
|الگوی شلوارک۱ =
|الگوی جوراب۱ = _barcelona1920h
|دست چپ۱ = 000080
|بدن۱ = 000080
|دست راست۱ = 000080
|شلوارک۱ = 000080
|جوراب۱ = 000080
|الگوی دست چپ۲ = _fcbarcelona1920a
|الگوی بدن۲ = _fcbarcelona1920a
|الگوی دست راست۲ = _fcbarcelona1920a
|الگوی شلوارک۲ =
|الگوی جوراب۲ = _fcbarcelona1920a
|دست چپ۲ = FFDD00
|بدن۲ = FFDD00
|دست راست۲ = FFDD00
|شلوارک۲ = FFDD00
|جوراب۲ = FFDD00
|الگوی دست چپ۳ = _fcbarcelona1920t
|الگوی بدن۳ = _fcbarcelona1920t
|الگوی دست راست۳ = _fcbarcelona1920t
|الگوی شلوارک۳ = _fcbarcelona1920t
|الگوی جوراب۳ = _fcbarcelona1920t
|دست چپ۳ = 00E8C5
|بدن۳ = 00E8C5
|دست راست۳ = 00E8C5
|شلوارک۳ = 00E8C5
|جوراب۳ = 00E8C5
|نخستین بازی = '''بارسلونا''' ۰ - ۱ ''بونانوا''
| پرگل ترین برد = '''بارسلونا''' ۹ - ۱ ''خیمناستیک دی تاراگونا''
| بدترین باخت = '''بارسلونا''' ۱ - ۱۱ ''رئال مادرید''
| بهترین گلزن تاریخ = {{flagicon|ARG}} لیونل مسی
| گروه هوادارها = '''کولز''' (culés)
| افتخارات = ''داخلی'': ۲۰ قهرمونی [[لالیگا]] دله، ۲۵ قهرمونی
[[جام حذفی]] دله، ۷ قهرمونی [[سوپرکاپ]] و ۲ قهرمونی لیگ کاپ دله<br />''اروپایی'': ۳ قهرمونی [[لیگ قهرمونون اروپا|لیگ قهرموناون]] دله،<br />۳ قهرمونی در [[جام یوفا]]، ۴ قهرمونی در [[جام در جام اروپا]] و ۲ قهرمونی [[سوپرکاپ اروپا]] دله<br />جهونی:اتا بار قهرمونی جام باشگاهئون جهون دله(۲۰۰۹)
|آدرس اینترنتی = <center>[http://www.fcbarcelona.com http://www.fcbarcelona.com]</center>
|گرانترین خرید={{flagicon|BRA}} فیلیپه کوتینیو|گرانترین فروش={{flagicon|BRA}} نیمار}}
'''باشگاه فوتوال بارسلونا''' ''(به اسپانیایی: Fútbol Club Barcelona)'' که بیشتر '''بارسلونا''' یا به صورت دستیار ریال مادرید معروف هست، اتا [[فوتوال|باشگاه فوتوال]] حرفهای اسپانیایی هسته که شهر [[بارسلون]] ِ[[کاتالونیا]] [[اسپانیا]] دله دره. این تیم [[لالیگا]] دله بازی کانده و جزو سه تیمی هسته که هنتا به دسته پایینتر سقوط نکاردنه.
این باشگاه با عنوان '''باشگاه فوتوال بارسلونا''' سال ۱۸۹۹ توسط عدهای اهل [[سوئیس]]، [[انگلیس]] و اسپانیا و به رهبری [[خوان گمپر]] تاسیس بیّه. باشگاه به نوعی، نهادی ترویج فرهنگ [[کاتالان]] و [[کاتالانیسم]] وسّه هسته و از این رو عبارت «فراتر از یک باشگاه» (Més que un club) ره به عنوان شه شعار انتخاب هاکرده. سرود رسمی باشگاه، ''El Cant del Barça''، اثر جوزپ ماریا، اسپیناس اسم دانّه. برخلاف خله از تیمئون جهون این تیم توسط هوادارونش اداره وانه. بارسلونا دومین تیم ثروتمند جهون با درآمد ۳۹۸ میلیون یورو هسته. این باشگاه رقابت دیرینهای با [[رئال مادرید]] دانّه و به مسابقهای که بین این دِتا تیم برگزار کانّه [[ال کلاسیکو]] بائوته وانه.
تیم فوتوال بارسلونا با ۲۰ قهرمونی لالیگا دله، ۲۵ قهرمونی جام حذفی دله، ۷ قهرمونی سوپرکاپ دله و ۲ قهرمونی لیگ کاپ دله، بعد از [[رئال مادرید]] پرافتخارترین تیم اسپانیا هسته. وشون همچنین با بَوردن ۹ عنوان اصلی [[اروپا]] دله، اتا از موفقترین تیمئون حاضر اروپا دله هستنه.<ref name="UEFA">{{یادکرد وب |نشانی=http://www.uefa.com/footballeurope/club=50080/domestic.html |عنوان=فوتوال اروپا: باشگاه فوتوال بارسلونا |تاریخ بازدید=۲۹ مه ۲۰۰۸ |ناشر= اتحادیه فوتوال اروپا ([[یوفا]])([UEFA http://www.uefa.com])|سال=|زبان=انگلیسی |فرمت=}}</ref>
۳ قهرمونی [[لیگ قهرمونون اروپا|لیگ قهرمونون]] دله،
۳ قهرمونی [[جام یوفا]] دله، ۴ قهرمونی [[جام جام دله اروپا]] دله و ۲ قهرمونی [[سوپرکاپ اروپا]] دله دستبییارده.
در سال ۲۰۰۹، بارسلونا موفق بیّه اولین باشگاهی بائه که [[سهگانه (فوتوال)|سهگانه]] لالیگا، [[کوپا دل ری]] و لیگ قهرمونون
باشگاهئون اروپا راه به دست بییاره. همینتی بارسلونا تنها تیمی هسته که از سال ۱۹۵۵ همواره جام باشگاهئون اروپا دله حاضر بییه.
[[استادیوم]] باشگاه [[نیوکمپ]] اسم دانّه، که با گنجایش ۹۹٫۳۵۴ تماشاگر، گتترین استادیوم اروپا هسته. بارسلونا از درجه بالایی از محبوبیت برخوردار هسته، حدود ۲۵٫۷% مردم اسپانیا طرفدار بارسلونا هستنه<ref name="cis">{{یادکرد وب |نشانی=
http://www.cis.es/cis/export/sites/default/-Archivos/Marginales/2700_2719/2705/Es2705mar_A.pdf
|عنوان=
Centro de Investigaciones Sociológicas |تاریخ بازدید=۱۱ می ۲۰۰۷
|ناشر= |سال=|زبان=انگلیسی |فرمت=PDF}}</ref>، و این در حالیست که
بر اساس بررسیای که اخیراً انجام بیته، بارسلونا با داشتن ۴۴٫۲ میلیون
هوادار اروپا دله، پرطرفدارترین تیم حاضر اروپا هم هسته<ref
name="ET">{{یادکرد وب |نشانی=
http://www.earthtimes.org/articles/show/255305,survey-barcelona-is-most-popular-club-england-dethrone-spain.html
|عنوان= نتیجه یک بررسی: بارسا محبوب ترین باشگاه، انگلیس، اسپانیا را به زیر کشید.
|تاریخ بازدید=۱۱ فوریه ۲۰۰۹ |ناشر= وبگاه [earthtimes http://www.earthtimes.org]|سال=۲۰۰۹|زبان=انگلیسی
|فرمت=}}</ref>. باشگاه همچنین با داشتن ۱۵۶٬۳۶۶ عضو رسمی ژوئن ۲۰۰۷، بیشترین عضو ثبت نوم بَیی ره میون تموم باشگاهئون فوتوال دنیا دانّه. طرفدارون بارسلونا همچنین به ''culés'' معروفنه. بارسلونا رقابت بینظیری با رئال مادرید داشته و با این تیم اتا از مشهورترین مسابقهئون فوتوال جهون دله موسوم به [[ال کلاسیکو]] رقابت کانّه.
فصل ۰۸-۲۰۰۷ بارسلونا با درآمدی بالغ بر ۳۰۸٫۸ میلیون [[یورو]] تبدیل به
سومین باشگاه ثروتمند جهون بیّه. بارسلونا دارای تیم دومی به نام [[بارسلونا اتلتیک]] هم هسته و تا قبل از ۲۰۰۷، تیم جوونای باشگاه به نام [[بارسلونا سی]] هم فعالیت کارده.
== وابسته جستارون ==
* [[بارسلون|شهر بارسلونا]]
* [[کاتالونیا]]
* [[لالیگا]]
== پانویسها ==
{{تلمبار|رج|FC Barcelona}}
{{پانویس|اندازه=ریز}}
{{لالیگا}}
[[رج:ایسپانیا فوتوال تیمون|بارسلونا]]
[[رج:بارسلونا| ]]
8uw1e0fhyc8mx61uh2i3p77k2010lfl
390672
390663
2026-07-23T21:59:59Z
محک
1023
اونچی که [[Special:Contributions/~2026-41075-86|~2026-41075-86]] ([[User talk:~2026-41075-86|گپ]]) دچی بییه، دگارسته بیه همونتایی که [[User:محک|محک]] این ولگه دله، اواخر بنویشت بییه.
268822
wikitext
text/x-wiki
{{For|بارسلونا}}
{{شابلون:جعبه اطلاعات تیم فوتوال
| نام باشگاه = باشگاه فوتوال بارسلونا
| تصویر = [[پرونده:FCBLogo.svg.png|200px]]
| توضیحات =
| نام کامل باشگاه = باشگاه فوتوال بارسلونا {{سخ}} (Fútbol Club Barcelona)
| لقب (ها) = آبی و اناریئون
| شعار =
| نام غیر رسمی = بارسا (Barça)، آبی و اناریئون (Blaugranes)
| تاریخ تأسیس = ۲۹ نوامبر ۱۸۹۹
| تاریخ انحلال =
| نام ورزشگاه = [[نیوکمپ]]
| گنجایش = ۹۹٫۳۵۴
| مالک =
| مدیرعامل = [[سندرو راسل]]
| سرمربی = {{flagicon|ESP}} [[ارنستو والورده]]
| لیگ = [[لالیگا]]
| فصل =
| جایگاه =
|فصل جاری =
|الگوی دست چپ۱ = _fcbarcelona1920h
|الگوی بدن۱ = _fcbarcelona1920h
|الگوی دست راست۱ = _fcbarcelona1920h
|الگوی شلوارک۱ =
|الگوی جوراب۱ = _barcelona1920h
|دست چپ۱ = 000080
|بدن۱ = 000080
|دست راست۱ = 000080
|شلوارک۱ = 000080
|جوراب۱ = 000080
|الگوی دست چپ۲ = _fcbarcelona1920a
|الگوی بدن۲ = _fcbarcelona1920a
|الگوی دست راست۲ = _fcbarcelona1920a
|الگوی شلوارک۲ =
|الگوی جوراب۲ = _fcbarcelona1920a
|دست چپ۲ = FFDD00
|بدن۲ = FFDD00
|دست راست۲ = FFDD00
|شلوارک۲ = FFDD00
|جوراب۲ = FFDD00
|الگوی دست چپ۳ = _fcbarcelona1920t
|الگوی بدن۳ = _fcbarcelona1920t
|الگوی دست راست۳ = _fcbarcelona1920t
|الگوی شلوارک۳ = _fcbarcelona1920t
|الگوی جوراب۳ = _fcbarcelona1920t
|دست چپ۳ = 00E8C5
|بدن۳ = 00E8C5
|دست راست۳ = 00E8C5
|شلوارک۳ = 00E8C5
|جوراب۳ = 00E8C5
|نخستین بازی = '''بارسلونا''' ۰ - ۱ ''بونانوا''
| پرگل ترین برد = '''بارسلونا''' ۹ - ۱ ''خیمناستیک دی تاراگونا''
| بدترین باخت = '''بارسلونا''' ۱ - ۱۲ ''اتلتیکو بیلبائو''
| بهترین گلزن تاریخ = {{flagicon|ARG}} لیونل مسی
| گروه هوادارها = '''کولز''' (culés)
| افتخارات = ''داخلی'': ۲۰ قهرمونی [[لالیگا]] دله، ۲۵ قهرمونی
[[جام حذفی]] دله، ۷ قهرمونی [[سوپرکاپ]] و ۲ قهرمونی لیگ کاپ دله<br />''اروپایی'': ۳ قهرمونی [[لیگ قهرمونون اروپا|لیگ قهرموناون]] دله،<br />۳ قهرمونی در [[جام یوفا]]، ۴ قهرمونی در [[جام در جام اروپا]] و ۲ قهرمونی [[سوپرکاپ اروپا]] دله<br />جهونی:اتا بار قهرمونی جام باشگاهئون جهون دله(۲۰۰۹)
|آدرس اینترنتی = <center>[http://www.fcbarcelona.com http://www.fcbarcelona.com]</center>
|گرانترین خرید={{flagicon|BRA}} فیلیپه کوتینیو|گرانترین فروش={{flagicon|BRA}} نیمار}}
'''باشگاه فوتوال بارسلونا''' ''(به اسپانیایی: Fútbol Club Barcelona)'' که بیشتر '''بارسلونا''' یا به صورت مخفف '''بارسا''' بشناسییه وانه، اتا [[فوتوال|باشگاه فوتوال]] حرفهای اسپانیایی هسته که شهر [[بارسلون]] ِ[[کاتالونیا]] [[اسپانیا]] دله دره. این تیم [[لالیگا]] دله بازی کانده و جزو سه تیمی هسته که هنتا به دسته پایینتر سقوط نکاردنه.
این باشگاه با عنوان '''باشگاه فوتوال بارسلونا''' سال ۱۸۹۹ توسط عدهای اهل [[سوئیس]]، [[انگلیس]] و اسپانیا و به رهبری [[خوان گمپر]] تاسیس بیّه. باشگاه به نوعی، نهادی ترویج فرهنگ [[کاتالان]] و [[کاتالانیسم]] وسّه هسته و از این رو عبارت «فراتر از یک باشگاه» (Més que un club) ره به عنوان شه شعار انتخاب هاکرده. سرود رسمی باشگاه، ''El Cant del Barça''، اثر جوزپ ماریا، اسپیناس اسم دانّه. برخلاف خله از تیمئون جهون این تیم توسط هوادارونش اداره وانه. بارسلونا دومین تیم ثروتمند جهون با درآمد ۳۹۸ میلیون یورو هسته. این باشگاه رقابت دیرینهای با [[رئال مادرید]] دانّه و به مسابقهای که بین این دِتا تیم برگزار کانّه [[ال کلاسیکو]] بائوته وانه.
تیم فوتوال بارسلونا با ۲۰ قهرمونی لالیگا دله، ۲۵ قهرمونی جام حذفی دله، ۷ قهرمونی سوپرکاپ دله و ۲ قهرمونی لیگ کاپ دله، بعد از [[رئال مادرید]] پرافتخارترین تیم اسپانیا هسته. وشون همچنین با بَوردن ۹ عنوان اصلی [[اروپا]] دله، اتا از موفقترین تیمئون حاضر اروپا دله هستنه.<ref name="UEFA">{{یادکرد وب |نشانی=http://www.uefa.com/footballeurope/club=50080/domestic.html |عنوان=فوتوال اروپا: باشگاه فوتوال بارسلونا |تاریخ بازدید=۲۹ مه ۲۰۰۸ |ناشر= اتحادیه فوتوال اروپا ([[یوفا]])([UEFA http://www.uefa.com])|سال=|زبان=انگلیسی |فرمت=}}</ref>
۳ قهرمونی [[لیگ قهرمونون اروپا|لیگ قهرمونون]] دله،
۳ قهرمونی [[جام یوفا]] دله، ۴ قهرمونی [[جام جام دله اروپا]] دله و ۲ قهرمونی [[سوپرکاپ اروپا]] دله دستبییارده.
در سال ۲۰۰۹، بارسلونا موفق بیّه اولین باشگاهی بائه که [[سهگانه (فوتوال)|سهگانه]] لالیگا، [[کوپا دل ری]] و لیگ قهرمونون
باشگاهئون اروپا راه به دست بییاره. همینتی بارسلونا تنها تیمی هسته که از سال ۱۹۵۵ همواره جام باشگاهئون اروپا دله حاضر بییه.
[[استادیوم]] باشگاه [[نیوکمپ]] اسم دانّه، که با گنجایش ۹۹٫۳۵۴ تماشاگر، گتترین استادیوم اروپا هسته. بارسلونا از درجه بالایی از محبوبیت برخوردار هسته، حدود ۲۵٫۷% مردم اسپانیا طرفدار بارسلونا هستنه<ref name="cis">{{یادکرد وب |نشانی=
http://www.cis.es/cis/export/sites/default/-Archivos/Marginales/2700_2719/2705/Es2705mar_A.pdf
|عنوان=
Centro de Investigaciones Sociológicas |تاریخ بازدید=۱۱ می ۲۰۰۷
|ناشر= |سال=|زبان=انگلیسی |فرمت=PDF}}</ref>، و این در حالیست که
بر اساس بررسیای که اخیراً انجام بیته، بارسلونا با داشتن ۴۴٫۲ میلیون
هوادار اروپا دله، پرطرفدارترین تیم حاضر اروپا هم هسته<ref
name="ET">{{یادکرد وب |نشانی=
http://www.earthtimes.org/articles/show/255305,survey-barcelona-is-most-popular-club-england-dethrone-spain.html
|عنوان= نتیجه یک بررسی: بارسا محبوب ترین باشگاه، انگلیس، اسپانیا را به زیر کشید.
|تاریخ بازدید=۱۱ فوریه ۲۰۰۹ |ناشر= وبگاه [earthtimes http://www.earthtimes.org]|سال=۲۰۰۹|زبان=انگلیسی
|فرمت=}}</ref>. باشگاه همچنین با داشتن ۱۵۶٬۳۶۶ عضو رسمی ژوئن ۲۰۰۷، بیشترین عضو ثبت نوم بَیی ره میون تموم باشگاهئون فوتوال دنیا دانّه. طرفدارون بارسلونا همچنین به ''culés'' معروفنه. بارسلونا رقابت بینظیری با رئال مادرید داشته و با این تیم اتا از مشهورترین مسابقهئون فوتوال جهون دله موسوم به [[ال کلاسیکو]] رقابت کانّه.
فصل ۰۸-۲۰۰۷ بارسلونا با درآمدی بالغ بر ۳۰۸٫۸ میلیون [[یورو]] تبدیل به
سومین باشگاه ثروتمند جهون بیّه. بارسلونا دارای تیم دومی به نام [[بارسلونا اتلتیک]] هم هسته و تا قبل از ۲۰۰۷، تیم جوونای باشگاه به نام [[بارسلونا سی]] هم فعالیت کارده.
== وابسته جستارون ==
* [[بارسلون|شهر بارسلونا]]
* [[کاتالونیا]]
* [[لالیگا]]
== پانویسها ==
{{تلمبار|رج|FC Barcelona}}
{{پانویس|اندازه=ریز}}
{{لالیگا}}
[[رج:ایسپانیا فوتوال تیمون|بارسلونا]]
[[رج:بارسلونا| ]]
saar3mzula75sp01321ct6663nnqxvc
فرانسیوم
0
8623
390676
325390
2026-07-24T02:36:33Z
InternetArchiveBot
25385
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5
390676
wikitext
text/x-wiki
{{خار بنویشته}}
{{Elementbox
|number=87
|symbol=Fr
|name=فرانسیم
|pronounce={{IPAc-en|ˈ|f|r|æ|n|s|i|əm}}<br />{{respell|FRAN|see-əm}}
|left=رادون
|right=رادیم
|above=Cs
|below=Uue
|series = فلزات قلیایی
|group=1
|period=7
|block=s
|appearance= فلزی
|image name=
|atomic mass=(۲۲۳)
|electron configuration=&#91;رادونRn&#93; 7s<sup>1</sup>
|electrons per shell= 2, 8, 18, 32, 18, 8, 1
|phase= جامد
|density gpcm3nrt= 1.87
|melting point K=? 300
|melting point C=? 27
|melting point F=? 80
|boiling point K=? 950
|boiling point C=? 677
|boiling point F=? 1250
|heat fusion= ca. 2
|heat vaporization= ca. 65
|vapor pressure 1= 404
|vapor pressure 10= 454
|vapor pressure 100= 519
|vapor pressure 1 k= 608
|vapor pressure 10 k= 738
|vapor pressure 100 k= 946
|vapor pressure comment=(extrapolated)
|crystal structure= cubic body-centered
|oxidation states= ۱ (اکسید بازی بسیار قوی)
|electronegativity= ۰.۷
|number of ionization energies=۱
|1st ionization energy= 380
|covalent radius= 260
|Van der Waals radius=۳۴۸ آنگستروم
|magnetic ordering= پارامغناطیس
|electrical resistivity= 3 µ
|thermal conductivity= 15
|CAS number= 7440-73-5
|isotopes=
{{Elementbox_isotopes_decay | mn=221 | sym=Fr
| na=[[synthetic radioisotope|syn]] | hl=4.8&nbsp;min
| dm=α | de=6.457 | pn=217 | ps=استاتین|At }}
{{Elementbox_isotopes_decay | mn=222 | sym=Fr
| na=syn | hl=14.2&nbsp;min
| dm=[[پرتو بتا|β<sup>–</sup>]] | de=2.033 | pn=222 | ps=[[Radium|Ra]] }}
{{Elementbox_isotopes_decay2 | mn=223 | sym=Fr
| na=trace | hl=22.00&nbsp;min
| dm1=β<sup>–</sup> | de1=1.149 | pn1=223 | ps1=Ra
| dm2=α | de2=5.430 | pn2=219 | ps2=At }}
|isotopes comment=
}} {{Template reference list}}
'''فرانسیُم''' (به فرانسوی: Francium) با اسمئون قدیمی کا-سزیم و یا اکتینیم {{چر}}''K''،{{رچ}}<ref name="shimi" /> عنصری شیمیایی با نماد ''Fr'' و عدد اتمی ۸۷ هسته که گروه ''IA'' ([فلزون قلیایی) و دوره هفتم دله قرار بیته.<ref name="shimi">{{یادکرد|نویسنده=آقاپور مقدم، علیرضا توکلی صابری|کتاب=فرهنگ عناصر|سال=۱۳۶۹|ناشر=انتشارات اطلس}}</ref> این عنصر، اتا الکترون ظرفیتی دانّه و میون همه عناصر جدول تناوبی، کمترین الکترونگاتیو ره دانّه.
دمای ذوب و جوش فرانسیم به ترتیب ۲۷ و ۶۷۷ درجه سانتیگراد هسنه، و ونه شعاع اتمی ۲۷۰ پیکومتر وانه.<ref>[https://web.archive.org/web/20101123174904/http://periodic.lanl.gov/elements/87.html Los Alamos, Chemistry Division]</ref>
مارگوریت پری، فرانسیم ره سال ۱۹۳۹ [[فرانسه]] دله کشف هاکرده،<ref name=anasor>عناصر جهون بنویشته گ سیبورگ ا.والنس ترجمه مظفرزاده، خواجه نصیرطوسی صفحه ۹۲-۹۳</ref><ref name="roshd">{{یادکرد وب|نشانی=http://daneshnameh.roshd.ir/mavara/mavara-index.php?page=فرانسیم&SSOReturnPage=Check&Rand=0|عنوان=فرانسیم|ناشر=[[دانشنامهٔ رشد|دانشنامه رشد]]|تاریخ بازدید=۲۶ سپتامبر ۲۰۰۸}}</ref><ref>{{یادکرد وب|نشانی=http://books.google.com/books?id=mJQrAAAAYAAJ&printsec=frontcover&dq=Francium&ei=97vXSfDKGaGSzgSMl-iAAw&client=firefox-a#PPA1,M1|عنوان=The radiochemistry of francium|تاریخ بازدید=۴ آوریل ۲۰۰۹|زبان=انگلیسی}}</ref> به همین دلیل این عنصر فرانسیم اسم بیته.<ref name="shimi" /> این عنصر آخرین عنصر کشف بَیی هسته که طبیعت دله به طور آزاد وجود داشته و پس از [[استاتین]] کمیابترین عنصر بشناسی بَیییه.
فرانسیم بیرون از آزمایشگاه، به طور خله ناچیزی سنگ معدن [[اورانیوم]] و [[توریوم]] دله پیدا وانه، جایی که ایزوتوپ ۲۲۳ وه به طور پیاپی تشکیل و متلاشی وانه. تخمین بزونه که حدود ۳۰ گرم فرانسیم پوسته [[زمین]] دله وجود دانّه. سایر ایزوتوپئون فرانسیم به طور مصنوعی و آزمایشگاه دله بساته بینه. بیشترین مقداری که اسا فرانسیم جه به طور مصنوعی ایجاد بَیییه، ات خوشه ۱۰٬۰۰۰ اتمی بییه که از طریق ابر اتمی سرد و دانشگاه استونی بروک دله و سال ۱۹۹۷ بساته بیّه.<ref name="CRC2006">{{یادکرد |سال =2006 |کتاب= CRC Handbook of Chemistry and Physics |جلد = ۴ |صفحه= ۱۲ |ناشر= CRC |شابک=ISBN 0-8493-0474-1 }}<small>(یادکرد دست دوم)</small></ref> فرانسیم پس از فروپاشیین به [[استاتین]]، رادیوم و رادون تبدیل وانه.<ref name=ab />
== تاریخچه ==
حدود سالای دهه ۱۸۷۰ شیمیدانها متوجه بینه که ونه عنصری با عدد اتمی ۸۷ گروه فلزات قلیایی دله زیر [[سزیم]] وجود داشتبائه.<ref name="andyscouse" /> این عنصر با اسم اکا سزیم پیشبینی بیّه.<ref name="chemeducator">Adloff, Jean-Pierre; Kaufman, George B. (2005-09-25). [https://web.archive.org/web/20130604212956/http://chemeducator.org/sbibs/s0010005/spapers/1050387gk.htm Francium (Atomic Number 87), the Last Discovered Natural Element]. ''The Chemical Educator'' '''10''' (5). Retrieved on ۲۰۰۷ -03-26.</ref><ref name="shimi" /> گروهئون پژوهشی تلاششون ره پیداهاکردن و خالصسازی این عنصر ناشناخته وسّه شروع هاکردنه و پس از ۴ تلاش ناموفق، این عنصر بساته بیّه.
=== اکتشافات ناقص و ناتموم ===
[[دوبروسردوف]] شیمیدون روسی اولین شخصی بییه که ادعای کشف عنصری به نام فرانسیم یا اکا سزیم ره عنوان هاکرده.
سال ۱۹۲۵ وه متوجه وجود رادیواکتیویته ضعیفی ات نمونه پتاسیم دله بیّه و بفهمسته که این نمونه ممکن هسته حاوی مقداری از عنصر جدید بائه.<ref name="fontani">{{یادکرد گردهمایی| اول = Marco| آخر= Fontani| عنوان = The Twilight of the Naturally-Occurring Elements: Moldavium (Ml), Sequanium (Sq) and Dor (Do)| عنوانکتاب = International Conference on the History of Chemistry| صفحات = 1–8| تاریخ= 2005-09-10| مکان=لیسبون| نشانی= http://web.archive.org/web/20070709173005/http://5ichc-portugal.ulusofona.pt/uploads/PaperLong-MarcoFontani.doc| archiveurl = http://web.archive.org/web/20060224090117/http://5ichc-portugal.ulusofona.pt/uploads/PaperLong-MarcoFontani.doc| archivedate=2006-02-24| تاریخ بازدید = 2007-04-08 }}<small>نشانی اصلی:https://web.archive.org/web/20060224090117/http://5ichc-portugal.ulusofona.pt/uploads/PaperLong-MarcoFontani.doc</small></ref> سپس وه رسالهای در مورد خواص این عنصر بنویشته و بهخاطر نام کشورش وه ره روسیوم اسم بییشته<ref name="vanderkroft">{{یادکرد وب| نویسنده=پیتر وندرگروت| عنوان= Francium| کار = Elementymology & Elements Multidict| تاریخ= 2006-01-10| نشانی = http://www.vanderkroft.net/elements/elem/fr.html| تاریخ بازدید = 2007-04-08 |زبان=انگلیسی}}</ref>.اتکم بعد از وه دوبروسردوف به تدریس انستیتوی پلیمر اودسای [[اوکراین]] دله شروع هاکرده و تحقیقات بیشتری در زمینه این عنصر به عمل نییلرده.<ref name="fontani"/>
سال بعد، شیمیدانون انگلیسی [[جرالد دروس]]<ref group="پانویس">Gerald J. F. Druce</ref> و [[فردریک لورینگ]]<ref group="پانویس">Frederick H. Loring</ref> عکسای اشعه ایکس منگنز(II) سولفات ره بررسی هاکردنه.<ref name="vanderkroft"/>وشون این موشاهده دله به خطوط طیفی برخورد هاکردنه که گمون وَردنه مربوط به اکا-سزیم بائه. وشون این کشفیات ره اعلام هاکردنه و وه ره آلکالینیوم اسم بییشتنه.<ref name="fontani"/>
سال ۱۹۳۰ فرد آلیسون<ref group="پانویس">Fred Allison</ref> موسسه پلیتکنیک آلاباما دله مدعی بیّه که زمون بررسی پلوسیت و لپیدولیت با ماشین نور-مغناطیس<ref group="پانویس">magno-optic</ref> عنصر ۸۷ ره کشف هاکردنه. آلیسون پیشنهاد هدائه که بخاطر زادگاهش یعنی ایالت [[ویرجینیا]] این عنصر ویرجنیوم بائه و نماد Vi یا Vm بَیره.<ref name="vanderkroft"/><ref>{{یادکرد|فصل=|کتاب=|ناشر= |چاپ= |شهر= |کوشش= |ویرایش= |سال=|شابک=|نویسنده= |نویسندگان سایر بخشها=|ترجمه=|صفحه= |زبان=en |مقاله= [http://www.time.com/time/magazine/article/0,9171,743159,00.html Alabamine & Virginium] |ژورنال= |نشریه=TIME |تاریخ=1932-02-15 |دوره= |شماره= |شاپا=}} Retrieved on 2007-04-01.</ref> البته سال ۱۹۳۴ مک فرسون دانشگاه برکلی دله این اکتشاف نادرست ره رد هاکرده.<ref>{{یادکرد| نویسنده=اچ مکفرسون G.| مقاله =[http://prola.aps.org/abstract/PR/v47/i4/p310_1 An Investigation of the Magneto-Optic Method of Chemical Analysis] | نشریه= Physical Review| شماره= 47| دوره = 4| صفحه= 310–315| ناشر= انجمن فیزیک آمریکا| تاریخ= 1934-12-21}}</ref>
سال ۱۹۳۶ هوریا هولوبی<ref group="پانویس">Horia Hulubei</ref> شیمیدون فرانسوی به همراه ونه فرانسوی رفخ ایوت کاچویس<ref group="پانویس">Yvette Cauchois</ref> پولوسیت ره با استفاده از دستگاه اشعه ایکس با دقت بالا آنالیز هاکردنه.<ref name="fontani"/>وشون متوجه وجود چندین خطوط نشر ضعیف بَینه که به عنصر ۸۷ نسبت هدانه. این عنصر به افتخار [[مولداوی]] که آزمایشات اونجه انجام بیّه، مولداویوم نام بیته و نماد وه هم Ml تعیین بیّه. سال ۱۹۳۷ تحقیقات هولوبی بهوسیله ات فیزیکدون آمریکایی بهنام اف اچ هرش<ref group="پانویس">F. H. Hirsh Jr.</ref> رد بیّه. هرش اطمینان داشته که اکا-سزیم طبیعت دله وجود ندانّه و وشون به اشتباه خطوط نشر جیوه یا بیسموت ره بدینه. گرچه هولوبی تاکید کارده که ونه دستگاهئون دقیق نینه که چنین اشتباهی ره مرتکب نوانّه.<ref name="vanderkroft"/>
به همین خاطر ژان باپستیت پرین<ref group="پانویس">Jean Baptiste Perrin</ref> برنده نوبل جایزه و استاد هولوبی به کمک مارگوریت پری<ref group="پانویس">Marguerite Perey</ref> مولداویوم ره بهعنوان فرانسیم مورد تایید قرار هدائه.<ref name="fontani"/>
== مشخصات ==
[[پرونده:Electron shell 087 Francium.svg|thumb|left|200px|هسته اتم فرانسیم]]
به علت نایابی و ناپایداری امکان سِواکردن اتمئون فرانسیم به حدی که قابل اندازهگیری بائن نییه به همین دلیل ونه خواص وسّه ونه روی ونه جاء جدول تناوبی سر تکیه هاکردن.<ref>{{یادکرد|کتاب=شیمی ۲ و آزمایشگاه رشته ریاضی فیزیک-علوم تجربی|فصل=خواص تناوبی عنصرها|نویسندهمنصور عابدینی، علی سیدی اصفهانی، بهرام قنبری و نعمتالله ارشدی|ناشر=شرکت چاپ و نشر کتابهای درسی ایران|سال=۱۳۸۷}}</ref>
فرانسیم اتا از فلزون قلیایی هسته که خواصی شبیه به [[سزیم]] دانّه.<ref name="CRC2006" />
فرانسیم ناپایدارتر از هر عنصر سبکتر از دابنیوم (عنصر شماره ۱۰۵) هسته.<ref name="CRC2006" /> پایدارترین ایزوتوپ فرانسیم ۲۲۳ با نیم عمر کمتر از ۲۲ دقیقوئه. عنصر ناپایدار بعدی استاتین نیم عمری حدود ۸٫۵ ساعت دانه.<ref name="andyscouse" /> تمام ایزوتوپون فرانسیم پس از فروپاشی به استاتین، رادیوم و رادون تبدیل وانه.<ref name="andyscouse">{{یادکرد وب| نویسنده=اندی پرایس| عنوان = Francium| تاریخ= 2004-12-20| نشانی= http://www.andyscouse.com/pages/francium.htm| تاریخ بازدید = 2007-03-25 |زبان=انگلیسی}}</ref>
با توجه به اینکه فرانسیم اتا از عناصر چگال جدول تناوبی هسته و اینکه تعداد الکترون لایه ظرفیتش ۱ هسته،<ref>{{یادکرد وب| نویسنده=مارک وینتر | عنوان= Electron Configuration| کار= Francium|ناشر=دانشگاه شفیلد| نشانی= http://www.webelements.com/webelements/elements/text/Fr/eneg.html|تاریخ بازدید= 2007-04-18 |زبان=انگلیسی}}</ref> بنابراین ونه وزن اکی والان همه عناصر جه بیشتر هسته.<ref name="CRC2006" />به محاسبه لینوس پاولینگ مقدار الکترونگاتیوی فرانسیم ونه [[سزیم]] جا برابر و حدود ۰.۷ بائه<ref>{{یادکرد|فصل= |کتاب=The Nature of the Chemical Bond (3rd Edn.)|ناشر= Cornell University Press|چاپ= |شهر= |کوشش= |ویرایش= |سال= 1960 |شابک= |نویسنده=Pauling, {{چر}}Linus |نویسندگان سایر بخشها=|ترجمه=|صفحه=93 |زبان=en |مقاله= |ژورنال= |نشریه= |تاریخ= |دوره= |شماره= |شاپا=}}</ref> گرچه محاسبات جدیدتر ونه قایده ره ۰.۷۹ نشان دنّه اما این مقدار به طور تجربی تائید نیّه<ref>{{یادکرد|فصل=|کتاب=|ناشر= |چاپ= |شهر= |کوشش= |ویرایش= |سال=|شابک=|نویسنده= Allred, A. L.|نویسندگان سایر بخشها=|ترجمه=|صفحه=215–221 |زبان=en |مقاله= Electronegativity values from thermochemical data |ژورنال= [[Journal of Inorganic and Nuclear Chemistry|''J. Inorg. Nucl. Chem.'']] |نشریه=|تاریخ= 1961 |دوره=17 |شماره= 3–4 |شاپا= [[Digital object identifier|doi]]: <span class="neverexpand">[http://dx.doi.org/{{urlencode:10.1016/0022-1902(61)80142-5}} {{#tag:nowiki|10.1016/0022-1902(61)80142-5}}]</span> }}</ref> به طور مشابه فرانسیم کمترین الکترونگاتیوی ره بین عناصر دانه<ref>{{یادکرد وب|نشانی=http://www.webelements.com/francium/electronegativity.html|عنوان=Francium: electronegativities|تاریخ بازدید=۲۶ فوریه ۲۰۰۹|زبان=انگلیسی|ناشر=webelements}}</ref><ref>David R. Lide (ed), CRC Handbook of Chemistry and Physics, 84th Edition. CRC Press. Boca Raton, Florida, 2003; Section 9, Molecular Structure and Spectroscopy; Electronegativity<small>(ارجاع دست دوم)</small></ref><ref>Wikipedia contributors, "Electronegativities of the elements (data page)," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Electronegativities_of_the_elements_(data_page)&oldid=267722701 (accessed February 27, 2009).</ref><ref>J.A. Dean (ed), Lange's Handbook of Chemistry (15th Edition), McGraw-Hill, 1999; Section 4; Table 4.5, Electronegativities of the Elements<small></small></ref><ref name="roshd"/>
فرانسیم مایع -در صورتی که تشکیل بوو- دمای ذوب تنش سطحی برابر ۰٫۰۵۰۹۲ نیوتن بر [[متر]] ونه داره.<ref>{{یادکرد| نویسنده=ال.وی کوژیتو| coauthors = Kol'tsov, V. B., and Kol'tsov, A. V.|عنوان= Evaluation of the Surface Tension of Liquid Francium| ژورنال = Inorganic Materials| شماره = ۳۹| دوره = ۱۱| صفحه= ۱۱۳۸–۱۱۴۱| ناشر= Springer Science & Business Media B.V.| تاریخ = ۲۰۰۳-۰۲-۲۱| نشانی = http://search.ebscohost.com/login.aspx?direct=true&db=aqh&AN=16822434&site=ehost-live| تاریخ بازدید = ۲۰۰۷-۰۴-۱۴ }}</ref> فرانسیم بتونده نمکئون سزیم جا مثل پرکلرات، یدات، تارتارات، کلروپلاتینات و سیلیکوتنگستات سزیم (و [[روبیدیوم تاتارات]]) واکنش دنه. همچنین با سیلیسیوم تنگستن و کلورپلاتینید واکنش هدائه و به ترتیب تولید سیلیکو تنگستن اسید و پرکلریک اسید هاکرده.<ref>{{یادکرد |نویسنده=ای.کا هاید |مقاله= Radiochemical Methods for the Isolation of Element 87 (Francium) |نشریه= [[J. Am. Chem. Soc.]] |سال= 1952 |شماره= 74 |دوره= 16 |صفحه= 4181–4184 |doi= 10.1021/ja01136a066 }}<small>(یادکرد دست دوم)</small></ref><ref>E. N K. Hyde ''Radiochemistry of Francium'',Subcommittee on Radiochemistry, National Academy of Sciences-National Research Council; available from the Office of Technical Services, Dept. of Commerce, 1960.<small>(یادکرد دست دوم)</small></ref> نمکون فرانسیم عمدتاً [[ئو]] دله محلول هستنه.<ref>A. G. Maddock. Radioactivity of the heavy elements. ''Q. Rev., Chem. Soc.'', '''1951''', ''3'', 270–314. {{doi|10.1039/QR9510500270}} <small>(یادکرد دست دوم)</small></ref>
== کاربردها ==
فرانسیم به علت ناپایداری و کمیاب بیین،<ref>{{یادکرد وب| نویسنده=وینتر مارک| عنوان= Uses|کار = Francium| ناشر= The University of Sheffield| نشانی= http://www.webelements.com/webelements/elements/text/Fr/uses.html| تاریخ بازدید= 2007-03-25 |ژبان=انگلیسی}}</ref><ref name="s">{{یادکرد وب| نویسنده=بنتور ینون| عنوان = Chemical Element.com - Francium| نشانی= http://www.chemicalelements.com/elements/fr.html| تاریخ بازدید= 2007-03-25 |زبان=انگلیسی}}</ref><ref name="nbb">{{یادکرد | نویسنده=امسلی جان| کتاب= Nature's Building Blocks| ناشر= انتشارات دانشگاه آکسفورد| سال چاپ= 2001| شهر=آکسفورد|صفحه= 151–153| شابک=ISBN 0-19-850341-5 }}<small>(یادکرد دست دوم)</small></ref><ref name="elemental">{{یادکرد وب| نویسنده=استیو گاگنون| عنوان= Francium| ناشر = Jefferson Science Associates, LLC|نشانی= http://web.archive.org/web/20071007192925/http://education.jlab.org/itselemental/ele087.html| تاریخ بازدید= 2007-04-01 |زبان=انگلیسی}}<small>نشانی اصلی:https://web.archive.org/web/20070331235139/http://education.jlab.org/itselemental/ele087.html</small></ref><ref name="nostrand332" /> کاربرد تجاری نداینه.
پژوهشئونی درباره کاربرد فرانسیم درمان [[سرطان]] سر انجام بیّه،<ref name="andyscouse" /> ولی انجام این عمل ناممکن به نظر رسنه.<ref name="nbb" /> قابلیتئون فرانسیم مثل سنتز بیّن و همچنین ونه ساختار اتمی ویژه باعث بیییه که ونجه آزمایشئون طیف سنجی دله استفاده هاکنن.<ref>{{یادکرد| نویسنده=ای.گومز| coauthors = Orozco, L A, and Sprouse, G D| مقاله=[http://www.iop.org/EJ/abstract/0034-4885/69/1/R02/ Spectroscopy with trapped francium: advances and perspectives for weak interaction studies] | نشریه= Rep. Prog. Phys.| شماره = 69| دوره = 1| صفحه= 79–118| تاریخ= 2005-11-07| doi = 10.1088/0034-4885/69/1/R02| تاریخ بازدید = 2007-04-11 }}</ref> این آزمایشها به درک اطلاعات بیشتری زمینه پتانسیل شیمیایی و ذرات زیر اتمی سر برسییه.<ref>{{یادکرد|فصل=|کتاب=|ناشر= |چاپ= |شهر= |کوشش= |ویرایش= |سال=|شابک=|نویسنده=Gomez, {{چر}}E |نویسندگان سایر بخشها=Orozco, L A, and Sprouse, G D|ترجمه=|صفحه=79–118 |زبان=en |مقاله= [http://www.iop.org/EJ/abstract/0034-4885/69/1/R02/ Spectroscopy with trapped francium: advances and perspectives for weak interaction studies] |ژورنال= Rep. Prog. Phys. |نشریه=|تاریخ=2005-11-07 |دوره=69 |شماره= 1 |شاپا= [[Digital object identifier|doi]]: <span class="neverexpand">[http://dx.doi.org/{{urlencode:10.1088/0034-4885/69/1/R02}} {{#tag:nowiki|10.1088/0034-4885/69/1/R02}}]</span> }} Retrieved on 2007-04-11.</ref> به نظر رسنه که بنشنه فرانسیم جه آزمایشات مربوط به نیروگاه هستهای و سیکلوترونها دله استفاده هاکردن.<ref name="NeBB" />
مطالعات نور گسیلبَیی توسط یونئون فرانسیم-۲۱۰ جه که توسط لیزر جه تله دکتنه سر، هداییئون دقیقی راجع به گذارون بین ترازون انرژی اتمی امه اختیار بییشتنه که شباهت نسبتاً زیادی به نتایج پیشبینی بَیی نظریه کوانتمی دارنه.<ref>{{یادکرد|فصل=|کتاب=|ناشر= |چاپ= |شهر= |کوشش= |ویرایش= |سال=|شابک=|نویسنده=Peterson, {{چر}}I |نویسندگان سایر بخشها=|ترجمه=|صفحه=294 |زبان=en |مقاله= [http://search.ebscohost.com/login.aspx?direct=true&db=ulh&AN=9605167788&site=src-live Creating, cooling, trapping francium atoms] |ژورنال= |نشریه=Science News |تاریخ=1996-05-11 |دوره= |شماره= |شاپا=}} Retrieved on 2007-04-11. </ref>
== وجود ==
[[پرونده:Pichblende.jpg|thumb|left|ات سنگ اورانیت با حدود ۱۰۰٬۰۰۰ اتم (3.3{{e|−20}} g) فرانسیم-۲۲۳ جه.<ref name="nbb" />]]
=== طبیعت دله ===
فرانسیم ۲۲۳ نتیجه فروپاشی آلفای آکتینیوم ۲۲۷ هسته که سنگ معدن توریوم و اورانیوم دله پیدا وانه.<ref name="CRC2006" />مقدار مشخصی از اورانیوم دله، گمون شونه که به ازای صد میلیون اتم اورانیوم ات اتم فرانسیم پیدا وانه.<ref name="nbb" />همچنین تخمین بزونه که تموم پوسته زمین دله حدود ۳۰ [[گرم]] فرانسیم موجود داره.<ref>{{یادکرد وب
| نویسنده=مارک وینتر
| عنوان= Geological information
| کار= Francium
| ناشر = The University of Sheffield
| نشانی = http://www.webelements.com/webelements/elements/text/Fr/geol.html
| تاریخ بازدید = 2007-03-26 |زبان=انگلیسی}}</ref><ref name="roshd" />بنابراین فرانسیم بعد از [[استاتین]] کمیابترین عنصر زمین هسته.<ref name="andyscouse" /><ref name="nbb" />
=== حاصل سنتز ===
فرانسیم بتونده واکنش هستهای Au(۱۹۷) + O(۱۸) → Fr(۲۱۰) + ۵n بوئه و از این طریق دانشگاه استونی بروک بتونسته مقدار زیادی ایزوتوپئون ۲۰۹،۲۱۰ و ۲۱۱ فرانسیم ره تهیه هاکنه<ref name="sbproduction">{{یادکرد وب| عنوان= Production of Francium| کار= Francium| ناشر= [[دانشگاه استونی بروک|SUNY Stony Brook]] Physics & Astronomy| تاریخ = 2007-02-20| نشانی=http://web.archive.org/web/20071012010344/http://fr.physics.sunysb.edu/francium_news/production.HTM| تاریخ بازدید= 2007-03-26 |زبان=انگلیسی}}<small>نشانی اصلی:http://fr.physics.sunysb.edu/francium_news/production.HTM</small></ref>.که روش مشتق بَیی تله مغناطونوری هسته.<ref group="پانویس">این روش سِواسازی فرانسیم سر کاربرد دانّه</ref><ref name="sbtrapping">{{یادکرد وب| عنوان= Cooling and Trapping| work = Francium|ناشر= [[دانشگاه استونی بروک|SUNY Stony Brook]] Physics & Astronomy| تایخ = 2007-02-20| نشانی = http://web.archive.org/web/20080122073747/http://fr.physics.sunysb.edu/francium_news/trapping.HTM| تاریخ بازدید = 2007-05-01 |زبان=انگلیسی}}<small>نشانی اصلی:https://web.archive.org/web/20071122170110/http://fr.physics.sunysb.edu/francium_news/trapping.HTM</small></ref> بجز این، روشون بمبوارش رادیوم با نوترون و بمبوارش توریوم با پروتون، دوتریوم و یونای هلیوم سنتز فرانسیم دله به کار شونّه. فرانسیم سال ۲۰۰۸ تاسا مقیاس قابل توجه سنتز نییئه.<ref name="CRC2006" /><ref name="andyscouse" /><ref name="nbb" /><ref name="losalamos">{{یادکرد وب| عنوان = Francium| ناشر = [http://www.lanl.gov/آزمایشگاه ملی لوس آموس] بخش شیمی| تاریخ = 2003-12-15| نشانی= http://periodic.lanl.gov/elements/87.html| تاریخ بازدید= 2007-03-29 |زبان=انگلیسی}}</ref>
در روش تله مغناطونوری اتمئون فرانسیم از طریق میدون مغناطیسی بساته وانّه توسط مس سِوا وانّه و توسط لیزر تله کفنّه.<ref name="sbtrapping" />
== ایزوتوپها ==
تا [[اسا]] ۳۴ ایزوتوپ فرانسیم عدد جرمی ۱۹۹ تا ۲۳۲ جه بشناسییه بَینه.<ref name=autogenerated1>{{یادکرد |سال= ۲۰۰۶ |کتاب = CRC Handbook of Chemistry and Physics |مصحح =دیوید لید |جلد= ۱۱ |صفحه = ۱۸۰-۱۸۱ |ناشر = CRC |شابک =ISBN 0-8493-0487-3 }}<small></small></ref> فرانسیم هفت ایزومر دانه.<ref name="CRC2006" /> ۲۲۳ و ۲۲۱ تنها ایزوتوپئونی هستنه که طبیعت دله درنه، گرچه ایزوتوپ بسیار دوم بیشتر پیدا وانه.<ref name="nostrand679">{{یادکرد |contribution = Francium |سال = 2005|کتاب= Van Nostrand's Encyclopedia of Chemistry|مصحح=گلن کونسیدین| pages = 679| شهر= New York|ناشر= Wylie-Interscience| شابک =ISBN 0-471-61525-0 }}</ref>
فرانسیم ۲۲۳ پایدارترین ایزوتوپ فرانسیم با نیم عمر ۲۱٫۸ دقیقوئه.<ref name="CRC2006" /><ref name="shimi" /> بعد از وه فرانسیم ۲۱۲ با ۲۰ دقیقه نیمه عمر دره<ref name="NeBB">{{یادکرد|فصل=Francium|کتاب=Nature's Building Blocks|نویسنده =John Emsley|ناشر =Oxford university Press|صفحه=152|سال=2003|شابک=ISBN 0-19-850340-7}}{{یادکرد وب|نشانی=http://books.google.com/books?id=j-Xu07p3cKwC&pg=PA152&dq=Francium&ei=97vXSfDKGaGSzgSMl-iAAw&client=firefox-a#PPA152,M1|عنوان=پیوند مستقیم|تاریخ بازدید=۵ آوریل ۲۰۰۹}}</ref> فرانسیم ۲۲۳ پنجمین محصول فروپاشی اکتینیوم ۲۲۷ هسته.<ref name="nostrand332">{{یادکرد |contribution = Chemical Elements |سال = 2005| کتاب = Van Nostrand's Encyclopedia of Chemistry| مصحح=گلن کونسیدن| صفحه = ۳۳۲| شهر=نیویورک| ناشر= Wylie-Interscience| شابک = ISBN 0-471-61525-0 }}</ref> سپس وه با واپاشی بتا به رادیوم ۲۲۳ (با انرژی واپاشی ۱۱۴۹ کیلوالکترون ولت)و درصد جزئی از وه (۰.۰۰۶%) مسیر دیگه جه با واپاشی آلفا به استاتین ۲۱۹ تبدیل وانه.<ref name=ab>{{یادکرد وب |نویسنده=National Nuclear Data Center |تاریخ=۱۹۹۰ |عنوان=Table of Isotopes decay data |نشانی=http://ie.lbl.gov/toi/nuclide.asp?iZA=870223 |ناشر=آزمایشگاه ملی بروکهاون|تاریخ بازدید=۲۰۰۷-۰۴-۰۴ |زبان=انگلیسی}}.</ref>
فرانسیم ۲۲۱ نیم عمری حدود ۴٫۸ دقیقه دانه<ref name="CRC2006" /> و نهمین محصول فروپاشی نپتونی آکتینیوم ۲۲۵ هسته.<ref name="nostrand332" />سپس وه با فروپاشی آلفا به استاتین ۲۱۷ تبدیل وانه(با انرژی واپاشی ۶.۴۵۷ مگاالکترون ولت)<ref name="CRC2006" />.
آخرین ایزوتوپ پایدار، فرانسیم ۲۱۵ با نیم عمر ۰٫۱۲ میکرو ثانیوئه(انرژی واپاشی ۹.۵۴ کیلوالکترون ولت)<ref name="CRC2006" />.ایزومر ناپایدارتر وه، فرانسیم ۲۱۵m با نیم عمر ۳٫۵ نانو ثانیه هسته.<ref name="NNDClist">{{یادکرد وب |نویسنده=National Nuclear Data Center |تاریخ=۲۰۰۳ |عنوان=Fr Isotopes |نشانی=http://ie.lbl.gov/education/parent/Fr_iso.htm |ناشر=آزمایشگاه ملی بروکهاون|تاریخ بازدید=۲۰۰۷-۰۴-۰۴ |زبان=انگلیسی}}.</ref>
فرانسیم ۲۱۸ هم به طور تخمینی نیمه عمر ۵{{e|-۳}} ثانیه دانّه و با واپاشی آلفا و انرژی ۷.۸۵ مگا الکترون ولت جا به استاتین تبدیل وانه.<ref>{{یادکرد|کتاب=The radiochemistry of francium|نویسنده =Earl K. Hyde|ناشر =Subcommittee on Radiochemistry|صفحه=2
}}{{یادکرد وب|نشانی=http://books.google.com/books?id=mJQrAAAAYAAJ&printsec=frontcover&dq=Francium&ei=97vXSfDKGaGSzgSMl-iAAw&client=firefox-a#PPA2,M1|عنوان=پیوند مستقیم|تاریخ بازدید=۴ آوریل ۲۰۰۹|زبان=انگلیسی}}</ref>
== پانویس ==
{{پانویس|گروه=پانویس}}
== منابع ==
:'''عمومی''':
* {{یادکرد-ویکی
|پیوند = http://en.wikipedia.org/w/index.php?title=Francium&oldid=279057546
|عنوان = Francium
|زبان = انگلیسی
|بازیابی = ۲۳ مارس ۲۰۰۹
}}
* {{یادکرد|نویسنده= ونتسکی|فصل= فرانسیم (کمیابترین کمیابها)|کتاب= در بارهٔ فلزات کمیاب چه میدانید؟|ناشر =انتشارت میر (گوتنبرگ)|مترجم= پروین قاسمی|چاپ=|شهر= [[تهران]]|صفحه=۳۲۶- ۳۱۳|سال=۱۳۶۶|شابک=}}
:'''ویژه''':
{{پانویس|چپچین=بله|۲}}
== پیوند به بیرون ==
{{Commons|Francium}}
* [https://web.archive.org/web/20080516062148/http://www.webelements.com/webelements/elements/text/Fr/index.html WebElements.com - فرانسیم]
* [https://web.archive.org/web/20101123174904/http://periodic.lanl.gov/elements/87.html آزمایشگاه ملی لوس آموس - فرانسیم]
* [http://fr.physics.sunysb.edu/francium_news/frconten.htm دانشگاه استونی بروک]
{{ترتیبپیشفرض:فرانسیم}}
[[رج:عناصر شیمیایی]]
[[رج:فلزهای قلیایی]]
c9cz2gl5acnrrhy3te0yqvgyouxxtxc
تگزاس
0
9208
390675
247913
2026-07-24T01:03:46Z
InternetArchiveBot
25385
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5
390675
wikitext
text/x-wiki
{{Coord|31|N|100|W|region:US-TX_type:adm1st_scale:10000000|display=title}}
{{US state
| Name = تگزاس
| Fullname = تگزاس ایالت<br />Texas
| Former = Republic of Texas
| Former_flag = Previous flag of Texas.svg
| Flag = Flag of Texas.svg
| Flaglink = '''[[تگزاس پرچم]]'''
| Seal =Seal_of_Texas.svg
| Seallink = تگزاس نشون
| Map = Map_of_USA_TX.svg
| Nickname = Lone Star State<br />(اتا اسارهیی ایالت)
| Motto = Friendship<br /> (دوستی)
| Capital = [[آستین]]
| LargestCity = [[هوستون]]
| Governor = ریک پری (ج)
| Senators = خانم کی بایلی هاچینسون (ج)<br /> جان کورنین (ج)
| PostalAbbreviation = TX
| TradAbbreviation = Tex.
| OfficialLang = No Official Language<br />''See [[Languages spoken in Texas|languages of Texas]]''
| AreaRank = ۲<sup>مین</sup>
| TotalAreaUS = ۲۶۱٬۷۹۷
| TotalArea = ۶۷۸٬۰۵۱
| LandAreaUS = 261,797 <!--www.texas.gov Texas Almanac 2006-2007 Edition-->
| LandArea = ۶۷۸٬۰۵۱
| WaterAreaUS = 6,784 <!--www.texas.gov Texas Almanac 2006-2007 Edition-->
| WaterArea = ۱۷٬۵۷۰
| PCWater = ۲٫۵
| PopRank = ۲<sup>مین</sup>
| 2000Pop = ۲۰٬۸۵۱٬۸۲۰
| DensityRank = ۲۸ام
| 2000DensityUS = ۷۹٫۶ <!--quickfacts.census.gov -->
| 2000Density = ۳۰٫۷۵
| AdmittanceOrder = ۲۸<sup>مین</sup>
| AdmittanceDate = ۲۹ دسامبر ۱۸۴۵ میلادی
| TimeZone = [[Central Standard Time Zone|Central]]: [[UTC]]-6/[[Daylight saving time|-5]]
| TZ1Where = most of state
| TimeZone2 =[[Mountain Standard Time Zone|Mountain]]: [[UTC]]-7/[[Daylight saving time|-6]]
| TZ2Where = tip of [[West Texas]]
| Latitude = 25°50'N to 36°30'N
| Longitude = 93°31'W to 106°38'W
| WidthUS = 773 <!-- http://www.texasalmanac.com/environment/ -->
| Width = ۱۲۴۴
| LengthUS = ۷۹۰
| Length = ۱۲۷۰
| HighestPoint = قله گوادالوپ<ref name=usgs>{{یادکرد|فصل=|کتاب=|ناشر= |چاپ= |شهر= |کوشش= |ویرایش= |سال=|شابک=|نویسنده= |نویسندگان سایر بخشها=|ترجمه=|صفحه= |زبان=en |مقاله= [http://erg.usgs.gov/isb/pubs/booklets/elvadist/elvadist.html#Highest Elevations and Distances in the United States] |ژورنال= |نشریه=U.S Geological Survey |تاریخ= 29 April 2005 |دوره= |شماره= |شاپا=}} Retrieved on November 8. </ref>
| HighestElevUS = ۸۷۴۹
| HighestElev = ۲۶۶۷
| MeanElevUS = ۱۷۰۰
| MeanElev = 520
| LowestPoint = [[مکزیک دریامونا]]<ref name=usgs/>
| LowestElevUS = ۰
| LowestElev = ۰
| ISOCode = US-TX
| Website = www.texas.gov}}
'''تگزاس''' {{انگلیسی جه|''Texas''}} اتا ایالت نوم هسته که [[آمریکا]] دله دَره. ونه نیشتنگا [[آستین]] {{انگلیسی جه|''Austin''}} و این ایالتِ لقب، «اتاسارهیی ایالت» هسته.<ref>[https://web.archive.org/web/20130805163012/http://netstate.com/states/intro/tx_intro.htm Texas Lone Star State Capital Austin]</ref> ونه گتی نزدیک به ۶۹۶٬۲۴۱ کیلومتر مربعه، تگزاس [[آمریکا]]ی دوّمین گتِ ایالت هسته.
== نگارخنه ==
<center>
<gallery>
Capitolaustin.jpg|[[آستین]]
PushingUpDYCsGalveston.jpg|اتا قبر گلوستونِ تگزاس دله
San Jacinto Monument (2001-05).jpg|سن جاسینتو ِیادبود، جایی که [[سن جاسینتو جنگ]] ونه دله دکته، و تگزاسیون مکزیک ِارتش ره شکست هدانه و استقلال جه برسینه.
Riverwalk Christmas 05-2.jpg|ئو و هوای مطبوع و صنعت پیشرفته گردشگری شهر سنآنتونیو هر سال باعث جذب بیست میلیون گردشگر به این شهر وونه.
</gallery>
</center>
== منابع ==
{{چپچین}}
{{پانویس}}
{{پایان چپچین}}
== بِریمْ بگردستن ==
{{تلمبار-رج|Texas}}
=== رسمی سایتون ===
* [https://web.archive.org/web/20101125033221/http://www.governor.state.tx.us/ تگزاس فرماندار]
* [http://www.senate.state.tx.us/ تگزاس سنا]
* [http://www.sos.state.tx.us/ تگزاس خارجی امورِ وزیر]
* [http://www.legis.state.tx.us تگزاس پارلمون]
* [https://web.archive.org/web/20081219032210/http://www.supreme.courts.state.tx.us/ تگزاس عالی دادگاه]
* [http://www.oag.state.tx.us/ تگزاس دادستان کل]
* [https://web.archive.org/web/20061105221742/http://www.agd.state.tx.us/ تگزاس مسلح نیروئون]
{{تقسیمات سیاسی ایالات متحده آمریکا}}
[[رج:تگزاس|*]]
[[رج:آمریکای متحده ایالات ایالتون]]
as5apwos6d9w3jvanixpixlg7iz7lai
ییلماز گونی
0
9981
390678
209608
2026-07-24T04:53:23Z
InternetArchiveBot
25385
Rescuing 1 sources and tagging 0 as dead.) #IABot (v2.0.9.5
390678
wikitext
text/x-wiki
{{صندخ/شخص}}
[[پرونده:Guneytomb20091.jpg|انگشتدان|ونه قبر [[پرلاشز]] [[پاریس]] دله.]]
'''یلماز گونِی''' ([[زازاکی]] جه: Yılmaz Güney) (بزائه ۱ آوریل ۱۹۳۷ - بمرده ۹ سپتامبر ۱۹۸۴) کارگردون، فیلمنومهنویس، بازیگر و نویسنده [[زازاکی]] اهل [[تورکیه]] هسته.
وه سال ۱۹۳۷ اتا فقیر خانواده میون اتا از روستائون اطراف [[آدانا]] [[کوردستون]] دله دنیا بموئه. وه وچگی گدر مجبور به کار هاکردن بیّه. وه دانشکده حقوق دانشگاه آنکارا دله مشغول به تحصیل بییه که با آشنایی اتا گت نمایشنومهنویس جه ونه زندگی عوض بیّه. وه چهرهای بشناسیبَیی سوسیالیست هنرمندون جهون میون هسته و ونه فیلمها جه سعی بر نشون هدائن تفاوتون فاحش بین شرق و غرب تورکیه به طور کلی و مناطق [[زازاکی|زازانشین]] و [[کوردستون|کورد نشین]] با دیگه نقاط [[تورکیه]] بییه. بعد از کودتای راستی ارتش وه زندون دکته و با استفاده از مرخصی فرار هاکرده و [[فرانسه]] جه پناه بَییته. اینتا په ونه تورکی تابعیت حذف بیّه. وه سال ۱۹۸۴ ۴۷ سالگی گدر سرطان جه بمرده.
ونه راستی نوم '''یلماز پوتون''' Yilmaz Pütün هسته. اما شه ره '''یلماز گونی''' بنومسته. یلماز شه آخرین مصاحبه دله که اتا از فیلمها درباره بییه، گاته: «این فیلم در اصل سرگذشت کوردی مردمون هسته اما حتی اجازه نداشتمی این فیلم دله [[کوردی زوون]] جه گپ بزنیم و اگه این کار ره کاردمی همه کسایی که فیلم سَره زحمت بکشینه، زندونی بینه…»
ونه وسّه بعضی کوردی فیلمونِ جشنوارهئون دله اتا بخش یِلنه تا ونه یاد زنّه بمونده.<ref>{{وب منبع|زوون= فارسی|لینک= http://kurdpress.com/Fa/NSite/FullStory/News/?Id=44336|عنوان= هشتمین جشنواره فیلم کُردی در لندن | ناشر = کوردپرس|تاریخ = ۱۳۹۲/۲/۲۵|هارشیین تاریخ= }}</ref>
== آثار یلماز گونی ==
یلماز فیلمئون اینان انه:
# ۱۹۸۳ '''دیفار''' (Duvar)
# ۱۹۸۲ '''راه''' (Yol)
# ۱۹۷۸ '''رمه''' (Sürü)
# ۱۹۷۴ '''رفِق''' (Arkadaş)
# ۱۹۷۴ '''بیچارهها/بدبختها''' (Zavallılar)
# ۱۹۷۳ '''بَبا''' (Baba)
# ۱۹۷۱ '''نواجِش''' (Ağıt)
# ۱۹۷۱ '''ناامیدها''' (Umutsuzlar)
# ۱۹۷۱ '''درد''' (Acı)
# ۱۹۷۱ '''اختلاس کنندگون''' (Vurguncular)
# ۱۹۷۱ '''عبرت''' (İbret)
# ۱۹۷۱ '''فراریئون''' (Kaçaklar)
# ۱۹۷۱''' فردا آخرین روز هسته''' (Yarın Son Gündür)
# ۱۹۷۰ '''زنده هدف''' (Canlı Hedef)
# ۱۹۷۰ '''امید''' (Umut)
# ۱۹۷۰ '''عوثمان، پیاده سرباز''' (Piyade Osman)
# ۱۹۷۰ '''هفت شرور''' (Yedi Belalılar)
# ۱۹۶۹ '''وشنا ورگئون''' (Aç Kurtlar)
# ۱۹۶۹ '''اتا زشت مردی''' (Bir Çirkin Adam)
# ۱۹۶۸ '''پیره نوری''' (Pire Nuri)
# ۱۹۶۸ '''سیدخان: خاک ِعروس''' (Seyyit Han: Toprağın Gelini)
# ۱۹۶۷ '''گلوله مه ره اثر نکانده''' (Bana Kurşun İşlemez)
# ۱۹۶۷ '''مه اسم کریمه''' (Benim Adım Kerim)
# ۱۹۶۶ '''اسب، زن، اسلحه''' (At Avrat Silah)
== پیوند به بیرون ==
* [https://web.archive.org/web/20120224011337/http://www.chris-kutschera.com/A/Yilmaz%20Guney.htm آخرین مصاحبه یلماز گونی با کریس کوچرا (به انگلیسی)]
* [https://web.archive.org/web/20120113083824/http://www.sensesofcinema.com/2004/cteq/suru/ مطلبی از وبگاه Senses of Cinema در مورد یلماز گونی] (به انگلیسی)
== منابع ==
{{پانویس}}
* انگلیسی ویکیپدیا
[[رج:کارگردون]]
[[رج:کوردستون گت آدمون]]
6dxo5cjsyoj7fwpsacjftj0awtrh3su
جرجرانی
0
40798
390680
326426
2026-07-24T07:36:26Z
HenryThe
27142
390680
wikitext
text/x-wiki
{{صندخ/موجود
|عکس= Emerging_cicada.jpg
}}
'''جرجرانی''' یا '''جیرجیرانی''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Cicada'') اتا [[بئو|حشره]] نوم هسته که بلندِ چمر جا خوندنّه.
== منابع ==
{{پهنویس}}
{{جونورون}}
[[رج:بئو]]
n81cieyqcczdogav3ogn620tf7ww213
ماژول:Params
828
112844
390662
390304
2026-07-23T13:40:32Z
Grufo
45757
Update from [[d:Special:GoToLinkedPage/mediawikiwiki/Q122696746|master]] using [[mw:Synchronizer| #Synchronizer]]
390662
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_key_list_sorted (tbl, sort_fn)
local nums, words, nn, nw = {}, {}, 0, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
nn = nn + 1
nums[nn] = key
else
nw = nw + 1
words[nw] = key
end
end
table.sort(nums)
table.sort(words, sort_fn)
return nums, words, nn, nw
end
-- Parse a parameter name string and return it as a string or a number
local function get_parameter_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_parameter_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.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 refpipe = {
call_for_each_group = true,
--coins = true,
count = true,
evaluating = true,
for_each = true,
list = true,
list_values = true,
list_maybe_with_names = true,
value_of = true
}
-- 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,
--renaming_to_values = true,
shifting = true,
splicing = true,
--swapping_names_and_values = 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)
local main_frame = child_frame:getParent()
return {
frame = main_frame,
opipe = child_frame.args,
oparams = main_frame.args,
firstposonly = static_iface,
iterfunc = pairs,
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, n_forward)
local nextfn
if ctx.pipe[n_forward] ~= nil then
nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)'
end
if nextfn == nil then error(modulename ..
': You must specify a function to call', 0) end
if library[nextfn] == nil then
if ctx.firstposonly[nextfn] == nil then error(modulename ..
': The function ‘' .. nextfn .. '’ does not exist', 0)
else error(modulename .. ': The ‘' .. nextfn ..
'’ directive can only appear in first position', 0)
end
end
remove_numeric_keys(ctx.pipe, 1, n_forward)
return library[nextfn]
end
-- Main loop
local function main_loop (ctx, start_with)
local fn = start_with
repeat fn = fn(ctx) until not fn
if ctx.n_parents > 0 then error(modulename ..
': One or more ‘merging_substack’ directives are missing', 0) end
if ctx.n_children > 0 then error(modulename ..
', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end
end
-- Load a `setting`-like directive string into the `dest` table
local function set_strings_from_opts (dest, opts, start_from)
local cmd
if opts[start_from] == nil then return start_from - 1 end
cmd = opts[start_from]:gsub('%s+', ''):gsub('/+', '/')
:match'^/*(.*[^/])'
if cmd == nil then return start_from end
local vname, chr
local amap, sep, argc = {}, string.byte('/'), start_from + 1
for idx = 1, #cmd do
chr = cmd:byte(idx)
if chr == sep then
for key, val in ipairs(amap) do
dest[val], amap[key] = opts[argc], nil
end
argc = argc + 1
else
vname = memoryslots[string.char(chr)]
if vname == nil then error(modulename ..
', ‘setting’: Unknown slot ‘' ..
string.char(chr) .. '’', 0) end
table.insert(amap, vname)
end
end
for key, val in ipairs(amap) do dest[val] = opts[argc] end
return argc
end
-- Add a new stack of parameters to `ctx.children`
local function new_substack (ctx)
local currsnap, newparams = ctx.n_children + 1, {}
if ctx.children == nil then ctx.children = { newparams }
else ctx.children[currsnap] = newparams end
ctx.n_children = currsnap
return newparams
end
-- Parse a raw argument containing a `sortfunctions` directive, or
-- `'without_sorting'`, or `nil`
local function load_sort_opt (raw_arg)
if raw_arg == nil then return nil, 1, false end
local trarg = raw_arg:match'^%s*(.-)%s*$'
if trarg == 'without_sorting' then return nil, 2, false, trarg end
local tmp = sortfunctions[trarg]
if tmp == nil then return nil, 1, false, trarg end
return tmp or nil, 2, true, trarg
end
-- Parse optional user arguments of type `...|[let/use]|[...]|[let/use]|[...]|
-- [number of additional parameters]|[parameter 1]|[parameter 2]|[...]`
local function load_child_opts (src, start_from, append_after, params)
local tnamed, tmp1, tmp2
local pin, tbl, mem = start_from, {}, {}
while src[pin] ~= nil and src[pin + 1] ~= nil do
tmp1 = src[pin]:match'^%s*(.*%S)'
if tmp1 == 'let' and src[pin + 2] ~= nil then
tmp1 = get_parameter_name(src[pin + 1])
mem[tmp1], tbl[tmp1], pin = nil, src[pin + 2], pin + 3
--[[
elseif tmp1 == 'expose' then
tmp1 = get_parameter_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_parameter_name(src[pin + 2])
tmp2 = params[tmp1]
mem[tmp1], tbl[get_parameter_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, n_skip, default_style, params)
local style, shf
local tmp = src[n_skip + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then style, shf = default_style, n_skip - 1
else shf = n_skip 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
local dest, argc, tnew, mem = load_child_opts(src, style[2] + shf,
n_exist, params)
tmp = style[1]
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, whoami)
if opts[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No pattern string was given', 0) end
if opts[2] == nil then error(modulename ..
', ‘' .. whoami .. '’: No replacement string was given', 0) end
local ptn, repl, nmax, argc = opts[1], opts[2], tonumber(opts[3]), 3
if nmax ~= nil or (opts[3] or ''):match'^%s*$' ~= nil then argc = 4 end
local flg = opts[argc]
if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg, argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl)
end
-- Parse the arguments of the `with_*_matching` class of modifiers
local function load_pattern_args (opts, whoami)
local keyw
local ptns, state, nptns, cnt = {}, 0, 0, 1
for _, val in ipairs(opts) do
if state == 0 then
nptns, state = nptns + 1, -1
ptns[nptns] = { val, false, false }
else
keyw = val:match'^%s*(.*%S)'
if keyw == nil or mkeywords[keyw] == nil or (
state > 0 and mkeywords[keyw] > 0
) then break
else
state = mkeywords[keyw]
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
cnt = cnt + 1
end
if state == 0 then error(modulename .. ', ‘' .. whoami ..
'’: No pattern was given', 0) end
return ptns, nptns, cnt
end
-- Load the optional arguments of the `parsing`, `reinterpreting` and
-- `evaluating` modifiers
local function load_parse_opts (opts, start_from, isp, psp)
local tmp
local optslots, noptslots, argc, trimn, trimu, iplain, pplain =
{ true, true, true }, 3, start_from, true, false, true, true
repeat
noptslots, tmp = noptslots - 1, opts[argc]
if tmp == nil then break end
tmp = tmp:match'^%s*(.-)%s*$'
if optslots[1] ~= nil and trim_parse_opts[tmp] ~= nil then
tmp = trim_parse_opts[tmp]
trimn, trimu, optslots[1] = tmp[1], tmp[2], nil
elseif optslots[2] ~= nil and isep_parse_opts[tmp] ~= nil then
argc = argc + 1
iplain, isp, optslots[2] = isep_parse_opts[tmp],
opts[argc], nil
elseif optslots[3] ~= nil and psep_parse_opts[tmp] ~= nil then
argc = argc + 1
pplain, psp, optslots[3] = psep_parse_opts[tmp],
opts[argc], nil
else break end
argc = argc + 1
until noptslots < 1
return isp, iplain, psp, pplain, trimn, trimu, argc
end
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
end
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
margs[karg] = key
tbl[key] = fn()
end
end,
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg], margs[varg] = key, val
tbl[key] = fn()
end
end
}
-- Private table for `map_names()`
local name_thieves = {
[0] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg], rargs[varg] = key, val
steal_if_renamed(val, tbl, key, cache, fn())
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numeric
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local prefix, gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
if type(key) == 'string' then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else
prefix, gid = '', key
end
if groups[gid] == nil then groups[gid] = {} end
if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then
prefix = tonumber(prefix)
if prefix < 1 then prefix = prefix - 1 end
end
groups[gid][prefix] = val
end
return groups
end
-- Split into parts a string containing the `$#` and `$@` placeholders and
-- return the information as a skeleton table, a canvas table and a length
local function parse_placeholder_string (target)
local idx, s_pos, skel, canvas = 1, 1, {}, {}
local e_pos = string.find(target, '%$[@#]', 1, false)
while e_pos ~= nil do
canvas[idx] = target:sub(s_pos, e_pos - 1)
skel[idx + 1] = target:sub(e_pos, e_pos + 1) == '$@'
idx = idx + 2
s_pos = 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 idx
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
idx = idx + 1
else
key = get_parameter_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 idx
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 idx
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_parameter_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 idx
end
-- Heavy lifting for `snapshotting` and `remembering`
local function make_child (ctx, src, whoami)
local len = tonumber(ctx.pipe[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 = ctx.pipe
if ctx.pipe[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No parameter name was provided', 0) end
local argc
local tbl, vars = ctx.params, {}
local sortfn, varsarg0, do_sort, tmp = load_sort_opt(opts[2])
if varsarg0 == 2 then tmp = opts[3] and opts[3]:match'^%s*(.-)%s*$' end
if tmp == 'with_flushed_glue' then
varsarg0 = varsarg0 + 1
argc = set_strings_from_opts(vars, opts, varsarg0 + 1)
set_strings_from_substack(ctx, vars, whoami)
else
if tmp == 'without_flushed_glue' then varsarg0 = varsarg0 + 1 end
argc = set_strings_from_opts(vars, opts, varsarg0 + 1)
end
if argc < varsarg0 then error(modulename ..
', ‘' .. whoami .. '’: No setting directive was given', 0) end
if next(tbl) == nil then
if vars.ifngiven ~= nil then ctx.params =
{ [get_parameter_name(ctx.pipe[1])] = vars.ifngiven }
elseif tbl == ctx.oparams then ctx.params = {} end
return argc
end
local cache, len
if do_sort then
local words
cache, words, len, tmp = get_key_list_sorted(tbl, sortfn)
for idx = 1, tmp do cache[len + idx] = words[idx] end
len = len + tmp
else
len, cache = 0, {}
for key in pairs(tbl) do
len = len + 1
cache[len] = key
end
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_parameter_name(ctx.pipe[1])] = table.concat(pmap) }
return argc
end
-- Concatenate the numeric keys from the table of parameters to the numeric
-- keys from the table of options; non-numeric keys from the table of options
-- will prevail over colliding non-numeric keys from the table of parameters
local function concat_params (ctx)
local retval, tbl, nmax = {}, ctx.params, table.maxn(ctx.pipe)
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(ctx.pipe) 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 tbl = ctx.params
if ctx.subset == 1 then
for key, val in ipairs(tbl) do fn(key, val) end
return
end
if ctx.subset == -1 then
for key, val in ipairs(tbl) do tbl[key] = nil end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(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 then
for key, val in ipairs(tbl) do
fn(key, val)
tbl[key] = nil
end
end
for key, val in pairs(tbl) do fn(key, val) 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
for key, val in ipairs(ctx.params) do fn_seq(key, val) end
return
end
if ctx.subset == -1 then
flush_params(ctx, fn_oth)
return
end
local tbl = ctx.params
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort)
local sequence = {}
for key, val in ipairs(tbl) do sequence[key] = val end
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 sequence[nums[idx]] then fn_seq(nums[idx], sequence[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(tbl) do
fn_seq(key, val)
tbl[key] = nil
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, 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, 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, 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, 1)
end
-- Syntax: #invoke:params|setting|directives|...|pipe to
library.setting = function (ctx)
local argc = set_strings_from_opts(ctx, ctx.pipe, 1)
if argc < 2 then error(modulename ..
', ‘setting’: No directive was given', 0) end
return context_iterate(ctx, argc + 1)
end
-- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to
library.scoring = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘scoring’: No parameter name was provided', 0) end
local tmp
local retval, opts = 0, ctx.pipe
for _ in pairs(ctx.params) do retval = retval + 1 end
if opts[2] ~= nil then tmp = opts[2]:match'^%s*(.*%S)' end
if tmp == 'in_substack' then
new_substack(ctx)[get_parameter_name(opts[1])] = tostring(retval)
return context_iterate(ctx, 3)
end
ctx.params[get_parameter_name(opts[1])] = tostring(retval)
return context_iterate(ctx, tmp == 'here' and 3 or 2)
end
-- Syntax: #invoke:params|squeezing|pipe to
library.squeezing = function (ctx)
local store, indices, tbl, newlen = {}, {}, ctx.params, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
newlen = newlen + 1
indices[newlen], store[key], tbl[key] = key, val, nil
end
end
table.sort(indices)
for idx = 1, newlen do tbl[idx] = store[indices[idx]] end
return context_iterate(ctx, 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[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, 1 do tbl[idx] = newval end
for key, val in pairs(tmp) do tbl[key] = val end
end
return context_iterate(ctx, 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, 1)
end
-- Syntax: #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function (ctx)
local lcut = tonumber(ctx.pipe[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(ctx.pipe[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, 1 do tbl[idx] = nil end
for idx = 1, lcut, 1 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, 3)
end
-- Syntax: #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function (ctx)
local lcut = tonumber(ctx.pipe[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(ctx.pipe[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, 1 do
tbl[idx - lshift], tbl[idx] =
tbl[idx], nil
end
end
end
end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|purging|start offset|length|pipe to
library.purging = function (ctx)
local idx = tonumber(ctx.pipe[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(ctx.pipe[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, 3) end
len = len - idx + 1
end
ctx.params = copy_table_reduced(tbl, idx, len)
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function (ctx)
local last = tonumber(ctx.pipe[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(ctx.pipe[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, 3) end
idx = idx - len
if last < idx then return context_iterate(ctx, 3) end
len = last - idx + 1
end
ctx.params = copy_table_reduced(ctx.params, idx, len)
return context_iterate(ctx, 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[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, 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, 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 numerics = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
end
end
for key, val in pairs(numerics) do tbl[shift - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|mirroring_numeric_names|pipe to
--[[
library.mirroring_numeric_names = function (ctx)
local nmax, nmin
local tbl, numerics = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = 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(numerics) do tbl[nmax + nmin - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|swapping_numeric_names|pipe to
--[[
library.swapping_numeric_names = function (ctx)
local tmp
local tbl, cache, nsize = ctx.params, {}, 0
for key in pairs(tbl) do
if type(key) == 'number' then
nsize = nsize + 1
cache[nsize] = key
end
end
table.sort(cache)
for idx = math.floor(nsize / 2), 1, -1 do
tmp = tbl[cache[idx] ]
tbl[cache[idx] ] = tbl[cache[nsize - idx + 1] ]
tbl[cache[nsize - idx + 1] ] = tmp
end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function (ctx)
local sortfn
if ctx.pipe[1] ~= nil then
sortfn = sortfunctions[ctx.pipe[1]:match'^%s*(.-)%s*$']
end
if sortfn then table.sort(ctx.params, sortfn)
else table.sort(ctx.params) end -- i.e. either `false` or `nil`
if sortfn == nil then return context_iterate(ctx, 1) end
return context_iterate(ctx, 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 opts, tbl = ctx.pipe, ctx.params
local tmp1 = opts[1]
if tmp1 ~= nil then
tmp2 = tonumber(tmp1)
if tmp2 == nil or math.floor(tmp2) ~= tmp2 then
pos, argc, tmp2 = tonumber(opts[2]), 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, 3, 0 end
else pos, argc, refp = tonumber(opts[2]), 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
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
tmp1 = tonumber(opts[argc])
if len == 0 and (tmp1 == nil or tmp1 < 1) then error(modulename ..
', ‘splicing’: When the increment is zero the number of elements to add cannot be zero', 0) end
if tmp1 == nil or tmp1 < 0 or math.floor(tmp1) ~= tmp1 then
return context_iterate(ctx, argc)
end
tmp2 = argc - pos + 1
for key = pos, pos + tmp1 - 1 do tbl[key] = opts[key + tmp2] end
return context_iterate(ctx, argc + tmp1 + 1)
end
-- Syntax: #invoke:params|imposing|name|value|pipe to
library.imposing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘imposing’: Missing parameter name to impose', 0) end
ctx.params[get_parameter_name(ctx.pipe[1])] = ctx.pipe[2]
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = get_parameter_name(ctx.pipe[1])
if ctx.params[key] == nil then ctx.params[key] = ctx.pipe[2] end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|reassigning|source|destination|[mode]|pipe to
library.reassigning = function (ctx)
local opts, tbl = ctx.pipe, ctx.params
if opts[1] == nil then error(modulename ..
', ‘reassigning’: Missing source parameter', 0) end
if opts[2] == nil then error(modulename ..
', ‘reassigning’: Missing destination parameter', 0) end
local mode, argc
local src = get_parameter_name(opts[1])
local val = tbl[src]
if opts[3] ~= nil then mode = a_modes[opts[3]:match'^%s*(.-)%s*$'] end
if mode == nil then mode, argc = 0, 3 else argc = 4 end
if val == nil and mode > 1 then return context_iterate(ctx, argc) end
local dest = get_parameter_name(opts[2])
local tmp = tbl[dest] == nil
if mode % 2 == 0 or (mode == 7 and tmp) then tbl[src] = nil end
if tmp or mode < 4 then tbl[dest] = val end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘discarding’: Missing parameter name to discard', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil then
ctx.params[get_parameter_name(ctx.pipe[1])] = nil
return context_iterate(ctx, 2)
end
local key = tonumber(ctx.pipe[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, 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, 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, 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 targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_matching')
local tbl, newparams = ctx.params, {}
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
tmp = ptn[1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
newparams[tmp] = tbl[tmp]
else
for key, val in pairs(tbl) do
if tostring(key):find(ptn[1], 1, ptn[2]) then
newparams[key] = val
end
end
end
end
ctx.params = newparams
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]
-- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_name_not_matching = function (ctx)
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_not_matching')
local tbl = ctx.params
if nptns == 1 and targets[1][3] then
local tmp = targets[1][1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tbl[tonumber(tmp)] = nil
else tbl[tmp] = nil end
return context_iterate(ctx, argc)
end
local yesmatch, ptn
for key in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if tostring(key) ~= ptn[1] then
yesmatch = false
break
end
elseif not tostring(key):find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]
-- |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_value_matching = function (ctx)
local nomatch, ptn
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_matching')
for key, val in pairs(tbl) do
nomatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val == ptn[1] then
nomatch = false
break
end
elseif val:find(ptn[1], 1, ptn[2]) then
nomatch = false
break
end
end
if nomatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]
-- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_value_not_matching = function (ctx)
local yesmatch, ptn
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_not_matching')
for key, val in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val ~= ptn[1] then
yesmatch = false
break
end
elseif not val:find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|keeping_at_most|number of parameters to pick|pipe to
library.keeping_at_most = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local len = tonumber(ctx.pipe[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, 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, 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, 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, 1)
end
-- Syntax: #invoke:params|mapping_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.values_only, ctx.params)
local model = { title = tname, args = margs }
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_invoking|module name|function name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘mapping_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 2, mapping_styles.values_only, ctx.params)
local model = { title = 'Module:' .. mname, args = margs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
value_maps[looptype](tbl, margs, karg, varg, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function (ctx)
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.values_only, ctx.params)
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to
library.mapping_by_mixing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘mapping_by_mixing’: No mixing string was provided', 0) end
local tbl, mix = ctx.params, ctx.pipe[1]
if mix == '$#' then
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 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, 2)
end
-- Syntax: #invoke:params|mapping_to_names|pipe to
--[[
library.mapping_to_names = function (ctx)
local tbl = ctx.params
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 1)
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, 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, 1)
end
-- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to
library.renaming_to_sequence = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache, len
local tbl = ctx.params
local sortfn, argc, do_sort = load_sort_opt(ctx.pipe[1])
if do_sort then
local words, wl
cache, words, len, wl = get_key_list_sorted(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
len, cache = 0, {}
for _, val in pairs(tbl) do
len = len + 1
cache[len] = val
end
end
ctx.params = cache
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.names_only, ctx.params)
local model = { title = tname, args = rargs }
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_invoking|module name|function
-- name|[call style]|[let/use]|[...]|[let/use]|[...]|[number of
-- additional arguments]|[argument 1]|[argument 2]|[...]|[argument
-- N]|pipe to
library.renaming_by_invoking = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘renaming_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 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 = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.names_only, ctx.params)
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:callParserFunction(magic, rargs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
ptn = get_parameter_name(ptn)
local val = tbl[ptn]
if val ~= nil then
tbl[ptn], tbl[get_parameter_name(repl)] = nil, val
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to
library.renaming_by_mixing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
if ctx.pipe[1] == nil then error(modulename ..
', ‘renaming_by_mixing’: No mixing string was provided', 0) end
local mix = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache = {}
if mix == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_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_parameter_name(table.concat(canvas))] = val
end
end
ctx.params = cache
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|renaming_to_values|pipe to
--[[
library.renaming_to_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 cache = {}
for _, val in pairs(ctx.params) do cache[val] = val end
ctx.params = cache
return context_iterate(ctx, 1)
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 tmp, argc, tbl, mem = load_child_opts(ctx.pipe, 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 = ctx.pipe[1]
if tmp ~= nil then tmp = tmp:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local groups = make_groups(tbl)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0], model.args = gid, group
groups[gid] = ctx.frame:expandTemplate(model)
end
for key, val in pairs(mem) do groups[key] = val end
ctx.params = groups
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.parsing = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘parsing’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
parse_parameter_string(ctx.params, opts[1], isep, iplain, psep, pplain,
trimnamed, trimunnamed)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim
-- flag]|[iteration delimiter setter]|[...]|[key-value delimiter
-- setter]|[...]|pipe to
library.reinterpreting = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
local tbl, tmp = ctx.params, get_parameter_name(opts[1])
local str = tbl[tmp]
if str ~= nil then
tbl[tmp] = nil
parse_parameter_string(tbl, str, isep, iplain, psep, pplain,
trimnamed, trimunnamed)
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.evaluating = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘evaluating’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '!', ':')
if opts[1]:match'^%s*(.*%S)' == nil then
ctx.pipe = copy_or_ref_table(opts, opts ~= ctx.opipe)
return context_iterate(ctx, argc)
end
local new_opts, cache = {}, {}
local shift = parse_parameter_string(cache, opts[1], isep, iplain,
psep, pplain, trimnamed, trimunnamed) - argc
for key, val in pairs(opts) do
if type(key) ~= 'number' or key < 1 then new_opts[key] = val
elseif key >= argc then new_opts[key + shift] = val end
end
for key, val in pairs(cache) do new_opts[key] = val end
ctx.pipe = new_opts
return context_iterate(ctx, 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
if ctx.pipe[1] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end
local tmp
local mix_k = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache, mix_v = {}, ctx.pipe[2]
if mix_k == '$@' and mix_v == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = val
end
elseif mix_k == '$@' and mix_v == '$#' then
for key, val in pairs(ctx.params) do
cache[get_parameter_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_parameter_name(table.concat(cnv_k))] =
table.concat(cnv_v)
end
end
ctx.params = cache
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|swapping_names_and_values|pipe to
--[[
library.swapping_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 cache = {}
for key, val in pairs(ctx.params) do cache[val] = key end
ctx.params = cache
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|combining|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return key .. kvs .. val end,
'combining'
) + 1)
end
-- Syntax: #invoke:params|combining_values|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return val end,
'combining_values'
) + 1)
end
-- Syntax: #invoke:params|combining_by_calling|template name|new parameter
-- name|pipe to
library.combining_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tname = ctx.pipe[1]
if tname ~= nil then tname = tname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_calling’: No template name was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_calling’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] = ctx.frame:expandTemplate{
title = tname,
args = ctx.params
}
}
return context_iterate(ctx, 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 mname = ctx.pipe[1]
if mname ~= nil then mname = mname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No module name was provided', 0) end
local fname = ctx.pipe[2]
if fname ~= nil then fname = fname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No function name was provided', 0) end
if ctx.pipe[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_parameter_name(ctx.pipe[3])] =
tostring(mfunc(ctx.frame:newChild(model)))
}
return context_iterate(ctx, 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 magic = ctx.pipe[1]
if magic ~= nil then magic = magic:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_magic’: No parser function was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_magic’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] =
ctx.frame:callParserFunction(magic, ctx.params)
}
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|snapshotting|[maximum number]|pipe to
library.snapshotting = function (ctx)
return context_iterate(ctx, make_child(ctx, ctx.params, 'snapshotting'))
end
-- Syntax: #invoke:params|remembering|[maximum number]|pipe to
library.remembering = function (ctx)
return context_iterate(ctx, make_child(ctx, ctx.oparams, 'remembering'))
end
-- Syntax: #invoke:params|entering_substack|[new]|pipe to
library.entering_substack = function (ctx)
local tbl, ncurrparent = ctx.params, ctx.n_parents + 1
if ctx.parents == nil then ctx.parents = { tbl }
else ctx.parents[ncurrparent] = tbl end
ctx.n_parents = ncurrparent
if ctx.pipe[1] ~= nil and ctx.pipe[1]:match'^%s*new%s*$' then
ctx.params = {}
return context_iterate(ctx, 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, 1)
end
-- Syntax: #invoke:params|pulling|parameter name|pipe to
library.pulling = function (ctx)
local opts = ctx.pipe
if opts[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_parameter_name(opts[1])
if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|recalling|parameter name|pipe to
library.recalling = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘recalling’: No parameter to recall was provided', 0) end
local arg = get_parameter_name(opts[1])
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|finding|parameter name|pipe to
--[[
library.finding = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘finding’: No parameter to find was provided', 0) end
local arg = get_parameter_name(opts[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, 2)
end
end
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, 2)
end
]]--
-- Syntax: #invoke:params|picking|number of parameters to pick|pipe to
--[[
library.picking = function (ctx)
local len = tonumber(ctx.pipe[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, 2)
end
]]--
-- Syntax: #invoke:params|detaching_substack|pipe to
library.detaching_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘detaching_substack’: No substack has been created', 0) end
local parent = ctx.parents[ncurrparent]
for key in pairs(ctx.params) do parent[key] = nil end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|dropping_substack|pipe to
library.dropping_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘dropping_substack’: No substack has been created', 0) end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents =
ctx.parents[ncurrparent], nil, ncurrparent - 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|leaving_substack|pipe to
library.leaving_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘leaving_substack’: No substack has been created', 0) end
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { ctx.params }
else ctx.children[currsnap] = ctx.params end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents, ctx.n_children =
ctx.parents[ncurrparent], nil, ncurrparent - 1, currsnap
return context_iterate(ctx, 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, 1)
end
-- Syntax: #invoke:params|flushing|pipe to
library.flushing = function (ctx)
if ctx.n_children < 1 then error(modulename ..
', ‘flushing’: There are no substacks to flush', 0) end
local parent, currsnap = ctx.params, ctx.n_children
for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
return context_iterate(ctx, 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, 1)
end
--[[ Functions ]]--
-----------------------------
-- Syntax: #invoke:params|count
library.count = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local retval = 0
for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end
if ctx.subset == -1 then retval = retval - #ctx.params end
ctx.text = retval
return false
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]
-- |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘concat_and_call’: No template name was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx)
}
return false
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘concat_and_invoke’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘concat_and_invoke’: No function name was provided', 0) end
remove_numeric_keys(opts, 1, 2)
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)
})
return false
end
-- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend
-- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
-- value n]|[...]
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘concat_and_magic’: No parser function was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:callParserFunction(magic, concat_params(ctx))
return false
end
-- Syntax: #invoke:params|value_of|parameter name
library.value_of = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘value_of’: No parameter name was provided', 0) end
local val
local key = opts[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)
-- NOTE: `ctx.pipe` might be the original metatable!
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: `ctx.pipe` might be the original metatable!
-- 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)
-- NOTE: `ctx.pipe` might be the original metatable!
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|coins|[first coin = value 1]|[second coin = value
-- 2]|[...]|[last coin = value N]
--[[
library.coins = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do tbl[key] = opts[get_parameter_name(val)] end
return library.list_values(ctx)
end
]]--
-- Syntax: #invoke:params|unique_coins|[first coin = value 1]|[second coin =
-- value 2]|[...]|[last coin = value N]
--[[
library.unique_coins = function (ctx)
local tmp
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do
tmp = get_parameter_name(val)
tbl[key], opts[tmp] = opts[tmp], nil
end
return library.list_values(ctx)
end
]]
-- Syntax: #invoke:params|for_each|wikitext
library.for_each = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, pps, txt = {}, 0, ctx.itersep or '', ctx.pipe[1] or ''
local skel, cnv, n_parts = parse_placeholder_string(txt)
flush_params(ctx, function (key, val)
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
ret[nss + 1], nss = pps, nss + 2
ret[nss] = table.concat(cnv)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
-- |[named param n=value n]|[...]
library.invoke_for_each = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.magic_for_each = function (ctx)
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, opts)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_value = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each_value’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[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 = ctx.pipe
local mname, fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each_value’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each_value’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
remove_numeric_keys(opts, 1, 1)
flush_params(ctx, function (key, val)
opts[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 = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each_value’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, opts)
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.pipe` and `ctx.params` might be the original metatables!
local tmp
if ctx.pipe[1] ~= nil then tmp = ctx.pipe[1]:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘call_for_each_group’: No template name was provided', 0) end
local model = { title = tmp }
local opts, ret, nss, ccs = {}, {}, 0, ctx.itersep or ''
for key, val in pairs(ctx.pipe) do
if type(key) == 'number' then opts[key - 1] = val
else opts[key] = val end
end
ctx.pipe = opts
ctx.params = make_groups(ctx.params)
flush_params(ctx, function (gid, group)
for key, val in pairs(opts) 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)
ctx.pipe = copy_or_ref_table(ctx.opipe, false)
ctx.params = {}
main_loop(ctx, context_iterate(ctx, 1))
return ctx.text
end
--[[ First-position-only functions ]]--
---------------------------------------
-- Syntax: #invoke:params|self
static_iface.self = function (frame)
return 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)
ctx.pipe = copy_or_ref_table(ctx.opipe, refpipe[fname])
ctx.params = copy_or_ref_table(ctx.oparams, refparams[fname])
main_loop(ctx, func)
return ctx.text
end
end
})
s0wwht3ty2l3u443tnfm9mh3z5pmpgj
390677
390662
2026-07-24T03:49:16Z
Grufo
45757
Update from [[d:Special:GoToLinkedPage/mediawikiwiki/Q122696746|master]] using [[mw:Synchronizer| #Synchronizer]]
390677
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_key_list_sorted (tbl, sort_fn)
local nums, words, nn, nw = {}, {}, 0, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
nn = nn + 1
nums[nn] = key
else
nw = nw + 1
words[nw] = key
end
end
table.sort(nums)
table.sort(words, sort_fn)
return nums, words, nn, nw
end
-- Parse a parameter name string and return it as a string or a number
local function get_parameter_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_parameter_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.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 refpipe = {
call_for_each_group = true,
--coins = true,
count = true,
evaluating = true,
for_each = true,
list = true,
list_values = true,
list_maybe_with_names = true,
value_of = true
}
-- 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,
--renaming_to_values = true,
shifting = true,
splicing = true,
--swapping_names_and_values = 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)
local main_frame = child_frame:getParent()
return {
frame = main_frame,
opipe = child_frame.args,
oparams = main_frame.args,
firstposonly = static_iface,
iterfunc = pairs,
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, n_forward)
local nextfn
if ctx.pipe[n_forward] ~= nil then
nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)'
end
if nextfn == nil then error(modulename ..
': You must specify a function to call', 0) end
if library[nextfn] == nil then
if ctx.firstposonly[nextfn] == nil then error(modulename ..
': The function ‘' .. nextfn .. '’ does not exist', 0)
else error(modulename .. ': The ‘' .. nextfn ..
'’ directive can only appear in first position', 0)
end
end
remove_numeric_keys(ctx.pipe, 1, n_forward)
return library[nextfn]
end
-- Main loop
local function main_loop (ctx, start_with)
local fn = start_with
repeat fn = fn(ctx) until not fn
if ctx.n_parents > 0 then error(modulename ..
': One or more ‘merging_substack’ directives are missing', 0) end
if ctx.n_children > 0 then error(modulename ..
', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end
end
-- Load a `setting`-like directive string into the `dest` table
local function set_strings_from_opts (dest, opts, start_from)
local cmd
if opts[start_from] == nil then return start_from - 1 end
cmd = opts[start_from]:gsub('%s+', ''):gsub('/+', '/')
:match'^/*(.*[^/])'
if cmd == nil then return start_from end
local vname, chr
local amap, sep, argc = {}, string.byte('/'), start_from + 1
for idx = 1, #cmd do
chr = cmd:byte(idx)
if chr == sep then
for key, val in ipairs(amap) do
dest[val], amap[key] = opts[argc], nil
end
argc = argc + 1
else
vname = memoryslots[string.char(chr)]
if vname == nil then error(modulename ..
', ‘setting’: Unknown slot ‘' ..
string.char(chr) .. '’', 0) end
table.insert(amap, vname)
end
end
for key, val in ipairs(amap) do dest[val] = opts[argc] end
return argc
end
-- Add a new stack of parameters to `ctx.children`
local function new_substack (ctx)
local currsnap, newparams = ctx.n_children + 1, {}
if ctx.children == nil then ctx.children = { newparams }
else ctx.children[currsnap] = newparams end
ctx.n_children = currsnap
return newparams
end
-- Parse a raw argument containing a `sortfunctions` directive, or
-- `'without_sorting'`, or `nil`
local function load_sort_opt (raw_arg)
if raw_arg == nil then return nil, 1, false end
local trarg = raw_arg:match'^%s*(.-)%s*$'
if trarg == 'without_sorting' then return nil, 2, false, trarg end
local tmp = sortfunctions[trarg]
if tmp == nil then return nil, 1, false, trarg end
return tmp or nil, 2, true, trarg
end
-- Parse optional user arguments of type `...|[let/use]|[...]|[let/use]|[...]|
-- [number of additional parameters]|[parameter 1]|[parameter 2]|[...]`
local function load_child_opts (src, start_from, append_after, params)
local tnamed, tmp1, tmp2
local pin, tbl, mem = start_from, {}, {}
while src[pin] ~= nil and src[pin + 1] ~= nil do
tmp1 = src[pin]:match'^%s*(.*%S)'
if tmp1 == 'let' and src[pin + 2] ~= nil then
tmp1 = get_parameter_name(src[pin + 1])
mem[tmp1], tbl[tmp1], pin = nil, src[pin + 2], pin + 3
--[[
elseif tmp1 == 'expose' then
tmp1 = get_parameter_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_parameter_name(src[pin + 2])
tmp2 = params[tmp1]
mem[tmp1], tbl[get_parameter_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, n_skip, default_style, params)
local style, shf
local tmp = src[n_skip + 1]
if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end
if style == nil then style, shf = default_style, n_skip - 1
else shf = n_skip 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
local dest, argc, tnew, mem = load_child_opts(src, style[2] + shf,
n_exist, params)
tmp = style[1]
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, whoami)
if opts[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No pattern string was given', 0) end
if opts[2] == nil then error(modulename ..
', ‘' .. whoami .. '’: No replacement string was given', 0) end
local ptn, repl, nmax, argc = opts[1], opts[2], tonumber(opts[3]), 3
if nmax ~= nil or (opts[3] or ''):match'^%s*$' ~= nil then argc = 4 end
local flg = opts[argc]
if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end
if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end
return ptn, repl, nmax, flg, argc, (nmax ~= nil and nmax < 1) or
(flg == 3 and ptn == repl)
end
-- Parse the arguments of the `with_*_matching` class of modifiers
local function load_pattern_args (opts, whoami)
local keyw
local ptns, state, nptns, cnt = {}, 0, 0, 1
for _, val in ipairs(opts) do
if state == 0 then
nptns, state = nptns + 1, -1
ptns[nptns] = { val, false, false }
else
keyw = val:match'^%s*(.*%S)'
if keyw == nil or mkeywords[keyw] == nil or (
state > 0 and mkeywords[keyw] > 0
) then break
else
state = mkeywords[keyw]
if state > 1 then ptns[nptns][2] = true end
if state == 3 then ptns[nptns][3] = true end
end
end
cnt = cnt + 1
end
if state == 0 then error(modulename .. ', ‘' .. whoami ..
'’: No pattern was given', 0) end
return ptns, nptns, cnt
end
-- Load the optional arguments of the `parsing`, `reinterpreting` and
-- `evaluating` modifiers
local function load_parse_opts (opts, start_from, isp, psp)
local tmp
local optslots, noptslots, argc, trimn, trimu, iplain, pplain =
{ true, true, true }, 3, start_from, true, false, true, true
repeat
noptslots, tmp = noptslots - 1, opts[argc]
if tmp == nil then break end
tmp = tmp:match'^%s*(.-)%s*$'
if optslots[1] ~= nil and trim_parse_opts[tmp] ~= nil then
tmp = trim_parse_opts[tmp]
trimn, trimu, optslots[1] = tmp[1], tmp[2], nil
elseif optslots[2] ~= nil and isep_parse_opts[tmp] ~= nil then
argc = argc + 1
iplain, isp, optslots[2] = isep_parse_opts[tmp],
opts[argc], nil
elseif optslots[3] ~= nil and psep_parse_opts[tmp] ~= nil then
argc = argc + 1
pplain, psp, optslots[3] = psep_parse_opts[tmp],
opts[argc], nil
else break end
argc = argc + 1
until noptslots < 1
return isp, iplain, psp, pplain, trimn, trimu, argc
end
-- Map parameters' values using a custom callback and a referenced table
local value_maps = {
[0] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do tbl[key] = fn() end
end,
[1] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[varg] = val
tbl[key] = fn()
end
end,
[2] = function (tbl, margs, karg, varg, fn)
for key in pairs(tbl) do
margs[karg] = key
tbl[key] = fn()
end
end,
[3] = function (tbl, margs, karg, varg, fn)
for key, val in pairs(tbl) do
margs[karg], margs[varg] = key, val
tbl[key] = fn()
end
end
}
-- Private table for `map_names()`
local name_thieves = {
[0] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[1] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[varg] = val
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[2] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg] = key
steal_if_renamed(val, tbl, key, cache, fn())
end
end,
[3] = function (cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(tbl) do
rargs[karg], rargs[varg] = key, val
steal_if_renamed(val, tbl, key, cache, fn())
end
end
}
-- Map parameters' names using a custom callback and a referenced table
local function map_names (tbl, rargs, karg, varg, looptype, fn)
local cache = {}
name_thieves[looptype](cache, tbl, rargs, karg, varg, fn)
for key, val in pairs(cache) do tbl[key] = val end
end
-- Return a new table that contains `src` regrouped according to the numeric
-- suffixes in its keys
local function make_groups (src)
-- NOTE: `src` might be the original metatable!
local prefix, gid
local groups = {}
for key, val in pairs(src) do
-- `key` must only be a string or a number...
if type(key) == 'string' then
prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$'
gid = tonumber(gid) or ''
else
prefix, gid = '', key
end
if groups[gid] == nil then groups[gid] = {} end
if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then
prefix = tonumber(prefix)
if prefix < 1 then prefix = prefix - 1 end
end
groups[gid][prefix] = val
end
return groups
end
-- Split into parts a string containing the `$#` and `$@` placeholders and
-- return the information as a skeleton table, a canvas table and a length
local function parse_placeholder_string (target)
local idx, s_pos, skel, canvas = 1, 1, {}, {}
local e_pos = string.find(target, '%$[@#]', 1, false)
while e_pos ~= nil do
canvas[idx] = target:sub(s_pos, e_pos - 1)
skel[idx + 1] = target:sub(e_pos, e_pos + 1) == '$@'
idx = idx + 2
s_pos = 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 idx
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
idx = idx + 1
else
key = get_parameter_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 idx
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 idx
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_parameter_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 idx
end
-- Heavy lifting for `snapshotting` and `remembering`
local function make_child (ctx, src, whoami)
local len = tonumber(ctx.pipe[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 = ctx.pipe
if ctx.pipe[1] == nil then error(modulename ..
', ‘' .. whoami .. '’: No parameter name was provided', 0) end
local argc
local tbl, vars = ctx.params, {}
local sortfn, varsarg0, do_sort, tmp = load_sort_opt(opts[2])
if varsarg0 == 2 then tmp = opts[3] and opts[3]:match'^%s*(.-)%s*$' end
if tmp == 'with_flushed_glue' then
varsarg0 = varsarg0 + 1
argc = set_strings_from_opts(vars, opts, varsarg0 + 1)
set_strings_from_substack(ctx, vars, whoami)
else
if tmp == 'without_flushed_glue' then varsarg0 = varsarg0 + 1 end
argc = set_strings_from_opts(vars, opts, varsarg0 + 1)
end
if argc < varsarg0 then error(modulename ..
', ‘' .. whoami .. '’: No setting directive was given', 0) end
if next(tbl) == nil then
if vars.ifngiven ~= nil then ctx.params =
{ [get_parameter_name(ctx.pipe[1])] = vars.ifngiven }
elseif tbl == ctx.oparams then ctx.params = {} end
return argc
end
local cache, len
if do_sort then
local words
cache, words, len, tmp = get_key_list_sorted(tbl, sortfn)
for idx = 1, tmp do cache[len + idx] = words[idx] end
len = len + tmp
else
len, cache = 0, {}
for key in pairs(tbl) do
len = len + 1
cache[len] = key
end
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_parameter_name(ctx.pipe[1])] = table.concat(pmap) }
return argc
end
-- Concatenate the numeric keys from the table of parameters to the numeric
-- keys from the table of options; non-numeric keys from the table of options
-- will prevail over colliding non-numeric keys from the table of parameters
local function concat_params (ctx)
local retval, tbl, nmax = {}, ctx.params, table.maxn(ctx.pipe)
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(ctx.pipe) 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 tbl = ctx.params
if ctx.subset == 1 then
for key, val in ipairs(tbl) do fn(key, val) end
return
end
if ctx.subset == -1 then
for key, val in ipairs(tbl) do tbl[key] = nil end
end
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(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 then
for key, val in ipairs(tbl) do
fn(key, val)
tbl[key] = nil
end
end
for key, val in pairs(tbl) do fn(key, val) 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
for key, val in ipairs(ctx.params) do fn_seq(key, val) end
return
end
if ctx.subset == -1 then
flush_params(ctx, fn_oth)
return
end
local tbl = ctx.params
if ctx.sorttype > 0 then
local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort)
local sequence = {}
for key, val in ipairs(tbl) do sequence[key] = val end
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 sequence[nums[idx]] then fn_seq(nums[idx], sequence[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(tbl) do
fn_seq(key, val)
tbl[key] = nil
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, 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, 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, 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, 1)
end
-- Syntax: #invoke:params|setting|directives|...|pipe to
library.setting = function (ctx)
local argc = set_strings_from_opts(ctx, ctx.pipe, 1)
if argc < 2 then error(modulename ..
', ‘setting’: No directive was given', 0) end
return context_iterate(ctx, argc + 1)
end
-- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to
library.scoring = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘scoring’: No parameter name was provided', 0) end
local tmp
local retval, opts = 0, ctx.pipe
for _ in pairs(ctx.params) do retval = retval + 1 end
if opts[2] ~= nil then tmp = opts[2]:match'^%s*(.*%S)' end
if tmp == 'in_substack' then
new_substack(ctx)[get_parameter_name(opts[1])] = tostring(retval)
return context_iterate(ctx, 3)
end
ctx.params[get_parameter_name(opts[1])] = tostring(retval)
return context_iterate(ctx, tmp == 'here' and 3 or 2)
end
-- Syntax: #invoke:params|squeezing|pipe to
library.squeezing = function (ctx)
local store, indices, tbl, newlen = {}, {}, ctx.params, 0
for key, val in pairs(tbl) do
if type(key) == 'number' then
newlen = newlen + 1
indices[newlen], store[key], tbl[key] = key, val, nil
end
end
table.sort(indices)
for idx = 1, newlen do tbl[idx] = store[indices[idx]] end
return context_iterate(ctx, 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[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, 1 do tbl[idx] = newval end
for key, val in pairs(tmp) do tbl[key] = val end
end
return context_iterate(ctx, 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, 1)
end
-- Syntax: #invoke:params|cutting|left cut|right cut|pipe to
library.cutting = function (ctx)
local lcut = tonumber(ctx.pipe[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(ctx.pipe[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, 1 do tbl[idx] = nil end
for idx = 1, lcut, 1 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, 3)
end
-- Syntax: #invoke:params|cropping|left crop|right crop|pipe to
library.cropping = function (ctx)
local lcut = tonumber(ctx.pipe[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(ctx.pipe[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, 1 do
tbl[idx - lshift], tbl[idx] =
tbl[idx], nil
end
end
end
end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|purging|start offset|length|pipe to
library.purging = function (ctx)
local idx = tonumber(ctx.pipe[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(ctx.pipe[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, 3) end
len = len - idx + 1
end
ctx.params = copy_table_reduced(tbl, idx, len)
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|backpurging|start offset|length|pipe to
library.backpurging = function (ctx)
local last = tonumber(ctx.pipe[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(ctx.pipe[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, 3) end
idx = idx - len
if last < idx then return context_iterate(ctx, 3) end
len = last - idx + 1
end
ctx.params = copy_table_reduced(ctx.params, idx, len)
return context_iterate(ctx, 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[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, 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, 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 numerics = {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = nil
end
end
for key, val in pairs(numerics) do tbl[shift - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|mirroring_numeric_names|pipe to
--[[
library.mirroring_numeric_names = function (ctx)
local nmax, nmin
local tbl, numerics = ctx.params, {}
for key, val in pairs(tbl) do
if type(key) == 'number' then
numerics[key] = val
tbl[key] = 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(numerics) do tbl[nmax + nmin - key] = val end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|swapping_numeric_names|pipe to
--[[
library.swapping_numeric_names = function (ctx)
local tmp
local tbl, cache, nsize = ctx.params, {}, 0
for key in pairs(tbl) do
if type(key) == 'number' then
nsize = nsize + 1
cache[nsize] = key
end
end
table.sort(cache)
for idx = math.floor(nsize / 2), 1, -1 do
tmp = tbl[cache[idx] ]
tbl[cache[idx] ] = tbl[cache[nsize - idx + 1] ]
tbl[cache[nsize - idx + 1] ] = tmp
end
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to
library.sorting_sequential_values = function (ctx)
local sortfn
if ctx.pipe[1] ~= nil then
sortfn = sortfunctions[ctx.pipe[1]:match'^%s*(.-)%s*$']
end
if sortfn then table.sort(ctx.params, sortfn)
else table.sort(ctx.params) end -- i.e. either `false` or `nil`
if sortfn == nil then return context_iterate(ctx, 1) end
return context_iterate(ctx, 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 opts, tbl = ctx.pipe, ctx.params
local tmp1 = opts[1]
if tmp1 ~= nil then
tmp2 = tonumber(tmp1)
if tmp2 == nil or math.floor(tmp2) ~= tmp2 then
pos, argc, tmp2 = tonumber(opts[2]), 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, 3, 0 end
else pos, argc, refp = tonumber(opts[2]), 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 - pos + 1
for key = pos, pos + insn - 1 do tbl[key] = opts[key + tmp1] end
return context_iterate(ctx, argc + insn + 1)
end
-- Syntax: #invoke:params|imposing|name|value|pipe to
library.imposing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘imposing’: Missing parameter name to impose', 0) end
ctx.params[get_parameter_name(ctx.pipe[1])] = ctx.pipe[2]
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|providing|name|value|pipe to
library.providing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘providing’: Missing parameter name to provide', 0) end
local key = get_parameter_name(ctx.pipe[1])
if ctx.params[key] == nil then ctx.params[key] = ctx.pipe[2] end
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|reassigning|source|destination|[mode]|pipe to
library.reassigning = function (ctx)
local opts, tbl = ctx.pipe, ctx.params
if opts[1] == nil then error(modulename ..
', ‘reassigning’: Missing source parameter', 0) end
if opts[2] == nil then error(modulename ..
', ‘reassigning’: Missing destination parameter', 0) end
local mode, argc
local src = get_parameter_name(opts[1])
local val = tbl[src]
if opts[3] ~= nil then mode = a_modes[opts[3]:match'^%s*(.-)%s*$'] end
if mode == nil then mode, argc = 0, 3 else argc = 4 end
if val == nil and mode > 1 then return context_iterate(ctx, argc) end
local dest = get_parameter_name(opts[2])
local tmp = tbl[dest] == nil
if mode % 2 == 0 or (mode == 7 and tmp) then tbl[src] = nil end
if tmp or mode < 4 then tbl[dest] = val end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|discarding|name|[how many]|pipe to
library.discarding = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘discarding’: Missing parameter name to discard', 0) end
local len = tonumber(ctx.pipe[2])
if len == nil then
ctx.params[get_parameter_name(ctx.pipe[1])] = nil
return context_iterate(ctx, 2)
end
local key = tonumber(ctx.pipe[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, 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, 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, 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 targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_matching')
local tbl, newparams = ctx.params, {}
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
tmp = ptn[1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tmp = tonumber(tmp)
end
newparams[tmp] = tbl[tmp]
else
for key, val in pairs(tbl) do
if tostring(key):find(ptn[1], 1, ptn[2]) then
newparams[key] = val
end
end
end
end
ctx.params = newparams
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1]
-- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_name_not_matching = function (ctx)
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_name_not_matching')
local tbl = ctx.params
if nptns == 1 and targets[1][3] then
local tmp = targets[1][1]
if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then
tbl[tonumber(tmp)] = nil
else tbl[tmp] = nil end
return context_iterate(ctx, argc)
end
local yesmatch, ptn
for key in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if tostring(key) ~= ptn[1] then
yesmatch = false
break
end
elseif not tostring(key):find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or]
-- |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag
-- N]|pipe to
library.with_value_matching = function (ctx)
local nomatch, ptn
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_matching')
for key, val in pairs(tbl) do
nomatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val == ptn[1] then
nomatch = false
break
end
elseif val:find(ptn[1], 1, ptn[2]) then
nomatch = false
break
end
end
if nomatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1]
-- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain
-- flag N]|pipe to
library.with_value_not_matching = function (ctx)
local yesmatch, ptn
local tbl = ctx.params
local targets, nptns, argc = load_pattern_args(ctx.pipe,
'with_value_not_matching')
for key, val in pairs(tbl) do
yesmatch = true
for idx = 1, nptns do
ptn = targets[idx]
if ptn[3] then
if val ~= ptn[1] then
yesmatch = false
break
end
elseif not val:find(ptn[1], 1, ptn[2]) then
yesmatch = false
break
end
end
if yesmatch then tbl[key] = nil end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|keeping_at_most|number of parameters to pick|pipe to
library.keeping_at_most = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local len = tonumber(ctx.pipe[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, 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, 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, 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, 1)
end
-- Syntax: #invoke:params|mapping_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.mapping_by_calling = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘mapping_by_calling’: No template name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.values_only, ctx.params)
local model = { title = tname, args = margs }
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_invoking|module name|function name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_invoking = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘mapping_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘mapping_by_invoking’: No function name was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 2, mapping_styles.values_only, ctx.params)
local model = { title = 'Module:' .. mname, args = margs }
local mfunc = require(model.title)[fname]
if mfunc == nil then error(modulename ..
', ‘mapping_by_invoking’: The function ‘' .. fname ..
'’ does not exist', 0) end
value_maps[looptype](tbl, margs, karg, varg, function ()
return tostring(mfunc(ctx.frame:newChild(model)))
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_magic|parser function|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to
library.mapping_by_magic = function (ctx)
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘mapping_by_magic’: No parser function was provided', 0) end
local margs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.values_only, ctx.params)
value_maps[looptype](tbl, margs, karg, varg, function ()
return ctx.frame:callParserFunction(magic, margs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.mapping_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'mapping_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
for key, val in pairs(tbl) do
if val == ptn then tbl[key] = repl end
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
for key, val in pairs(tbl) do
tbl[key] = val:gsub(ptn, repl, nmax)
end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to
library.mapping_by_mixing = function (ctx)
if ctx.pipe[1] == nil then error(modulename ..
', ‘mapping_by_mixing’: No mixing string was provided', 0) end
local tbl, mix = ctx.params, ctx.pipe[1]
if mix == '$#' then
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 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, 2)
end
-- Syntax: #invoke:params|mapping_to_names|pipe to
--[[
library.mapping_to_names = function (ctx)
local tbl = ctx.params
for key in pairs(tbl) do tbl[key] = tostring(key) end
return context_iterate(ctx, 1)
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, 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, 1)
end
-- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to
library.renaming_to_sequence = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local cache, len
local tbl = ctx.params
local sortfn, argc, do_sort = load_sort_opt(ctx.pipe[1])
if do_sort then
local words, wl
cache, words, len, wl = get_key_list_sorted(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
len, cache = 0, {}
for _, val in pairs(tbl) do
len = len + 1
cache[len] = val
end
end
ctx.params = cache
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_calling|template name|[call
-- style]|[let/use]|[...]|[let/use]|[...]|[number of additional
-- parameters]|[parameter 1]|[parameter 2]|[...]|[parameter N]|pipe to
library.renaming_by_calling = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘renaming_by_calling’: No template name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.names_only, ctx.params)
local model = { title = tname, args = rargs }
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:expandTemplate(model)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_invoking|module name|function
-- name|[call style]|[let/use]|[...]|[let/use]|[...]|[number of
-- additional arguments]|[argument 1]|[argument 2]|[...]|[argument
-- N]|pipe to
library.renaming_by_invoking = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘renaming_by_invoking’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘renaming_by_invoking’: No function name was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 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 = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘renaming_by_magic’: No parser function was provided', 0) end
local rargs, argc, looptype, karg, varg, tbl, mem =
load_callback_opts(opts, 1, mapping_styles.names_only, ctx.params)
map_names(tbl, rargs, karg, varg, looptype, function ()
return ctx.frame:callParserFunction(magic, rargs)
end)
for key, val in pairs(mem) do tbl[key] = val end
ctx.params = tbl
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain
-- flag]|pipe to
library.renaming_by_replacing = function (ctx)
local ptn, repl, nmax, flg, argc, die =
load_replace_args(ctx.pipe, 'renaming_by_replacing')
if die then return context_iterate(ctx, argc) end
local tbl = ctx.params
if flg == 3 then
ptn = get_parameter_name(ptn)
local val = tbl[ptn]
if val ~= nil then
tbl[ptn], tbl[get_parameter_name(repl)] = nil, val
end
else
if flg == 2 then
-- Copied from Module:String's `str._escapePattern()`
ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0')
end
local cache = {}
for key, val in pairs(tbl) do
steal_if_renamed(val, tbl, key, cache,
tostring(key):gsub(ptn, repl, nmax))
end
for key, val in pairs(cache) do tbl[key] = val end
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to
library.renaming_by_mixing = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
if ctx.pipe[1] == nil then error(modulename ..
', ‘renaming_by_mixing’: No mixing string was provided', 0) end
local mix = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache = {}
if mix == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_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_parameter_name(table.concat(canvas))] = val
end
end
ctx.params = cache
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|renaming_to_values|pipe to
--[[
library.renaming_to_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 cache = {}
for _, val in pairs(ctx.params) do cache[val] = val end
ctx.params = cache
return context_iterate(ctx, 1)
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 tmp, argc, tbl, mem = load_child_opts(ctx.pipe, 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 = ctx.pipe[1]
if tmp ~= nil then tmp = tmp:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘grouping_by_calling’: No template name was provided', 0) end
local model = { title = tmp }
local groups = make_groups(tbl)
for gid, group in pairs(groups) do
for key, val in pairs(gargs) do group[key] = val end
group[0], model.args = gid, group
groups[gid] = ctx.frame:expandTemplate(model)
end
for key, val in pairs(mem) do groups[key] = val end
ctx.params = groups
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.parsing = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘parsing’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
parse_parameter_string(ctx.params, opts[1], isep, iplain, psep, pplain,
trimnamed, trimunnamed)
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim
-- flag]|[iteration delimiter setter]|[...]|[key-value delimiter
-- setter]|[...]|pipe to
library.reinterpreting = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '|', '=')
local tbl, tmp = ctx.params, get_parameter_name(opts[1])
local str = tbl[tmp]
if str ~= nil then
tbl[tmp] = nil
parse_parameter_string(tbl, str, isep, iplain, psep, pplain,
trimnamed, trimunnamed)
end
return context_iterate(ctx, argc)
end
-- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration
-- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to
library.evaluating = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘evaluating’: No string to parse was provided', 0) end
local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc =
load_parse_opts(opts, 2, '!', ':')
if opts[1]:match'^%s*(.*%S)' == nil then
ctx.pipe = copy_or_ref_table(opts, opts ~= ctx.opipe)
return context_iterate(ctx, argc)
end
local new_opts, cache = {}, {}
local shift = parse_parameter_string(cache, opts[1], isep, iplain,
psep, pplain, trimnamed, trimunnamed) - argc
for key, val in pairs(opts) do
if type(key) ~= 'number' or key < 1 then new_opts[key] = val
elseif key >= argc then new_opts[key + shift] = val end
end
for key, val in pairs(cache) do new_opts[key] = val end
ctx.pipe = new_opts
return context_iterate(ctx, 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
if ctx.pipe[1] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end
local tmp
local mix_k = ctx.pipe[1]:match'^%s*(.-)%s*$'
local cache, mix_v = {}, ctx.pipe[2]
if mix_k == '$@' and mix_v == '$@' then
for _, val in pairs(ctx.params) do
cache[get_parameter_name(val)] = val
end
elseif mix_k == '$@' and mix_v == '$#' then
for key, val in pairs(ctx.params) do
cache[get_parameter_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_parameter_name(table.concat(cnv_k))] =
table.concat(cnv_v)
end
end
ctx.params = cache
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|swapping_names_and_values|pipe to
--[[
library.swapping_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 cache = {}
for key, val in pairs(ctx.params) do cache[val] = key end
ctx.params = cache
return context_iterate(ctx, 1)
end
]]--
-- Syntax: #invoke:params|combining|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return key .. kvs .. val end,
'combining'
) + 1)
end
-- Syntax: #invoke:params|combining_values|new parameter name|[sort
-- order]|[with/without flushed glue]|setting directives|...|pipe to
library.combining_values = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
return context_iterate(ctx, combine_parameters(
ctx,
function (key, val, kvs) return val end,
'combining_values'
) + 1)
end
-- Syntax: #invoke:params|combining_by_calling|template name|new parameter
-- name|pipe to
library.combining_by_calling = function (ctx)
-- NOTE: `ctx.params` might be the original metatable! As a modifier,
-- this function MUST create a copy of it before returning
local tname = ctx.pipe[1]
if tname ~= nil then tname = tname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_calling’: No template name was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_calling’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] = ctx.frame:expandTemplate{
title = tname,
args = ctx.params
}
}
return context_iterate(ctx, 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 mname = ctx.pipe[1]
if mname ~= nil then mname = mname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No module name was provided', 0) end
local fname = ctx.pipe[2]
if fname ~= nil then fname = fname:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_invoking’: No function name was provided', 0) end
if ctx.pipe[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_parameter_name(ctx.pipe[3])] =
tostring(mfunc(ctx.frame:newChild(model)))
}
return context_iterate(ctx, 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 magic = ctx.pipe[1]
if magic ~= nil then magic = magic:match'^%s*(.*%S)'
else error(modulename ..
', ‘combining_by_magic’: No parser function was provided', 0) end
if ctx.pipe[2] == nil then error(modulename ..
', ‘combining_by_magic’: No parameter name was provided', 0) end
ctx.params = {
[get_parameter_name(ctx.pipe[2])] =
ctx.frame:callParserFunction(magic, ctx.params)
}
return context_iterate(ctx, 3)
end
-- Syntax: #invoke:params|snapshotting|[maximum number]|pipe to
library.snapshotting = function (ctx)
return context_iterate(ctx, make_child(ctx, ctx.params, 'snapshotting'))
end
-- Syntax: #invoke:params|remembering|[maximum number]|pipe to
library.remembering = function (ctx)
return context_iterate(ctx, make_child(ctx, ctx.oparams, 'remembering'))
end
-- Syntax: #invoke:params|entering_substack|[new]|pipe to
library.entering_substack = function (ctx)
local tbl, ncurrparent = ctx.params, ctx.n_parents + 1
if ctx.parents == nil then ctx.parents = { tbl }
else ctx.parents[ncurrparent] = tbl end
ctx.n_parents = ncurrparent
if ctx.pipe[1] ~= nil and ctx.pipe[1]:match'^%s*new%s*$' then
ctx.params = {}
return context_iterate(ctx, 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, 1)
end
-- Syntax: #invoke:params|pulling|parameter name|pipe to
library.pulling = function (ctx)
local opts = ctx.pipe
if opts[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_parameter_name(opts[1])
if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|recalling|parameter name|pipe to
library.recalling = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘recalling’: No parameter to recall was provided', 0) end
local arg = get_parameter_name(opts[1])
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, 2)
end
-- Syntax: #invoke:params|finding|parameter name|pipe to
--[[
library.finding = function (ctx)
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘finding’: No parameter to find was provided', 0) end
local arg = get_parameter_name(opts[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, 2)
end
end
if ctx.oparams[arg] ~= nil then ctx.params[arg] = ctx.oparams[arg] end
return context_iterate(ctx, 2)
end
]]--
-- Syntax: #invoke:params|picking|number of parameters to pick|pipe to
--[[
library.picking = function (ctx)
local len = tonumber(ctx.pipe[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, 2)
end
]]--
-- Syntax: #invoke:params|detaching_substack|pipe to
library.detaching_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘detaching_substack’: No substack has been created', 0) end
local parent = ctx.parents[ncurrparent]
for key in pairs(ctx.params) do parent[key] = nil end
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|dropping_substack|pipe to
library.dropping_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘dropping_substack’: No substack has been created', 0) end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents =
ctx.parents[ncurrparent], nil, ncurrparent - 1
return context_iterate(ctx, 1)
end
-- Syntax: #invoke:params|leaving_substack|pipe to
library.leaving_substack = function (ctx)
local ncurrparent = ctx.n_parents
if ncurrparent < 1 then error(modulename ..
', ‘leaving_substack’: No substack has been created', 0) end
local currsnap = ctx.n_children + 1
if ctx.children == nil then ctx.children = { ctx.params }
else ctx.children[currsnap] = ctx.params end
ctx.params, ctx.parents[ncurrparent], ctx.n_parents, ctx.n_children =
ctx.parents[ncurrparent], nil, ncurrparent - 1, currsnap
return context_iterate(ctx, 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, 1)
end
-- Syntax: #invoke:params|flushing|pipe to
library.flushing = function (ctx)
if ctx.n_children < 1 then error(modulename ..
', ‘flushing’: There are no substacks to flush', 0) end
local parent, currsnap = ctx.params, ctx.n_children
for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end
ctx.children[currsnap], ctx.n_children = nil, currsnap - 1
return context_iterate(ctx, 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, 1)
end
--[[ Functions ]]--
-----------------------------
-- Syntax: #invoke:params|count
library.count = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local retval = 0
for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end
if ctx.subset == -1 then retval = retval - #ctx.params end
ctx.text = retval
return false
end
-- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2]
-- |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value
-- n]|[...]
library.concat_and_call = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘concat_and_call’: No template name was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:expandTemplate{
title = tname,
args = concat_params(ctx)
}
return false
end
-- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend
-- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named
-- item n=value n]|[...]
library.concat_and_invoke = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘concat_and_invoke’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘concat_and_invoke’: No function name was provided', 0) end
remove_numeric_keys(opts, 1, 2)
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)
})
return false
end
-- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend
-- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n=
-- value n]|[...]
library.concat_and_magic = function (ctx)
-- NOTE: `ctx.params` might be the original metatable!
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘concat_and_magic’: No parser function was provided', 0) end
remove_numeric_keys(opts, 1, 1)
ctx.text = ctx.frame:callParserFunction(magic, concat_params(ctx))
return false
end
-- Syntax: #invoke:params|value_of|parameter name
library.value_of = function (ctx)
-- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables!
local opts = ctx.pipe
if opts[1] == nil then error(modulename ..
', ‘value_of’: No parameter name was provided', 0) end
local val
local key = opts[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)
-- NOTE: `ctx.pipe` might be the original metatable!
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: `ctx.pipe` might be the original metatable!
-- 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)
-- NOTE: `ctx.pipe` might be the original metatable!
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|coins|[first coin = value 1]|[second coin = value
-- 2]|[...]|[last coin = value N]
--[[
library.coins = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do tbl[key] = opts[get_parameter_name(val)] end
return library.list_values(ctx)
end
]]--
-- Syntax: #invoke:params|unique_coins|[first coin = value 1]|[second coin =
-- value 2]|[...]|[last coin = value N]
--[[
library.unique_coins = function (ctx)
local tmp
local opts, tbl = ctx.pipe, ctx.params
for key, val in pairs(tbl) do
tmp = get_parameter_name(val)
tbl[key], opts[tmp] = opts[tmp], nil
end
return library.list_values(ctx)
end
]]
-- Syntax: #invoke:params|for_each|wikitext
library.for_each = function (ctx)
-- NOTE: `ctx.pipe` might be the original metatable!
local ret, nss, pps, txt = {}, 0, ctx.itersep or '', ctx.pipe[1] or ''
local skel, cnv, n_parts = parse_placeholder_string(txt)
flush_params(ctx, function (key, val)
for idx = 2, n_parts, 2 do
if skel[idx] then cnv[idx] = val
else cnv[idx] = tostring(key) end
end
ret[nss + 1], nss = pps, nss + 2
ret[nss] = table.concat(cnv)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:expandTemplate(model)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|invoke_for_each|module name|module function|[append
-- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...]
-- |[named param n=value n]|[...]
library.invoke_for_each = function (ctx)
local mname, fname
local opts = ctx.pipe
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = mfunc(ctx.frame:newChild(model))
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append 2]
-- |[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.magic_for_each = function (ctx)
local magic
local opts = ctx.pipe
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
table.insert(opts, 1, true)
flush_params(ctx, function (key, val)
opts[1], opts[2], ret[nss + 1], nss = key, val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, opts)
end)
finalize_and_return_concatenated_list(ctx, ret, nss, 2)
return false
end
-- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append
-- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param
-- n=value n]|[...]
library.call_for_each_value = function (ctx)
local tname
local opts = ctx.pipe
if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end
if tname == nil then error(modulename ..
', ‘call_for_each_value’: No template name was provided', 0) end
local model = { title = tname, args = opts }
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[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 = ctx.pipe
local mname, fname
if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end
if mname == nil then error(modulename ..
', ‘invoke_for_each_value’: No module name was provided', 0) end
if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end
if fname == nil then error(modulename ..
', ‘invoke_for_each_value’: No function name was provided', 0) end
local model = { title = 'Module:' .. mname, args = opts }
local mfunc = require(model.title)[fname]
local ret, nss, ccs = {}, 0, ctx.itersep or ''
remove_numeric_keys(opts, 1, 1)
flush_params(ctx, function (key, val)
opts[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 = ctx.pipe
local magic
if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end
if magic == nil then error(modulename ..
', ‘magic_for_each_value’: No parser function was provided', 0) end
local ret, nss, ccs = {}, 0, ctx.itersep or ''
flush_params(ctx, function (key, val)
opts[1], ret[nss + 1], nss = val, ccs, nss + 2
ret[nss] = ctx.frame:callParserFunction(magic, opts)
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.pipe` and `ctx.params` might be the original metatables!
local tmp
if ctx.pipe[1] ~= nil then tmp = ctx.pipe[1]:match'^%s*(.*%S)' end
if tmp == nil then error(modulename ..
', ‘call_for_each_group’: No template name was provided', 0) end
local model = { title = tmp }
local opts, ret, nss, ccs = {}, {}, 0, ctx.itersep or ''
for key, val in pairs(ctx.pipe) do
if type(key) == 'number' then opts[key - 1] = val
else opts[key] = val end
end
ctx.pipe = opts
ctx.params = make_groups(ctx.params)
flush_params(ctx, function (gid, group)
for key, val in pairs(opts) 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)
ctx.pipe = copy_or_ref_table(ctx.opipe, false)
ctx.params = {}
main_loop(ctx, context_iterate(ctx, 1))
return ctx.text
end
--[[ First-position-only functions ]]--
---------------------------------------
-- Syntax: #invoke:params|self
static_iface.self = function (frame)
return 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)
ctx.pipe = copy_or_ref_table(ctx.opipe, refpipe[fname])
ctx.params = copy_or_ref_table(ctx.oparams, refparams[fname])
main_loop(ctx, func)
return ctx.text
end
end
})
9ko1dij40e2ajwgg59fvqm72uoivi2f
پایرتس آف کاراییبن: کرس آف بلک پرل
0
172102
390664
2026-07-23T21:46:19Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
390664
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''''کاراییب پایرتس: کرس آف بلک پرل''''' یا '''''کارائیب دریایِ دزد: سیو مرواریِ نفرین''''' {{به انگلیسی|Pirates of the Caribbean: The Curse of the Black Pearl}} اتا فیلم [[کاراییب پایرتس]] سری فیلمها جه هسته که ونه اولین قسمت بییه.
== آسنی ==
بریتانیای اتا گت نظامی کشتی دله، اتا اشرافی کیجا دیّه که ونه نوم ره گتنه الیزابت. الیزابت اتا روز وینده دریا دله اتا تختهچو سر اتا ریکا کته. وه ره دریا دله جه بالا کشنّه. ریکا نوم ره گتنه ویلیام ترنر و ونه گردن اتا دریایی دزدونِ گردنی دیّه. الیزابت تا وه خاسته هوش بئه، گردنی ره گیرنه و جا دنه تا ریکا ره نکوشن.
سالها گذرنه. وشون گت وونّه و ویلیام آهنگر وونه. الیزابت وسه هم خاستکارچی إنه که کشتیِ ناخدا هسته. الیزابت (که گردنی ره هنتا شه همرکت دارنه) وقتی خاستکارِ بخاستی ره إشنونه، غش کنده و کفنه ئو دله. همینگدر اتا دزد (جک إسپارو) که بندر نیشتبییه و سربازها جه گپ زو، وینده کیجا دکته ئو دله و وه ره نجات دنه. الیزابت گردنی وقتی ئو خرنه، اتا طلسم واری چمر إنه و «سیو مرواری» (black pearl) کشتی ره خور کنده.
جک إسپارو چون دریایی دزد بییه، خانه وه ره بیرن اعدام هاکنن ولی الیزابت ونه پشت در إنه. إسپارو فرار کنده و اتا آهنگری دله شونه که شه دستِ زلفن (قفل) ره وا هاکنه. همین گدر ویلیام سر رسنه و ونجه شمشیر زنده تا وه ره بیره. أنده هئی ره زننه که سربازها سر رسنّه و جک إسپارو ره ورنه زندون.
درنه تا سیو مرواری إنه شهر ره حمله کنده و بازار ره کوفه کنّه و کیجا، الیزابت، ره گیرنه - ورنه. وه ره حالی وونه گردنی وسّه بمونه و شه فامیلی ره دِرو گنه و شه ره الیزابت ترنر معرفی کنده و شرط کنده اگه شهر ره تش ندن و دگردن دریو دله، گردنی ره دنه وشون ره.
کاپتان باربوسا ونه شرایط ره قبول کنده ولی وه ره رها نکنده. میّن وونه سیو مرواریِ دزدها همه نفرین بئی هستنه و نامیرا بینه و هیچ چیزی حس نکنّه. وشون اتا گنج بدزدی بینه که وشون ره طلسم هاکرده و وسته تموم گردنیها سر ره جمع هاکنن و ونه سر اتا نفرین بئیِ خون ره هشنن که طلسم باطل بوه.
ویلیام ترنر شهر دله شونه جک اسپارو ره زندون جه دریارنه و وشون دِ-به-دِ اتا گت کشتی ره ناخدا جه دزّنه و إنّه سیو مرواری دمبالسر. جک إسپارو اینجه ویلیام ره حالی کنده که ونه پییر اتا دریای دزد بییه و ونه نوم ره تلوپ ترنر گتنه. وشون اتا جزیره جه خدمه پىدا کنّه و راه ره إدامه دنه. کاپتان که خیال کنده الیزابت همون تلوپ ترنر وچه هسته، ونه خون ره شندنه گردنی سر ولی طلسم باطل نیه.
این گدر ویلیام سر برسییه و کیجا ره نجات هدا ولی جک دکته کاپتان باربوسا دستپه. دتا کشتی پیش-پئی هئی ره دمبال کنّه تا سیو مرواری اوناتا ره غرق کنده و ونه آدمون ره اسیر کنده. ویلیام ترنر شه خد ره شناسا دنه و در عوض قول گیرنه الیزابت ره آزاد هاکنن. کاپتان هم الیزابت و جک ره اتا جزیره ور دمدنه دریا دله تا شه قول ره بستینکلا عمل هاکنه.
جک و الیزابت جزیره دله اتگال خِشی درنه و اینصوه الیزابت دار-دار ره تش دنه تا بریتانیای کشتیئون سرصاب بون و بئن وشون په. همین هم وونه. جک تونده اینجه ناخدا ره راقاضی دمبده که بورن سیو مرواری دمبال. ناخدا چدومبه ندومبه کانده تا الیزابت گنه اگه بورن ویلیام دمبال بگردن، وه خاستکاری ره أره دنه. القصه، راه کفنه.
ناخدا و ونه سربازها چند دسته وونّه و جزیره ور إستنّه. جک شونه دله تا کاپتان باربوسا جه گپ بزنه و ونه مخ ره بزنه که تا میرا هستنه و ویلیامِ خون ره نشنینه، ناخدای سربازون ره بکوشن و اینتی دِتا کشتی بوون.
تا خانه سربازها و سیو مرواریِ نامیرائون جنگ دکفن، جزیره دله جک إسپارو و کاپتان باربوسا میون دعوا وونه و جک که اتا گردنی ره بىستایی بدزدییه، نامیرا وونه و کاپتان جه شمشیرکا کنده. ویلیام و الیزابت هم باقیِ بموندست خدمه ره سرگرم دارنه. جک اتدقه شمشیر ره باربوسای کش خِنه و باربوسا وه ره ریک چینده ولی همین گدر ویلیام شه دستِ خون ره گردنی سر سُنه و طلسم ره باطل کنده. هم کاپتان دکته بمرده، هم ونه خدمه که جنگستنه شکست بخردنه، هم سیو مرواری دکته جکِ خدمه دست و هم الیزابت و ویلیام زنده در بوردنه.
جک إسپارو ره ورنه إنگلیس که دزدی وسه اعدام هاکنن. الیزابت هم ناخدا جه ونه نومزه هاکنه. ولی آخرین توم که جک ره ورنه دار بزنن، ویلیام وه ره نجات و فراری دنه. جکِ خدمه سیو مرواری جه إنّه ونه دمبال. ناخدا هم وقتی وینده کیجا واقعاً وه ره نخانه، بیخیال وونه و گنه بییلین همه بورن.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:کاراییب پایرتس]]
[[رج: انگلیسی فیلمون]]
[[رج: فیلمون]]
45qxdngh9hpk6m9oa5z3ortevzlf69z
390665
390664
2026-07-23T21:47:07Z
محک
1023
[[رج:فیلمون]] حذف شد; [[رج:۲۰۰۳ فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
390665
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''''کاراییب پایرتس: کرس آف بلک پرل''''' یا '''''کارائیب دریایِ دزد: سیو مرواریِ نفرین''''' {{به انگلیسی|Pirates of the Caribbean: The Curse of the Black Pearl}} اتا فیلم [[کاراییب پایرتس]] سری فیلمها جه هسته که ونه اولین قسمت بییه.
== آسنی ==
بریتانیای اتا گت نظامی کشتی دله، اتا اشرافی کیجا دیّه که ونه نوم ره گتنه الیزابت. الیزابت اتا روز وینده دریا دله اتا تختهچو سر اتا ریکا کته. وه ره دریا دله جه بالا کشنّه. ریکا نوم ره گتنه ویلیام ترنر و ونه گردن اتا دریایی دزدونِ گردنی دیّه. الیزابت تا وه خاسته هوش بئه، گردنی ره گیرنه و جا دنه تا ریکا ره نکوشن.
سالها گذرنه. وشون گت وونّه و ویلیام آهنگر وونه. الیزابت وسه هم خاستکارچی إنه که کشتیِ ناخدا هسته. الیزابت (که گردنی ره هنتا شه همرکت دارنه) وقتی خاستکارِ بخاستی ره إشنونه، غش کنده و کفنه ئو دله. همینگدر اتا دزد (جک إسپارو) که بندر نیشتبییه و سربازها جه گپ زو، وینده کیجا دکته ئو دله و وه ره نجات دنه. الیزابت گردنی وقتی ئو خرنه، اتا طلسم واری چمر إنه و «سیو مرواری» (black pearl) کشتی ره خور کنده.
جک إسپارو چون دریایی دزد بییه، خانه وه ره بیرن اعدام هاکنن ولی الیزابت ونه پشت در إنه. إسپارو فرار کنده و اتا آهنگری دله شونه که شه دستِ زلفن (قفل) ره وا هاکنه. همین گدر ویلیام سر رسنه و ونجه شمشیر زنده تا وه ره بیره. أنده هئی ره زننه که سربازها سر رسنّه و جک إسپارو ره ورنه زندون.
درنه تا سیو مرواری إنه شهر ره حمله کنده و بازار ره کوفه کنّه و کیجا، الیزابت، ره گیرنه - ورنه. وه ره حالی وونه گردنی وسّه بمونه و شه فامیلی ره دِرو گنه و شه ره الیزابت ترنر معرفی کنده و شرط کنده اگه شهر ره تش ندن و دگردن دریو دله، گردنی ره دنه وشون ره.
کاپتان باربوسا ونه شرایط ره قبول کنده ولی وه ره رها نکنده. میّن وونه سیو مرواریِ دزدها همه نفرین بئی هستنه و نامیرا بینه و هیچ چیزی حس نکنّه. وشون اتا گنج بدزدی بینه که وشون ره طلسم هاکرده و وسته تموم گردنیها سر ره جمع هاکنن و ونه سر اتا نفرین بئیِ خون ره هشنن که طلسم باطل بوه.
ویلیام ترنر شهر دله شونه جک اسپارو ره زندون جه دریارنه و وشون دِ-به-دِ اتا گت کشتی ره ناخدا جه دزّنه و إنّه سیو مرواری دمبالسر. جک إسپارو اینجه ویلیام ره حالی کنده که ونه پییر اتا دریای دزد بییه و ونه نوم ره تلوپ ترنر گتنه. وشون اتا جزیره جه خدمه پىدا کنّه و راه ره إدامه دنه. کاپتان که خیال کنده الیزابت همون تلوپ ترنر وچه هسته، ونه خون ره شندنه گردنی سر ولی طلسم باطل نیه.
این گدر ویلیام سر برسییه و کیجا ره نجات هدا ولی جک دکته کاپتان باربوسا دستپه. دتا کشتی پیش-پئی هئی ره دمبال کنّه تا سیو مرواری اوناتا ره غرق کنده و ونه آدمون ره اسیر کنده. ویلیام ترنر شه خد ره شناسا دنه و در عوض قول گیرنه الیزابت ره آزاد هاکنن. کاپتان هم الیزابت و جک ره اتا جزیره ور دمدنه دریا دله تا شه قول ره بستینکلا عمل هاکنه.
جک و الیزابت جزیره دله اتگال خِشی درنه و اینصوه الیزابت دار-دار ره تش دنه تا بریتانیای کشتیئون سرصاب بون و بئن وشون په. همین هم وونه. جک تونده اینجه ناخدا ره راقاضی دمبده که بورن سیو مرواری دمبال. ناخدا چدومبه ندومبه کانده تا الیزابت گنه اگه بورن ویلیام دمبال بگردن، وه خاستکاری ره أره دنه. القصه، راه کفنه.
ناخدا و ونه سربازها چند دسته وونّه و جزیره ور إستنّه. جک شونه دله تا کاپتان باربوسا جه گپ بزنه و ونه مخ ره بزنه که تا میرا هستنه و ویلیامِ خون ره نشنینه، ناخدای سربازون ره بکوشن و اینتی دِتا کشتی بوون.
تا خانه سربازها و سیو مرواریِ نامیرائون جنگ دکفن، جزیره دله جک إسپارو و کاپتان باربوسا میون دعوا وونه و جک که اتا گردنی ره بىستایی بدزدییه، نامیرا وونه و کاپتان جه شمشیرکا کنده. ویلیام و الیزابت هم باقیِ بموندست خدمه ره سرگرم دارنه. جک اتدقه شمشیر ره باربوسای کش خِنه و باربوسا وه ره ریک چینده ولی همین گدر ویلیام شه دستِ خون ره گردنی سر سُنه و طلسم ره باطل کنده. هم کاپتان دکته بمرده، هم ونه خدمه که جنگستنه شکست بخردنه، هم سیو مرواری دکته جکِ خدمه دست و هم الیزابت و ویلیام زنده در بوردنه.
جک إسپارو ره ورنه إنگلیس که دزدی وسه اعدام هاکنن. الیزابت هم ناخدا جه ونه نومزه هاکنه. ولی آخرین توم که جک ره ورنه دار بزنن، ویلیام وه ره نجات و فراری دنه. جکِ خدمه سیو مرواری جه إنّه ونه دمبال. ناخدا هم وقتی وینده کیجا واقعاً وه ره نخانه، بیخیال وونه و گنه بییلین همه بورن.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:کاراییب پایرتس]]
[[رج: انگلیسی فیلمون]]
[[رج:۲۰۰۳ فیلمون]]
q6i3r2azvf52zzfogh5qazvb53sw156
390666
390665
2026-07-23T21:53:00Z
محک
1023
390666
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''''کاراییب پایرتس: کرس آف بلک پرل''''' یا '''''کارائیب دریایِ دزد: سیو مرواریِ نفرین''''' {{به انگلیسی|Pirates of the Caribbean: The Curse of the Black Pearl}} اتا فیلم [[کاراییب پایرتس]] سری فیلمها جه هسته که ونه اولین قسمت بییه.
أصلی نقشِ بازیگرون اینان بینه: [[جانی دپ]] (جک إسپارو)، [[جفری راش]] (کاپتان هکتور باربوسا)، [[اورلاندو بلوم]] (ویلیام ترنر)، [[کیرا نایتلی]] (الیزابت سوآن).
== آسنی ==
بریتانیای اتا گت نظامی کشتی دله، اتا اشرافی کیجا دیّه که ونه نوم ره گتنه الیزابت سوآن. الیزابت اتا روز وینده دریا دله اتا تختهچو سر اتا ریکا کته. وه ره دریا دله جه بالا کشنّه. ریکا نوم ره گتنه ویلیام ترنر و ونه گردن اتا دریایی دزدونِ گردنی دیّه. الیزابت تا وه خاسته هوش بئه، گردنی ره گیرنه و جا دنه تا ریکا ره نکوشن.
سالها گذرنه. وشون گت وونّه و ویلیام آهنگر وونه. الیزابت وسه هم خاستکارچی إنه که کشتیِ ناخدا هسته. الیزابت (که گردنی ره هنتا شه همرکت دارنه) وقتی خاستکارِ بخاستی ره إشنونه، غش کنده و کفنه ئو دله. همینگدر اتا دزد (جک إسپارو) که بندر نیشتبییه و سربازها جه گپ زو، وینده کیجا دکته ئو دله و وه ره نجات دنه. الیزابت گردنی وقتی ئو خرنه، اتا طلسم واری چمر إنه و «سیو مرواری» (black pearl) کشتی ره خور کنده.
جک إسپارو چون دریایی دزد بییه، خانه وه ره بیرن اعدام هاکنن ولی الیزابت ونه پشت در إنه. إسپارو فرار کنده و اتا آهنگری دله شونه که شه دستِ زلفن (قفل) ره وا هاکنه. همین گدر ویلیام سر رسنه و ونجه شمشیر زنده تا وه ره بیره. أنده هئی ره زننه که سربازها سر رسنّه و جک إسپارو ره ورنه زندون.
درنه تا سیو مرواری إنه شهر ره حمله کنده و بازار ره کوفه کنّه و کیجا، الیزابت، ره گیرنه - ورنه. وه ره حالی وونه گردنی وسّه بمونه و شه فامیلی ره دِرو گنه و شه ره الیزابت ترنر معرفی کنده و شرط کنده اگه شهر ره تش ندن و دگردن دریو دله، گردنی ره دنه وشون ره.
کاپتان باربوسا ونه شرایط ره قبول کنده ولی وه ره رها نکنده. میّن وونه سیو مرواریِ دزدها همه نفرین بئی هستنه و نامیرا بینه و هیچ چیزی حس نکنّه. وشون اتا گنج بدزدی بینه که وشون ره طلسم هاکرده و وسته تموم گردنیها سر ره جمع هاکنن و ونه سر اتا نفرین بئیِ خون ره هشنن که طلسم باطل بوه.
ویلیام ترنر شهر دله شونه جک اسپارو ره زندون جه دریارنه و وشون دِ-به-دِ اتا گت کشتی ره ناخدا جه دزّنه و إنّه سیو مرواری دمبالسر. جک إسپارو اینجه ویلیام ره حالی کنده که ونه پییر اتا دریای دزد بییه و ونه نوم ره تلوپ ترنر گتنه. وشون اتا جزیره جه خدمه پىدا کنّه و راه ره إدامه دنه. کاپتان که خیال کنده الیزابت همون تلوپ ترنر وچه هسته، ونه خون ره شندنه گردنی سر ولی طلسم باطل نیه.
این گدر ویلیام سر برسییه و کیجا ره نجات هدا ولی جک دکته کاپتان باربوسا دستپه. دتا کشتی پیش-پئی هئی ره دمبال کنّه تا سیو مرواری اوناتا ره غرق کنده و ونه آدمون ره اسیر کنده. ویلیام ترنر شه خد ره شناسا دنه و در عوض قول گیرنه الیزابت ره آزاد هاکنن. کاپتان هم الیزابت و جک ره اتا جزیره ور دمدنه دریا دله تا شه قول ره بستینکلا عمل هاکنه.
جک و الیزابت جزیره دله اتگال خِشی درنه و اینصوه الیزابت دار-دار ره تش دنه تا بریتانیای کشتیئون سرصاب بون و بئن وشون په. همین هم وونه. جک تونده اینجه ناخدا ره راقاضی دمبده که بورن سیو مرواری دمبال. ناخدا چدومبه ندومبه کانده تا الیزابت گنه اگه بورن ویلیام دمبال بگردن، وه خاستکاری ره أره دنه. القصه، راه کفنه.
ناخدا و ونه سربازها چند دسته وونّه و جزیره ور إستنّه. جک شونه دله تا کاپتان باربوسا جه گپ بزنه و ونه مخ ره بزنه که تا میرا هستنه و ویلیامِ خون ره نشنینه، ناخدای سربازون ره بکوشن و اینتی دِتا کشتی بوون.
تا خانه سربازها و سیو مرواریِ نامیرائون جنگ دکفن، جزیره دله جک إسپارو و کاپتان باربوسا میون دعوا وونه و جک که اتا گردنی ره بىستایی بدزدییه، نامیرا وونه و کاپتان جه شمشیرکا کنده. ویلیام و الیزابت هم باقیِ بموندست خدمه ره سرگرم دارنه. جک اتدقه شمشیر ره باربوسای کش خِنه و باربوسا وه ره ریک چینده ولی همین گدر ویلیام شه دستِ خون ره گردنی سر سُنه و طلسم ره باطل کنده. هم کاپتان دکته بمرده، هم ونه خدمه که جنگستنه شکست بخردنه، هم سیو مرواری دکته جکِ خدمه دست و هم الیزابت و ویلیام زنده در بوردنه.
جک إسپارو ره ورنه إنگلیس که دزدی وسه اعدام هاکنن. الیزابت هم ناخدا جه ونه نومزه هاکنه. ولی آخرین توم که جک ره ورنه دار بزنن، ویلیام وه ره نجات و فراری دنه. جکِ خدمه سیو مرواری جه إنّه ونه دمبال. ناخدا هم وقتی وینده کیجا واقعاً وه ره نخانه، بیخیال وونه و گنه بییلین همه بورن.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:کاراییب پایرتس]]
[[رج: انگلیسی فیلمون]]
[[رج:۲۰۰۳ فیلمون]]
130sey7ybk1xa4eubfvjao1a6hqg7jr
390667
390666
2026-07-23T21:54:50Z
محک
1023
390667
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''''کاراییب پایرتس: کرس آف بلک پرل''''' که ونه نوم معنی وونه '''''کارائیب دریایِ دزد: سیو مرواریِ نفرین''''' {{به انگلیسی|Pirates of the Caribbean: The Curse of the Black Pearl}} اتا فیلم، [[کاراییب پایرتس]] سری فیلمها جه هسته که ونه اولین قسمت بییه و ۲۰۰۳ دربمو. [[گور وربینسکی]] این فیلم ره بساته.
أصلی نقشِ بازیگرون اینان بینه: [[جانی دپ]] (جک إسپارو)، [[جفری راش]] (کاپتان هکتور باربوسا)، [[اورلاندو بلوم]] (ویلیام ترنر)، [[کیرا نایتلی]] (الیزابت سوآن).
== آسنی ==
بریتانیای اتا گت نظامی کشتی دله، اتا اشرافی کیجا دیّه که ونه نوم ره گتنه الیزابت سوآن. الیزابت اتا روز وینده دریا دله اتا تختهچو سر اتا ریکا کته. وه ره دریا دله جه بالا کشنّه. ریکا نوم ره گتنه ویلیام ترنر و ونه گردن اتا دریایی دزدونِ گردنی دیّه. الیزابت تا وه خاسته هوش بئه، گردنی ره گیرنه و جا دنه تا ریکا ره نکوشن.
سالها گذرنه. وشون گت وونّه و ویلیام آهنگر وونه. الیزابت وسه هم خاستکارچی إنه که کشتیِ ناخدا هسته. الیزابت (که گردنی ره هنتا شه همرکت دارنه) وقتی خاستکارِ بخاستی ره إشنونه، غش کنده و کفنه ئو دله. همینگدر اتا دزد (جک إسپارو) که بندر نیشتبییه و سربازها جه گپ زو، وینده کیجا دکته ئو دله و وه ره نجات دنه. الیزابت گردنی وقتی ئو خرنه، اتا طلسم واری چمر إنه و «سیو مرواری» (black pearl) کشتی ره خور کنده.
جک إسپارو چون دریایی دزد بییه، خانه وه ره بیرن اعدام هاکنن ولی الیزابت ونه پشت در إنه. إسپارو فرار کنده و اتا آهنگری دله شونه که شه دستِ زلفن (قفل) ره وا هاکنه. همین گدر ویلیام سر رسنه و ونجه شمشیر زنده تا وه ره بیره. أنده هئی ره زننه که سربازها سر رسنّه و جک إسپارو ره ورنه زندون.
درنه تا سیو مرواری إنه شهر ره حمله کنده و بازار ره کوفه کنّه و کیجا، الیزابت، ره گیرنه - ورنه. وه ره حالی وونه گردنی وسّه بمونه و شه فامیلی ره دِرو گنه و شه ره الیزابت ترنر معرفی کنده و شرط کنده اگه شهر ره تش ندن و دگردن دریو دله، گردنی ره دنه وشون ره.
کاپتان باربوسا ونه شرایط ره قبول کنده ولی وه ره رها نکنده. میّن وونه سیو مرواریِ دزدها همه نفرین بئی هستنه و نامیرا بینه و هیچ چیزی حس نکنّه. وشون اتا گنج بدزدی بینه که وشون ره طلسم هاکرده و وسته تموم گردنیها سر ره جمع هاکنن و ونه سر اتا نفرین بئیِ خون ره هشنن که طلسم باطل بوه.
ویلیام ترنر شهر دله شونه جک اسپارو ره زندون جه دریارنه و وشون دِ-به-دِ اتا گت کشتی ره ناخدا جه دزّنه و إنّه سیو مرواری دمبالسر. جک إسپارو اینجه ویلیام ره حالی کنده که ونه پییر اتا دریای دزد بییه و ونه نوم ره تلوپ ترنر گتنه. وشون اتا جزیره جه خدمه پىدا کنّه و راه ره إدامه دنه. کاپتان که خیال کنده الیزابت همون تلوپ ترنر وچه هسته، ونه خون ره شندنه گردنی سر ولی طلسم باطل نیه.
این گدر ویلیام سر برسییه و کیجا ره نجات هدا ولی جک دکته کاپتان باربوسا دستپه. دتا کشتی پیش-پئی هئی ره دمبال کنّه تا سیو مرواری اوناتا ره غرق کنده و ونه آدمون ره اسیر کنده. ویلیام ترنر شه خد ره شناسا دنه و در عوض قول گیرنه الیزابت ره آزاد هاکنن. کاپتان هم الیزابت و جک ره اتا جزیره ور دمدنه دریا دله تا شه قول ره بستینکلا عمل هاکنه.
جک و الیزابت جزیره دله اتگال خِشی درنه و اینصوه الیزابت دار-دار ره تش دنه تا بریتانیای کشتیئون سرصاب بون و بئن وشون په. همین هم وونه. جک تونده اینجه ناخدا ره راقاضی دمبده که بورن سیو مرواری دمبال. ناخدا چدومبه ندومبه کانده تا الیزابت گنه اگه بورن ویلیام دمبال بگردن، وه خاستکاری ره أره دنه. القصه، راه کفنه.
ناخدا و ونه سربازها چند دسته وونّه و جزیره ور إستنّه. جک شونه دله تا کاپتان باربوسا جه گپ بزنه و ونه مخ ره بزنه که تا میرا هستنه و ویلیامِ خون ره نشنینه، ناخدای سربازون ره بکوشن و اینتی دِتا کشتی بوون.
تا خانه سربازها و سیو مرواریِ نامیرائون جنگ دکفن، جزیره دله جک إسپارو و کاپتان باربوسا میون دعوا وونه و جک که اتا گردنی ره بىستایی بدزدییه، نامیرا وونه و کاپتان جه شمشیرکا کنده. ویلیام و الیزابت هم باقیِ بموندست خدمه ره سرگرم دارنه. جک اتدقه شمشیر ره باربوسای کش خِنه و باربوسا وه ره ریک چینده ولی همین گدر ویلیام شه دستِ خون ره گردنی سر سُنه و طلسم ره باطل کنده. هم کاپتان دکته بمرده، هم ونه خدمه که جنگستنه شکست بخردنه، هم سیو مرواری دکته جکِ خدمه دست و هم الیزابت و ویلیام زنده در بوردنه.
جک إسپارو ره ورنه إنگلیس که دزدی وسه اعدام هاکنن. الیزابت هم ناخدا جه ونه نومزه هاکنه. ولی آخرین توم که جک ره ورنه دار بزنن، ویلیام وه ره نجات و فراری دنه. جکِ خدمه سیو مرواری جه إنّه ونه دمبال. ناخدا هم وقتی وینده کیجا واقعاً وه ره نخانه، بیخیال وونه و گنه بییلین همه بورن.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:کاراییب پایرتس]]
[[رج: انگلیسی فیلمون]]
[[رج:۲۰۰۳ فیلمون]]
1owu9kb5b0hftmd74hfd5oy9v3f9dga
390671
390667
2026-07-23T21:58:08Z
محک
1023
390671
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Pirates of the Caribbean - The Curse of the Black Pearl.png
}}
'''''کاراییب پایرتس: کرس آف بلک پرل''''' که ونه نوم معنی وونه '''''کارائیب دریایِ دزد: سیو مرواریِ نفرین''''' {{به انگلیسی|Pirates of the Caribbean: The Curse of the Black Pearl}} اتا فیلم، [[کاراییب پایرتس]] سری فیلمها جه هسته که ونه اولین قسمت بییه و ۲۰۰۳ دربمو. [[گور وربینسکی]] این فیلم ره بساته.
أصلی نقشِ بازیگرون اینان بینه: [[جانی دپ]] (جک إسپارو)، [[جفری راش]] (کاپتان هکتور باربوسا)، [[اورلاندو بلوم]] (ویلیام ترنر)، [[کیرا نایتلی]] (الیزابت سوآن).
== آسنی ==
بریتانیای اتا گت نظامی کشتی دله، اتا اشرافی کیجا دیّه که ونه نوم ره گتنه الیزابت سوآن. الیزابت اتا روز وینده دریا دله اتا تختهچو سر اتا ریکا کته. وه ره دریا دله جه بالا کشنّه. ریکا نوم ره گتنه ویلیام ترنر و ونه گردن اتا دریایی دزدونِ گردنی دیّه. الیزابت تا وه خاسته هوش بئه، گردنی ره گیرنه و جا دنه تا ریکا ره نکوشن.
سالها گذرنه. وشون گت وونّه و ویلیام آهنگر وونه. الیزابت وسه هم خاستکارچی إنه که کشتیِ ناخدا هسته. الیزابت (که گردنی ره هنتا شه همرکت دارنه) وقتی خاستکارِ بخاستی ره إشنونه، غش کنده و کفنه ئو دله. همینگدر اتا دزد (جک إسپارو) که بندر نیشتبییه و سربازها جه گپ زو، وینده کیجا دکته ئو دله و وه ره نجات دنه. الیزابت گردنی وقتی ئو خرنه، اتا طلسم واری چمر إنه و «سیو مرواری» (black pearl) کشتی ره خور کنده.
جک إسپارو چون دریایی دزد بییه، خانه وه ره بیرن اعدام هاکنن ولی الیزابت ونه پشت در إنه. إسپارو فرار کنده و اتا آهنگری دله شونه که شه دستِ زلفن (قفل) ره وا هاکنه. همین گدر ویلیام سر رسنه و ونجه شمشیر زنده تا وه ره بیره. أنده هئی ره زننه که سربازها سر رسنّه و جک إسپارو ره ورنه زندون.
درنه تا سیو مرواری إنه شهر ره حمله کنده و بازار ره کوفه کنّه و کیجا، الیزابت، ره گیرنه - ورنه. وه ره حالی وونه گردنی وسّه بمونه و شه فامیلی ره دِرو گنه و شه ره الیزابت ترنر معرفی کنده و شرط کنده اگه شهر ره تش ندن و دگردن دریو دله، گردنی ره دنه وشون ره.
کاپتان باربوسا ونه شرایط ره قبول کنده ولی وه ره رها نکنده. میّن وونه سیو مرواریِ دزدها همه نفرین بئی هستنه و نامیرا بینه و هیچ چیزی حس نکنّه. وشون اتا گنج بدزدی بینه که وشون ره طلسم هاکرده و وسته تموم گردنیها سر ره جمع هاکنن و ونه سر اتا نفرین بئیِ خون ره هشنن که طلسم باطل بوه.
ویلیام ترنر شهر دله شونه جک اسپارو ره زندون جه دریارنه و وشون دِ-به-دِ اتا گت کشتی ره ناخدا جه دزّنه و إنّه سیو مرواری دمبالسر. جک إسپارو اینجه ویلیام ره حالی کنده که ونه پییر اتا دریای دزد بییه و ونه نوم ره تلوپ ترنر گتنه. وشون اتا جزیره جه خدمه پىدا کنّه و راه ره إدامه دنه. کاپتان که خیال کنده الیزابت همون تلوپ ترنر وچه هسته، ونه خون ره شندنه گردنی سر ولی طلسم باطل نیه.
این گدر ویلیام سر برسییه و کیجا ره نجات هدا ولی جک دکته کاپتان باربوسا دستپه. دتا کشتی پیش-پئی هئی ره دمبال کنّه تا سیو مرواری اوناتا ره غرق کنده و ونه آدمون ره اسیر کنده. ویلیام ترنر شه خد ره شناسا دنه و در عوض قول گیرنه الیزابت ره آزاد هاکنن. کاپتان هم الیزابت و جک ره اتا جزیره ور دمدنه دریا دله تا شه قول ره بستینکلا عمل هاکنه.
جک و الیزابت جزیره دله اتگال خِشی درنه و اینصوه الیزابت دار-دار ره تش دنه تا بریتانیای کشتیئون سرصاب بون و بئن وشون په. همین هم وونه. جک تونده اینجه ناخدا ره راقاضی دمبده که بورن سیو مرواری دمبال. ناخدا چدومبه ندومبه کانده تا الیزابت گنه اگه بورن ویلیام دمبال بگردن، وه خاستکاری ره أره دنه. القصه، راه کفنه.
ناخدا و ونه سربازها چند دسته وونّه و جزیره ور إستنّه. جک شونه دله تا کاپتان باربوسا جه گپ بزنه و ونه مخ ره بزنه که تا میرا هستنه و ویلیامِ خون ره نشنینه، ناخدای سربازون ره بکوشن و اینتی دِتا کشتی بوون.
تا خانه سربازها و سیو مرواریِ نامیرائون جنگ دکفن، جزیره دله جک إسپارو و کاپتان باربوسا میون دعوا وونه و جک که اتا گردنی ره بىستایی بدزدییه، نامیرا وونه و کاپتان جه شمشیرکا کنده. ویلیام و الیزابت هم باقیِ بموندست خدمه ره سرگرم دارنه. جک اتدقه شمشیر ره باربوسای کش خِنه و باربوسا وه ره ریک چینده ولی همین گدر ویلیام شه دستِ خون ره گردنی سر سُنه و طلسم ره باطل کنده. هم کاپتان دکته بمرده، هم ونه خدمه که جنگستنه شکست بخردنه، هم سیو مرواری دکته جکِ خدمه دست و هم الیزابت و ویلیام زنده در بوردنه.
جک إسپارو ره ورنه إنگلیس که دزدی وسه اعدام هاکنن. الیزابت هم ناخدا جه ونه نومزه هاکنه. ولی آخرین توم که جک ره ورنه دار بزنن، ویلیام وه ره نجات و فراری دنه. جکِ خدمه سیو مرواری جه إنّه ونه دمبال. ناخدا هم وقتی وینده کیجا واقعاً وه ره نخانه، بیخیال وونه و گنه بییلین همه بورن.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:کاراییب پایرتس]]
[[رج: انگلیسی فیلمون]]
[[رج:۲۰۰۳ فیلمون]]
hrqwszakjd47gd1pdiea2pyatq4gfjg
پرونده:Pirates of the Caribbean - The Curse of the Black Pearl.png
6
172103
390668
2026-07-11T05:26:10Z
en>Jevansen
0
+ [[:Category:Film posters for English-language films]]
390668
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Pirates of the Caribbean: The Curse of the Black Pearl
| Source = http://www.impawards.com/2003/pirates_of_the_caribbean_ver3.html
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
{{media|Pirates of the Caribbean}}
[[Category:Walt Disney film posters]]
[[Category:Film posters for English-language films]]
8k1r2rof6dro6m9t811m44z53pblon7
390669
390668
2026-07-23T21:56:49Z
محک
1023
۱ نسخه واردشده از [[:en:File:Pirates_of_the_Caribbean_-_The_Curse_of_the_Black_Pearl.png]]
390668
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Pirates of the Caribbean: The Curse of the Black Pearl
| Source = http://www.impawards.com/2003/pirates_of_the_caribbean_ver3.html
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
{{media|Pirates of the Caribbean}}
[[Category:Walt Disney film posters]]
[[Category:Film posters for English-language films]]
8k1r2rof6dro6m9t811m44z53pblon7
390670
390669
2026-07-23T21:57:12Z
محک
1023
محک [[پرونده:Pirates of the Caribbean - The Curse of the Black Pearl.png]] ره بار بییشته
390668
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Pirates of the Caribbean: The Curse of the Black Pearl
| Source = http://www.impawards.com/2003/pirates_of_the_caribbean_ver3.html
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
{{media|Pirates of the Caribbean}}
[[Category:Walt Disney film posters]]
[[Category:Film posters for English-language films]]
8k1r2rof6dro6m9t811m44z53pblon7
الوها جمه
0
172104
390681
2026-07-24T08:23:52Z
HenryThe
27142
این صفحه ره [[:en:Special:Redirect/revision/1362529288|Aloha shirt]] ترجمه سر جه بساتنه
390681
wikitext
text/x-wiki
'''الوها جمه''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Aloha Shirt''، هاوایی جه: ''palaka aloha'')<ref>{{Cite web|title=Nā Puke Wehewehe ʻŌlelo Hawaiʻi|url=https://wehewehe.org/|url-status=live|publisher=Ulukau: The Hawaiian Electronic Library|postscript=:|archive-url=https://web.archive.org/web/20051210100843/https://wehewehe.org:80/|archive-date=2005-12-10|access-date=2026-06-08}}</ref> کا '''هاوایی جمه''' هم ونگ بونه، اته جور رسمی [[جومه (پوشاک)|جمه]] هسّه که [[هاوایی]] دله ریشه دانه. وه پولکدار و یقهدار جمه هسّه، و معمولا کل-اوستین دارنه و ونه [[جل|جِل]] چاپبئی جل هسّه. دب و سنت این هسّه کا وه ره شلوار رو النه اما بونه کا شلوار دله هم هادن. الوها جمه ره بتوندن، رسمی یا غیر رسمی کاری پمتیِ حساب هاوایی دله دپوشن.
الوها جومه یا [[غیر رسمی جومه]]، کا اِسا اته معمول [[دب]] حیساب وونه و اینتی هسّه که کاری هفته کا درنه توم وونه کارکرئون [[جومه]] گدر اته غیررسمی [[پمتی]] پوشندنه و اینتی جشن گیرنه، ونه شروء بیّن اونجه جا بییه کا بتجستنه الوها جمه ره تبلیغ هاکنن و ونه تبلیغ هاکردن جا این دب به وجود بموئه.<ref>[httsp://www.nokaoimagazine.com/Departments/talk_story/Aipono_Tickets.html "Aloha Friday"]. [[:en:Maui_No_Ka_'Oi_Magazine|Maui No Ka 'Oi Magazine]]. Vol. 11, no. 2. March 2007. Retrieved June 8, 2026.</ref>
== منبع ==
* 1 فردینه مایِ 1538 تبری، این ولگ [[:en:Aloha_shirt|اینگلیسی ویکیپدیا]] جه ترجمه بیّه.
[[رج:پمتی]]
[[رج:آمریکا فرهنگ]]
[[رج:مقالاتی که جاپونی زوون منبع دارنه]]
ndoghgiva7nx6tnkk3jnlhmy5pysq9l
390682
390681
2026-07-24T08:25:47Z
HenryThe
27142
+صندخ
390682
wikitext
text/x-wiki
{{Databox}}
'''الوها جمه''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Aloha Shirt''، هاوایی جه: ''palaka aloha'')<ref>{{Cite web|title=Nā Puke Wehewehe ʻŌlelo Hawaiʻi|url=https://wehewehe.org/|url-status=live|publisher=Ulukau: The Hawaiian Electronic Library|postscript=:|archive-url=https://web.archive.org/web/20051210100843/https://wehewehe.org:80/|archive-date=2005-12-10|access-date=2026-06-08}}</ref> کا '''هاوایی جمه''' هم ونگ بونه، اته جور رسمی [[جومه (پوشاک)|جمه]] هسّه که [[هاوایی]] دله ریشه دانه. وه پولکدار و یقهدار جمه هسّه، و معمولا کل-اوستین دارنه و ونه [[جل|جِل]] چاپبئی جل هسّه. دب و سنت این هسّه کا وه ره شلوار رو النه اما بونه کا شلوار دله هم هادن. الوها جمه ره بتوندن، رسمی یا غیر رسمی کاری پمتیِ حساب هاوایی دله دپوشن.
الوها جومه یا [[غیر رسمی جومه]]، کا اِسا اته معمول [[دب]] حیساب وونه و اینتی هسّه که کاری هفته کا درنه توم وونه کارکرئون [[جومه]] گدر اته غیررسمی [[پمتی]] پوشندنه و اینتی جشن گیرنه، ونه شروء بیّن اونجه جا بییه کا بتجستنه الوها جمه ره تبلیغ هاکنن و ونه تبلیغ هاکردن جا این دب به وجود بموئه.<ref>[httsp://www.nokaoimagazine.com/Departments/talk_story/Aipono_Tickets.html "Aloha Friday"]. [[:en:Maui_No_Ka_'Oi_Magazine|Maui No Ka 'Oi Magazine]]. Vol. 11, no. 2. March 2007. Retrieved June 8, 2026.</ref>
== منبع ==
* 1 فردینه مایِ 1538 تبری، این ولگ [[:en:Aloha_shirt|اینگلیسی ویکیپدیا]] جه ترجمه بیّه.
[[رج:پمتی]]
[[رج:آمریکا فرهنگ]]
[[رج:مقالاتی که جاپونی زوون منبع دارنه]]
ionck363sqi473j0ksrlxosxoks81ws