ویکیپدیا
mznwiki
https://mzn.wikipedia.org/wiki/%DA%AF%D8%AA_%D8%B5%D9%81%D8%AD%D9%87
MediaWiki 1.47.0-wmf.14
first-letter
مدیا
شا
گپ
کارور
کارور گپ
ویکیپدیا
ویکیپدیا گپ
پرونده
پرونده گپ
مدیاویکی
مدیاویکی گپ
شابلون
شابلون گپ
رانما
رانما گپ
رج
رج گپ
پورتال
پورتال گپ
پروژه
پروژه گپ
TimedText
TimedText talk
ماژول
ماژول گپ
Event
Event talk
رج:ایران اوستانون
14
5232
391986
174345
2026-08-06T17:47:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391986
wikitext
text/x-wiki
[[رج:ایران]]
[[رج:ایالتون، کشور په]]
pmv1h16idv9r1ei5js6vmvfbgajjhff
رج:یونانی اساطیر
14
8740
391994
39797
2026-08-06T17:48:16Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391994
wikitext
text/x-wiki
[[رج:یونان تاریخ]]
[[رج:اساطیر، کشور په]]
j7ur2g4mxayqk71kjvb9cbeudfzkvka
رج:اساطیر، کشور په
14
9124
391968
209265
2026-08-06T17:45:16Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:اساطیر با حیساب جوغرافی]] را بدون برجایگذاشتن تغییرمسیر به [[رج:اساطیر، کشور په]] منتقل کرد: ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
209265
wikitext
text/x-wiki
[[رج:مردمون، کار په]]
[[رج:مردمون با حیساب جوغرافی]]
tdby9djmfixomm2apsxh0p7bskgwdkk
رج:ایران اسطورهئون
14
9872
391988
180605
2026-08-06T17:47:36Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391988
wikitext
text/x-wiki
[[رج:اساطیر، کشور په]]
[[رج:ایران تاریخ]]
l3atf4qbzlolsqbp5bvx0uigo8vmea8
رج:انگلیسی کتابون
14
10833
391941
120974
2026-08-06T17:38:38Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391941
wikitext
text/x-wiki
[[رج:انگلیسی زوون|کتاب]]
[[رج:کتابون، زوون په]]
nz772e5n04a60kutmsae3crvgpl5un0
موزه
0
21841
391711
115868
2026-08-06T14:19:57Z
HenryThe
27142
+صندخ
391711
wikitext
text/x-wiki
{{Databox}}[[پرونده:Louvre at night centered.jpg|thumb|300px|[[لوور موزه]]]]
'''موزه''' {{فرانسوی|musée}} اتا جاء ره گانّه که ونه درون اتسری باستونی، صنعتی، هنری و گوهرون ِمجموعه ره جمع هاکرد بون.
[[یونسکو]]ی تعریف، موزه جه اینتی هسته:
«موزه اتا مؤسسه هسته که همیشکی بوئه و مادی هدف نداره ولی ونه لوش همه پَلی وا هسته و جامعه سه خدمت کانده و ونه پیشرفت سه کار کانده. موزهئون هدف، تحقیق هاکردن آثار و باقی بموندستچیئون سَر و جمعهاکردن آثار و وشون داشتن و معنوی استفادههاکردن هسته.»<ref>موزهداری، نوشیندخت نفیسی، سمت، تهران، ۱۳۸۰</ref>
== منابع ==
{{تلمبار-رج|Museums}}
<references />
* {{یادکرد |کتاب=دهخدا لغتنومه جلد ۴۶ شماره مسلسل۲۲۰|نویسنده = [[علیاکبر دهخدا|دهخدا، علیاکبر]]| ناشر =دانشگاه تهران، لغتنومه سازمان| شهر=[[تهران]]|کوشش=[[محمد معین|دکتر محمد معین]]}}
*{{یادکرد-ویکی |پیوند =http://en.wikipedia.org/wiki/Museum |عنوان =Museum |زبان = انگلیسی |بازیابی = ۱۲ فوریه ۲۰۱۱}}
{{موزهئون}}
[[رج:تاریخ]]
[[رج:موزهئون|*]]
11pt3ubr0tg6r2w06plwp2tarattf67
رج:جاپون استانون
14
23238
391997
189934
2026-08-06T17:48:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391997
wikitext
text/x-wiki
[[رج:جاپون|استان]]
[[رج:جاپون کشوری تقسیمات]]
[[رج:ایالتون، کشور په]]
bivbffn3vf3yel814ysp4wp3m4q1xg0
کس
0
25354
392028
390540
2026-08-07T02:27:21Z
~2026-43275-15
46338
/* */
392028
wikitext
text/x-wiki
[[پرونده:Vaginal opening description.jpg|250px|بندانگشتی|چپ|پپش ِمختلفِ بخشون:{{سخ}}۱. کلیتوریس هود (تینگِ جلد){{سخ}}۲.[[تینگ]] یا [[کلیتوریس]]{{سخ}}۳.دلهیی لو{{سخ}}۴.شاشمقوم{{سخ}}۵.پپش دله{{سخ}}۶.کتم و تینگ{{سخ}}۷.[[موس]]]]
'''پَپُش''' یا '''پَپِش''' یا '''پَپُس''' یا '''پَپِس''' یا '''بِند''' یا '''کاس''' یا '''کُس''' یا '''کِس''' {{انگلیسی جه|Vulva}} اتا بیرونی بخش زنکون ِچک میون دَره. ونه دله شه بخشای مختلفی قرار دارنه. مثلاً کس پشم، [[کتم]] و [[تینگ]] (انگلیسی نوم: [[کلیتوریس]]) <ref>[http://www.tabarestan.ir/dictionary?searchMethod=contains&searchword=%D8%A2%D9%84%D8%AA+%D8%AA%D9%86%D8%A7%D8%B3%D9%84%DB%8C+%D8%B2%D9%86&searchType=n.meaning&search=%D8%AC%D8%B3%D8%AA%D8%AC%D9%88&limitstart=0&option=com_dictionary&Itemid=437&1d46f051b99d2862ec8955e4f7c6604f=1 تبرستون آنلاین لغتنومه: کص]</ref>
== نگارخانه ==
<gallery>
Labioplasty and Clitoral Hood Reduc یا tion.jpg|زنان پپش بتونده شکلای مختلف داره
Female_sexual_arousal.JPG|تحریک بیی پپش و معمولی پپش ِمقایسه
</gallery>
{{شابلون:آدم تن}}
== منابع ==
{{تلمبار-رج|Female genitalia}}
{{پانویس}}
{{چپچین}}
* Wikipedia contributors, "Vulva," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Vulva&oldid=487428553 (accessed April 19, 2012).
{{پایان چپچین}}
[[رج:بگائستن]]
[[رج:بدن]]
naimrd3eqszezojww5yn5gl9drqk9qm
392029
392028
2026-08-07T02:28:44Z
~2026-43275-15
46338
392029
wikitext
text/x-wiki
[[پرونده:Vaginal opening description.jpg|250px|بندانگشتی|چپ|پپش ِمختلفِ بخشون:{{سخ}}۱. کلیتوریس هود (تینگِ جلد){{سخ}}۲.[[تینگ]] یا [[کلیتوریس]]{{سخ}}۳.دلهیی لو{{سخ}}۴.شاشمقوم{{سخ}}۵.پپش دله{{سخ}}۶.کتم و تینگ{{سخ}}۷.[[موس]]]]
'''کص''' یا '''پَپِش''' یا '''پَپُس''' یا '''پَپِس''' یا '''بِند''' یا '''کاس''' یا '''کُس''' یا '''کِس''' {{انگلیسی جه|Vulva}} اتا بیرونی بخش زنکون ِچک میون دَره. ونه دله شه بخشای مختلفی قرار دارنه. مثلاً کس پشم، [[کتم]] و [[تینگ]] (انگلیسی نوم: [[کلیتوریس]]) <ref>[http://www.tabarestan.ir/dictionary?searchMethod=contains&searchword=%D8%A2%D9%84%D8%AA+%D8%AA%D9%86%D8%A7%D8%B3%D9%84%DB%8C+%D8%B2%D9%86&searchType=n.meaning&search=%D8%AC%D8%B3%D8%AA%D8%AC%D9%88&limitstart=0&option=com_dictionary&Itemid=437&1d46f051b99d2862ec8955e4f7c6604f=1 تبرستون آنلاین لغتنومه: کص]</ref>
== نگارخانه ==
<gallery>
Labioplasty and Clitoral Hood Reduc یا tion.jpg|زنان پپش بتونده شکلای مختلف داره
Female_sexual_arousal.JPG|تحریک بیی پپش و معمولی پپش ِمقایسه
</gallery>
{{شابلون:آدم تن}}
== منابع ==
{{تلمبار-رج|Female genitalia}}
{{پانویس}}
{{چپچین}}
* Wikipedia contributors, "Vulva," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Vulva&oldid=487428553 (accessed April 19, 2012).
{{پایان چپچین}}
[[رج:بگائستن]]
[[رج:بدن]]
317gp2ofmzm0jv4o9u9704bdl21l24n
392030
392029
2026-08-07T02:30:05Z
~2026-43275-15
46338
/* */
392030
wikitext
text/x-wiki
[[پرونده:Vaginal opening description.jpg|250px|بندانگشتی|چپ|پپش ِمختلفِ بخشون:{{سخ}}۱. کلیتوریس هود (تینگِ جلد){{سخ}}۲.[[تینگ]] یا [[کلیتوریس]]{{سخ}}۳.دلهیی لو{{سخ}}۴.شاشمقوم{{سخ}}۵.پپش دله{{سخ}}۶.کتم و تینگ{{سخ}}۷.[[موس]]]]
'''کص''' یا '''پَپِش''' یا '''پَپُس''' یا '''پَپِس''' یا '''بِند''' یا '''کاس''' یا '''کص''' یا '''کِص''' {{انگلیسی جه|Vulva}} اتا بیرونی بخش زنکون ِچک میون دَره. ونه دله شه بخشای مختلفی قرار دارنه. مثلاً کس پشم، [[کتم]] و [[تینگ]] (انگلیسی نوم: [[کلیتوریس]]) <ref>[http://www.tabarestan.ir/dictionary?searchMethod=contains&searchword=%D8%A2%D9%84%D8%AA+%D8%AA%D9%86%D8%A7%D8%B3%D9%84%DB%8C+%D8%B2%D9%86&searchType=n.meaning&search=%D8%AC%D8%B3%D8%AA%D8%AC%D9%88&limitstart=0&option=com_dictionary&Itemid=437&1d46f051b99d2862ec8955e4f7c6604f=1 تبرستون آنلاین لغتنومه: کص]</ref>
== نگارخانه ==
<gallery>
Labioplasty and Clitoral Hood Reduc یا tion.jpg|زنان پپش بتونده شکلای مختلف داره
Female_sexual_arousal.JPG|تحریک بیی پپش و معمولی پپش ِمقایسه
</gallery>
{{شابلون:آدم تن}}
== منابع ==
{{تلمبار-رج|Female genitalia}}
{{پانویس}}
{{چپچین}}
* Wikipedia contributors, "Vulva," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Vulva&oldid=487428553 (accessed April 19, 2012).
{{پایان چپچین}}
[[رج:بگائستن]]
[[رج:بدن]]
jb3btrort0qri5irqd26zo6jqlle9jo
392031
392030
2026-08-07T04:51:19Z
محک
1023
اونچی که [[Special:Contributions/~2026-43275-15|~2026-43275-15]] ([[User talk:~2026-43275-15|گپ]]) دچی بییه، دگارسته بیه همونتایی که [[User:محک|محک]] این ولگه دله، اواخر بنویشت بییه.
390383
wikitext
text/x-wiki
[[پرونده:Vaginal opening description.jpg|250px|بندانگشتی|چپ|پپش ِمختلفِ بخشون:{{سخ}}۱. کلیتوریس هود (تینگِ جلد){{سخ}}۲.[[تینگ]] یا [[کلیتوریس]]{{سخ}}۳.دلهیی لو{{سخ}}۴.شاشمقوم{{سخ}}۵.پپش دله{{سخ}}۶.کتم و تینگ{{سخ}}۷.[[موس]]]]
'''پَپُش''' یا '''پَپِش''' یا '''پَپُس''' یا '''پَپِس''' یا '''بِند''' یا '''کاس''' یا '''کُس''' یا '''کِس''' {{انگلیسی جه|Vulva}} اتا بیرونی بخش زنکون ِچک میون دَره. ونه دله شه بخشای مختلفی قرار دارنه. مثلاً کس پشم، [[کتم]] و [[تینگ]] (انگلیسی نوم: [[کلیتوریس]]) <ref>[http://www.tabarestan.ir/dictionary?searchMethod=contains&searchword=%D8%A2%D9%84%D8%AA+%D8%AA%D9%86%D8%A7%D8%B3%D9%84%DB%8C+%D8%B2%D9%86&searchType=n.meaning&search=%D8%AC%D8%B3%D8%AA%D8%AC%D9%88&limitstart=0&option=com_dictionary&Itemid=437&1d46f051b99d2862ec8955e4f7c6604f=1 تبرستون آنلاین لغتنومه: کس]</ref>
== نگارخانه ==
<gallery>
Labioplasty and Clitoral Hood Reduc یا tion.jpg|زنان پپش بتونده شکلای مختلف داره
Female_sexual_arousal.JPG|تحریک بیی پپش و معمولی پپش ِمقایسه
</gallery>
{{شابلون:آدم تن}}
== منابع ==
{{تلمبار-رج|Female genitalia}}
{{پانویس}}
{{چپچین}}
* Wikipedia contributors, "Vulva," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Vulva&oldid=487428553 (accessed April 19, 2012).
{{پایان چپچین}}
[[رج:بگائستن]]
[[رج:بدن]]
pw261xz7843zvdvqde68sz7rze56szh
میترا
0
25428
391979
144850
2026-08-06T17:46:36Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391979
wikitext
text/x-wiki
[[پرونده:Mithraic torch-bearer, Chiaramonti Inv1705.jpg|بندانگشتی|چپ|میترای رومی ِموجستمه [[واتیکان]] دله]]
'''میترا''' یا '''مهر''' اتا [[هندوایرانی]] باستانی ایزد بییه که پیش از [[زرتشت]] دیّه، وه خورشید نماد بییه. وه [[زرتشت]] دین دله هم اتا خدائه. وه ره [[روم]]ی دینون دله هم اشناسینه و حتی [[مسیحیت]] دله هم نفوذ پیدا هاکرده.
== وابسته جستارون ==
* [[ورزا]]
== منابع ==
{{تلمبار-رج|Mithra}}
* رستمپور، سالومه، مهرپرستی در ایران هند و روم، انتشارات خورشیدآفرین (۱۳۸۲)
* ملیحه کرباسیان، فرهنگ الفبایی موضوعی اساطیر ایران باستان، نشر اختران (۱۳۸۴)
* یشتها
* نویسنده کومن، فرانتس- ترجمه و پژوهش رضی، هاشم- آیین پر رمز و راز میترایی- انتشارات بهجت (۱۳۷۹)
[[رج:اساطیر، کشور په]]
[[رج:میتراییسم|*]]
1264kdrc846wkzdbclifzpwt0zrpdta
رج:آمریکای متحده ایالات ایالتون
14
26084
391971
247875
2026-08-06T17:45:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391971
wikitext
text/x-wiki
{{تلمبار-رج|States of the United States}}
[[رج:آمریکای متحده ایالات]]
[[رج:ایالتون، کشور په]]
i4cktl3x3ac5i4b9u4m70lzyhyfvait
رج:سوریه استانها
14
26136
392002
182953
2026-08-06T17:49:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392002
wikitext
text/x-wiki
[[رج:سوریه|استان]]
[[رج:ایالتون، کشور په]]
caood3txhn9v5lsbj3a5wmyyu43rj17
رج:مکزیک ایالات
14
26760
392012
126750
2026-08-06T17:51:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392012
wikitext
text/x-wiki
{{تلمبار-رج|States of Mexico}}
[[رج:ایالتون، کشور په]]
[[رج:مکزیک|ایالات]]
ogti82wbfvwwcog23c0v702geydsd6l
رج:ایتالیا ناحیهئون
14
28188
391984
182949
2026-08-06T17:47:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391984
wikitext
text/x-wiki
{{تلمبا-رج|Regions of Italy}}
[[رج:ایتالیا|ن]]
[[رج:ایالتون، کشور په]]
drgq18hxp8jch4p9w3pq6dsnnwwussb
مشترکالمنافع کشورون اتحادیه
0
29368
391901
209539
2026-08-06T17:19:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391901
wikitext
text/x-wiki
{{جعبه اطلاعات اتحادیه
|نام اتحادیه = مشترکالمنافع کشورون اتحادیه
|تصویر = Commonwealth of Nations.svg
|اندازه تصویر = 250px
|توضیح تصویر =
|پرچم = Flag of the Commonwealth of Nations.jpg
|توضیح پرچم = این پرچم ره «هرکاجه آفتاب دَره، اونجه بریتانیای ِسامون ِشِنه» شعار جه الهام بَییته.
|مقر = [[مارلبورگ]]، [[لندن]]، [[انگلستان]]
|زبانهای رسمی = [[انگلیسی]]
|تعداد اعضا = ۵۳ کشور
|رهبران =
|تأسیس =
|مساحت = ۳۰٪ خاشکیئون
|جمعیت = ۱٫۹ میلیارد نفر تقریباً ۳۰٪ جهون
|پول رسمی =
|دبیرکل =
|عنوان ریاست = [[شاه چارلز سوم]]
|عنوان نایب رئیس =
|افراد کلیدی =
|سازمانهای وابسته = [[مشترکالمنافع کشورون]]
|بودجه =
|شعار =
|وبگاه = [http://www.thecommonwealth.org/ رسمی سایت]
|نام پیشین =
}}
'''مشترکالمنافع کشورون اتحادیه''' یا '''همسود کشورون''' {{انگلیسی جه|Commonwealth of Nations}} اتسری کشور هستنه که به جز [[موزامبیک]] و [[کامرون]] همگی قبلاً [[بریتانیا]] مستعمره بینه. این اتحادیه دله ۵۳تا مستقل کشور درنه. این کشورون ِکایری ِاساس [[سنگاپور اعلامیه]] هسته که سال ۱۹۷۱ بنویشته بیّه و ونه په [[حقوق بشر]]، قانون ِحکومت، فردی آزادیون، مساوات، [[دموکراسی]]، آزاد تجارت، جهونی صلح و... سَره همه ونه تِلاش هاکِنِن.
[[شاه چارلز سوم]] این کشورون ِهمبستگی ِنماد هسته. این اتحادیهی ِاعضا سیاسی پیمون ندارنه و فقط وشون پیمون بعضی مسائل خاص پهروو هسته. ویشته این کشورون دله شاه چارلز اتا گت ِفرماندار انتخاب کانده که ونه نماینده اون کشور دله هسته و بعضی کشورون دله این مقوم رییسجمهور ِاختیارات ره دانّه.<ref>{{یادکرد-ویکی
|پیوند = http://en.wikipedia.org/wiki/John_Howard
|عنوان = John Howard
|زبان = en
|بازیابی = ۱۲/۳/۸۶
}}</ref>.
== منابع ==
{{پانویس}}
== وابسته جستارون ==
{{تلمبار-رج|Commonwealth of Nations}}
* [[مشترکالمنافع سامونها]]
{{همسود کشورون}}
{{سازمانهای میاندولتی}}
{{مناطق انگلیسیزبان}}
[[رج:بریتانیا]]
[[رج:سازمانئون بینالمللی]]
[[رج:مشترکالمنافع کشورون| ]]
[[رج:کشورون، زوون په]]
a17irfcbe0w7oj1gifr1eq2lan5jyxl
بردمن
0
29403
391756
139662
2026-08-06T15:35:33Z
محک
1023
[[رج:اوسکار بییته فیلمون]] حذف شد; [[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391756
wikitext
text/x-wiki
{{جعبه اطلاعات فیلم
| عنوان = بـِردمَن
| تصویر = Birdman_poster.jpg
| عرض تصویر =
| متن جایگزین =
| حاشیه = بله
| زیرنویس =
| عنوان فیلم =
| کارگردان = [[آلخاندرو گونزالز اینیاریتو]]
| تهیهکننده =آلخاندرو گونزالز اینیاریتو{{سخ}}جان لشر{{سخ}}[[آرنان میلشان]]{{سخ}}جیمز اسکاچدپول
| نویسنده = آلخاندرو گونزالز اینیاریتو{{سخ}}نیکولاس جیکابون{{سخ}}الکساندر دینلاریس جونیور{{سخ}}آرماندو بو
| فیلمنامهنویس =
| داستان =
| بر اساس =
| بازیگران = [[مایکل کیتون]]{{سخ}}[[زک گالیفیاناکیس]]{{سخ}}[[ادوارد نورتون]]{{سخ}}[[آندرهآ ریسبرو]]{{سخ}}[[امی رایان]]{{سخ}}[[اما استون]]{{سخ}}[[نائومی واتس]]
| راوی =
| موسیقی = [[آنتونیو سانچز]]
| فیلمبرداری = [[امانوئل لوبزکی]]
| تدوین = [[داگلاس کرایز]]{{سخ}}[[استیون میریونه]]
| استودیو = [[ریجنسی انترپرایزز]]{{سخ}}[[ورلدویوو انترتینمنت]]
| توزیعکننده = [[فاکس سرچلایت پیکچرز]]
| تاریخ انتشار = {{Film date|2014|08|27|ونیز|۲۰۱۴|۱۰|۱۷|متحده ایالات}}
| مدت = ۱۱۹ دقیقه<!--Theatrical runtime: 119:12--><ref>{{cite web | url=http://bbfc.co.uk/releases/birdman-film | title=''BIRDMAN'' (15) | work=[[هیئت ردهبندی سنی فیلمهای بریتانیا|British Board of Film Classification]] | date=September 11, 2014 | accessdate=October 29, 2014}}</ref><ref>{{cite web|url=http://www.labiennale.org/en/cinema/71st-festival/screenings/aug27.html|title=La Biennale di Venezia - 27 August|accessdate=August 17, 2014}}</ref>
| کشور = [[ایالات متحده آمریکا]]
| زبان = انگلیسی
| بودجه = ۱۸ میلیون دلار<!--Theatrical runtime: 119:12--><ref>{{cite web | url=http://bbfc.co.uk/releases/birdman-film | title=''BIRDMAN'' (15) | work=[[هیئت ردهبندی سنی فیلمهای بریتانیا|British Board of Film Classification]] | date=September 11, 2014 | accessdate=October 29, 2014}}</ref><ref>{{cite web|url=http://www.labiennale.org/en/cinema/71st-festival/screenings/aug27.html|title=La Biennale di Venezia - 27 August|accessdate=August 17, 2014}}</ref>
| فروش = ۵۹٫۷ میلیون دلار<ref name="mojo">{{cite web|title= Birdman|url = http://www.boxofficemojo.com/movies/?id=birdman.htm |work = [[باکس آفیس موجو|Box Office Mojo]] |publisher = Internet Movie Database|accessdate = January 12, 2015}}</ref>
}}
'''''بردمن''''' یا '''''پرندهمونا''''' {{انگلیسی|Birdman}} اتا فیلم ِنوم [[کمدی-درام]] ژانر دله و کارگردانی، تهیهکنندگی و نویسندگی [[آلخاندرو گونزالز اینیاریتو]] جه هسته که ۱۷ اکتبر ۲۰۱۴ اکران بیّه. [[مایکل کیتون]]، [[زک گالیفیاناکیس]]، [[ادوارد نورتون]]، [[آندرهآ ریسبرو]]، [[امی رایان]]، [[اما استون]] و [[نائومی واتس]] این فیلم دله نقش دارنه. کیتون ِنقش این فیلم دله اتا هالیوودی بازیگر هسته که مدتها پیش اتا ابرقهرمونی نقش جه شهرت پیدا هاکرده و اسا خانه اتا تیاتر جه دِباره مشهور بَواشه.
این فیلم بیش از ۵۹ میلیون دلار بَروته بیّه. [[اوسکار جایزه]] سَره، این فیلم ۹ بخش دله ''[[د گرند بوداپست هتل]]'' ِهمراهی ویشترین اوسکارون ره بَییتنه.<ref>{{cite news|last=Ford|first=Rebecca|url=http://www.hollywoodreporter.com/news/oscar-nominations-2015-complete-list-academy-award-nominees-763162|title=Oscar Nominations 2015: The Complete List|accessdate=January 15, 2015|work=[[هالیوود ریپورتر|The Hollywood Reporter]]|date=January 15, 2015}}</ref>
== بازیگرون ==
* [[مایکل کیتون]]: ریگان تامسون ِنقش
* [[ادوارد نورتون]]: مایک شاینر
* [[اما استون]]: سم تامسون
* [[نائومی واتس]]: لزلی
* [[زک گالیفیاناکیس]]: جیک
* [[آندرهآ ریسبرو]]: لورا
* [[امی رایان]]: سیلویا تامسون
* [[لیندسی دونکن]]: تابیتا دیکینسان
* [[مریت وور]]: آنی
* [[جرمی شیموس]]: رالف
* [[فرانک ریدلی]]: آقای روث
== منابع ==
{{پانویس|چپچین=بله}}
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:کمدی فیلمون]]
[[رج:اوسکار بیته فیلمون]]
[[رج:۲۰۱۴ فیلمون]]
lqkmi9o3n990vytn0gih5hng4hlic55
رج:انگلیسی فیلمون
14
29479
391857
132280
2026-08-06T17:08:49Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391857
wikitext
text/x-wiki
[[رج:فیلم، زوون په]]
[[رج:انگلیسی زوون|فیلم]]
gqdkia8u82enmxi52ksig4u23qlwive
رج:فیلم، زوون په
14
29480
391849
135443
2026-08-06T17:07:49Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:فیلمون با حیساب زوون]] را بدون برجایگذاشتن تغییرمسیر به [[رج:فیلم، زوون په]] منتقل کرد: ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
135443
wikitext
text/x-wiki
[[رج:فیلم|زوون]]
[[رج:زوون|فیلم]]
3hk51w3y03izzzua9xrdpnuzsovua2g
رج:آمریکایی فیلمون
14
29481
391847
210435
2026-08-06T17:07:35Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391847
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:آمریکای متحده ایالات|ف]]
nxow2dcsa7cahcurvnvtuv6cf5aztav
رج:فیلم، کشور په
14
29482
391845
135445
2026-08-06T17:07:05Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:فیلمون با حیساب جوغرافی]] را بدون برجایگذاشتن تغییرمسیر به [[رج:فیلم، کشور په]] منتقل کرد: ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
135445
wikitext
text/x-wiki
[[رج:فیلم|جوغرافی]]
[[رج:جوغرافی|فیلم]]
8m5n2idw7wcplklae2wvm1qll5qa0al
رج:۲۰۱۴ فیلمون
14
29484
391918
135447
2026-08-06T17:22:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391918
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۴|فیلم]]
0mpy2h8j932i9v00zvo55ctzikd4uvm
رج:فیلم، سال په
14
29485
391868
131915
2026-08-06T17:11:10Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:فیلمون با حیساب سال]] را بدون برجایگذاشتن تغییرمسیر به [[رج:فیلم، سال په]] منتقل کرد: ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
131915
wikitext
text/x-wiki
[[رج:سال]]
[[رج:فیلم]]
gavigjaju0kfgqqidx4qwjgmx26mxfd
رج:بریتانیایی فیلمون
14
29487
391851
135449
2026-08-06T17:08:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391851
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:بریتانیا|فیلم]]
nlnprwc57fu63y7irpa6chltf94ns5g
رج:ایسپانیولی فیلمون
14
29488
391862
132284
2026-08-06T17:09:29Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391862
wikitext
text/x-wiki
[[رج:فیلم، زوون په]]
[[رج:ایسپانیولی زوون|فیلم]]
61ky0o92pgdnow0nshfcvbvopzd2dk2
رج:۲۰۱۳ فیلمون
14
29491
391916
135451
2026-08-06T17:21:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391916
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۳|فیلم]]
espalzbg5g5m93p29mo3nx0w9qve8yq
رج:ایسپانیایی فیلمون
14
29492
391850
131924
2026-08-06T17:07:55Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391850
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:ایسپانیا|فیلم]]
[[fa:رده:فیلمهای اسپانیا]]
12dbkfa312k1dns55gn7ixs4x2g41ik
رج:ونزوئلایی فیلمون
14
29493
391858
135452
2026-08-06T17:08:55Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391858
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:ونزوئلا|فیلم]]
o74j5azlma12ksz34z9o8pkxcxznxtn
رج:ایرانی فیلمون
14
29494
391848
135453
2026-08-06T17:07:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391848
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:ایران فرهنگ|فیلم]]
2qmpigt03rtompnyx65bvk2smq34f4d
رج:فرانسوی فیلمون
14
29495
391866
132283
2026-08-06T17:10:49Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391866
wikitext
text/x-wiki
[[رج:فیلم، زوون په]]
[[رج:فرانسوی زوون|فیلم]]
nef3boxvu4wkl7p56ynwnv3r82ee5iw
رج:فارسی فیلمون
14
29496
391865
179163
2026-08-06T17:10:29Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391865
wikitext
text/x-wiki
[[رج:فیلم، زوون په]]
[[رج:فارسی زوون]]
b1gdijcdmg2ljtf0ysbidm3u7rprx52
رج:فرانسه فیلمون
14
29497
391855
135455
2026-08-06T17:08:35Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391855
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:فرانسه]]
oxvtke4wncikt0hqd71gzfbkcfw99x2
رج:آلمانی فیلمون
14
29498
391846
135456
2026-08-06T17:07:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391846
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:آلمان]]
0dqb1292jdcpmpp3hf7xmyfvtaeb0xr
رج:انگلیسیزوون کشورون
14
29635
391907
209542
2026-08-06T17:20:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391907
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:انگلیسی زوون|کشور]]
pwb6wvux1xg2ntlca0nw3islkkwii38
رج:فرانسویزوون کشورون
14
29636
391923
209557
2026-08-06T17:23:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391923
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:فرانسوی زوون|کشور]]
0d8v1lb39bmhxrs34jypyd700g5l8th
رج:عربیزوون کشورون
14
29637
391919
209554
2026-08-06T17:22:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391919
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:عربی زوون|کشور]]
ojklv35whwx24ow1si1iqw8uk5okqq8
رج:ایسپانیولیزوون کشورون
14
29638
391911
209546
2026-08-06T17:21:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391911
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:ایسپانیولی زوون|کشور]]
7smam30eriz2dk8010oetx9w6wyx21a
فرانکوفونی
0
29648
391899
209536
2026-08-06T17:19:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391899
wikitext
text/x-wiki
{{coord|48|51|36|N|2|18|12|E|source:kolossus-frwiki|display=title}}
{{infobox geopolitical organization
| name = ''Organisation internationale de la Francophonie''<br/>(''La Francophonie'')
| linking_name = لا فرانکوفونی
| image_flag = Flag of La Francophonie.svg
| text_symbol_type = [[موتو]]
| text_symbol = "Égalité, complémentarité, solidarité"<ref name="IEPF">[http://www.iepf.org/docs/depang.pdf Brochure: ''L’Institut de l’énergie et de l’environnement de la Francophonie''] ([http://www.iepf.org/ IEPF]). Accessed 22 January 2009.</ref><br/><small>"Equality, complementarity, solidarity"</small> <sup>a</sup>
| national_anthem = ''Ode to Joy''
| image_map = La francophonie mapa.svg
| map_caption = کَئو مناطق عضو هستنه
| membership_type = اعضا
| membership = {{collapsible list
| titlestyle = background: transparent; text-align: left; font-weight: normal;
| title = ۵۷ کشور
| {{nowrap|{{پرچم|Albania}}}}
| {{پرچم|Andorra}}
| {{پرچم|Armenia}}
| {{پرچم|Belgium}}
| {{پرچم|Benin}}
| {{پرچم|Bulgaria}}
| {{پرچم|Burkina Faso}}
| {{پرچم|Burundi}}
| {{پرچم|Cambodia}}
| {{پرچم|Cameroon}}
| {{پرچم|Canada}}
| {{پرچم|Cape Verde}}
| {{پرچم|Central African Republic}}
| {{پرچم|Chad}}
| {{پرچم|Comoros}}
| {{پرچم|Republic of Congo}}
| {{پرچم|Democratic Republic of Congo}}
| {{پرچم|Cyprus}}
| {{پرچم|Djibouti}}
| {{پرچم|Dominica}}
| {{پرچم|Equatorial Guinea}}
| {{پرچم|Egypt}}
| {{پرچم|France}}
| {{flagicon image|Flag of Wallonia.svg}} [[بلژیک فرانسوی کمیته]]
| {{پرچم|Gabon}}
| {{پرچم|Ghana}}
| {{پرچم|Greece}}
| {{پرچم|Guinea}}
| {{پرچم|Guinea-Bissau}}
| {{nowrap|{{پرچم|Haiti}}}}
| {{پرچم|Ivory Coast}}
| {{پرچم|Laos}}
| {{nowrap|{{پرچم|Lebanon}}}}
| {{پرچم|Luxembourg}}
| {{nowrap|{{شمالی مقدونیه|Macedonia}}}}
| {{nowrap|{{پرچم|Madagascar}}}}
| {{nowrap|{{پرچم|Mali}}}}
| {{پرچم|Mauritania}}
| {{پرچم|Mauritius}}
| {{nowrap|{{پرچم|Moldova}}}}
| {{پرچم|Monaco}}
| {{nowrap|{{پرچم|Morocco}}}}
| {{flagicon image|Flag of New Brunswick.svg}} [[نیو برانسویک]]
| {{nowrap|{{پرچم|Niger}}}}
| {{nowrap|{{پرچم|Qatar}}}}
| {{پرچم|Romania}}
| {{پرچم|Rwanda}}
| {{flagicon image|Flag of Quebec.svg}} [[کبک]]
| {{پرچم|Saint Lucia}}
| {{nowrap|{{پرچم|São Tomé and Príncipe}}}}
| {{پرچم|Senegal}}
| {{پرچم|Seychelles}}
| {{پرچم|Switzerland}}
| {{nowrap|{{پرچم|Togo}}}}
| {{پرچم|Tunisia}}
| {{پرچم|Vanuatu}}
| {{پرچم|Vietnam}}
}}
| admin_center_type = مَقِر
| admin_center = [[پاریس]]، [[فرانسه]]
| languages_type = رسمی زوون
| languages = [[فرانسوی]]
| leader_title1 = رییس
| leader_name1 = [[مایکل جین]]
| leader_title2 = [[Assemblée parlementaire de la Francophonie|APF]] [[General Secretary]]
| leader_name2 = [[Jacques Legendre (French politician)|Jacques Legendre]]
| established_event1 = [[نیامی]] ِکنفرانس
| established_date1 = 20 مارس 1970<br>(بعنوان ''[[Agence de Coopération Culturelle et Technique|ACCT]]'')
| established_event2 = [[هانوی]] ِکنفرانس
| established_date2 = 14–16 نوامبر 1997<br>(بعنوان ''La Francophonie'')
| area_km2 = 28,223,184
| area_sq_mi = 10,897,032.263
| area_rank =
| population_estimate = {{nowrap|~ 1 billion}}
| population_estimate_year = 2013
| population_estimate_rank =
| population_density_km2 = 34.36
| population_density_sq_mi = 89.02
| GDP_PPP =
| GDP_PPP_year =
| GDP_PPP_rank =
| GDP_PPP_per_capita =
| GDP_PPP_per_capita_rank =
| GDP_nominal =
| GDP_nominal_year =
| GDP_nominal_rank =
| GDP_nominal_per_capita =
| GDP_nominal_per_capita_rank =
| official_website = [http://www.francophonie.org/ francophonie.org]
| footnote_a =
}}
'''فرانکوفونی''' یا '''فرانسوی زوون ِکشورون''' {{فرانسوی جه|Francophonie}} مجموعه دولتون و حکومتونی هستنه که وشون زوون [[فرانسوی]] هسته. فرانکوفونی ِفرهنگ [[فرانسه]] و [[بلژیک]] ِکولونیها دله رواج داشته.
== بریم بگردستن==
* [https://web.archive.org/web/20100724001316/http://www.francophonie.org/ رسمی سایت]
[[رج:فرانسوی زوون]]
[[رج:فرانسویزوون کشورون]]
[[رج:کشورون، زوون په]]
[[رج:پاریس]]
[[رج:سازمانئون بینالمللی]]
84xljrf4wv16uyg1ripatbt9423qnbn
رج:کشورون، زوون په
14
29651
391896
209532
2026-08-06T17:18:25Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:کشورون،، زوون په]] را بدون برجایگذاشتن تغییرمسیر به [[رج:کشورون، زوون په]] منتقل کرد: ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
135499
wikitext
text/x-wiki
[[رج:کشورون|*]]
[[رج:زوون|*]]
27exwzhsv42otrjr71qk775k2koxfgn
پرتغالیزوون کشورون انجمن
0
29652
391903
209538
2026-08-06T17:19:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391903
wikitext
text/x-wiki
{{infobox geopolitical organization
|native_name = ''Comunidade dos Países de Língua Portuguesa''
| name = (پرتغالیزوون کشورون کمیته)
| linking_name = پرتغالیزوون کشورون کمیته
| image_flag = Flag of the CPLP.PNG
| text_symbol_type =
| text_symbol =
|national_anthem =
| image_map = CPLPmap2.png
| map_caption = اعضای نقشه
| membership_type = اعضا
|membership = {{Collapsible list |title=9 تا عضو|{{AGO}}|{{BRA}}|{{CPV}}|{{GNB}}|{{GEQ}}|{{MOZ}}|{{PRT}}|{{STP}}|{{TLS}}}}
{{Collapsible list |title=6 تا ناظر|{{GEO}}|{{JPN}}|{{MUS}}|{{NAM}}|{{SEN}}|{{TUR}}}}
| admin_center_type = Headquarters
| admin_center = {{nowrap|[[لیسبون]]، [[پرتغال]]}}
|latd=38 |latm=42.65 |latNS=N |longd=9 |longm=8.05 |longEW=W
| languages_type = رسمی زوون
| languages = [[پرتغالی]]
| leader_title1 = Executive Secretary
| leader_name1 = موزامبیک ِرییسجمهور
| leader_title2 = دورهیی رییس
| leader_name2 = {{پرچم|Mozambique}}
| established_event1 =
| established_date1 = 17 جولای 1996
| area_km2 =
| area_sq_mi =
| area_rank =
| population_estimate = {{nowrap|~ 266 million}}
| official_website = [http://www.cplp.org cplc.org]
}}
'''پرتغالیزوون کشورون کمیته''' یا '''پرتغالی زوون مناطق کمیته'''<ref>Republic of Mauritius. Prime Minister's Office. Cabinet Decisions taken on 21 July 2006,
https://web.archive.org/web/20131018140646/http://www.gov.mu/portal/site/pmosite/menuitem.4ca0efdee47462e7440a600248a521ca/?content_id=0aad636fa35bc010VgnVCM1000000a04a8c0RCRD</ref> (Comunidade dos Países de Língua Portuguesa) اتا بینالمللی کمیته هسته که ونه دله کشورونی دَرنه که قدیم تاسا [[پرتغالی]] جه گپ زَنّه.<ref name="CPLP_NewsID46">{{cite web |url=http://www.cplp.org/id-46.aspx |title=CPLP Objectivos|language=Portuguese |publisher=CPLP |date= |accessdate=23 July 2014}}</ref>
== منابع ==
{{پانویس}}
[[رج:پرتغالی زوون]]
[[رج:کشورون، زوون په]]
[[رج:لیسبون]]
[[رج:سازمانئون بینالمللی]]
[[رج:پرتغالیزوون کشورون| ]]
r1ie3ycni25eeoh8t8wgdpm0nybpka4
رج:پرتغالیزوون کشورون
14
29675
391931
209565
2026-08-06T17:24:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391931
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:پرتغالی زوون|زوون]]
nq6txx2j61t77ok1utpcqtjavdrjglp
رج:۲۰۱۵ فیلمون
14
29984
391920
135520
2026-08-06T17:22:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391920
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۵|فیلم]]
h3f06cvhs12w9ad74233nq1f3cqopod
رج:سواحلیزوون کشورون
14
30131
391917
209552
2026-08-06T17:22:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391917
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:سواحلی زوون|کشور]]
h2okl0y0x9kahmjri9886n7ynpaxcnf
رج:اروپا تاریخ
14
30199
392023
134344
2026-08-06T17:52:23Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ تاریخ با حیساب قاره با [[:رج:تاریخ، قاره په|تاریخ، قاره په]]
392023
wikitext
text/x-wiki
[[رج:تاریخ، قاره په]]
[[رج:اروپا|تاریخ]]
flnra0u9zwsw8j12gd35obaz88cskhs
رج:آمریکا تاریخ
14
30200
392021
134345
2026-08-06T17:52:03Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ تاریخ با حیساب قاره با [[:رج:تاریخ، قاره په|تاریخ، قاره په]]
392021
wikitext
text/x-wiki
[[رج:تاریخ، قاره په]]
[[رج:آمریکا|تاریخ]]
bqzoz5vzruoyqi9sw7sex20hzjo08jp
رج:تاریخ، قاره په
14
30201
392010
134346
2026-08-06T17:50:43Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:تاریخ با حیساب قاره]] را بدون برجایگذاشتن تغییرمسیر به [[رج:تاریخ، قاره په]] منتقل کرد: ربات: جایگزینی ردهٔ تاریخ با حیساب قاره با [[:رج:تاریخ، قاره په|تاریخ، قاره په]]
134346
wikitext
text/x-wiki
[[رج:تاریخ|قاره]]
[[رج:قاره ئون|تاریخ]]
29fpo1pg9b59nfq38p8bfevgcgg0wyh
رج:آسیا تاریخ
14
30202
392015
134347
2026-08-06T17:51:23Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ تاریخ با حیساب قاره با [[:رج:تاریخ، قاره په|تاریخ، قاره په]]
392015
wikitext
text/x-wiki
[[رج:تاریخ، قاره په]]
[[رج:آسیا|تاریخ]]
gs7qpb7x8369p6luqbeuswn4wic4nie
رج:آفریقا تاریخ
14
30206
392018
134361
2026-08-06T17:51:44Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ تاریخ با حیساب قاره با [[:رج:تاریخ، قاره په|تاریخ، قاره په]]
392018
wikitext
text/x-wiki
[[رج:تاریخ، قاره په]]
[[رج:آفریقا|تاریخ]]
g5ofl8cgxsqfy7hxjmv3kaa7g0sp4iq
رج:روسیزوون کشورون
14
30221
391915
328406
2026-08-06T17:21:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391915
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:روسی زوون]]
j1rv5ejww83kfj38awnxmrtgtfo7dt4
گلادیاتور (فیلم)
0
30776
391764
389853
2026-08-06T15:37:57Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391764
wikitext
text/x-wiki
{{جعبه فیلم
| عنوان= گلادیاتور {{بر}} Gladiator
| تصویر= Gladiator_film.jpg
|عرض تصویر= 200px
| زیرنویس=
| کارگردان= [[ریدلی اسکات]]
| تهیهکننده= [[داگلاس ویک]] {{بر}} [[دیوید فرانزونی]] {{بر}} [[فرانکو لاستیگ]]
| نویسنده= [[دیوید فرانزونی]] {{بر}} [[جان لوگان]] {{بر}} [[ویلیام نیکلسون]]
| بازیگران= [[راسل کرو]] {{بر}} [[واکین فینیکس]] {{بر}} [[کانی نیلسن]] {{بر}} [[الیور رید]] {{بر}} [[ریچارد هریس]] {{بر}} [[درک جاکوبی]]
| موسیقی= [[هانس زیمر]] {{بر}} [[لیزا جرارد]]
| فیلمبرداری= جان متیسون
| تدوین= [[پیترو اسکالیا]]
| توزیعکننده= [[دریمورکس]] و [[یونیورسال استودیوز]]
| انتشار=
| اکران= ۵ مه ۲۰۰۰
| مدت= ۱۵۴ دقیقه {{بر}} نسخه کامل ۱۷۱ دقیقه
| زبان= [[انگلیسی]]
| کشور= {{USA}} {{بر}} {{UK}}
| بودجه= ۱۰۳٬۰۰۰٬۰۰۰ [[دلار]]
| فروش= ۴۵۷٬۶۴۰٬۴۲۷ [[دلار]]
| پس_از=
| پیش_از=
| درجه فیلم=
| imdb_id = 0172495
| soure_id =
| amg_id = 1:184587
| پانویس=
}}
'''''گلادیاتور''''' {{انگلیسی جه|Gladiator}} اتا فیلمِ نوم بییه که [[ریدلی اسکات]] ونه کارگردان و نقش اول بییه. این فیلم سال ۲۰۰۰ بساته بیّه. این فیلمِ موسیقی ره [[هانس زیمر]] بساته و بتترین فیلم ِموسیقیون جه هسته. راسل کرو این فیلمِ سَره [[اوسکار جایزه ]] ره نقشاولی وسر بَییته. این فیلم پنجتا اوسکار داشته.
فیلم اتا [[گلادیاتور]] ِزندگی هسته. این مَردی اول [[روم]] ِارتش دله دَیّه و فرمانده بییه. وقتی ولیعهد امپراتور ره بَکاشته، وه ره [[برده]] بَییتنه و ونه خانواده ره بَکاشتنه. وه آخرسر اَنده گلادیاتوری جنگ کانده تا اینکه شه ره جدیدِ امپراتور جه رِسِنِنده و ونجه انتقام گیرنه.
== منابع ==
{{پانویس}}
* {{یادکرد-ویکی
|پیوند = https://en.wikipedia.org/w/index.php?title=Gladiator_(2000_film)&oldid=634506398
|عنوان = (Gladiator (2000 film
|زبان = انگلیسی
|بازیابی = ۱۹ نوامبر ۲۰۱۴
}}
[[رج:گلادیاتور]]
[[رج:انگلیسی فیلمون]]
[[رج:بریتانیایی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:حماسهای فیلمون]]
[[رج: تاریخی فیلمون]]
[[رج:روم دله فیلمون]]
[[رج:۲۰۰۰ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
6810e7di2mig5d0ptotn1rwgvx3dwg5
اسپات لایت
0
31167
391755
140168
2026-08-06T15:35:18Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391755
wikitext
text/x-wiki
{{Infobox film
| name = اسپات لایت
| image = Spotlight (film) poster.jpg
| alt =
| caption =
| film name =
| director = [[توماس مککارتی]]
| producer = [[استیو گولین]]{{سخ}}مایکل شوگر{{سخ}}نیکول راکلین{{سخ}}بلای فاوست
| writer = [[جاش سینر]]{{سخ}}تام مککارتی
| screenplay =
| story =
| based on =
| starring = [[مارک روفالو]]{{سخ}}[[مایکل کیتون]]{{سخ}}[[ریچل مکآدامز]]{{سخ}}[[لیو شریبر]]{{سخ}}[[جان اسلتری]]{{سخ}}[[استنلی توچی]]
| narrator =
| music = [[هاوارد شور]]
| cinematography =ماسانوبو تاکایاناگی
| editing = تام مک آردل
| studio =انونیموس کانتنت{{سخ}}پارتیسیپنت مدیا{{سخ}}راکلین/فاوست
| distributor = [[اوپن رود فیلمز]]
| released = {{Film date|۲۰۱۵|۹||ونیز جشنواره|۲۰۱۵|۱۱|۶}}
| runtime = ۱۲۸ دقه
| country = [[آمریکا]]
| language = انگلیسی
| budget =
| gross =}}
'''''اسپات لایت''''' {{انگلیسی جه|Spotlight}} اتا فیلم به کارگردانی [[توماس مککارتی]] هسته که سال ۲۰۱۵ منتشر بیه و ونه داستان واقعیت سَر جه هسته.
== داستان ==
این فیلم دله [[کاتولیک کلیسا]]ئون ِتجاوزات به وچون جه گپ بزه وانه و این که چتی اتا خورنگار سعی کانده این مسئله ره افشا هاکنه و کلیسا خانه ونه سر ره سرپوش دینگِنه. این فیلم 2016 سال دله [[اوسکار جایزه]] ره بتترین فیلم وسّه بَییته.<ref>{{یادکرد وب |نویسنده = |نشانی=http://persian.euronews.com/2015/09/04/boston-globe-revelations-of-child-abuse-hit-the-silver-screen-in-the-film/ |عنوان= «افشاگر»؛ آغازگر جشنواره فیلم ونیز | ناشر = یورونیوز |تاریخ =۴ سپتامبر ۲۰۱۵ |تاریخ بازبینی= ۱۴ شهریور ۱۳۹۴}}</ref>
== بازیگرون ==
* [[مارک روفالو]]
* [[مایکل کیتون]]
* [[ریچل مکآدامز]]
* [[لیو شریبر]]
* [[جان اسلتری]]
* [[استنلی توچی]]
* [[جیمی شریدن]]
* [[پل گویلفویل]]
* [[بیلی کروداپ]]
== منابع ==
{{پانویس}}
* {{یادکرد-ویکی|پیوند =//en.wikipedia.org/w/index.php?title=Spotlight_(film)&oldid=679430048|عنوان = Spotlight (film)|زبان =انگلیسی|بازیابی =۴ سپتامبر ۲۰۱۵}}
* {{IMDb title|۱۸۹۵۵۸۷}}
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:درام فیلمون]]
[[رج:۲۰۱۵ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
db5q97tj8zadfvqi1q246st9v796gv5
رج:ایسپانیا شهمختار بخشون
14
31463
391989
138994
2026-08-06T17:47:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391989
wikitext
text/x-wiki
[[رج:ایسپانیا]]
[[رج:ایالتون، کشور په]]
npbqzix8vvjl2rb4z18ra79yq5saqgn
رج:هندیزوون کشورون
14
32503
391929
209563
2026-08-06T17:24:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391929
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:هندی زوون]]
tt7l8p7idw1w0da29rhguzy4pzfo0ij
رج:چینیزوون کشورون
14
32515
391933
209567
2026-08-06T17:24:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391933
wikitext
text/x-wiki
[[رج:چینی زوونون]]
[[رج:کشورون، زوون په]]
sew61vk8776yjxiqy10i3pp5nh2layn
رج:تامیلیزوون کشورون
14
32517
391913
209548
2026-08-06T17:21:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391913
wikitext
text/x-wiki
[[رج:تامیلی زوون]]
[[رج:کشورون، زوون په]]
j9dfjuje3aopg9xr4v5bjm15adfrpcs
رج:مالاییزوون کشورون
14
32518
391925
209559
2026-08-06T17:23:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391925
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:مالایی زوون]]
h3qz4lqdgk7swapbk7omxwts1ncp4sc
رج:هلندیزوون کشورون
14
32576
391927
209561
2026-08-06T17:23:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391927
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:هلندی زوون|کشورون]]
g78sqzbq6j20bj018fy01dhk6k7z2n8
رج:فارسیزوون کشورون
14
32577
391921
209555
2026-08-06T17:22:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391921
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:فارسی زوون|کشورون]]
qond5lwka1zc7ql9dfafszwsn9nxt36
رج:۲۰۱۷ فیلمون
14
32908
391924
191635
2026-08-06T17:23:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391924
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۷|فیلم]]
s4v7nmn54799fzf1h5qfv2d5nxtaywc
رج:ایالتون، کشور په
14
33159
391965
145110
2026-08-06T17:44:42Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:ایالتون با حیساب کشورون]] را بدون برجایگذاشتن تغییرمسیر به [[رج:ایالتون، کشور په]] منتقل کرد: ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
145110
wikitext
text/x-wiki
[[رج:جوغرافی]]
2yw066j4abp9feb0fc4ytssbfir6znr
رج:مازرونی زوون کتابون
14
33470
391954
182721
2026-08-06T17:40:08Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391954
wikitext
text/x-wiki
[[رج:مازرون شاعرون]]
[[رج:مازرون نویسندگون]]
[[رج:کتابون، زوون په]]
[[رج:مازرونی زوون]]
kaq3indlh2hu470enh0gllvf4ehbhwe
رج:کتابون، زوون په
14
33505
391939
157434
2026-08-06T17:38:08Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:کتابون با حیساب زوون]] را بدون برجایگذاشتن تغییرمسیر به [[رج:کتابون، زوون په]] منتقل کرد: ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
157434
wikitext
text/x-wiki
[[رج:کتابون مقالات]]
[[رج:کیتاب]]
[[رج:زوون]]
j78n7cdwpsi2y4i70l33wf5npo861fa
رج:۲۰۱۸ فیلمون
14
33666
391926
191636
2026-08-06T17:23:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391926
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۸]]
32euxsku4sutfukyq0wlk5drwmwt5ed
رج:۲۰۱۹ فیلمون
14
33667
391928
191637
2026-08-06T17:23:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391928
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۹|فیلم]]
i9w2rm8i3p6vnl9vq9kkiaxig1qyxn5
گرین بوک
0
33670
391765
148424
2026-08-06T15:38:24Z
محک
1023
[[رج:یونیورسال پیکچرز فیلمون]] حذف شد; [[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391765
wikitext
text/x-wiki
{{Infobox film
| name = گرین بوک
| image = Green Book poster.jpg
| alt =
| caption =
| film name =
| director = [[پیتر فارلی]]
| producer = [[جیم برک]]
| writer = {{plainlist|
* نیک واللونگا
* برایان هیز کوری
* پیتر فارلی
}}
| screenplay =
| story =
| based on =
| starring = [[ویگو مورتنسن]]{{سخ}}[[ماهرشالا علی]]{{سخ}}[[لیندا کاردلیانی]]{{سخ}}[[اقبال طبا]]{{سخ}}سباستین
| narrator =
| music = [[کریس بوئرز]]
| cinematography = [[شان پورتر (فیلمبردار)|شان پورتر]]
| editing = پل جی. دون ویتو
| studio = {{Plainlist|
* [[دریمورکس]]
* [[امبلین پارتنرز]]<ref name=insight>{{cite web|url=https://www.varietyinsight.com/print_featurefilm_releases.php|title=Film releases|work=[[ورایتی]]|accessdate=August 18, 2018}}</ref>
* [[پارتیسیپنت مدیا]]<ref name=insight/>
* کونوندرام انترتینمنت<ref name=insight/>
* سینتیک مدیا<ref name=insight/>
}}
| distributor = [[یونیورسال استودیوز]]
| released = {{filmdate|۲۰۱۸|۹|۱۱|[[جشنواره بینالمللی فیلم تورنتو]]|۲۰۱۸|۱۱|۲۱|آمریکا}}
| runtime = ۱۳۰ دقیقه<ref>{{cite web|url=https://tiff.net/tiff/green-book|title=Green Book|website=[[جشنواره بینالمللی فیلم تورنتو|Toronto International Film Festival]]|accessdate=August ۱۴, ۲۰۱۸}}</ref>
| country = آمریکا
| language = انگلیسی
| budget = ۲۸٫۹ میلیون دلار<ref>{{cite web|url=https://articles.nola.com/movies/index.ssf/۲۰۱۷/۱۰/negro_motorist_green_book_movie_10312017.amp|title=Movie inspired by 'The Negro Motorist Green Book' to film in New Orleans|website=Nola.com|date=October ۳۱، ۲۰۱۷ |first=Mike |last=Scott |accessdate=October ۲۸، ۲۰۱۸}}</ref>
| gross =}}
'''''گرین بوک''''' ({{lang-en|Green Book}}) که یعنی '''''کتاب سبز''''' اتا فیلم نوم هسته که [[کمدی-درام]] هسته و ونه کارگردانی ره [[پیتر فارلی]] سال ۲۰۱۸ انجام هدائه. این فیلم تور ۱۹۶۰ پیانیست کلاسیک و جاز آمریکایی-جامائیکایی، [[دان شرلی]] ([[ماهرشالا علی]]) ره دمبال کانده و ونه سفر هاکردن ِداستانه.
این فیلم ۵تا کاندیداتوری [[اسکار]] ۲۰۱۹ داشته که ۳تاشون ره بَورده. اتاشون هم بتترین فیلمِ جایزه بییه. این فیلم [[گلدن گلوب]] دله هم سهتا جایزه بَورد بییه.
== منابع ==
{{پانویس|چپچین=بله|۲}}
* {{یادکرد-ویکی|پیوند =//en.wikipedia.org/w/index.php?title=Green_Book_(film)&oldid=866296940|عنوان = Green Book (film)|زبان =انگلیسی|بازیابی =۲۹ اکتبر ۲۰۱۸}}
== بریم بگردستن ==
* {{رسمی|https://www.greenbookfilm.com/}}
[[رده:۲۰۱۸ فیلمون]]
[[رده:آمریکایی فیلمون]]
[[رده:نژادپرستی فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:اوسکار بیته فیلمون]]
swfamirbju7rdbtkixjj5y9z0j8tmig
رج:فمینیستی فیلمون
14
33692
391843
147584
2026-08-06T17:03:17Z
محک
1023
[[رج:فیلم ژانر]] حذف شد; [[رج:فیلم، موضوع په]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391843
wikitext
text/x-wiki
[[رج:فیلم، موضوع په|فیمین]]
[[رج:فمینیسم|فیلم]]
gxf14zfw0mx3cj03qjo6jyhcs9v7kan
رج:ابرقهرمونی فیلمون
14
33693
391985
147585
2026-08-06T17:47:16Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391985
wikitext
text/x-wiki
[[رج:فیلم ژانر|سوپرهرو]]
[[رج:اساطیر، کشور په]]
8ivh94miz3pdnx9vilablr5au7j874z
پاپلی (مستند)
0
34297
391854
328858
2026-08-06T17:08:29Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391854
wikitext
text/x-wiki
'''پاپلی''' اتا ۷۲ دقیقهای مستند هسه که مهدی زمانپور کیاسری سال ۱۵۲۸ [[تبری تقویم|طبری]] دله بساته.
{{جعبه فیلم|عنوان=پاپلی|انتشار=|عرض تصویر=|زیرنویس=|کارگردان=[[مهدی زمانپور کیاسری]]|تهیهکننده=|نویسنده=|بازیگران=|موسیقی=|فیلمبرداری=|تدوین=|توزیعکننده=|تصویر=|مدت=۷۲ دقیقه|اکران=|زبان=[[تبری]]|کشور=ایران|بودجه=|فروش=|پس_از=|پیش_از=|درجه فیلم=|imdb_id=|soure_id=|amg_id=|پانویس=}}
اینتا مستند اتا روستایی کیجای درباره هسه که ونه نوم زینب هسه و ونه برارون و خاخرون همه سرسامون بییت هسنه ولی وه که شه پر و مار مسئولیت ره شه دوش سر حس کنه هر خواسگاری انه ره رد کنه...
== جشنوارهئون ==
* جشنواره کازان روسیه
* جشنواره داکسای کانادا
* جشنواره وزول فرانسه
* جشنواره سان لایت آلمان
* جشنواره تی آر تی ترکیه
* جشنواره دوربان آفریقای جنوبی
* جشنواره سینما حقیقت
* جشنواره فیلم سلامت
[[رج:فیلم، زوون په]]
[[رج:فیلم]]
t44hpkx0aczibklnin3x584f9uzucbe
کارور:Hashter
2
34454
392026
164837
2026-08-06T20:27:21Z
Hashter
23378
صفحه ره اسپه هاکرده
392026
wikitext
text/x-wiki
phoiac9h4m842xq45sp7s6u21eteeq1
رج:کرهای فیلمون
14
34460
391861
189708
2026-08-06T17:09:15Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391861
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:فیلمون با حیساب زوون]]
[[رج:جنوبی کره]]
[[رج:کرهای زوون]]
gn0vfz3adk78lq4t2mf4wudlae3gqae
391873
391861
2026-08-06T17:12:09Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391873
wikitext
text/x-wiki
[[رج:فیلمون با حیساب جوغرافی]]
[[رج:فیلم، زوون په]]
[[رج:جنوبی کره]]
[[رج:کرهای زوون]]
hy6ophp2hns205upop9ernzcwymp1ze
ئو شند
0
34734
391710
324263
2026-08-06T14:17:49Z
HenryThe
27142
391710
wikitext
text/x-wiki
{{Taxobox
| name = شِند
|color=pink
| image = LutraCanadensis fullres.jpg
| image_width = 299px
| image_caption =
| regnum = [[جانوران]]
| phylum = [[رسندارون]]
| classis = [[کالهدارون]]
| ordo = [[گوشتخارون]]
| familia = [[راسو]]ئون
| subfamilia =
| subdivision_ranks =
| subdivision =
}}
'''شِند''' یا '''شِنگ''' یا '''ئو شِند''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Otter'') اتجور حیوون هستنه که ویشته ئو دله درنه. ئو شندِ نسل در بزه وونه چون دنیا دله اکثر شیرین ئویِ دریاچهئون و روخنهئون دله گند بزه بیّه و نفتی کشتیون و کشاورزی سموم ئو ره مسوم هاکردنه که ئو شندِ وسّه ضرر دارنه. شنگ تموم دنیا دله پیدا وونه. ونه خِراک ویشته [[ماهی]]، صدف، [[کرچنگ|خرچنگ]]، میگو و [[گل|گَل]] هسته.
== منابع ==
{{پانویس}}
Wikipedia contributors, "Otter," Wikipedia, The Free Encyclopedia, http://en.wikipedia.org/w/index.php?title=Otter&oldid=192648677 (accessed February 19, 2008).
{{جونورون}}
[[رج:کالهدارون]]
pjqjmdhlgr7bsmz65atzhcleqe04ab0
رج:هندی فیلمون
14
35175
391870
156248
2026-08-06T17:11:29Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391870
wikitext
text/x-wiki
[[رج:فیلم، زوون په]]
[[رج:هندی زوون]]
55r52a88m39hn1qwpgmriij9sxld38y
رج:فارسی کتابون
14
35450
391952
179162
2026-08-06T17:39:58Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391952
wikitext
text/x-wiki
[[رج:کتابون، زوون په]]
[[رج:فارسی زوون]]
nks4hakf6bjzvjcrbc9roof7ky4r0fy
رج:۲۰۲۰ فیلمون
14
35582
391930
157852
2026-08-06T17:24:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391930
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۲۰|فیلمون]]
acg161s77hfwe4c5hauucjjnje8bv5f
رج:نظامی
14
35782
391959
170558
2026-08-06T17:40:39Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391959
wikitext
text/x-wiki
[[رج:فارسی شاعرون]]
[[رج:کتابون، نویسنده په]]
cb0aghlsrr2569t6o1gmt7lwf0ceu3v
رج:اوسکار بیتهئون
14
35800
391778
158774
2026-08-06T15:52:14Z
محک
1023
[[رج:بازیگرون]] حذف شد با استفاده از [[ویکیپدیا:رجساز]]
391778
wikitext
text/x-wiki
[[رج:اوسکار جایزه]]
jrskrv4m3i48vj0nzli8nl0udnnc92j
رج:آلمانی کتابون
14
36599
391940
168652
2026-08-06T17:38:28Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391940
wikitext
text/x-wiki
[[رج:آلمانی زوون]]
[[رج:کتابون، زوون په]]
4962flllakx28er5bpfpvk07nk0o96z
رج:سوییس کانتونها
14
36637
392003
182963
2026-08-06T17:49:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392003
wikitext
text/x-wiki
[[رج:سوییس]]
[[رج:ایالتون، کشور په]]
nsjw4ebi6fnjuc7er827ect664a2i2l
رج:آلمانیزوون کشورون
14
36687
391905
209541
2026-08-06T17:20:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391905
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:آلمانی زوون|کشورون]]
9v89cbs5gtwdh5k5nnsnd4runbfj7u0
رج:ایتالیاییزوون کشورون
14
36688
391909
209544
2026-08-06T17:20:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کشورون،، زوون په با [[:رج:کشورون، زوون په|کشورون، زوون په]]
391909
wikitext
text/x-wiki
[[رج:کشورون، زوون په]]
[[رج:ایتالیایی زوون]]
ctjpumqjcczrh3bgg0juas4jb3bx5i9
ماژول:Wikidata.Ca/i18n
828
36879
392034
325811
2026-08-07T06:33:17Z
محک
1023
آزمایش هاکنم منابع خار وونه یا نا؟
392034
Scribunto
text/plain
-- Translate and set up for your language
-- Please contact [[:ca:Module talk:Wikidades]] if you need any help
local i18n = {
["errors"] = {
["property-not-found"] = "Property not found.",
["qualifier-not-found"] = "Qualifier not found.",
},
["datetime"] =
{
-- $1 is a placeholder for the actual number, or use the format of #time parser function
["beforenow"] = "$1 BCE", -- how to format negative numbers for precisions 0 to 5
["afternow"] = "$1 CE", -- how to format positive numbers for precisions 0 to 5
["bc"] = '$1 "پ.م"', -- how print negative years
["ad"] = "$1", -- how print 1st century AD dates
[0] = "$1 میلیارد سال", -- precision: billion years
[1] = "$100 میلیون سال", -- precision: hundred million years
[2] = "$10 میلیون سال", -- precision: ten million years
[3] = "$1 میلیون سال", -- precision: million years
[4] = "$100000 سال", -- precision: hundred thousand years; thousand separators added afterwards
[5] = "$10000 سال", -- precision: ten thousand years; thousand separators added afterwards
[6] = "$1 هزاره", -- precision: millennium
[7] = " قرن $1", -- precision: century
[8] = "دهه $1", -- precision: decade
[9] = "[[Y]]", -- precision: year,
[10] = "[[F Y]]", -- precision: month
[11] = "j F Y", -- precision: day
["hms"] = {["hours"] = "h", ["minutes"] = "m", ["seconds"] = "s"}, -- duration: xh xm xs
},
["years-old"] = { -- in Mazeruni {"zero", "one", "two", "few 3-10", "many 11-99", "other 100-102"}
"أقل من سنة",
"سال",
"سال",
"$1 سال",
"$1 سال",
"$1 سال"
},
["cite"] = { -- cite parameters of local templates
["title"] = "title",
["author"] = "author",
["date"] = "date",
["pages"] = "pages",
["language"] = "language",
-- cite web parameters
["url"] = "url",
["website"] = "website",
["access-date"] = "access-date",
["archive-url"] = "archive-url",
["archive-date"] = "archive-date",
["publisher"] = "publisher",
["quote"] = "quote",
-- cite journal parameters
["work"] = "work",
["issue"] = "issue",
["issn"] = "issn",
["doi"] = "doi"
},
-- local wiki settings
["addpencil"] = true, -- adds a pencil icon linked to Wikidata statement, planned to overwrite by Wikidata Bridge
["categorylabels"] = "", -- Category:Pages with Wikidata labels not translated (void for no local category)
["categoryprop"] = "رج:صفحهئونی که اتا ویژگی ره کار زننه $1", -- Category:Pages using Wikidata property $1
["categoryref"] = "رج:صفحهئونی که ویکیدیتا جه وصلنه", -- Category:Pages with references from Wikidata
["addfallback"] = {'fa','fr', 'it', 'es', 'de', 'pt'}, -- additional fallback language codes, i.e. {'sv', 'de'}
["suppressids"] = { -- list of Qid values to suppress,
'Q22282939' -- for no 'linguistic content'
},
["qidlabels"] = false -- show labels as Qid if no fallback translation is available (default true)
}
-- Functions for local grammatical cases (as ordinal) and local fixes (if used)
local cases = {
-- local fixes
-- ["infoboxlabel"] = function(word) return require("Module:Wikidades/labels").fixInfoboxLabel(word) end,
-- ["infoboxdata"] = function(word) return require("Module:Wikidades/labels").fixInfoboxData(word) end,
-- other local cases
["monolingualtext"] = function(lang, text)
return mw.getCurrentFrame():expandTemplate{ title = 'native name', args = { lang, text, ["parensize"] = "80%" } }
end,
}
return {
i18n = i18n,
cases = cases
}
gijphzgkl6v5u4b417y8clayvu7dui3
رج:فرانسوی کتابون
14
37051
391951
169936
2026-08-06T17:39:48Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391951
wikitext
text/x-wiki
[[رج:فرانسوی زوون|کتاب]]
[[رج:کتابون، زوون په]]
q7gga12a6q9h57aa9luv1zjixvuh7zh
ماژول:Wikidata2/time
828
37139
392032
181784
2026-08-07T05:51:15Z
محک
1023
392032
Scribunto
text/plain
local p = {}
------------------------------------------------------------------------------
-- module local variables and functions
local wiki =
{
langcode = mw.language.getContentLanguage().code
}
-- internationalisation
local i18n =
{ ["errors"] = {
["property-param-not-provided"] = "Property parameter not provided.",
["entity-not-found"] = "Entity not found.",
["unknown-claim-type"] = "Unknown claim type.",
["unknown-snak-type"] = "Unknown snak type.",
["unknown-datatype"] = "Unknown datatype.",
["unknown-entity-type"] = "Unknown entity type.",
["unknown-value-module"] = "You must set both value-module and value-function parameters.",
["value-module-not-found"] = "The module pointed by value-module not found.",
["value-function-not-found"] = "The function pointed by value-function not found."
},
["datetime"] =
{
-- $1 is a placeholder for the actual number
[0] = "$1 میلیارد سال", --a دقت:میلیارد سال
[1] = "$100 میلیون سال", --a دقت: میلیون سال
[2] = "$10 میلیون سال", --a دقت: ده میلیون سال
[3] = "$1 میلیون سال", --a دقت: مليون سال
[4] = "$100,000 سال", --a دقت: صد هزار سال
[5] = "$10,000 سال", --a دقت: ده هزار سال
[6] = "$1 هزاره", --a دقت: هزاره
[7] = "قرن $1", --a دقت: قرن
[8] = "دهه $1", --a دقت: عقد
-- the following use the format of #time parser function
[9] = "Y", -- دقت: سال,
[10] = "F Y", -- دقت: ماه
[11] = "j F Y", -- دقت: روز
[12] = "j F Y ga", -- دقت: ساعت
[13] = "j F Y g:ia", -- دقت: دقه
[14] = "j F Y g:i:sa", -- دقت: ثانیه
["beforenow"] = "$1 پم", -- how to format negative numbers for precisions 0 to 5
["afternow"] = "$1", -- how to format positive numbers for precisions 0 to 5
["bc"] = '$1 "پم"', -- كيف طباعة السنوات السلبية
["ad"] = "$1", -- كيف طباعة سنوات الإيجابية
-- the following are for function getDateValue()
["default-format"] = "dmy", -- مقدار پیش فرض برای #3 (getDateValue)
["default-addon"] = "پم", -- default value of the #4 (getDateValue)
["prefix-addon"] = false, -- set to true for languages put "BC" in front of the
-- datetime string; or the addon will be suffixed
["addon-sep"] = " ", -- separator between datetime string and addon (or inverse)
["format"] = -- options of the 3rd argument
{
["j F Y"] = "j F Y",
["dmy"] = "j F Y",
["dmY"] = "dmY",
["j F"] = "j F",
["longdate"] = "j F Y",
["my"] = "F Y",
["y"] = "Y",
["Y"] = "Y",
["F"] = "F",
["n"] = "n",
["m"] = "F",
["j"] = "j",
["d"] = "j",
["ymd"] = "Y-m-d",
["ym"] = "Y-m"
}
},
["ordinal"] =
{
[1] = "", --st
[2] = "", --nd
[3] = "", --rd
["default"] = "" --th
}
}
local categorywikidatadata = '[[رج:صفحهئونی که ویکی دیتا ره کار زننه]]';
-- this function needs to be internationalised along with the above:
-- we need three exceptions in English for 1st, 2nd, 3rd
-- takes cardinal numer as a numeric and returns the ordinal as a string
local function makeOrdinal(cardinal)
local ordsuffix = i18n.ordinal.default
if cardinal % 10 == 1 then
ordsuffix = i18n.ordinal[1]
elseif cardinal % 10 == 2 then
ordsuffix = i18n.ordinal[2]
elseif cardinal % 10 == 3 then
ordsuffix = i18n.ordinal[3]
end
return tostring(cardinal) .. ordsuffix
end
local function formatError(code)
return '<span class="error">' .. (i18n.errors[code] or code) .. '</span>'
end
local function parseDateValue(timestamp, date_format, date_addon)
local prefix_addon = i18n["datetime"]["prefix-addon"]
local addon_sep = i18n["datetime"]["addon-sep"]
local addon = ""
-- check for negative date
if string.sub(timestamp, 1, 1) == '-' then
timestamp = '+' .. string.sub(timestamp, 2)
addon = date_addon
end
local function d(f)
local year_suffix
local tstr = ""
local lang_obj = mw.language.new(wiki.langcode)
local f_parts = mw.text.split(f, 'Y', true)
for idx, f_part in pairs(f_parts) do
year_suffix = ''
if string.match(f_part, "x[mijkot]$") then
-- for non-Gregorian year
f_part = f_part .. 'Y'
elseif idx < #f_parts then
-- supress leading zeros in year
year_suffix = lang_obj:formatDate('Y', timestamp)
year_suffix = string.gsub(year_suffix, '^0+', '', 1)
end
tstr = tstr .. lang_obj:formatDate(f_part, timestamp) .. year_suffix
end
if addon ~= "" and prefix_addon then
return addon .. addon_sep .. tstr
elseif addon ~= "" then
return tstr .. addon_sep .. addon
else
return tstr
end
end
local _date_format = i18n["datetime"]["format"][date_format]
if _date_format ~= nil then
return d(_date_format)
else
return formatError("unknown-datetime-format")
end
end
-- This local function combines the year/month/day/BC/BCE handling of parseDateValue{}
-- with the millennium/century/decade handling of formatDate()
local function parseDateFull(timestamp, precision, date_format, date_addon)
local prefix_addon = i18n["datetime"]["prefix-addon"]
local addon_sep = i18n["datetime"]["addon-sep"]
local addon = ""
-- check for negative date
if string.sub(timestamp, 1, 1) == '-' then
timestamp = '+' .. string.sub(timestamp, 2)
addon = date_addon
end
-- get the next four characters after the + (should be the year now in all cases)
-- ok, so this is dirty, but let's get it working first
local intyear = tonumber(string.sub(timestamp, 2, 5))
if intyear == 0 and precision <= 9 then
return ""
end
-- precision is 10000 years or more
if precision <= 5 then
local factor = 10 ^ ((5 - precision) + 4)
local y2 = math.ceil(math.abs(intyear) / factor)
if precision == 2 then y2 = intyear / 10 end
if precision == 3 then y2 = intyear / 100 end
local relative = mw.ustring.gsub(i18n.datetime[precision], "$1", tostring(y2))
--mw.log("وحدة:Wikidata2/time:" .. i18n.datetime[precision] .. " timestamp: " .. timestamp .. " intyear: " .. intyear )
if addon ~= "" then
-- negative date
relative = mw.ustring.gsub(i18n.datetime.beforenow, "$1", relative)
else
relative = mw.ustring.gsub(i18n.datetime.afternow, "$1", relative)
end
return relative
end
-- precision is decades (8), centuries (7) and millennia (6)
local era, card
if precision == 6 then
card = math.floor((intyear - 1) / 1000) + 1
era = mw.ustring.gsub(i18n.datetime[6], "$1", makeOrdinal(card))
end
if precision == 7 then
card = math.floor((intyear - 1) / 100) + 1
era = mw.ustring.gsub(i18n.datetime[7], "$1", makeOrdinal(card))
end
if precision == 8 then
era = mw.ustring.gsub(i18n.datetime[8], "$1", tostring(math.floor(math.abs(intyear) / 10) * 10))
end
if era then
if addon ~= "" then
era = mw.ustring.gsub(mw.ustring.gsub(i18n.datetime.bc, '"', ""), "$1", era)
else
era = mw.ustring.gsub(mw.ustring.gsub(i18n.datetime.ad, '"', ""), "$1", era)
end
return era
end
local _date_format = i18n["datetime"]["format"][date_format]
if _date_format ~= nil then
-- check for precision is year and override supplied date_format
if precision == 9 then
_date_format = i18n["datetime"][9]
end
if precision == 10 then
_date_format = i18n["datetime"][10]
end
local year_suffix
local tstr = ""
local lang_obj = mw.language.new(wiki.langcode)
local f_parts = mw.text.split(_date_format, 'Y', true)
for idx, f_part in pairs(f_parts) do
year_suffix = ''
if string.match(f_part, "x[mijkot]$") then
-- for non-Gregorian year
f_part = f_part .. 'Y'
elseif idx < #f_parts then
-- supress leading zeros in year
year_suffix = lang_obj:formatDate('Y', timestamp)
year_suffix = string.gsub(year_suffix, '^0+', '', 1)
end
tstr = tstr .. lang_obj:formatDate(f_part, timestamp) .. year_suffix
end
local fdate
if addon ~= "" and prefix_addon then
fdate = addon .. addon_sep .. tstr
elseif addon ~= "" then
fdate = tstr .. addon_sep .. addon
else
fdate = tstr
end
--mw.log("ماژول:Wikidata2/time:" .. timestamp .. " precision: " .. precision .. " fdate: " .. fdate )
return fdate
else
return formatError("unknown-datetime-format")
end
end
-- precision: 0 - billion years, 1 - hundred million years, ..., 6 - millennia, 7 - century, 8 - decade, 9 - year, 10 - month, 11 - day, 12 - hour, 13 - minute, 14 - second
local function normalizeDate(date)
date = mw.text.trim(date, "+")
-- extract year
local yearstr = mw.ustring.match(date, "^\-?%d+")
local year = tonumber(yearstr)
-- remove leading zeros of year
return year .. mw.ustring.sub(date, #yearstr + 1), year
end
function p.getdate(time1, options)
if options.modifytime and options.modifytime ~= ""
then
formatd = options.modifytime
else
formatd = i18n["datetime"]["default-format"]
end
local date_format = mw.text.trim(formatd)
local timestamp = time1.time
local dateprecision = time1.precision
if dateprecision >5 then
timestamp = mw.ustring.gsub(timestamp ,'%-00%-','-01-')
end
if dateprecision == 9 or dateprecision == 10 then
timestamp = mw.ustring.gsub(timestamp ,'%-00T','-01T') end
local date_addon = mw.text.trim(options.date_addon or i18n["datetime"]["default-addon"])
local tid = parseDateFull(timestamp, dateprecision, date_format, date_addon)
return tid
end
function p.getdate1(time1, modifytime )
if modifytime and modifytime ~= ''
then
formatd = modifytime
else
formatd = i18n["datetime"]["default-format"]
end
local date_format = mw.text.trim(formatd)
local timestamp = time1.time
local dateprecision = time1.precision
timestamp = string.gsub(timestamp ,'-00-','-01-')
if dateprecision == 9 or dateprecision == 10 then
timestamp = string.gsub(timestamp ,'-00T','-01T')
end
local date_addon = mw.text.trim(i18n["datetime"]["default-addon"])
local tid = parseDateFull(timestamp, dateprecision, date_format, date_addon)
return tid
end
-- returns the page id (Q...) of the current page or nothing of the page is not connected to Wikidata
function p.pageId(frame)
local entity = mw.wikibase.getEntityObject()
if not entity then return nil else return entity.id end
end
return p
jz5i6rwks8rv3u6kqn9f6mjq9gkrser
رج:پرتغالی کتابون
14
37311
391957
170484
2026-08-06T17:40:28Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391957
wikitext
text/x-wiki
[[رج:پرتغالی زوون|کتاب]]
[[رج:کتابون، زوون په]]
5wkpttdg1pjvbtjka7b9p3vct74qde6
رج:ایسپانیولی کتابون
14
37325
391944
170507
2026-08-06T17:38:58Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391944
wikitext
text/x-wiki
[[رج:ایسپانیولی زوون|کتاب]]
[[رج:کتابون، زوون په]]
c2072nh6mvwznvy2nm6xl4ephvu64g5
رج:ایتالیایی کتابون
14
37337
391943
170523
2026-08-06T17:38:48Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391943
wikitext
text/x-wiki
[[رج:ایتالیایی زوون|کتاب]]
[[رج:کتابون، زوون په]]
pmo14jg3s26j7n0a3dg62ly74vckud7
رج:تالکین
14
37360
391960
170551
2026-08-06T17:40:58Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391960
wikitext
text/x-wiki
[[رج:کتابون، نویسنده په]]
[[رج:بریتانیا نویسندگون]]
63usg3t9z3w2d6lgdopwcutu6i38wd6
رج:کتابون، نویسنده په
14
37365
391942
170559
2026-08-06T17:38:38Z
TapuriaBot
3049
TapuriaBot صفحهٔ [[رج:کتابون با حیساب نویسنده]] را بدون برجایگذاشتن تغییرمسیر به [[رج:کتابون، نویسنده په]] منتقل کرد: ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
170559
wikitext
text/x-wiki
[[رج:نویسندگون]]
[[رج:کیتاب]]
iqixhwn82qz1l2f5q27gzqgn2hoxatx
رج:شکسپیر
14
37368
391956
170578
2026-08-06T17:40:18Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391956
wikitext
text/x-wiki
[[رج:کتابون، نویسنده په]]
[[رج:بریتانیا نویسندگون]]
63usg3t9z3w2d6lgdopwcutu6i38wd6
رج:یونانی کتابون
14
38114
391958
171673
2026-08-06T17:40:38Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391958
wikitext
text/x-wiki
[[رج:کتابون، زوون په]]
[[رج:یونانی زوون]]
gjaa5cixawbnrabtws1mug11n6uel91
زمون پناهگاه
0
40433
391964
177178
2026-08-06T17:42:29Z
محک
1023
[[رج:کیتاب]] حذف شد با استفاده از [[ویکیپدیا:رجساز]]
391964
wikitext
text/x-wiki
{{ صندخ/کتاب}}
'''{{PAGENAME}}''' اتا [[بلغاری زوون]] کتاب هسته که سال ٢٠٢٠ جورجی گاسپادینوف بنویشته. این کتاب ایتالیایی و انگلیسی دگارست جایزه بیتنه و انگلیسی نسخه، آمریکای [[من بوکر]] جایزه ره بیته. این کتاب بنویشتن ٣ سال بکشییه.
ونه داستان و آسنی، اتا کلینیک دله گذرنه که آلزایمریها شنه و هر طبقه ات سری مریض درنه که هر کمین اتجور خاطره یاد یارنه و کشورون و دورههای مختلف جه سر در یارنه. این کیلینیک اسم درکانده و مردم انه تا شه دلوس دوره و کشور طبقه دله چرخ بزنن.
== منابع ==
{{پهنویس}}
* انگلیسی ویکیپدیا
<!--- رجئون: --->
[[رج:راهنما جه بساته مقالات]]
[[رج:بلغاری کتابون]]
rhd3vlyfrhi6bixb7avnwkaxyb4t9be
اتا شو سبرینا دلهدائی جا
0
40544
391869
192015
2026-08-06T17:11:21Z
محک
1023
[[رج:فیلم]] حذف شد; [[رج:۲۰۰۰ فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391869
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''اتا شو سبرینا دلهدائی جا''' (انگلیسی: Una noche con Sabrina Love) اتا دراما-کومدی فیلم هسه کا ونه دایرکتر آلخادرو اگرستی هسه و 2000 دله منتشر بوه.
== اکترئون: ==
* سیسیلیا روت
* جانکارلو جانینی
* نورما آلیاندرو
* توماس فونسی
* چارلی گارسیا
* اندی موشیاتی
== ممبعئون: ==
* {{ویکی منبع|پیوند=//en.wikipedia.org/w/index.php?title=Una_noche_con_Sabrina_Love&oldid=830038767|عنوان=Una noche con Sabrina Love|زبان=انگلیسی|بازیابی=۲۲ ژوئیه ۲۰۱۸}}
[[رج:فرانسه فیلمون]]
[[رج:ایسپانیولی فیلمون]]
[[رج:۲۰۰۰ فیلمون]]
c8k5gnwvnm3ce9jtvyjx07rhel1o2rx
رج:ایتالیایی فیلمون
14
40676
391860
177829
2026-08-06T17:09:09Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391860
wikitext
text/x-wiki
[[رج:فیلم، زوون په]]
[[رج:ایتالیایی زوون|فیلم]]
bs7saasm3oi1hz4k6lzf79epb1xorv2
ماژول:Citation/CS1/Date validation
828
41039
392033
328963
2026-08-07T06:17:47Z
محک
1023
آزمایش هاکنم منابع خار وونه یا نا؟
392033
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style; -- imported functions from selected Module:Citation/CS1/Utilities
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration
--[[--------------------------< F I L E - S C O P E D E C L A R A T I O N S >--------------------------------
File-scope variables are declared here
]]
local lang_object = mw.getContentLanguage(); -- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?
local year_limit; -- used by is_valid_year()
--[[----------------< S T R I P _ W I K I L I N K >------------------------------
حذف براکتهای ویکیلینک از یک رشته.
]]
local function strip_wikilink (str)
if not str then
return nil;
end
-- حالت پیپدار: [[X|Y]] -> Y
str = str:gsub ('%[%[[^%]|]*|([^%]]*)%]%]', '%1');
-- حالت ساده: [[X]] -> X
str = str:gsub ('%[%[([^%]|]*)%]%]', '%1');
-- هرگونه فضای اضافی دوگانه را پاک کن
str = str:gsub ('%s+', ' '):gsub ('^%s', ''):gsub ('%s$', '');
return str;
end
--[=[-------------------------< I S _ V A L I D _ A C C E S S D A T E >----------------------------------------
returns true if:
Wikipedia start date <= accessdate < today + 2 days
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)
accessdate is the date provided in |access-date= at time 00:00:00 UTC
today is the current date at time 00:00:00 UTC plus 48 hours
if today is 2015-01-01T00:00:00 then
adding 24 hours gives 2015-01-02T00:00:00 – one second more than today
adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow
This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser
apparently doesn't understand non-English date month names. This function will always return false when the date
contains a non-English month name because good1 is false after the call to lang.formatDate(). To get around that
call this function with YYYY-MM-DD format dates.
]=]
local function is_valid_accessdate (accessdate)
local good1, good2;
local access_ts, tomorrow_ts; -- to hold Unix time stamps representing the dates
good1, access_ts = pcall (lang_object.formatDate, lang_object, 'U', accessdate ); -- convert accessdate value to Unix timestamp
good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, 'U', 'today + 2 days' ); -- today midnight + 2 days is one second more than all day tomorrow
if good1 and good2 then -- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand
access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts); -- convert to numbers for the comparison;
tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);
else
return false; -- one or both failed to convert to Unix time stamp
end
if 979516800 <= access_ts and access_ts < tomorrow_ts then -- Wikipedia start date <= accessdate < tomorrow's date
return true;
else
return false; -- accessdate out of range
end
end
--[[--------------------------< G E T _ M O N T H _ N U M B E R >----------------------------------------------
returns a number according to the month in a date: 1 for January, etc. Capitalization and spelling must be correct.
If not a valid month, returns 0
]]
local function get_month_number (month)
return cfg.date_names['local'].long[month] or cfg.date_names['local'].short[month] or -- look for local names first
cfg.date_names['en'].long[month] or cfg.date_names['en'].short[month] or -- failing that, look for English names
0; -- not a recognized month name
end
--[[--------------------------< G E T _ S E A S O N _ N U M B E R >--------------------------------------------
returns a number according to the sequence of seasons in a year: 21 for Spring, etc. Capitalization and spelling
must be correct. If not a valid season, returns 0.
21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”
returns 0 when <param> is not |date=
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons. EDTF does support the distinction between north and south
hemisphere seasons but cs1|2 has no way to make that distinction.
These additional divisions not currently supported:
25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere
29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_season_number (season, param)
if 'date' ~= param then
return 0; -- season dates only supported by |date=
end
return cfg.date_names['local'].season[season] or -- look for local names first
cfg.date_names['en'].season[season] or -- failing that, look for English names
0; -- not a recognized season name
end
--[[--------------------------< G E T _ Q U A R T E R _ N U M B E R >------------------------------------------
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc. Capitalization and spelling
must be correct. If not a valid quarter, returns 0.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
returns 0 when <param> is not |date=
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons and quarters.
These additional divisions not currently supported:
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_quarter_number (quarter, param)
if 'date' ~= param then
return 0; -- quarter dates only supported by |date=
end
quarter = mw.ustring.gsub (quarter, ' +', ' '); -- special case replace multiple space chars with a single space char
return cfg.date_names['local'].quarter[quarter] or -- look for local names first
cfg.date_names['en'].quarter[quarter] or -- failing that, look for English names
0; -- not a recognized quarter name
end
--[[--------------------------< G E T _ P R O P E R _ N A M E _ N U M B E R >----------------------------------
returns a non-zero number if date contains a recognized proper-name. Capitalization and spelling must be correct.
returns 0 when <param> is not |date=
]]
local function get_proper_name_number (name, param)
if 'date' ~= param then
return 0; -- proper-name dates only supported by |date=
end
return cfg.date_names['local'].named[name] or -- look for local names dates first
cfg.date_names['en'].named[name] or -- failing that, look for English names
0; -- not a recognized named date
end
--[[--------------------------< G E T _ E L E M E N T _ N U M B E R <------------------------------------------
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)
]]
local function get_element_number (element, param)
local num;
local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number}; -- list of functions to execute in order
for _, func in ipairs (funcs) do -- spin through the function list
num = func (element, param); -- call the function and get the returned number
if 0 ~= num then -- non-zero when valid month season quarter
return num; -- return that number
end
end
return nil; -- not valid
end
--[[--------------------------< I S _ V A L I D _ Y E A R >----------------------------------------------------
Function gets current year from the server and compares it to year from a citation parameter. Years more than one
year in the future are not acceptable.
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable
]]
local function is_valid_year (year, param)
if not is_set (year_limit) then
year_limit = tonumber(os.date("%Y"))+1; -- global variable so we only have to fetch it once
end
year = tonumber (year) or lang_object:parseFormattedNumber (year); -- convert to number for the comparison
if year and (100 > year) then -- years less than 100 not supported
return false;
end
if 'pmc-embargo-date' == param then -- special case for |pmc-embargo-date=
return year and (year <= tonumber(os.date("%Y"))+2) or false; -- years more than two years in the future are not accepted
end
return year and (year <= year_limit) or false;
end
--[[--------------------------< I S _ V A L I D _ D A T E >----------------------------------------------------
Returns true if day is less than or equal to the number of days in month and year is no farther into the future
than next year; else returns false.
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately
1923) dates are assumed to be Gregorian.
]]
local function is_valid_date (year, month, day, param)
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
local month_length;
if not is_valid_year (year, param) then -- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future
return false;
end
month = tonumber (month); -- required for YYYY-MM-DD dates
if (2 == month) then -- if February
month_length = 28; -- then 28 days unless
if 1582 > tonumber(year) then -- Julian calendar
if 0 == (year%4) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
else -- Gregorian calendar
if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
end
else
month_length = days_in_month[month] or 0; -- invalid month number is nil so default <month_length> to 0
end
if tonumber (day) > month_length then
return false;
end
return true;
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E >--------------------------
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August.
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are
listed in the short subtable. When both have the same style (both are listed in the same table), returns true; false else
]]
local function is_valid_month_range_style (month1, month2)
if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or -- are both English names listed in the long subtable?
(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or -- are both English names listed in the short subtable?
(cfg.date_names['local'].long[month1] and cfg.date_names['local'].long[month2]) or -- are both local names listed in the long subtable?
(cfg.date_names['local'].short[month1] and cfg.date_names['local'].short[month2]) then -- are both local names listed in the short subtable?
return true;
end
return false; -- names are mixed
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E >------------------------
Check a pair of months or seasons to see if both are valid members of a month or season pair.
Month pairs are expected to be left to right, earliest to latest in time.
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok
]]
local function is_valid_month_season_range(range_start, range_end, param)
local range_start_number = get_month_number (range_start);
local range_end_number;
if 0 == range_start_number then -- is this a month range?
range_start_number = get_season_number (range_start, param); -- not a month; is it a season? get start season number
range_end_number = get_season_number (range_end, param); -- get end season number
if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then
return true; -- any season pairing is accepted except when both are the same
end
return false; -- range_start and/or range_end is not a season
end
-- here when range_start is a month
range_end_number = get_month_number (range_end); -- get end month number
if range_start_number < range_end_number and -- range_start is a month; does range_start precede range_end?
is_valid_month_range_style (range_start, range_end) then -- do months have the same style?
return true; -- proper order and same style
end
return false; -- range_start month number is greater than or equal to range end number; or range end isn't a month
end
--[[--------------------------< M A K E _ C O I N S _ D A T E >------------------------------------------------
This function receives a table of date parts for one or two dates and an empty table reference declared in
Module:Citation/CS1. The function is called only for |date= parameters and only if the |date=<value> is
determined to be a valid date format. The question of what to do with invalid date formats is not answered here.
The date parts in the input table are converted to an ISO 8601 conforming date string:
single whole dates: yyyy-mm-dd
month and year dates: yyyy-mm
year dates: yyyy
ranges: yyyy-mm-dd/yyyy-mm-dd
yyyy-mm/yyyy-mm
yyyy/yyyy
Dates in the Julian calendar are reduced to year or year/year so that we don't have to do calendar conversion from
Julian to Proleptic Gregorian.
The input table has:
year, year2 – always present; if before 1582, ignore months and days if present
month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas
day, day2 – 0 if not provided, 1-31 for days
the output table receives:
rftdate: an ISO 8601 formatted date
rftchron: a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)
rftssn: one of four season keywords: winter, spring, summer, fall (lowercase)
rftquarter: one of four values: 1, 2, 3, 4
]]
local function make_COinS_date (input, tCOinS_date)
local date; -- one date or first date in a range
local date2 = ''; -- end of range date
input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year); -- language-aware tonumber()
input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2); -- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals
if ((1582 == input.year) and (10 > tonumber(input.month))) or (1582 > input.year) then -- if a Julian calendar date
tCOinS_date.rftdate = tostring (input.year); -- &rft.date gets year only
return; -- done
end
-- here for all forms of Gregorian dates
if 20 < tonumber (input.month) then -- if season, quarter, or proper-name date
date = input.year; -- &rft.date gets year only
if 0 ~= input.year2 and input.year ~= input.year2 then -- if a range, only the second year portion when not the same as range start year
date = string.format ('%.4d/%.4d', input.year, input.year2) -- assemble the date range
end
local season = {[24] = 'winter', [21] = 'spring', [22] = 'summer', [23] = 'fall', [33] = '1', [34] = '2', [35] = '3', [36] = '4', [98] = 'Easter', [99] = 'Christmas'}; -- seasons lowercase, no autumn; proper-names use title case
if 0 == input.month2 then -- single season, quarter, or proper-name date
if 40 < tonumber(input.month) then
tCOinS_date.rftchron = season[input.month]; -- proper-name date; used in journal metadata only
elseif 30 < tonumber(input.month) then
tCOinS_date.rftquarter = season[input.month]; -- quarter date; used in journal metadata only
else
tCOinS_date.rftssn = season[input.month]; -- season date; used in journal metadata only
end
else -- season ranges are lumped into &rft.chron; &rft.ssn and &rft.quarter are left blank
if input.year ~= input.year2 then -- season year – season year range or season year–year
if 0 ~= input.month2 then
tCOinS_date.rftchron = string.format ('%s %s – %s %s', season[input.month], input.year, season[input.month2], input.year2); -- used in journal metadata only
end
else -- season–season year range
tCOinS_date.rftchron = season[input.month] .. '–' .. season[input.month2]; -- season–season year range; used in journal metadata only
end
end
tCOinS_date.rftdate = tostring (date);
return; -- done
end
-- here for gregorian calendar dates
if 0 ~= input.day then
date = string.format ('%s-%.2d-%.2d', input.year, tonumber(input.month), tonumber(input.day)); -- whole date
elseif 0 ~= input.month then
date = string.format ('%s-%.2d', input.year, tonumber(input.month)); -- year and month
else
date = string.format ('%s', input.year); -- just year
end
if 0 ~= input.year2 then
if 0 ~= input.day2 then
date2 = string.format ('/%s-%.2d-%.2d', input.year2, tonumber(input.month2), tonumber(input.day2)); -- whole date
elseif 0 ~= input.month2 then
date2 = string.format ('/%s-%.2d', input.year2, tonumber(input.month2)); -- year and month
else
date2 = string.format ('/%s', input.year2); -- just year
end
end
tCOinS_date.rftdate = date .. date2; -- date2 has the '/' separator
return;
end
--[[--------------------------< P A T T E R N S _ T >----------------------------------------------------------
this is the list of patterns for date formats that this module recognizes. Approximately the first half of these
patterns represent formats that might be reformatted into another format. Those that might be reformatted have
'indicator' letters that identify the content of the matching capture: 'd' (day), 'm' (month), 'a' (anchor year),
'y' (year); second day, month, year have a '2' suffix.
These patterns are used for both date validation and for reformatting. This table should not be moved to ~/Configuration
because changes to this table require changes to check_date() and to reformatter() and reformat_date()
]]
local patterns_t = {
-- year-initial numerical year-month-day
['ymd'] = {'^([1-9]%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'},
-- month-initial: month day, year
['Mdy'] = {'^(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'a', 'y'},
-- month-initial day range: month day–day, year; days are separated by endash
['Md-dy'] = {'^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'd2', 'a', 'y'},
-- day-initial: day month year
['dMy'] = {'^([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'a', 'y'},
-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki
-- ['yMd'] = {'^(([1-9]%d%d%d?)%a?) +(%D-) +(%d%d?)$', 'a', 'y', 'm', 'd'},
-- day-range-initial: day–day month year; days are separated by endash
['d-dMy'] = {'^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'd2', 'm', 'a', 'y'},
-- day initial month-day-range: day month - day month year; uses spaced endash
['dM-dMy'] = {'^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'd2', 'm2', 'a', 'y'},
-- month initial month-day-range: month day – month day, year; uses spaced endash
['Md-Mdy'] = {'^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$','m', 'd', 'm2', 'd2', 'a', 'y'},
-- day initial month-day-year-range: day month year - day month year; uses spaced endash
['dMy-dMy'] = {'^([1-9]%d?) +(%D-) +([1-9]%d%d%d?) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'y', 'd2', 'm2', 'a', 'y2'},
-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
['Mdy-Mdy'] = {'^(%D-) +([1-9]%d?), +([1-9]%d%d%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'y', 'm2', 'd2', 'a', 'y2'},
-- these date formats cannot be converted, per se, but month name can be rendered short or long
-- month/season year - month/season year; separated by spaced endash
['My-My'] = {'^(%D-) +([1-9]%d%d%d?) +[%-–] +(%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'y', 'm2', 'a', 'y2'},
-- month/season range year; months separated by endash
['M-My'] = {'^(%D-)[%-–](%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'm2', 'a', 'y'},
-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.
['My'] = {'^([^%d–]-) +(([1-9]%d%d%d?)%a?)$', 'm', 'a', 'y'}, -- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn't
-- these date formats cannot be converted
['Sy4-y2'] = {'^(%D-) +(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
['Sy-y'] = {'^(%D-) +([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- special case Winter/Summer year-year; year separated with unspaced endash
['y-y'] = {'^([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
['y4-y2'] = {'^(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- year range: YYYY–YY; separated by unspaced endash
['y'] = {'^(([1-9]%d%d%d?)%a?)$'}, -- year; here accept either YYY or YYYY
}
--[[--------------------------< I S _ V A L I D _ E M B A R G O _ D A T E >------------------------------------
returns true and date value if that value has proper dmy, mdy, ymd format.
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.
]]
local function is_valid_embargo_date (v)
if v:match (patterns_t['ymd'][1]) or -- ymd
v:match (patterns_t['Mdy'][1]) or -- dmy
v:match (patterns_t['dMy'][1]) then -- mdy
return true, v;
end
return false, '9999'; -- if here not good date so return false and set embargo date to long time in future
end
--[[--------------------------< C H E C K _ D A T E >----------------------------------------------------------
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only
allowed range separator is endash. Additionally, check the date to see that it is a real date: no 31 in 30-day
months; no 29 February when not a leap year. Months, both long-form and three character abbreviations, and seasons
must be spelled correctly. Future years beyond next year are not allowed.
If the date fails the format tests, this function returns false and does not return values for anchor_year and
COinS_date. When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets
its year from the year parameter if present otherwise CITEREF does not get a date value.
Inputs:
date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)
Returns:
false if date string is not a real date; else
true, anchor_year, COinS_date
anchor_year can be used in CITEREF anchors
COinS_date is ISO 8601 format date; see make_COInS_date()
]]
local function check_date (date_string, param, tCOinS_date)
local year; -- assume that year2, months, and days are not used;
local year2 = 0; -- second year in a year range
local month = 0;
local month2 = 0; -- second month in a month range
local day = 0;
local day2 = 0; -- second day in a day range
local anchor_year;
local coins_date;
if date_string:match (patterns_t['ymd'][1]) then -- year-initial numerical year month day format
year, month, day = date_string:match (patterns_t['ymd'][1]);
if 12 < tonumber(month) or 1 > tonumber(month) or 1582 > tonumber(year) or 0 == tonumber(day) then return false; end -- month or day number not valid or not Gregorian calendar
anchor_year = year;
elseif mw.ustring.match(date_string, patterns_t['Mdy'][1]) then -- month-initial: month day, year
month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t['Mdy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
elseif mw.ustring.match(date_string, patterns_t['Md-dy'][1]) then -- month-initial day range: month day–day, year; days are separated by endash
month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-dy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2=month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy'][1]) then -- day-initial: day month year
day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['dMy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
--[[ NOT supported at en.wiki
elseif mw.ustring.match(date_string, patterns_t['yMd'][1]) then -- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed
anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t['yMd'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
-- end NOT supported at en.wiki ]]
elseif mw.ustring.match(date_string, patterns_t['d-dMy'][1]) then -- day-range-initial: day–day month year; days are separated by endash
day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['d-dMy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2 = month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dM-dMy'][1]) then -- day initial month-day-range: day month - day month year; uses spaced endash
day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['dM-dMy'][1]);
if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end -- date range order is left to right: earlier to later;
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]) then -- month initial month-day-range: month day – month day, year; uses spaced endash
month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]);
if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]) then -- day initial month-day-year-range: day month year - day month year; uses spaced endash
day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]) then -- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]) then -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
local century;
month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]);
if 'Winter' ~= month and 'Summer' ~= month then return false end; -- 'month' can only be Winter or Summer
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
year2 = century..year2; -- add the century to year2 for comparisons
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
month = get_season_number(month, param);
elseif mw.ustring.match(date_string, patterns_t['Sy-y'][1]) then -- special case Winter/Summer year-year; year separated with unspaced endash
month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy-y'][1]);
month = get_season_number (month, param); -- <month> can only be winter or summer; also for metadata
if (month ~= cfg.date_names['en'].season['Winter']) and (month ~= cfg.date_names['en'].season['Summer']) then
return false; -- not Summer or Winter; abandon
end
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['My-My'][1]) then -- month/season year - month/season year; separated by spaced endash
month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['My-My'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then -- both must be month year, same month style
month = get_month_number(month);
month2 = get_month_number(month2);
elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then -- both must be season year, not mixed
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
else
return false;
end
elseif mw.ustring.match(date_string, patterns_t['M-My'][1]) then -- month/season range year; months separated by endash
month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['M-My'][1]);
if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end
if 0 ~= get_month_number(month) then -- determined to be a valid range so just check this one to know if month or season
month = get_month_number(month);
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end
else
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
end
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['My'][1]) then -- month/season/quarter/proper-name year
month, anchor_year, year = mw.ustring.match(date_string, patterns_t['My'][1]);
if not is_valid_year(year) then return false; end
month = get_element_number(month, param); -- get month season quarter proper-name number or nil
if not month then return false; end -- not valid whatever it is
elseif mw.ustring.match(date_string, patterns_t['y-y'][1]) then -- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y-y'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['y4-y2'][1]) then -- Year range: YYYY–YY; separated by unspaced endash
local century;
year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y4-y2'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if 13 > tonumber(year2) then return false; end -- don't allow 2003-05 which might be May 2003
year2 = century .. year2; -- add the century to year2 for comparisons
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if in_array (param, {'date', 'publication-date', 'year'}) then -- here when 'valid' abbreviated year range; if one of these parameters
add_prop_cat ('year-range-abbreviated'); -- add properties cat
end
elseif mw.ustring.match(date_string, patterns_t['y'][1]) then -- year; here accept either YYY or YYYY
anchor_year, year = mw.ustring.match(date_string, patterns_t['y'][1]);
if false == is_valid_year(year) then
return false;
end
else
return false; -- date format not one of the MOS:DATE approved formats
end
if param ~= 'date' then -- CITEREF disambiguation only allowed in |date=; |year= & |publication-date= promote to date
if anchor_year:match ('%l$') then
return false;
end
end
-- خط بعدی برای پاکسازی احتمالی ویکیلینک از access-date
param_val = strip_wikilink (param_val);
if 'access-date' == param then -- test access-date here because we have numerical date parts
if 0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2 then -- none of these; access-date must not be a range
if not is_valid_accessdate(year .. '-' .. month .. '-' .. day) then
return false; -- return false when access-date out of bounds
end
else
return false; -- return false when access-date is a range of two dates
end
end
if 'archive-date' == param then -- test archive-date here because we have numerical date parts
if not (0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2) then -- none of these; archive-date must not be a range
return false; -- return false when archive-date is a range of two dates
end
end
local result=true; -- check whole dates for validity; assume true because not all dates will go through this test
if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD (simple whole date)
result = is_valid_date (year, month, day, param); -- <param> for |pmc-embargo-date=
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then -- YMD-d (day range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-md (day month range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month2, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-ymd (day month year range)
result = is_valid_date(year, month, day);
result = result and is_valid_date(year2, month2, day2);
end
if false == result then return false; end
if nil ~= tCOinS_date then -- this table only passed into this function when testing |date= parameter values
make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date); -- make an ISO 8601 date string for COinS
end
return true, anchor_year; -- format is good and date string represents a real date
end
--[[--------------------------< D A T E S >--------------------------------------------------------------------
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in
the COinS metadata) are derived. The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords "n.d." or "nd" (without quotes).
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,
parameters with errors are added to the <error_list> sequence table as the dates are tested.
]]
local function dates(date_parameters_list, tCOinS_date, error_list)
local anchor_year; -- will return as nil if the date being tested is not |date=
local COinS_date; -- will return as nil if the date being tested is not |date=
local embargo_date; -- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999
local good_date = false;
for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(v.val) then -- if the parameter has a value
v.val = mw.ustring.gsub(v.val, '%d', cfg.date_names.local_digits); -- translate 'local' digits to Western 0-9
if v.val:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
local year = v.val:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
if 'date' == k then
anchor_year, COinS_date = v.val:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
good_date = is_valid_year(year);
elseif 'year' == k then
good_date = is_valid_year(year);
else
good_date = false;
end
elseif 'date' == k then -- if the parameter is |date=
if v.val:match("^n%.d%.%a?$") then -- ToDo: I18N -- if |date=n.d. with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((n%.d%.)%a?)"); -- ToDo: I18N -- "n.d."; no error when date parameter is set to no date
elseif v.val:match("^nd%a?$") then -- ToDo: I18N -- if |date=nd with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((nd)%a?)"); -- ToDo: I18N -- "nd"; no error when date parameter is set to no date
else
good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date); -- go test the date
end
elseif 'year' == k then -- if the parameter is |year= it should hold only a year value
if v.val:match("^[1-9]%d%d%d?%a?$") then -- if |year = 3 or 4 digits only with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((%d+)%a?)");
else
good_date = false;
end
elseif 'pmc-embargo-date' == k then -- if the parameter is |pmc-embargo-date=
good_date = check_date (v.val, k); -- go test the date
if true == good_date then -- if the date is a valid date
good_date, embargo_date = is_valid_embargo_date (v.val); -- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999
end
else -- any other date-holding parameter
good_date = check_date (v.val, k); -- go test the date
end
if false == good_date then -- assemble one error message so we don't add the tracking category multiple times
table.insert (error_list, wrap_style ('parameter', v.name)); -- make parameter name suitable for error message list
end
end
end
return anchor_year, embargo_date; -- and done
end
--[[--------------------------< Y E A R _ C H E C K >----------------------------------------------------------
Temporary function to test |year= for acceptable values:
YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-
less useless
]]
local function year_check (year)
year = year:gsub ('c%. *', ''); -- remove circa annotation (if present) before testing <year>
for _, index in ipairs ({'y-y', 'y4-y2', 'y'}) do -- spin through these indexes into patterns_t
if mw.ustring.match (year, patterns_t[index][1]) then
return; -- if a match then |year= holds a valid 'year'
end
end
set_message ('maint_year'); -- if here, |year= value is not an accepted value; add a maint cat
end
--[[--------------------------< Y E A R _ D A T E _ C H E C K >------------------------------------------------
Compare the value provided in |year= with the year value(s) provided in |date=. This function sets a local numeric value:
0 - year value does not match the year value in date
1 - (default) year value matches the year value in date or one of the year values when date contains two years
2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)
the numeric value in <result> determines the 'output' if any from this function:
0 – adds error message to error_list sequence table
1 – adds maint cat
2 – does nothing
]]
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)
local year;
local date1;
local date2;
local result = 1; -- result of the test; assume that the test passes
year = year_string:match ('(%d%d%d%d?)');
if date_string:match ('%d%d%d%d%-%d%d%-%d%d') then --special case where both date and year are required YYYY-MM-DD and YYYYx
date1 = date_string:match ('(%d%d%d%d)');
year = year_string:match ('(%d%d%d%d)');
if year ~= date1 then
result = 0; -- years don't match
elseif year_string:match ('%d%d%d%d%a') then
result = 2; -- years match; but because disambiguated, don't add to maint cat
end
elseif date_string:match ("%d%d%d%d?.-%d%d%d%d?") then -- any of the standard range formats of date with two three- or four-digit years
date1, date2 = date_string:match ("(%d%d%d%d?).-(%d%d%d%d?)");
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif mw.ustring.match(date_string, "%d%d%d%d[%-–]%d%d") then -- YYYY-YY date ranges
local century;
date1, century, date2 = mw.ustring.match(date_string, "((%d%d)%d%d)[%-–]+(%d%d)");
date2 = century..date2; -- convert YY to YYYY
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif date_string:match ("%d%d%d%d?") then -- any of the standard formats of date with one year
date1 = date_string:match ("(%d%d%d%d?)");
if year ~= date1 then
result = 0;
end
else -- should never get here; this function called only when no other date errors
result = 0; -- no recognizable year in date
end
if 0 == result then -- year / date mismatch
table.insert (error_list, substitute (cfg.messages['mismatch'], {year_origin, date_origin})); -- add error message to error_list sequence table
elseif 1 == result then -- redundant year / date
set_message ('maint_date_year'); -- add a maint cat
end
end
--[[--------------------------< R E F O R M A T T E R >--------------------------------------------------------
reformat 'date' into new format specified by format_param if pattern_idx (the current format of 'date') can be
reformatted. Does the grunt work for reformat_dates().
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:
format string used by string.format()
identifier letters ('d', 'm', 'y', 'd2', 'm2', 'y2') that serve as indexes into a table t{} that holds captures
from mw.ustring.match() for the various date parts specified by patterns_t[pattern_idx][1]
Items in patterns_t{} have the general form:
['ymd'] = {'^(%d%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'}, where:
['ymd'] is pattern_idx
patterns_t['ymd'][1] is the match pattern with captures for mw.ustring.match()
patterns_t['ymd'][2] is an indicator letter identifying the content of the first capture
patterns_t['ymd'][3] ... the second capture etc.
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier
characters as indexes into t{} For the above, a ymd date is in t{} as:
t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)
To reformat, this function is called with the pattern_idx that matches the current format of the date and with
format_param set to the desired format. This function loads table t{} as described and then calls string.format()
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..
]]
local re_formats = {
['ymd'] = { -- date format is ymd; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Mdy'] = { -- date format is Mdy; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['dMy'] = { -- date format is dMy; reformat to:
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Md-dy'] = { -- date format is Md-dy; reformat to:
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- |df=dmy -> d-dMy
},
['d-dMy'] = { -- date format is d-d>y; reformat to:
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- |df=mdy -> Md-dy
},
['dM-dMy'] = { -- date format is dM-dMy; reformat to:
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- |df=mdy -> Md-Mdy
},
['Md-Mdy'] = { -- date format is Md-Mdy; reformat to:
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- |df=dmy -> dM-dMy
},
['dMy-dMy'] = { -- date format is dMy-dMy; reformat to:
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- |df=mdy -> Mdy-Mdy
},
['Mdy-Mdy'] = { -- date format is Mdy-Mdy; reformat to:
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- for long/short reformatting
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- |df=dmy -> dMy-dMy
},
['My-My'] = { -- these for long/short reformatting
['any'] = {'%s %s – %s %s', 'm', 'y', 'm2', 'y2'}, -- dmy/mdy agnostic
},
['M-My'] = { -- these for long/short reformatting
['any'] = {'%s–%s %s', 'm', 'm2', 'y'}, -- dmy/mdy agnostic
},
['My'] = { -- these for long/short reformatting
['any'] = {'%s %s', 'm', 'y'}, -- dmy/mdy agnostic
},
-- ['yMd'] = { -- not supported at en.wiki
-- ['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
-- ['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- },
}
local function reformatter (date, pattern_idx, format_param, mon_len)
if not in_array (pattern_idx, {'ymd', 'Mdy', 'Md-dy', 'dMy', 'yMd', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- not in this set of date format patterns_t then not a reformattable date
end
if 'ymd' == format_param and in_array (pattern_idx, {'ymd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd
end
if in_array (pattern_idx, {'My', 'M-My', 'My-My'}) then -- these are not dmy/mdy so can't be 'reformatted' into either
format_param = 'any'; -- so format-agnostic
end
-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line
-- if 'yMd' == format_param and in_array (pattern_idx, {'yMd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy'}) then -- these formats not convertable; yMd not supported at en.wiki
if 'yMd' == format_param then -- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line
return; -- not a reformattable date
end
local c1, c2, c3, c4, c5, c6, c7; -- these hold the captures specified in patterns_t[pattern_idx][1]
c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]); -- get the captures
local t = { -- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]
[patterns_t[pattern_idx][2]] = c1; -- at minimum there is always one capture with a matching indicator letter
[patterns_t[pattern_idx][3] or 'x'] = c2; -- patterns_t can have a variable number of captures; each capture requires an indicator letter;
[patterns_t[pattern_idx][4] or 'x'] = c3; -- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;
[patterns_t[pattern_idx][5] or 'x'] = c4; -- the 'x' here spoofs an indicator letter to prevent 'table index is nil' error
[patterns_t[pattern_idx][6] or 'x'] = c5;
[patterns_t[pattern_idx][7] or 'x'] = c6;
[patterns_t[pattern_idx][8] or 'x'] = c7;
};
if t.a then -- if this date has an anchor year capture (all convertable date formats except ymd)
if t.y2 then -- for year range date formats
t.y2 = t.a; -- use the anchor year capture when reassembling the date
else -- here for single date formats (except ymd)
t.y = t.a; -- use the anchor year capture when reassembling the date
end
end
if tonumber(t.m) then -- if raw month is a number (converting from ymd)
if 's' == mon_len then -- if we are to use abbreviated month names
t.m = cfg.date_names['inv_local_short'][tonumber(t.m)]; -- convert it to a month name
else
t.m = cfg.date_names['inv_local_long'][tonumber(t.m)]; -- convert it to a month name
end
t.d = t.d:gsub ('0(%d)', '%1'); -- strip leading '0' from day if present
elseif 'ymd' == format_param then -- when converting to ymd
t.y = t.y:gsub ('%a', ''); -- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?
if 1582 > tonumber (t.y) then -- ymd format dates not allowed before 1582
return;
end
t.m = string.format ('%02d', get_month_number (t.m)); -- make sure that month and day are two digits
t.d = string.format ('%02d', t.d);
elseif mon_len then -- if mon_len is set to either 'short' or 'long'
for _, mon in ipairs ({'m', 'm2'}) do -- because there can be two month names, check both
if t[mon] then
t[mon] = get_month_number (t[mon]); -- get the month number for this month (is length agnostic)
if 0 == t[mon] then return; end -- seasons and named dates can't be converted
t[mon] = (('s' == mon_len) and cfg.date_names['inv_local_short'][t[mon]]) or cfg.date_names['inv_local_long'][t[mon]]; -- fetch month name according to length
end
end
end
local new_date = string.format (re_formats[pattern_idx][format_param][1], -- format string
t[re_formats[pattern_idx][format_param][2]], -- named captures from t{}
t[re_formats[pattern_idx][format_param][3]],
t[re_formats[pattern_idx][format_param][4]],
t[re_formats[pattern_idx][format_param][5]],
t[re_formats[pattern_idx][format_param][6]],
t[re_formats[pattern_idx][format_param][7]],
t[re_formats[pattern_idx][format_param][8]]
);
return new_date;
end
--[[-------------------------< R E F O R M A T _ D A T E S >--------------------------------------------------
Reformats existing dates into the format specified by format.
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all. The -all version includes
access- and archive-dates; otherwise these dates are not reformatted.
This function allows automatic date formatting. In ~/Configuration, the article source is searched for one of
the {{use xxx dates}} templates. If found, xxx becomes the global date format as xxx-all. If |cs1-dates= in
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered. Legitimate
values for |cs1-dates= are:
l - all dates are rendered with long month names
ls - publication dates use long month names; access-/archive-dates use abbreviated month names
ly - publication dates use long month names; access-/archive-dates rendered in ymd format
s - all dates are rendered with abbreviated (short) month names
sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format
y - all dates are rendered in ymd format
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the
list in the new format. Dates in date_parameters_list are presumed here to be valid (no errors). This function
returns true when a date has been reformatted, false else. Actual reformatting is done by reformatter().
]]
local function reformat_dates (date_parameters_list, format)
local all = false; -- set to false to skip access- and archive-dates
local len_p = 'l'; -- default publication date length shall be long
local len_a = 'l'; -- default access-/archive-date length shall be long
local result = false;
local new_date;
if format:match('%a+%-all') then -- manual df keyword; auto df keyword when length not specified in {{use xxx dates}};
format = format:match('(%a+)%-all'); -- extract the format
all = true; -- all dates are long format dates because this keyword doesn't specify length
elseif format:match('%a+%-[lsy][sy]?') then -- auto df keywords; internal only
all = true; -- auto df applies to all dates; use length specified by capture len_p for all dates
format, len_p, len_a = format:match('(%a+)%-([lsy])([sy]?)'); -- extract the format and length keywords
if 'y' == len_p then -- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted
format = 'ymd'; -- override {{use xxx dates}}
elseif (not is_set(len_a)) or (len_p == len_a) then -- no access-/archive-date length specified or same length as publication dates then
len_a = len_p; -- in case len_a not set
end
end -- else only publication dates and they are long
for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) then -- if the parameter has a value
if not (not all and in_array (param_name, {'access-date', 'archive-date'})) then -- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way
for pattern_idx, pattern in pairs (patterns_t) do
if mw.ustring.match (param_val.val, pattern[1]) then
if all and in_array (param_name, {'access-date', 'archive-date'}) then -- if this date is an access- or archive-date
new_date = reformatter (param_val.val, pattern_idx, (('y' == len_a) and 'ymd') or format, len_a); -- choose ymd or dmy/mdy according to len_a setting
else -- all other dates
new_date = reformatter (param_val.val, pattern_idx, format, len_p);
end
if new_date then -- set when date was reformatted
date_parameters_list[param_name].val = new_date; -- update date in date list
result = true; -- and announce that changes have been made
break;
end
end -- if
end -- for
end -- if
end -- if
end -- for
return result; -- declare boolean result and done
end
--[[--------------------------< D A T E _ H Y P H E N _ T O _ D A S H >----------------------------------------
Loops through the list of date-holding parameters and converts any hyphen to an ndash. Not called if the cs1|2
template has any date errors.
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.
]]
local function date_hyphen_to_dash (date_parameters_list)
local result = false;
local n;
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) and
not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then -- for those that are not ymd dates (ustring because here digits may not be Western)
param_val.val, n = param_val.val:gsub ('%-', '–'); -- replace any hyphen with ndash
if 0 ~= n then
date_parameters_list[param_name].val = param_val.val; -- update the list
result = true;
end
end
end
return result; -- so we know if any hyphens were replaced
end
--[[-------------------------< D A T E _ N A M E _ X L A T E >------------------------------------------------
Attempts to translate English date names to local-language date names using names supplied by MediaWiki's
date parser function. This is simple name-for-name replacement and may not work for all languages.
if xlat_dig is true, this function will also translate Western (English) digits to the local language's digits.
This will also translate ymd dates.
]]
local function date_name_xlate (date_parameters_list, xlt_dig)
local xlate;
local mode; -- long or short month names
local modified = false;
local date;
local sources_t = {
{cfg.date_names.en.long, cfg.date_names.inv_local_long}, -- for translating long English month names to long local month names
{cfg.date_names.en.short, cfg.date_names.inv_local_short}, -- short month names
{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter}, -- quarter date names
{cfg.date_names.en.season, cfg.date_names.inv_local_season}, -- season date nam
{cfg.date_names.en.named, cfg.date_names.inv_local_named}, -- named dates
}
local function is_xlateable (month) -- local function to get local date name that replaces existing English-language date name
for _, date_names_t in ipairs (sources_t) do -- for each sequence table in date_names_t
if date_names_t[1][month] then -- if date name is English month (long or short), quarter, season or named and
if date_names_t[2][date_names_t[1][month]] then -- if there is a matching local date name
return date_names_t[2][date_names_t[1][month]]; -- return the local date name
end
end
end
end
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(param_val.val) then -- if the parameter has a value
date = param_val.val;
for month in mw.ustring.gmatch (date, '[%a ]+') do -- iterate through all date names in the date (single date or date range)
month = mw.text.trim (month); -- this because quarterly dates contain whitespace
xlate = is_xlateable (month); -- get translate <month>; returns translation or nil
if xlate then
date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
if xlt_dig then -- shall we also translate digits?
date = date:gsub ('%d', cfg.date_names.xlate_digits); -- translate digits from Western to 'local digits'
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
end
return modified;
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
add_prop_cat = utilities_page_ptr.add_prop_cat ; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
set_message = utilities_page_ptr.set_message;
substitute = utilities_page_ptr.substitute;
wrap_style = utilities_page_ptr.wrap_style;
cfg = cfg_table_ptr; -- import tables from selected Module:Citation/CS1/Configuration
end
--[[--------------------------< A R C H I V E _ D A T E _ C H E C K >------------------------------------------
Compare value in |archive-date= with the timestamp in Wayback machine urls. Emits an error message with suggested
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match
the timestamp.
this function never called when any date in a cs1|2 template has errors
error message suggests new |archive-date= value in an appropriate format specified by <df>. <df> is either
|df= or cfg.global_df in that order. If <df> is nil, suggested date has format from |archive-date=. There is
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format
is not changed.
]]
local function archive_date_check (archive_date, archive_url_timestamp, df)
local archive_date_format = 'dmy-y'; -- holds the date format of date in |archive-date; default to ymd; 'dmy' used here to spoof reformat_dates()
for _, v_t in ipairs ({{'dMy', 'dmy-all'}, {'Mdy', 'mdy-all'}}) do -- is |archive-date= format dmy or mdy?
if archive_date:match (patterns_t[v_t[1]][1]) then -- does the pattern match?
archive_date_format = cfg.keywords_xlate[v_t[2]]; -- get appropriate |df= supported keyword from the i18n translator table
break;
end
end
local dates_t = {};
dates_t['archive-date'] = {val=archive_date, name=''}; -- setup to call reformat_dates(); never called when errors so <name> unset as not needed
reformat_dates (dates_t, 'dmy-y'); -- reformat |archive-date= to ymd; 'dmy' used here to spoof reformat_dates()
local archive_url_date = archive_url_timestamp:gsub ('(%d%d%d%d)(%d%d)(%d%d)%d*', '%1-%2-%3'); -- make ymd format date from timestamp
if dates_t['archive-date'].val == archive_url_date then -- are the two dates the same
return; -- yes, done
else
dates_t['archive-date'] = {val=archive_url_date, name=''}; -- setup to call reformat_dates() with the timestamp date
reformat_dates (dates_t, df or archive_date_format); -- reformat timestamp to format specified by <df> or format used in |archive-date=
archive_url_date = dates_t['archive-date'].val;
set_message ('err_archive_date_url_ts_mismatch', archive_url_date); -- emit an error message
end
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return { -- return exported functions
archive_date_check = archive_date_check,
date_hyphen_to_dash = date_hyphen_to_dash,
date_name_xlate = date_name_xlate,
dates = dates,
is_valid_date = is_valid_date,
reformat_dates = reformat_dates,
set_selected_modules = set_selected_modules,
year_check = year_check,
year_date_check = year_date_check,
}
rkqmu8rdcui4e5nunhxgqhzcfjkanmo
392035
392033
2026-08-07T06:35:22Z
محک
1023
z.ai
392035
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style; -- imported functions from selected Module:Citation/CS1/Utilities
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration
--[[--------------------------< F I L E - S C O P E D E C L A R A T I O N S >--------------------------------
File-scope variables are declared here
]]
local lang_object = mw.getContentLanguage(); -- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?
local year_limit; -- used by is_valid_year()
--[[----------------< S T R I P _ W I K I L I N K >------------------------------
حذف براکتهای ویکیلینک از یک رشته.
]]
local function strip_wikilink (str)
if not str then
return nil;
end
-- حالت پیپدار: [[X|Y]] -> Y
str = mw.ustring.gsub (str, '%[%[[^%]|]*|([^%]]*)%]%]', '%1');
-- حالت ساده: [[X]] -> X
str = mw.ustring.gsub (str, '%[%[([^%]|]*)%]%]', '%1');
-- هرگونه فضای اضافی دوگانه را پاک کن
str = mw.ustring.gsub (str, '%s+', ' ');
str = mw.ustring.gsub (str, '^%s', '');
str = mw.ustring.gsub (str, '%s$', '');
return str;
end
--[=[-------------------------< I S _ V A L I D _ A C C E S S D A T E >----------------------------------------
returns true if:
Wikipedia start date <= accessdate < today + 2 days
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)
accessdate is the date provided in |access-date= at time 00:00:00 UTC
today is the current date at time 00:00:00 UTC plus 48 hours
if today is 2015-01-01T00:00:00 then
adding 24 hours gives 2015-01-02T00:00:00 – one second more than today
adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow
This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser
apparently doesn't understand non-English date month names. This function will always return false when the date
contains a non-English month name because good1 is false after the call to lang.formatDate(). To get around that
call this function with YYYY-MM-DD format dates.
]=]
local function is_valid_accessdate (accessdate)
local good1, good2;
local access_ts, tomorrow_ts; -- to hold Unix time stamps representing the dates
good1, access_ts = pcall (lang_object.formatDate, lang_object, 'U', accessdate ); -- convert accessdate value to Unix timestamp
good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, 'U', 'today + 2 days' ); -- today midnight + 2 days is one second more than all day tomorrow
if good1 and good2 then -- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand
access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts); -- convert to numbers for the comparison;
tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);
else
return false; -- one or both failed to convert to Unix time stamp
end
if 979516800 <= access_ts and access_ts < tomorrow_ts then -- Wikipedia start date <= accessdate < tomorrow's date
return true;
else
return false; -- accessdate out of range
end
end
--[[--------------------------< G E T _ M O N T H _ N U M B E R >----------------------------------------------
returns a number according to the month in a date: 1 for January, etc. Capitalization and spelling must be correct.
If not a valid month, returns 0
]]
local function get_month_number (month)
return cfg.date_names['local'].long[month] or cfg.date_names['local'].short[month] or -- look for local names first
cfg.date_names['en'].long[month] or cfg.date_names['en'].short[month] or -- failing that, look for English names
0; -- not a recognized month name
end
--[[--------------------------< G E T _ S E A S O N _ N U M B E R >--------------------------------------------
returns a number according to the sequence of seasons in a year: 21 for Spring, etc. Capitalization and spelling
must be correct. If not a valid season, returns 0.
21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”
returns 0 when <param> is not |date=
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons. EDTF does support the distinction between north and south
hemisphere seasons but cs1|2 has no way to make that distinction.
These additional divisions not currently supported:
25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere
29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_season_number (season, param)
if 'date' ~= param then
return 0; -- season dates only supported by |date=
end
return cfg.date_names['local'].season[season] or -- look for local names first
cfg.date_names['en'].season[season] or -- failing that, look for English names
0; -- not a recognized season name
end
--[[--------------------------< G E T _ Q U A R T E R _ N U M B E R >------------------------------------------
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc. Capitalization and spelling
must be correct. If not a valid quarter, returns 0.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
returns 0 when <param> is not |date=
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons and quarters.
These additional divisions not currently supported:
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_quarter_number (quarter, param)
if 'date' ~= param then
return 0; -- quarter dates only supported by |date=
end
quarter = mw.ustring.gsub (quarter, ' +', ' '); -- special case replace multiple space chars with a single space char
return cfg.date_names['local'].quarter[quarter] or -- look for local names first
cfg.date_names['en'].quarter[quarter] or -- failing that, look for English names
0; -- not a recognized quarter name
end
--[[--------------------------< G E T _ P R O P E R _ N A M E _ N U M B E R >----------------------------------
returns a non-zero number if date contains a recognized proper-name. Capitalization and spelling must be correct.
returns 0 when <param> is not |date=
]]
local function get_proper_name_number (name, param)
if 'date' ~= param then
return 0; -- proper-name dates only supported by |date=
end
return cfg.date_names['local'].named[name] or -- look for local names dates first
cfg.date_names['en'].named[name] or -- failing that, look for English names
0; -- not a recognized named date
end
--[[--------------------------< G E T _ E L E M E N T _ N U M B E R <------------------------------------------
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)
]]
local function get_element_number (element, param)
local num;
local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number}; -- list of functions to execute in order
for _, func in ipairs (funcs) do -- spin through the function list
num = func (element, param); -- call the function and get the returned number
if 0 ~= num then -- non-zero when valid month season quarter
return num; -- return that number
end
end
return nil; -- not valid
end
--[[--------------------------< I S _ V A L I D _ Y E A R >----------------------------------------------------
Function gets current year from the server and compares it to year from a citation parameter. Years more than one
year in the future are not acceptable.
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable
]]
local function is_valid_year (year, param)
if not is_set (year_limit) then
year_limit = tonumber(os.date("%Y"))+1; -- global variable so we only have to fetch it once
end
year = tonumber (year) or lang_object:parseFormattedNumber (year); -- convert to number for the comparison
if year and (100 > year) then -- years less than 100 not supported
return false;
end
if 'pmc-embargo-date' == param then -- special case for |pmc-embargo-date=
return year and (year <= tonumber(os.date("%Y"))+2) or false; -- years more than two years in the future are not accepted
end
return year and (year <= year_limit) or false;
end
--[[--------------------------< I S _ V A L I D _ D A T E >----------------------------------------------------
Returns true if day is less than or equal to the number of days in month and year is no farther into the future
than next year; else returns false.
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately
1923) dates are assumed to be Gregorian.
]]
local function is_valid_date (year, month, day, param)
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
local month_length;
if not is_valid_year (year, param) then -- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future
return false;
end
month = tonumber (month); -- required for YYYY-MM-DD dates
if (2 == month) then -- if February
month_length = 28; -- then 28 days unless
if 1582 > tonumber(year) then -- Julian calendar
if 0 == (year%4) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
else -- Gregorian calendar
if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
end
else
month_length = days_in_month[month] or 0; -- invalid month number is nil so default <month_length> to 0
end
if tonumber (day) > month_length then
return false;
end
return true;
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E >--------------------------
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August.
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are
listed in the short subtable. When both have the same style (both are listed in the same table), returns true; false else
]]
local function is_valid_month_range_style (month1, month2)
if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or -- are both English names listed in the long subtable?
(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or -- are both English names listed in the short subtable?
(cfg.date_names['local'].long[month1] and cfg.date_names['local'].long[month2]) or -- are both local names listed in the long subtable?
(cfg.date_names['local'].short[month1] and cfg.date_names['local'].short[month2]) then -- are both local names listed in the short subtable?
return true;
end
return false; -- names are mixed
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E >------------------------
Check a pair of months or seasons to see if both are valid members of a month or season pair.
Month pairs are expected to be left to right, earliest to latest in time.
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok
]]
local function is_valid_month_season_range(range_start, range_end, param)
local range_start_number = get_month_number (range_start);
local range_end_number;
if 0 == range_start_number then -- is this a month range?
range_start_number = get_season_number (range_start, param); -- not a month; is it a season? get start season number
range_end_number = get_season_number (range_end, param); -- get end season number
if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then
return true; -- any season pairing is accepted except when both are the same
end
return false; -- range_start and/or range_end is not a season
end
-- here when range_start is a month
range_end_number = get_month_number (range_end); -- get end month number
if range_start_number < range_end_number and -- range_start is a month; does range_start precede range_end?
is_valid_month_range_style (range_start, range_end) then -- do months have the same style?
return true; -- proper order and same style
end
return false; -- range_start month number is greater than or equal to range end number; or range end isn't a month
end
--[[--------------------------< M A K E _ C O I N S _ D A T E >------------------------------------------------
This function receives a table of date parts for one or two dates and an empty table reference declared in
Module:Citation/CS1. The function is called only for |date= parameters and only if the |date=<value> is
determined to be a valid date format. The question of what to do with invalid date formats is not answered here.
The date parts in the input table are converted to an ISO 8601 conforming date string:
single whole dates: yyyy-mm-dd
month and year dates: yyyy-mm
year dates: yyyy
ranges: yyyy-mm-dd/yyyy-mm-dd
yyyy-mm/yyyy-mm
yyyy/yyyy
Dates in the Julian calendar are reduced to year or year/year so that we don't have to do calendar conversion from
Julian to Proleptic Gregorian.
The input table has:
year, year2 – always present; if before 1582, ignore months and days if present
month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas
day, day2 – 0 if not provided, 1-31 for days
the output table receives:
rftdate: an ISO 8601 formatted date
rftchron: a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)
rftssn: one of four season keywords: winter, spring, summer, fall (lowercase)
rftquarter: one of four values: 1, 2, 3, 4
]]
local function make_COinS_date (input, tCOinS_date)
local date; -- one date or first date in a range
local date2 = ''; -- end of range date
input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year); -- language-aware tonumber()
input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2); -- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals
if ((1582 == input.year) and (10 > tonumber(input.month))) or (1582 > input.year) then -- if a Julian calendar date
tCOinS_date.rftdate = tostring (input.year); -- &rft.date gets year only
return; -- done
end
-- here for all forms of Gregorian dates
if 20 < tonumber (input.month) then -- if season, quarter, or proper-name date
date = input.year; -- &rft.date gets year only
if 0 ~= input.year2 and input.year ~= input.year2 then -- if a range, only the second year portion when not the same as range start year
date = string.format ('%.4d/%.4d', input.year, input.year2) -- assemble the date range
end
local season = {[24] = 'winter', [21] = 'spring', [22] = 'summer', [23] = 'fall', [33] = '1', [34] = '2', [35] = '3', [36] = '4', [98] = 'Easter', [99] = 'Christmas'}; -- seasons lowercase, no autumn; proper-names use title case
if 0 == input.month2 then -- single season, quarter, or proper-name date
if 40 < tonumber(input.month) then
tCOinS_date.rftchron = season[input.month]; -- proper-name date; used in journal metadata only
elseif 30 < tonumber(input.month) then
tCOinS_date.rftquarter = season[input.month]; -- quarter date; used in journal metadata only
else
tCOinS_date.rftssn = season[input.month]; -- season date; used in journal metadata only
end
else -- season ranges are lumped into &rft.chron; &rft.ssn and &rft.quarter are left blank
if input.year ~= input.year2 then -- season year – season year range or season year–year
if 0 ~= input.month2 then
tCOinS_date.rftchron = string.format ('%s %s – %s %s', season[input.month], input.year, season[input.month2], input.year2); -- used in journal metadata only
end
else -- season–season year range
tCOinS_date.rftchron = season[input.month] .. '–' .. season[input.month2]; -- season–season year range; used in journal metadata only
end
end
tCOinS_date.rftdate = tostring (date);
return; -- done
end
-- here for gregorian calendar dates
if 0 ~= input.day then
date = string.format ('%s-%.2d-%.2d', input.year, tonumber(input.month), tonumber(input.day)); -- whole date
elseif 0 ~= input.month then
date = string.format ('%s-%.2d', input.year, tonumber(input.month)); -- year and month
else
date = string.format ('%s', input.year); -- just year
end
if 0 ~= input.year2 then
if 0 ~= input.day2 then
date2 = string.format ('/%s-%.2d-%.2d', input.year2, tonumber(input.month2), tonumber(input.day2)); -- whole date
elseif 0 ~= input.month2 then
date2 = string.format ('/%s-%.2d', input.year2, tonumber(input.month2)); -- year and month
else
date2 = string.format ('/%s', input.year2); -- just year
end
end
tCOinS_date.rftdate = date .. date2; -- date2 has the '/' separator
return;
end
--[[--------------------------< P A T T E R N S _ T >----------------------------------------------------------
this is the list of patterns for date formats that this module recognizes. Approximately the first half of these
patterns represent formats that might be reformatted into another format. Those that might be reformatted have
'indicator' letters that identify the content of the matching capture: 'd' (day), 'm' (month), 'a' (anchor year),
'y' (year); second day, month, year have a '2' suffix.
These patterns are used for both date validation and for reformatting. This table should not be moved to ~/Configuration
because changes to this table require changes to check_date() and to reformatter() and reformat_date()
]]
local patterns_t = {
-- year-initial numerical year-month-day
['ymd'] = {'^([1-9]%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'},
-- month-initial: month day, year
['Mdy'] = {'^(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'a', 'y'},
-- month-initial day range: month day–day, year; days are separated by endash
['Md-dy'] = {'^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'd2', 'a', 'y'},
-- day-initial: day month year
['dMy'] = {'^([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'a', 'y'},
-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki
-- ['yMd'] = {'^(([1-9]%d%d%d?)%a?) +(%D-) +(%d%d?)$', 'a', 'y', 'm', 'd'},
-- day-range-initial: day–day month year; days are separated by endash
['d-dMy'] = {'^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'd2', 'm', 'a', 'y'},
-- day initial month-day-range: day month - day month year; uses spaced endash
['dM-dMy'] = {'^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'd2', 'm2', 'a', 'y'},
-- month initial month-day-range: month day – month day, year; uses spaced endash
['Md-Mdy'] = {'^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$','m', 'd', 'm2', 'd2', 'a', 'y'},
-- day initial month-day-year-range: day month year - day month year; uses spaced endash
['dMy-dMy'] = {'^([1-9]%d?) +(%D-) +([1-9]%d%d%d?) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'y', 'd2', 'm2', 'a', 'y2'},
-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
['Mdy-Mdy'] = {'^(%D-) +([1-9]%d?), +([1-9]%d%d%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'y', 'm2', 'd2', 'a', 'y2'},
-- these date formats cannot be converted, per se, but month name can be rendered short or long
-- month/season year - month/season year; separated by spaced endash
['My-My'] = {'^(%D-) +([1-9]%d%d%d?) +[%-–] +(%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'y', 'm2', 'a', 'y2'},
-- month/season range year; months separated by endash
['M-My'] = {'^(%D-)[%-–](%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'm2', 'a', 'y'},
-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.
['My'] = {'^([^%d–]-) +(([1-9]%d%d%d?)%a?)$', 'm', 'a', 'y'}, -- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn't
-- these date formats cannot be converted
['Sy4-y2'] = {'^(%D-) +(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
['Sy-y'] = {'^(%D-) +([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- special case Winter/Summer year-year; year separated with unspaced endash
['y-y'] = {'^([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
['y4-y2'] = {'^(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- year range: YYYY–YY; separated by unspaced endash
['y'] = {'^(([1-9]%d%d%d?)%a?)$'}, -- year; here accept either YYY or YYYY
}
--[[--------------------------< I S _ V A L I D _ E M B A R G O _ D A T E >------------------------------------
returns true and date value if that value has proper dmy, mdy, ymd format.
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.
]]
local function is_valid_embargo_date (v)
if v:match (patterns_t['ymd'][1]) or -- ymd
v:match (patterns_t['Mdy'][1]) or -- dmy
v:match (patterns_t['dMy'][1]) then -- mdy
return true, v;
end
return false, '9999'; -- if here not good date so return false and set embargo date to long time in future
end
--[[--------------------------< C H E C K _ D A T E >----------------------------------------------------------
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only
allowed range separator is endash. Additionally, check the date to see that it is a real date: no 31 in 30-day
months; no 29 February when not a leap year. Months, both long-form and three character abbreviations, and seasons
must be spelled correctly. Future years beyond next year are not allowed.
If the date fails the format tests, this function returns false and does not return values for anchor_year and
COinS_date. When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets
its year from the year parameter if present otherwise CITEREF does not get a date value.
Inputs:
date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)
Returns:
false if date string is not a real date; else
true, anchor_year, COinS_date
anchor_year can be used in CITEREF anchors
COinS_date is ISO 8601 format date; see make_COInS_date()
]]
local function check_date (date_string, param, tCOinS_date)
local year; -- assume that year2, months, and days are not used;
local year2 = 0; -- second year in a year range
local month = 0;
local month2 = 0; -- second month in a month range
local day = 0;
local day2 = 0; -- second day in a day range
local anchor_year;
local coins_date;
if date_string:match (patterns_t['ymd'][1]) then -- year-initial numerical year month day format
year, month, day = date_string:match (patterns_t['ymd'][1]);
if 12 < tonumber(month) or 1 > tonumber(month) or 1582 > tonumber(year) or 0 == tonumber(day) then return false; end -- month or day number not valid or not Gregorian calendar
anchor_year = year;
elseif mw.ustring.match(date_string, patterns_t['Mdy'][1]) then -- month-initial: month day, year
month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t['Mdy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
elseif mw.ustring.match(date_string, patterns_t['Md-dy'][1]) then -- month-initial day range: month day–day, year; days are separated by endash
month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-dy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2=month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy'][1]) then -- day-initial: day month year
day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['dMy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
--[[ NOT supported at en.wiki
elseif mw.ustring.match(date_string, patterns_t['yMd'][1]) then -- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed
anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t['yMd'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
-- end NOT supported at en.wiki ]]
elseif mw.ustring.match(date_string, patterns_t['d-dMy'][1]) then -- day-range-initial: day–day month year; days are separated by endash
day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['d-dMy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2 = month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dM-dMy'][1]) then -- day initial month-day-range: day month - day month year; uses spaced endash
day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['dM-dMy'][1]);
if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end -- date range order is left to right: earlier to later;
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]) then -- month initial month-day-range: month day – month day, year; uses spaced endash
month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]);
if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]) then -- day initial month-day-year-range: day month year - day month year; uses spaced endash
day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]) then -- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]) then -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
local century;
month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]);
if 'Winter' ~= month and 'Summer' ~= month then return false end; -- 'month' can only be Winter or Summer
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
year2 = century..year2; -- add the century to year2 for comparisons
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
month = get_season_number(month, param);
elseif mw.ustring.match(date_string, patterns_t['Sy-y'][1]) then -- special case Winter/Summer year-year; year separated with unspaced endash
month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy-y'][1]);
month = get_season_number (month, param); -- <month> can only be winter or summer; also for metadata
if (month ~= cfg.date_names['en'].season['Winter']) and (month ~= cfg.date_names['en'].season['Summer']) then
return false; -- not Summer or Winter; abandon
end
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['My-My'][1]) then -- month/season year - month/season year; separated by spaced endash
month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['My-My'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then -- both must be month year, same month style
month = get_month_number(month);
month2 = get_month_number(month2);
elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then -- both must be season year, not mixed
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
else
return false;
end
elseif mw.ustring.match(date_string, patterns_t['M-My'][1]) then -- month/season range year; months separated by endash
month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['M-My'][1]);
if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end
if 0 ~= get_month_number(month) then -- determined to be a valid range so just check this one to know if month or season
month = get_month_number(month);
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end
else
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
end
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['My'][1]) then -- month/season/quarter/proper-name year
month, anchor_year, year = mw.ustring.match(date_string, patterns_t['My'][1]);
if not is_valid_year(year) then return false; end
month = get_element_number(month, param); -- get month season quarter proper-name number or nil
if not month then return false; end -- not valid whatever it is
elseif mw.ustring.match(date_string, patterns_t['y-y'][1]) then -- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y-y'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['y4-y2'][1]) then -- Year range: YYYY–YY; separated by unspaced endash
local century;
year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y4-y2'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if 13 > tonumber(year2) then return false; end -- don't allow 2003-05 which might be May 2003
year2 = century .. year2; -- add the century to year2 for comparisons
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if in_array (param, {'date', 'publication-date', 'year'}) then -- here when 'valid' abbreviated year range; if one of these parameters
add_prop_cat ('year-range-abbreviated'); -- add properties cat
end
elseif mw.ustring.match(date_string, patterns_t['y'][1]) then -- year; here accept either YYY or YYYY
anchor_year, year = mw.ustring.match(date_string, patterns_t['y'][1]);
if false == is_valid_year(year) then
return false;
end
else
return false; -- date format not one of the MOS:DATE approved formats
end
if param ~= 'date' then -- CITEREF disambiguation only allowed in |date=; |year= & |publication-date= promote to date
if anchor_year:match ('%l$') then
return false;
end
end
if 'access-date' == param then -- test access-date here because we have numerical date parts
if 0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2 then -- none of these; access-date must not be a range
if not is_valid_accessdate(year .. '-' .. month .. '-' .. day) then
return false; -- return false when access-date out of bounds
end
else
return false; -- return false when access-date is a range of two dates
end
end
if 'archive-date' == param then -- test archive-date here because we have numerical date parts
if not (0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2) then -- none of these; archive-date must not be a range
return false; -- return false when archive-date is a range of two dates
end
end
local result=true; -- check whole dates for validity; assume true because not all dates will go through this test
if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD (simple whole date)
result = is_valid_date (year, month, day, param); -- <param> for |pmc-embargo-date=
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then -- YMD-d (day range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD-md (day month range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month2, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD-ymd (day month year range)
result = is_valid_date(year, month, day);
result = result and is_valid_date(year2, month2, day2);
end
if false == result then return false; end
if nil ~= tCOinS_date then -- this table only passed into this function when testing |date= parameter values
make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date); -- make an ISO 8601 date string for COinS
end
return true, anchor_year; -- format is good and date string represents a real date
end
--[[--------------------------< D A T E S >--------------------------------------------------------------------
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in
the COinS metadata) are derived. The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords "n.d." or "nd" (without quotes).
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,
parameters with errors are added to the <error_list> sequence table as the dates are tested.
]]
local function dates(date_parameters_list, tCOinS_date, error_list)
local anchor_year; -- will return as nil if the date being tested is not |date=
local COinS_date; -- will return as nil if the date being tested is not |date=
local embargo_date; -- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999
local good_date = false;
for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(v.val) then -- if the parameter has a value
v.val = mw.ustring.gsub(v.val, '%d', cfg.date_names.local_digits); -- translate 'local' digits to Western 0-9
v.val = strip_wikilink (v.val); -- remove wikilinks from date strings
if v.val:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
local year = v.val:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
if 'date' == k then
anchor_year, COinS_date = v.val:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
good_date = is_valid_year(year);
elseif 'year' == k then
good_date = is_valid_year(year);
else
good_date = false;
end
elseif 'date' == k then -- if the parameter is |date=
if v.val:match("^n%.d%.%a?$") then -- ToDo: I18N -- if |date=n.d. with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((n%.d%.)%a?)"); -- ToDo: I18N -- "n.d."; no error when date parameter is set to no date
elseif v.val:match("^nd%a?$") then -- ToDo: I18N -- if |date=nd with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((nd)%a?)"); -- ToDo: I18N -- "nd"; no error when date parameter is set to no date
else
good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date); -- go test the date
end
elseif 'year' == k then -- if the parameter is |year= it should hold only a year value
if v.val:match("^[1-9]%d%d%d?%a?$") then -- if |year = 3 or 4 digits only with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((%d+)%a?)");
else
good_date = false;
end
elseif 'pmc-embargo-date' == k then -- if the parameter is |pmc-embargo-date=
good_date = check_date (v.val, k); -- go test the date
if true == good_date then -- if the date is a valid date
good_date, embargo_date = is_valid_embargo_date (v.val); -- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999
end
else -- any other date-holding parameter
good_date = check_date (v.val, k); -- go test the date
end
if false == good_date then -- assemble one error message so we don't add the tracking category multiple times
table.insert (error_list, wrap_style ('parameter', v.name)); -- make parameter name suitable for error message list
end
end
end
return anchor_year, embargo_date; -- and done
end
--[[--------------------------< Y E A R _ C H E C K >----------------------------------------------------------
Temporary function to test |year= for acceptable values:
YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-
less useless
]]
local function year_check (year)
year = year:gsub ('c%. *', ''); -- remove circa annotation (if present) before testing <year>
for _, index in ipairs ({'y-y', 'y4-y2', 'y'}) do -- spin through these indexes into patterns_t
if mw.ustring.match (year, patterns_t[index][1]) then
return; -- if a match then |year= holds a valid 'year'
end
end
set_message ('maint_year'); -- if here, |year= value is not an accepted value; add a maint cat
end
--[[--------------------------< Y E A R _ D A T E _ C H E C K >------------------------------------------------
Compare the value provided in |year= with the year value(s) provided in |date=. This function sets a local numeric value:
0 - year value does not match the year value in date
1 - (default) year value matches the year value in date or one of the year values when date contains two years
2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)
the numeric value in <result> determines the 'output' if any from this function:
0 – adds error message to error_list sequence table
1 – adds maint cat
2 – does nothing
]]
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)
local year;
local date1;
local date2;
local result = 1; -- result of the test; assume that the test passes
year = year_string:match ('(%d%d%d%d?)');
if date_string:match ('%d%d%d%d%-%d%d%-%d%d') then --special case where both date and year are required YYYY-MM-DD and YYYYx
date1 = date_string:match ('(%d%d%d%d)');
year = year_string:match ('(%d%d%d%d)');
if year ~= date1 then
result = 0; -- years don't match
elseif year_string:match ('%d%d%d%d%a') then
result = 2; -- years match; but because disambiguated, don't add to maint cat
end
elseif date_string:match ("%d%d%d%d?.-%d%d%d%d?") then -- any of the standard range formats of date with two three- or four-digit years
date1, date2 = date_string:match ("(%d%d%d%d?).-(%d%d%d%d?)");
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif mw.ustring.match(date_string, "%d%d%d%d[%-–]%d%d") then -- YYYY-YY date ranges
local century;
date1, century, date2 = mw.ustring.match(date_string, "((%d%d)%d%d)[%-–]+(%d%d)");
date2 = century..date2; -- convert YY to YYYY
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif date_string:match ("%d%d%d%d?") then -- any of the standard formats of date with one year
date1 = date_string:match ("(%d%d%d%d?)");
if year ~= date1 then
result = 0;
end
else -- should never get here; this function called only when no other date errors
result = 0; -- no recognizable year in date
end
if 0 == result then -- year / date mismatch
table.insert (error_list, substitute (cfg.messages['mismatch'], {year_origin, date_origin})); -- add error message to error_list sequence table
elseif 1 == result then -- redundant year / date
set_message ('maint_date_year'); -- add a maint cat
end
end
--[[--------------------------< R E F O R M A T T E R >--------------------------------------------------------
reformat 'date' into new format specified by format_param if pattern_idx (the current format of 'date') can be
reformatted. Does the grunt work for reformat_dates().
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:
format string used by string.format()
indicator letters ('d', 'm', 'y', 'd2', 'm2', 'y2') that serve as indexes into a table t{} that holds captures
from mw.ustring.match() for the various date parts specified by patterns_t[pattern_idx][1]
Items in patterns_t{} have the general form:
['ymd'] = {'^(%d%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'}, where:
['ymd'] is pattern_idx
patterns_t['ymd'][1] is the match pattern with captures for mw.ustring.match()
patterns_t['ymd'][2] is an indicator letter identifying the content of the first capture
patterns_t['ymd'][3] ... the second capture etc.
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier
characters as indexes into t{} For the above, a ymd date is in t{} as:
t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)
To reformat, this function is called with the pattern_idx that matches the current format of the date and with
format_param set to the desired format. This function loads table t{} as described and then calls string.format()
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..
]]
local re_formats = {
['ymd'] = { -- date format is ymd; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Mdy'] = { -- date format is Mdy; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['dMy'] = { -- date format is dMy; reformat to:
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Md-dy'] = { -- date format is Md-dy; reformat to:
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- |df=dmy -> d-dMy
},
['d-dMy'] = { -- date format is d-d>y; reformat to:
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- |df=mdy -> Md-dy
},
['dM-dMy'] = { -- date format is dM-dMy; reformat to:
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- |df=mdy -> Md-Mdy
},
['Md-Mdy'] = { -- date format is Md-Mdy; reformat to:
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- |df=dmy -> dM-dMy
},
['dMy-dMy'] = { -- date format is dMy-dMy; reformat to:
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- |df=mdy -> Mdy-Mdy
},
['Mdy-Mdy'] = { -- date format is Mdy-Mdy; reformat to:
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- for long/short reformatting
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- |df=dmy -> dMy-dMy
},
['My-My'] = { -- these for long/short reformatting
['any'] = {'%s %s – %s %s', 'm', 'y', 'm2', 'y2'}, -- dmy/mdy agnostic
},
['M-My'] = { -- these for long/short reformatting
['any'] = {'%s–%s %s', 'm', 'm2', 'y'}, -- dmy/mdy agnostic
},
['My'] = { -- these for long/short reformatting
['any'] = {'%s %s', 'm', 'y'}, -- dmy/mdy agnostic
},
-- ['yMd'] = { -- not supported at en.wiki
-- ['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
-- ['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- },
}
local function reformatter (date, pattern_idx, format_param, mon_len)
if not in_array (pattern_idx, {'ymd', 'Mdy', 'Md-dy', 'dMy', 'yMd', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- not in this set of date format patterns_t then not a reformattable date
end
if 'ymd' == format_param and in_array (pattern_idx, {'ymd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd
end
if in_array (pattern_idx, {'My', 'M-My', 'My-My'}) then -- these are not dmy/mdy so can't be 'reformatted' into either
format_param = 'any'; -- so format-agnostic
end
-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line
-- if 'yMd' == format_param and in_array (pattern_idx, {'yMd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy'}) then -- these formats not convertable; yMd not supported at en.wiki
if 'yMd' == format_param then -- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line
return; -- not a reformattable date
end
local c1, c2, c3, c4, c5, c6, c7; -- these hold the captures specified in patterns_t[pattern_idx][1]
c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]); -- get the captures
local t = { -- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]
[patterns_t[pattern_idx][2]] = c1; -- at minimum there is always one capture with a matching indicator letter
[patterns_t[pattern_idx][3] or 'x'] = c2; -- patterns_t can have a variable number of captures; each capture requires an indicator letter;
[patterns_t[pattern_idx][4] or 'x'] = c3; -- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;
[patterns_t[pattern_idx][5] or 'x'] = c4; -- the 'x' here spoofs an indicator letter to prevent 'table index is nil' error
[patterns_t[pattern_idx][6] or 'x'] = c5;
[patterns_t[pattern_idx][7] or 'x'] = c6;
[patterns_t[pattern_idx][8] or 'x'] = c7;
};
if t.a then -- if this date has an anchor year capture (all convertable date formats except ymd)
if t.y2 then -- for year range date formats
t.y2 = t.a; -- use the anchor year capture when reassembling the date
else -- here for single date formats (except ymd)
t.y = t.a; -- use the anchor year capture when reassembling the date
end
end
if tonumber(t.m) then -- if raw month is a number (converting from ymd)
if 's' == mon_len then -- if we are to use abbreviated month names
t.m = cfg.date_names['inv_local_short'][tonumber(t.m)]; -- convert it to a month name
else
t.m = cfg.date_names['inv_local_long'][tonumber(t.m)]; -- convert it to a month name
end
t.d = t.d:gsub ('0(%d)', '%1'); -- strip leading '0' from day if present
elseif 'ymd' == format_param then -- when converting to ymd
t.y = t.y:gsub ('%a', ''); -- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?
if 1582 > tonumber (t.y) then -- ymd format dates not allowed before 1582
return;
end
t.m = string.format ('%02d', get_month_number (t.m)); -- make sure that month and day are two digits
t.d = string.format ('%02d', t.d);
elseif mon_len then -- if mon_len is set to either 'short' or 'long'
for _, mon in ipairs ({'m', 'm2'}) do -- because there can be two month names, check both
if t[mon] then
t[mon] = get_month_number (t[mon]); -- get the month number for this month (is length agnostic)
if 0 == t[mon] then return; end -- seasons and named dates can't be converted
t[mon] = (('s' == mon_len) and cfg.date_names['inv_local_short'][t[mon]]) or cfg.date_names['inv_local_long'][t[mon]]; -- fetch month name according to length
end
end
end
local new_date = string.format (re_formats[pattern_idx][format_param][1], -- format string
t[re_formats[pattern_idx][format_param][2]], -- named captures from t{}
t[re_formats[pattern_idx][format_param][3]],
t[re_formats[pattern_idx][format_param][4]],
t[re_formats[pattern_idx][format_param][5]],
t[re_formats[pattern_idx][format_param][6]],
t[re_formats[pattern_idx][format_param][7]],
t[re_formats[pattern_idx][format_param][8]]
);
return new_date;
end
--[[-------------------------< R E F O R M A T _ D A T E S >--------------------------------------------------
Reformats existing dates into the format specified by format.
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all. The -all version includes
access- and archive-dates; otherwise these dates are not reformatted.
This function allows automatic date formatting. In ~/Configuration, the article source is searched for one of
the {{use xxx dates}} templates. If found, xxx becomes the global date format as xxx-all. If |cs1-dates= in
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered. Legitimate
values for |cs1-dates= are:
l - all dates are rendered with long month names
ls - publication dates use long month names; access-/archive-dates use abbreviated month names
ly - publication dates use long month names; access-/archive-dates rendered in ymd format
s - all dates are rendered with abbreviated (short) month names
sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format
y - all dates are rendered in ymd format
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the
list in the new format. Dates in date_parameters_list are presumed here to be valid (no errors). This function
returns true when a date has been reformatted, false else. Actual reformatting is done by reformatter().
]]
local function reformat_dates (date_parameters_list, format)
local all = false; -- set to false to skip access- and archive-dates
local len_p = 'l'; -- default publication date length shall be long
local len_a = 'l'; -- default access-/archive-date length shall be long
local result = false;
local new_date;
if format:match('%a+%-all') then -- manual df keyword; auto df keyword when length not specified in {{use xxx dates}};
format = format:match('(%a+)%-all'); -- extract the format
all = true; -- all dates are long format dates because this keyword doesn't specify length
elseif format:match('%a+%-[lsy][sy]?') then -- auto df keywords; internal only
all = true; -- auto df applies to all dates; use length specified by capture len_p for all dates
format, len_p, len_a = format:match('(%a+)%-([lsy])([sy]?)'); -- extract the format and length keywords
if 'y' == len_p then -- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted
format = 'ymd'; -- override {{use xxx dates}}
elseif (not is_set(len_a)) or (len_p == len_a) then -- no access-/archive-date length specified or same length as publication dates then
len_a = len_p; -- in case len_a not set
end
end -- else only publication dates and they are long
for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) then -- if the parameter has a value
if not (not all and in_array (param_name, {'access-date', 'archive-date'})) then -- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way
for pattern_idx, pattern in pairs (patterns_t) do
if mw.ustring.match (param_val.val, pattern[1]) then
if all and in_array (param_name, {'access-date', 'archive-date'}) then -- if this date is an access- or archive-date
new_date = reformatter (param_val.val, pattern_idx, (('y' == len_a) and 'ymd') or format, len_a); -- choose ymd or dmy/mdy according to len_a setting
else -- all other dates
new_date = reformatter (param_val.val, pattern_idx, format, len_p);
end
if new_date then -- set when date was reformatted
date_parameters_list[param_name].val = new_date; -- update date in date list
result = true; -- and announce that changes have been made
break;
end
end -- if
end -- for
end -- if
end -- if
end -- for
return result; -- declare boolean result and done
end
--[[--------------------------< D A T E _ H Y P H E N _ T O _ D A S H >----------------------------------------
Loops through the list of date-holding parameters and converts any hyphen to an ndash. Not called if the cs1|2
template has any date errors.
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.
]]
local function date_hyphen_to_dash (date_parameters_list)
local result = false;
local n;
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) and
not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then -- for those that are not ymd dates (ustring because here digits may not be Western)
param_val.val, n = param_val.val:gsub ('%-', '–'); -- replace any hyphen with ndash
if 0 ~= n then
date_parameters_list[param_name].val = param_val.val; -- update the list
result = true;
end
end
end
return result; -- so we know if any hyphens were replaced
end
--[[-------------------------< D A T E _ N A M E _ X L A T E >------------------------------------------------
Attempts to translate English date names to local-language date names using names supplied by MediaWiki's
date parser function. This is simple name-for-name replacement and may not work for all languages.
if xlat_dig is true, this function will also translate Western (English) digits to the local language's digits.
This will also translate ymd dates.
]]
local function date_name_xlate (date_parameters_list, xlt_dig)
local xlate;
local mode; -- long or short month names
local modified = false;
local date;
local sources_t = {
{cfg.date_names.en.long, cfg.date_names.inv_local_long}, -- for translating long English month names to long local month names
{cfg.date_names.en.short, cfg.date_names.inv_local_short}, -- short month names
{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter}, -- quarter date names
{cfg.date_names.en.season, cfg.date_names.inv_local_season}, -- season date nam
{cfg.date_names.en.named, cfg.date_names.inv_local_named}, -- named dates
}
local function is_xlateable (month) -- local function to get local date name that replaces existing English-language date name
for _, date_names_t in ipairs (sources_t) do -- for each sequence table in date_names_t
if date_names_t[1][month] then -- if date name is English month (long or short), quarter, season or named and
if date_names_t[2][date_names_t[1][month]] then -- if there is a matching local date name
return date_names_t[2][date_names_t[1][month]]; -- return the local date name
end
end
end
end
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(param_val.val) then -- if the parameter has a value
date = param_val.val;
for month in mw.ustring.gmatch (date, '[%a ]+') do -- iterate through all date names in the date (single date or date range)
month = mw.text.trim (month); -- this because quarterly dates contain whitespace
xlate = is_xlateable (month); -- get translate <month>; returns translation or nil
if xlate then
date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
if xlt_dig then -- shall we also translate digits?
date = date:gsub ('%d', cfg.date_names.xlate_digits); -- translate digits from Western to 'local digits'
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
end
return modified;
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
add_prop_cat = utilities_page_ptr.add_prop_cat ; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
set_message = utilities_page_ptr.set_message;
substitute = utilities_page_ptr.substitute;
wrap_style = utilities_page_ptr.wrap_style;
cfg = cfg_table_ptr; -- import tables from selected Module:Citation/CS1/Configuration
end
--[[--------------------------< A R C H I V E _ D A T E _ C H E C K >------------------------------------------
Compare value in |archive-date= with the timestamp in Wayback machine urls. Emits an error message with suggested
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match
the timestamp.
this function never called when any date in a cs1|2 template has errors
error message suggests new |archive-date= value in an appropriate format specified by <df>. <df> is either
|df= or cfg.global_df in that order. If <df> is nil, suggested date has format from |archive-date=. There is
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format
is not changed.
]]
local function archive_date_check (archive_date, archive_url_timestamp, df)
local archive_date_format = 'dmy-y'; -- holds the date format of date in |archive-date; default to ymd; 'dmy' used here to spoof reformat_dates()
for _, v_t in ipairs ({{'dMy', 'dmy-all'}, {'Mdy', 'mdy-all'}}) do -- is |archive-date= format dmy or mdy?
if archive_date:match (patterns_t[v_t[1]][1]) then -- does the pattern match?
archive_date_format = cfg.keywords_xlate[v_t[2]]; -- get appropriate |df= supported keyword from the i18n translator table
break;
end
end
local dates_t = {};
dates_t['archive-date'] = {val=archive_date, name=''}; -- setup to call reformat_dates(); never called when errors so <name> unset as not needed
reformat_dates (dates_t, 'dmy-y'); -- reformat |archive-date= to ymd; 'dmy' used here to spoof reformat_dates()
local archive_url_date = archive_url_timestamp:gsub ('(%d%d%d%d)(%d%d)(%d%d)%d*', '%1-%2-%3'); -- make ymd format date from timestamp
if dates_t['archive-date'].val == archive_url_date then -- are the two dates the same
return; -- yes, done
else
dates_t['archive-date'] = {val=archive_url_date, name=''}; -- setup to call reformat_dates() with the timestamp date
reformat_dates (dates_t, df or archive_date_format); -- reformat timestamp to format specified by <df> or format used in |archive-date=
archive_url_date = dates_t['archive-date'].val;
set_message ('err_archive_date_url_ts_mismatch', archive_url_date); -- emit an error message
end
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return { -- return exported functions
archive_date_check = archive_date_check,
date_hyphen_to_dash = date_hyphen_to_dash,
date_name_xlate = date_name_xlate,
dates = dates,
is_valid_date = is_valid_date,
reformat_dates = reformat_dates,
set_selected_modules = set_selected_modules,
year_check = year_check,
year_date_check = year_date_check,
}
sflakrgc0cwyd8qdrwu65al28coo0ug
392036
392035
2026-08-07T06:36:23Z
محک
1023
392036
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style; -- imported functions from selected Module:Citation/CS1/Utilities
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration
--[[--------------------------< F I L E - S C O P E D E C L A R A T I O N S >--------------------------------
File-scope variables are declared here
]]
local lang_object = mw.getContentLanguage(); -- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?
local year_limit; -- used by is_valid_year()
--[=[-------------------------< I S _ V A L I D _ A C C E S S D A T E >----------------------------------------
returns true if:
Wikipedia start date <= accessdate < today + 2 days
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)
accessdate is the date provided in |access-date= at time 00:00:00 UTC
today is the current date at time 00:00:00 UTC plus 48 hours
if today is 2015-01-01T00:00:00 then
adding 24 hours gives 2015-01-02T00:00:00 – one second more than today
adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow
This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser
apparently doesn't understand non-English date month names. This function will always return false when the date
contains a non-English month name because good1 is false after the call to lang.formatDate(). To get around that
call this function with YYYY-MM-DD format dates.
]=]
local function is_valid_accessdate (accessdate)
local good1, good2;
local access_ts, tomorrow_ts; -- to hold Unix time stamps representing the dates
good1, access_ts = pcall (lang_object.formatDate, lang_object, 'U', accessdate ); -- convert accessdate value to Unix timestamp
good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, 'U', 'today + 2 days' ); -- today midnight + 2 days is one second more than all day tomorrow
if good1 and good2 then -- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand
access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts); -- convert to numbers for the comparison;
tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);
else
return false; -- one or both failed to convert to Unix time stamp
end
if 979516800 <= access_ts and access_ts < tomorrow_ts then -- Wikipedia start date <= accessdate < tomorrow's date
return true;
else
return false; -- accessdate out of range
end
end
--[[--------------------------< G E T _ M O N T H _ N U M B E R >----------------------------------------------
returns a number according to the month in a date: 1 for January, etc. Capitalization and spelling must be correct.
If not a valid month, returns 0
]]
local function get_month_number (month)
return cfg.date_names['local'].long[month] or cfg.date_names['local'].short[month] or -- look for local names first
cfg.date_names['en'].long[month] or cfg.date_names['en'].short[month] or -- failing that, look for English names
0; -- not a recognized month name
end
--[[--------------------------< G E T _ S E A S O N _ N U M B E R >--------------------------------------------
returns a number according to the sequence of seasons in a year: 21 for Spring, etc. Capitalization and spelling
must be correct. If not a valid season, returns 0.
21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”
returns 0 when <param> is not |date=
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons. EDTF does support the distinction between north and south
hemisphere seasons but cs1|2 has no way to make that distinction.
These additional divisions not currently supported:
25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere
29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_season_number (season, param)
if 'date' ~= param then
return 0; -- season dates only supported by |date=
end
return cfg.date_names['local'].season[season] or -- look for local names first
cfg.date_names['en'].season[season] or -- failing that, look for English names
0; -- not a recognized season name
end
--[[--------------------------< G E T _ Q U A R T E R _ N U M B E R >------------------------------------------
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc. Capitalization and spelling
must be correct. If not a valid quarter, returns 0.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
returns 0 when <param> is not |date=
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons and quarters.
These additional divisions not currently supported:
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_quarter_number (quarter, param)
if 'date' ~= param then
return 0; -- quarter dates only supported by |date=
end
quarter = mw.ustring.gsub (quarter, ' +', ' '); -- special case replace multiple space chars with a single space char
return cfg.date_names['local'].quarter[quarter] or -- look for local names first
cfg.date_names['en'].quarter[quarter] or -- failing that, look for English names
0; -- not a recognized quarter name
end
--[[--------------------------< G E T _ P R O P E R _ N A M E _ N U M B E R >----------------------------------
returns a non-zero number if date contains a recognized proper-name. Capitalization and spelling must be correct.
returns 0 when <param> is not |date=
]]
local function get_proper_name_number (name, param)
if 'date' ~= param then
return 0; -- proper-name dates only supported by |date=
end
return cfg.date_names['local'].named[name] or -- look for local names dates first
cfg.date_names['en'].named[name] or -- failing that, look for English names
0; -- not a recognized named date
end
--[[--------------------------< G E T _ E L E M E N T _ N U M B E R <------------------------------------------
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)
]]
local function get_element_number (element, param)
local num;
local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number}; -- list of functions to execute in order
for _, func in ipairs (funcs) do -- spin through the function list
num = func (element, param); -- call the function and get the returned number
if 0 ~= num then -- non-zero when valid month season quarter
return num; -- return that number
end
end
return nil; -- not valid
end
--[[--------------------------< I S _ V A L I D _ Y E A R >----------------------------------------------------
Function gets current year from the server and compares it to year from a citation parameter. Years more than one
year in the future are not acceptable.
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable
]]
local function is_valid_year (year, param)
if not is_set (year_limit) then
year_limit = tonumber(os.date("%Y"))+1; -- global variable so we only have to fetch it once
end
year = tonumber (year) or lang_object:parseFormattedNumber (year); -- convert to number for the comparison
if year and (100 > year) then -- years less than 100 not supported
return false;
end
if 'pmc-embargo-date' == param then -- special case for |pmc-embargo-date=
return year and (year <= tonumber(os.date("%Y"))+2) or false; -- years more than two years in the future are not accepted
end
return year and (year <= year_limit) or false;
end
--[[--------------------------< I S _ V A L I D _ D A T E >----------------------------------------------------
Returns true if day is less than or equal to the number of days in month and year is no farther into the future
than next year; else returns false.
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately
1923) dates are assumed to be Gregorian.
]]
local function is_valid_date (year, month, day, param)
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
local month_length;
if not is_valid_year (year, param) then -- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future
return false;
end
month = tonumber (month); -- required for YYYY-MM-DD dates
if (2 == month) then -- if February
month_length = 28; -- then 28 days unless
if 1582 > tonumber(year) then -- Julian calendar
if 0 == (year%4) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
else -- Gregorian calendar
if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
end
else
month_length = days_in_month[month] or 0; -- invalid month number is nil so default <month_length> to 0
end
if tonumber (day) > month_length then
return false;
end
return true;
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E >--------------------------
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August.
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are
listed in the short subtable. When both have the same style (both are listed in the same table), returns true; false else
]]
local function is_valid_month_range_style (month1, month2)
if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or -- are both English names listed in the long subtable?
(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or -- are both English names listed in the short subtable?
(cfg.date_names['local'].long[month1] and cfg.date_names['local'].long[month2]) or -- are both local names listed in the long subtable?
(cfg.date_names['local'].short[month1] and cfg.date_names['local'].short[month2]) then -- are both local names listed in the short subtable?
return true;
end
return false; -- names are mixed
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E >------------------------
Check a pair of months or seasons to see if both are valid members of a month or season pair.
Month pairs are expected to be left to right, earliest to latest in time.
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok
]]
local function is_valid_month_season_range(range_start, range_end, param)
local range_start_number = get_month_number (range_start);
local range_end_number;
if 0 == range_start_number then -- is this a month range?
range_start_number = get_season_number (range_start, param); -- not a month; is it a season? get start season number
range_end_number = get_season_number (range_end, param); -- get end season number
if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then
return true; -- any season pairing is accepted except when both are the same
end
return false; -- range_start and/or range_end is not a season
end
-- here when range_start is a month
range_end_number = get_month_number (range_end); -- get end month number
if range_start_number < range_end_number and -- range_start is a month; does range_start precede range_end?
is_valid_month_range_style (range_start, range_end) then -- do months have the same style?
return true; -- proper order and same style
end
return false; -- range_start month number is greater than or equal to range end number; or range end isn't a month
end
--[[--------------------------< M A K E _ C O I N S _ D A T E >------------------------------------------------
This function receives a table of date parts for one or two dates and an empty table reference declared in
Module:Citation/CS1. The function is called only for |date= parameters and only if the |date=<value> is
determined to be a valid date format. The question of what to do with invalid date formats is not answered here.
The date parts in the input table are converted to an ISO 8601 conforming date string:
single whole dates: yyyy-mm-dd
month and year dates: yyyy-mm
year dates: yyyy
ranges: yyyy-mm-dd/yyyy-mm-dd
yyyy-mm/yyyy-mm
yyyy/yyyy
Dates in the Julian calendar are reduced to year or year/year so that we don't have to do calendar conversion from
Julian to Proleptic Gregorian.
The input table has:
year, year2 – always present; if before 1582, ignore months and days if present
month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas
day, day2 – 0 if not provided, 1-31 for days
the output table receives:
rftdate: an ISO 8601 formatted date
rftchron: a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)
rftssn: one of four season keywords: winter, spring, summer, fall (lowercase)
rftquarter: one of four values: 1, 2, 3, 4
]]
local function make_COinS_date (input, tCOinS_date)
local date; -- one date or first date in a range
local date2 = ''; -- end of range date
input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year); -- language-aware tonumber()
input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2); -- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals
if ((1582 == input.year) and (10 > tonumber(input.month))) or (1582 > input.year) then -- if a Julian calendar date
tCOinS_date.rftdate = tostring (input.year); -- &rft.date gets year only
return; -- done
end
-- here for all forms of Gregorian dates
if 20 < tonumber (input.month) then -- if season, quarter, or proper-name date
date = input.year; -- &rft.date gets year only
if 0 ~= input.year2 and input.year ~= input.year2 then -- if a range, only the second year portion when not the same as range start year
date = string.format ('%.4d/%.4d', input.year, input.year2) -- assemble the date range
end
local season = {[24] = 'winter', [21] = 'spring', [22] = 'summer', [23] = 'fall', [33] = '1', [34] = '2', [35] = '3', [36] = '4', [98] = 'Easter', [99] = 'Christmas'}; -- seasons lowercase, no autumn; proper-names use title case
if 0 == input.month2 then -- single season, quarter, or proper-name date
if 40 < tonumber(input.month) then
tCOinS_date.rftchron = season[input.month]; -- proper-name date; used in journal metadata only
elseif 30 < tonumber(input.month) then
tCOinS_date.rftquarter = season[input.month]; -- quarter date; used in journal metadata only
else
tCOinS_date.rftssn = season[input.month]; -- season date; used in journal metadata only
end
else -- season ranges are lumped into &rft.chron; &rft.ssn and &rft.quarter are left blank
if input.year ~= input.year2 then -- season year – season year range or season year–year
if 0 ~= input.month2 then
tCOinS_date.rftchron = string.format ('%s %s – %s %s', season[input.month], input.year, season[input.month2], input.year2); -- used in journal metadata only
end
else -- season–season year range
tCOinS_date.rftchron = season[input.month] .. '–' .. season[input.month2]; -- season–season year range; used in journal metadata only
end
end
tCOinS_date.rftdate = tostring (date);
return; -- done
end
-- here for gregorian calendar dates
if 0 ~= input.day then
date = string.format ('%s-%.2d-%.2d', input.year, tonumber(input.month), tonumber(input.day)); -- whole date
elseif 0 ~= input.month then
date = string.format ('%s-%.2d', input.year, tonumber(input.month)); -- year and month
else
date = string.format ('%s', input.year); -- just year
end
if 0 ~= input.year2 then
if 0 ~= input.day2 then
date2 = string.format ('/%s-%.2d-%.2d', input.year2, tonumber(input.month2), tonumber(input.day2)); -- whole date
elseif 0 ~= input.month2 then
date2 = string.format ('/%s-%.2d', input.year2, tonumber(input.month2)); -- year and month
else
date2 = string.format ('/%s', input.year2); -- just year
end
end
tCOinS_date.rftdate = date .. date2; -- date2 has the '/' separator
return;
end
--[[--------------------------< P A T T E R N S _ T >----------------------------------------------------------
this is the list of patterns for date formats that this module recognizes. Approximately the first half of these
patterns represent formats that might be reformatted into another format. Those that might be reformatted have
'indicator' letters that identify the content of the matching capture: 'd' (day), 'm' (month), 'a' (anchor year),
'y' (year); second day, month, year have a '2' suffix.
These patterns are used for both date validation and for reformatting. This table should not be moved to ~/Configuration
because changes to this table require changes to check_date() and to reformatter() and reformat_date()
]]
local patterns_t = {
-- year-initial numerical year-month-day
['ymd'] = {'^([1-9]%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'},
-- month-initial: month day, year
['Mdy'] = {'^(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'a', 'y'},
-- month-initial day range: month day–day, year; days are separated by endash
['Md-dy'] = {'^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'd2', 'a', 'y'},
-- day-initial: day month year
['dMy'] = {'^([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'a', 'y'},
-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki
-- ['yMd'] = {'^(([1-9]%d%d%d?)%a?) +(%D-) +(%d%d?)$', 'a', 'y', 'm', 'd'},
-- day-range-initial: day–day month year; days are separated by endash
['d-dMy'] = {'^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'd2', 'm', 'a', 'y'},
-- day initial month-day-range: day month - day month year; uses spaced endash
['dM-dMy'] = {'^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'd2', 'm2', 'a', 'y'},
-- month initial month-day-range: month day – month day, year; uses spaced endash
['Md-Mdy'] = {'^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$','m', 'd', 'm2', 'd2', 'a', 'y'},
-- day initial month-day-year-range: day month year - day month year; uses spaced endash
['dMy-dMy'] = {'^([1-9]%d?) +(%D-) +([1-9]%d%d%d?) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'y', 'd2', 'm2', 'a', 'y2'},
-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
['Mdy-Mdy'] = {'^(%D-) +([1-9]%d?), +([1-9]%d%d%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'y', 'm2', 'd2', 'a', 'y2'},
-- these date formats cannot be converted, per se, but month name can be rendered short or long
-- month/season year - month/season year; separated by spaced endash
['My-My'] = {'^(%D-) +([1-9]%d%d%d?) +[%-–] +(%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'y', 'm2', 'a', 'y2'},
-- month/season range year; months separated by endash
['M-My'] = {'^(%D-)[%-–](%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'm2', 'a', 'y'},
-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.
['My'] = {'^([^%d–]-) +(([1-9]%d%d%d?)%a?)$', 'm', 'a', 'y'}, -- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn't
-- these date formats cannot be converted
['Sy4-y2'] = {'^(%D-) +(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
['Sy-y'] = {'^(%D-) +([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- special case Winter/Summer year-year; year separated with unspaced endash
['y-y'] = {'^([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
['y4-y2'] = {'^(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- year range: YYYY–YY; separated by unspaced endash
['y'] = {'^(([1-9]%d%d%d?)%a?)$'}, -- year; here accept either YYY or YYYY
}
--[[--------------------------< I S _ V A L I D _ E M B A R G O _ D A T E >------------------------------------
returns true and date value if that value has proper dmy, mdy, ymd format.
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.
]]
local function is_valid_embargo_date (v)
if v:match (patterns_t['ymd'][1]) or -- ymd
v:match (patterns_t['Mdy'][1]) or -- dmy
v:match (patterns_t['dMy'][1]) then -- mdy
return true, v;
end
return false, '9999'; -- if here not good date so return false and set embargo date to long time in future
end
--[[--------------------------< C H E C K _ D A T E >----------------------------------------------------------
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only
allowed range separator is endash. Additionally, check the date to see that it is a real date: no 31 in 30-day
months; no 29 February when not a leap year. Months, both long-form and three character abbreviations, and seasons
must be spelled correctly. Future years beyond next year are not allowed.
If the date fails the format tests, this function returns false and does not return values for anchor_year and
COinS_date. When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets
its year from the year parameter if present otherwise CITEREF does not get a date value.
Inputs:
date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)
Returns:
false if date string is not a real date; else
true, anchor_year, COinS_date
anchor_year can be used in CITEREF anchors
COinS_date is ISO 8601 format date; see make_COInS_date()
]]
local function check_date (date_string, param, tCOinS_date)
local year; -- assume that year2, months, and days are not used;
local year2 = 0; -- second year in a year range
local month = 0;
local month2 = 0; -- second month in a month range
local day = 0;
local day2 = 0; -- second day in a day range
local anchor_year;
local coins_date;
if date_string:match (patterns_t['ymd'][1]) then -- year-initial numerical year month day format
year, month, day = date_string:match (patterns_t['ymd'][1]);
if 12 < tonumber(month) or 1 > tonumber(month) or 1582 > tonumber(year) or 0 == tonumber(day) then return false; end -- month or day number not valid or not Gregorian calendar
anchor_year = year;
elseif mw.ustring.match(date_string, patterns_t['Mdy'][1]) then -- month-initial: month day, year
month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t['Mdy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
elseif mw.ustring.match(date_string, patterns_t['Md-dy'][1]) then -- month-initial day range: month day–day, year; days are separated by endash
month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-dy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2=month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy'][1]) then -- day-initial: day month year
day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['dMy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
--[[ NOT supported at en.wiki
elseif mw.ustring.match(date_string, patterns_t['yMd'][1]) then -- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed
anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t['yMd'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
-- end NOT supported at en.wiki ]]
elseif mw.ustring.match(date_string, patterns_t['d-dMy'][1]) then -- day-range-initial: day–day month year; days are separated by endash
day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['d-dMy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2 = month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dM-dMy'][1]) then -- day initial month-day-range: day month - day month year; uses spaced endash
day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['dM-dMy'][1]);
if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end -- date range order is left to right: earlier to later;
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]) then -- month initial month-day-range: month day – month day, year; uses spaced endash
month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]);
if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]) then -- day initial month-day-year-range: day month year - day month year; uses spaced endash
day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]) then -- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]) then -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
local century;
month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]);
if 'Winter' ~= month and 'Summer' ~= month then return false end; -- 'month' can only be Winter or Summer
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
year2 = century..year2; -- add the century to year2 for comparisons
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
month = get_season_number(month, param);
elseif mw.ustring.match(date_string, patterns_t['Sy-y'][1]) then -- special case Winter/Summer year-year; year separated with unspaced endash
month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy-y'][1]);
month = get_season_number (month, param); -- <month> can only be winter or summer; also for metadata
if (month ~= cfg.date_names['en'].season['Winter']) and (month ~= cfg.date_names['en'].season['Summer']) then
return false; -- not Summer or Winter; abandon
end
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['My-My'][1]) then -- month/season year - month/season year; separated by spaced endash
month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['My-My'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then -- both must be month year, same month style
month = get_month_number(month);
month2 = get_month_number(month2);
elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then -- both must be season year, not mixed
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
else
return false;
end
elseif mw.ustring.match(date_string, patterns_t['M-My'][1]) then -- month/season range year; months separated by endash
month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['M-My'][1]);
if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end
if 0 ~= get_month_number(month) then -- determined to be a valid range so just check this one to know if month or season
month = get_month_number(month);
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end
else
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
end
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['My'][1]) then -- month/season/quarter/proper-name year
month, anchor_year, year = mw.ustring.match(date_string, patterns_t['My'][1]);
if not is_valid_year(year) then return false; end
month = get_element_number(month, param); -- get month season quarter proper-name number or nil
if not month then return false; end -- not valid whatever it is
elseif mw.ustring.match(date_string, patterns_t['y-y'][1]) then -- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y-y'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['y4-y2'][1]) then -- Year range: YYYY–YY; separated by unspaced endash
local century;
year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y4-y2'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if 13 > tonumber(year2) then return false; end -- don't allow 2003-05 which might be May 2003
year2 = century .. year2; -- add the century to year2 for comparisons
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if in_array (param, {'date', 'publication-date', 'year'}) then -- here when 'valid' abbreviated year range; if one of these parameters
add_prop_cat ('year-range-abbreviated'); -- add properties cat
end
elseif mw.ustring.match(date_string, patterns_t['y'][1]) then -- year; here accept either YYY or YYYY
anchor_year, year = mw.ustring.match(date_string, patterns_t['y'][1]);
if false == is_valid_year(year) then
return false;
end
else
return false; -- date format not one of the MOS:DATE approved formats
end
if param ~= 'date' then -- CITEREF disambiguation only allowed in |date=; |year= & |publication-date= promote to date
if anchor_year:match ('%l$') then
return false;
end
end
if 'access-date' == param then -- test access-date here because we have numerical date parts
if 0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2 then -- none of these; access-date must not be a range
if not is_valid_accessdate(year .. '-' .. month .. '-' .. day) then
return false; -- return false when access-date out of bounds
end
else
return false; -- return false when access-date is a range of two dates
end
end
if 'archive-date' == param then -- test archive-date here because we have numerical date parts
if not (0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2) then -- none of these; archive-date must not be a range
return false; -- return false when archive-date is a range of two dates
end
end
local result=true; -- check whole dates for validity; assume true because not all dates will go through this test
if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD (simple whole date)
result = is_valid_date (year, month, day, param); -- <param> for |pmc-embargo-date=
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then -- YMD-d (day range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-md (day month range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month2, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-ymd (day month year range)
result = is_valid_date(year, month, day);
result = result and is_valid_date(year2, month2, day2);
end
if false == result then return false; end
if nil ~= tCOinS_date then -- this table only passed into this function when testing |date= parameter values
make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date); -- make an ISO 8601 date string for COinS
end
return true, anchor_year; -- format is good and date string represents a real date
end
--[[--------------------------< D A T E S >--------------------------------------------------------------------
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in
the COinS metadata) are derived. The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords "n.d." or "nd" (without quotes).
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,
parameters with errors are added to the <error_list> sequence table as the dates are tested.
]]
local function dates(date_parameters_list, tCOinS_date, error_list)
local anchor_year; -- will return as nil if the date being tested is not |date=
local COinS_date; -- will return as nil if the date being tested is not |date=
local embargo_date; -- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999
local good_date = false;
for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(v.val) then -- if the parameter has a value
v.val = mw.ustring.gsub(v.val, '%d', cfg.date_names.local_digits); -- translate 'local' digits to Western 0-9
if v.val:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
local year = v.val:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
if 'date' == k then
anchor_year, COinS_date = v.val:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
good_date = is_valid_year(year);
elseif 'year' == k then
good_date = is_valid_year(year);
else
good_date = false;
end
elseif 'date' == k then -- if the parameter is |date=
if v.val:match("^n%.d%.%a?$") then -- ToDo: I18N -- if |date=n.d. with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((n%.d%.)%a?)"); -- ToDo: I18N -- "n.d."; no error when date parameter is set to no date
elseif v.val:match("^nd%a?$") then -- ToDo: I18N -- if |date=nd with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((nd)%a?)"); -- ToDo: I18N -- "nd"; no error when date parameter is set to no date
else
good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date); -- go test the date
end
elseif 'year' == k then -- if the parameter is |year= it should hold only a year value
if v.val:match("^[1-9]%d%d%d?%a?$") then -- if |year = 3 or 4 digits only with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((%d+)%a?)");
else
good_date = false;
end
elseif 'pmc-embargo-date' == k then -- if the parameter is |pmc-embargo-date=
good_date = check_date (v.val, k); -- go test the date
if true == good_date then -- if the date is a valid date
good_date, embargo_date = is_valid_embargo_date (v.val); -- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999
end
else -- any other date-holding parameter
good_date = check_date (v.val, k); -- go test the date
end
if false == good_date then -- assemble one error message so we don't add the tracking category multiple times
table.insert (error_list, wrap_style ('parameter', v.name)); -- make parameter name suitable for error message list
end
end
end
return anchor_year, embargo_date; -- and done
end
--[[--------------------------< Y E A R _ C H E C K >----------------------------------------------------------
Temporary function to test |year= for acceptable values:
YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-
less useless
]]
local function year_check (year)
year = year:gsub ('c%. *', ''); -- remove circa annotation (if present) before testing <year>
for _, index in ipairs ({'y-y', 'y4-y2', 'y'}) do -- spin through these indexes into patterns_t
if mw.ustring.match (year, patterns_t[index][1]) then
return; -- if a match then |year= holds a valid 'year'
end
end
set_message ('maint_year'); -- if here, |year= value is not an accepted value; add a maint cat
end
--[[--------------------------< Y E A R _ D A T E _ C H E C K >------------------------------------------------
Compare the value provided in |year= with the year value(s) provided in |date=. This function sets a local numeric value:
0 - year value does not match the year value in date
1 - (default) year value matches the year value in date or one of the year values when date contains two years
2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)
the numeric value in <result> determines the 'output' if any from this function:
0 – adds error message to error_list sequence table
1 – adds maint cat
2 – does nothing
]]
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)
local year;
local date1;
local date2;
local result = 1; -- result of the test; assume that the test passes
year = year_string:match ('(%d%d%d%d?)');
if date_string:match ('%d%d%d%d%-%d%d%-%d%d') then --special case where both date and year are required YYYY-MM-DD and YYYYx
date1 = date_string:match ('(%d%d%d%d)');
year = year_string:match ('(%d%d%d%d)');
if year ~= date1 then
result = 0; -- years don't match
elseif year_string:match ('%d%d%d%d%a') then
result = 2; -- years match; but because disambiguated, don't add to maint cat
end
elseif date_string:match ("%d%d%d%d?.-%d%d%d%d?") then -- any of the standard range formats of date with two three- or four-digit years
date1, date2 = date_string:match ("(%d%d%d%d?).-(%d%d%d%d?)");
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif mw.ustring.match(date_string, "%d%d%d%d[%-–]%d%d") then -- YYYY-YY date ranges
local century;
date1, century, date2 = mw.ustring.match(date_string, "((%d%d)%d%d)[%-–]+(%d%d)");
date2 = century..date2; -- convert YY to YYYY
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif date_string:match ("%d%d%d%d?") then -- any of the standard formats of date with one year
date1 = date_string:match ("(%d%d%d%d?)");
if year ~= date1 then
result = 0;
end
else -- should never get here; this function called only when no other date errors
result = 0; -- no recognizable year in date
end
if 0 == result then -- year / date mismatch
table.insert (error_list, substitute (cfg.messages['mismatch'], {year_origin, date_origin})); -- add error message to error_list sequence table
elseif 1 == result then -- redundant year / date
set_message ('maint_date_year'); -- add a maint cat
end
end
--[[--------------------------< R E F O R M A T T E R >--------------------------------------------------------
reformat 'date' into new format specified by format_param if pattern_idx (the current format of 'date') can be
reformatted. Does the grunt work for reformat_dates().
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:
format string used by string.format()
identifier letters ('d', 'm', 'y', 'd2', 'm2', 'y2') that serve as indexes into a table t{} that holds captures
from mw.ustring.match() for the various date parts specified by patterns_t[pattern_idx][1]
Items in patterns_t{} have the general form:
['ymd'] = {'^(%d%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'}, where:
['ymd'] is pattern_idx
patterns_t['ymd'][1] is the match pattern with captures for mw.ustring.match()
patterns_t['ymd'][2] is an indicator letter identifying the content of the first capture
patterns_t['ymd'][3] ... the second capture etc.
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier
characters as indexes into t{} For the above, a ymd date is in t{} as:
t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)
To reformat, this function is called with the pattern_idx that matches the current format of the date and with
format_param set to the desired format. This function loads table t{} as described and then calls string.format()
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..
]]
local re_formats = {
['ymd'] = { -- date format is ymd; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Mdy'] = { -- date format is Mdy; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['dMy'] = { -- date format is dMy; reformat to:
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Md-dy'] = { -- date format is Md-dy; reformat to:
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- |df=dmy -> d-dMy
},
['d-dMy'] = { -- date format is d-d>y; reformat to:
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- |df=mdy -> Md-dy
},
['dM-dMy'] = { -- date format is dM-dMy; reformat to:
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- |df=mdy -> Md-Mdy
},
['Md-Mdy'] = { -- date format is Md-Mdy; reformat to:
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- |df=dmy -> dM-dMy
},
['dMy-dMy'] = { -- date format is dMy-dMy; reformat to:
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- |df=mdy -> Mdy-Mdy
},
['Mdy-Mdy'] = { -- date format is Mdy-Mdy; reformat to:
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- for long/short reformatting
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- |df=dmy -> dMy-dMy
},
['My-My'] = { -- these for long/short reformatting
['any'] = {'%s %s – %s %s', 'm', 'y', 'm2', 'y2'}, -- dmy/mdy agnostic
},
['M-My'] = { -- these for long/short reformatting
['any'] = {'%s–%s %s', 'm', 'm2', 'y'}, -- dmy/mdy agnostic
},
['My'] = { -- these for long/short reformatting
['any'] = {'%s %s', 'm', 'y'}, -- dmy/mdy agnostic
},
-- ['yMd'] = { -- not supported at en.wiki
-- ['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
-- ['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- },
}
local function reformatter (date, pattern_idx, format_param, mon_len)
if not in_array (pattern_idx, {'ymd', 'Mdy', 'Md-dy', 'dMy', 'yMd', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- not in this set of date format patterns_t then not a reformattable date
end
if 'ymd' == format_param and in_array (pattern_idx, {'ymd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd
end
if in_array (pattern_idx, {'My', 'M-My', 'My-My'}) then -- these are not dmy/mdy so can't be 'reformatted' into either
format_param = 'any'; -- so format-agnostic
end
-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line
-- if 'yMd' == format_param and in_array (pattern_idx, {'yMd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy'}) then -- these formats not convertable; yMd not supported at en.wiki
if 'yMd' == format_param then -- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line
return; -- not a reformattable date
end
local c1, c2, c3, c4, c5, c6, c7; -- these hold the captures specified in patterns_t[pattern_idx][1]
c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]); -- get the captures
local t = { -- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]
[patterns_t[pattern_idx][2]] = c1; -- at minimum there is always one capture with a matching indicator letter
[patterns_t[pattern_idx][3] or 'x'] = c2; -- patterns_t can have a variable number of captures; each capture requires an indicator letter;
[patterns_t[pattern_idx][4] or 'x'] = c3; -- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;
[patterns_t[pattern_idx][5] or 'x'] = c4; -- the 'x' here spoofs an indicator letter to prevent 'table index is nil' error
[patterns_t[pattern_idx][6] or 'x'] = c5;
[patterns_t[pattern_idx][7] or 'x'] = c6;
[patterns_t[pattern_idx][8] or 'x'] = c7;
};
if t.a then -- if this date has an anchor year capture (all convertable date formats except ymd)
if t.y2 then -- for year range date formats
t.y2 = t.a; -- use the anchor year capture when reassembling the date
else -- here for single date formats (except ymd)
t.y = t.a; -- use the anchor year capture when reassembling the date
end
end
if tonumber(t.m) then -- if raw month is a number (converting from ymd)
if 's' == mon_len then -- if we are to use abbreviated month names
t.m = cfg.date_names['inv_local_short'][tonumber(t.m)]; -- convert it to a month name
else
t.m = cfg.date_names['inv_local_long'][tonumber(t.m)]; -- convert it to a month name
end
t.d = t.d:gsub ('0(%d)', '%1'); -- strip leading '0' from day if present
elseif 'ymd' == format_param then -- when converting to ymd
t.y = t.y:gsub ('%a', ''); -- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?
if 1582 > tonumber (t.y) then -- ymd format dates not allowed before 1582
return;
end
t.m = string.format ('%02d', get_month_number (t.m)); -- make sure that month and day are two digits
t.d = string.format ('%02d', t.d);
elseif mon_len then -- if mon_len is set to either 'short' or 'long'
for _, mon in ipairs ({'m', 'm2'}) do -- because there can be two month names, check both
if t[mon] then
t[mon] = get_month_number (t[mon]); -- get the month number for this month (is length agnostic)
if 0 == t[mon] then return; end -- seasons and named dates can't be converted
t[mon] = (('s' == mon_len) and cfg.date_names['inv_local_short'][t[mon]]) or cfg.date_names['inv_local_long'][t[mon]]; -- fetch month name according to length
end
end
end
local new_date = string.format (re_formats[pattern_idx][format_param][1], -- format string
t[re_formats[pattern_idx][format_param][2]], -- named captures from t{}
t[re_formats[pattern_idx][format_param][3]],
t[re_formats[pattern_idx][format_param][4]],
t[re_formats[pattern_idx][format_param][5]],
t[re_formats[pattern_idx][format_param][6]],
t[re_formats[pattern_idx][format_param][7]],
t[re_formats[pattern_idx][format_param][8]]
);
return new_date;
end
--[[-------------------------< R E F O R M A T _ D A T E S >--------------------------------------------------
Reformats existing dates into the format specified by format.
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all. The -all version includes
access- and archive-dates; otherwise these dates are not reformatted.
This function allows automatic date formatting. In ~/Configuration, the article source is searched for one of
the {{use xxx dates}} templates. If found, xxx becomes the global date format as xxx-all. If |cs1-dates= in
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered. Legitimate
values for |cs1-dates= are:
l - all dates are rendered with long month names
ls - publication dates use long month names; access-/archive-dates use abbreviated month names
ly - publication dates use long month names; access-/archive-dates rendered in ymd format
s - all dates are rendered with abbreviated (short) month names
sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format
y - all dates are rendered in ymd format
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the
list in the new format. Dates in date_parameters_list are presumed here to be valid (no errors). This function
returns true when a date has been reformatted, false else. Actual reformatting is done by reformatter().
]]
local function reformat_dates (date_parameters_list, format)
local all = false; -- set to false to skip access- and archive-dates
local len_p = 'l'; -- default publication date length shall be long
local len_a = 'l'; -- default access-/archive-date length shall be long
local result = false;
local new_date;
if format:match('%a+%-all') then -- manual df keyword; auto df keyword when length not specified in {{use xxx dates}};
format = format:match('(%a+)%-all'); -- extract the format
all = true; -- all dates are long format dates because this keyword doesn't specify length
elseif format:match('%a+%-[lsy][sy]?') then -- auto df keywords; internal only
all = true; -- auto df applies to all dates; use length specified by capture len_p for all dates
format, len_p, len_a = format:match('(%a+)%-([lsy])([sy]?)'); -- extract the format and length keywords
if 'y' == len_p then -- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted
format = 'ymd'; -- override {{use xxx dates}}
elseif (not is_set(len_a)) or (len_p == len_a) then -- no access-/archive-date length specified or same length as publication dates then
len_a = len_p; -- in case len_a not set
end
end -- else only publication dates and they are long
for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) then -- if the parameter has a value
if not (not all and in_array (param_name, {'access-date', 'archive-date'})) then -- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way
for pattern_idx, pattern in pairs (patterns_t) do
if mw.ustring.match (param_val.val, pattern[1]) then
if all and in_array (param_name, {'access-date', 'archive-date'}) then -- if this date is an access- or archive-date
new_date = reformatter (param_val.val, pattern_idx, (('y' == len_a) and 'ymd') or format, len_a); -- choose ymd or dmy/mdy according to len_a setting
else -- all other dates
new_date = reformatter (param_val.val, pattern_idx, format, len_p);
end
if new_date then -- set when date was reformatted
date_parameters_list[param_name].val = new_date; -- update date in date list
result = true; -- and announce that changes have been made
break;
end
end -- if
end -- for
end -- if
end -- if
end -- for
return result; -- declare boolean result and done
end
--[[--------------------------< D A T E _ H Y P H E N _ T O _ D A S H >----------------------------------------
Loops through the list of date-holding parameters and converts any hyphen to an ndash. Not called if the cs1|2
template has any date errors.
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.
]]
local function date_hyphen_to_dash (date_parameters_list)
local result = false;
local n;
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) and
not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then -- for those that are not ymd dates (ustring because here digits may not be Western)
param_val.val, n = param_val.val:gsub ('%-', '–'); -- replace any hyphen with ndash
if 0 ~= n then
date_parameters_list[param_name].val = param_val.val; -- update the list
result = true;
end
end
end
return result; -- so we know if any hyphens were replaced
end
--[[-------------------------< D A T E _ N A M E _ X L A T E >------------------------------------------------
Attempts to translate English date names to local-language date names using names supplied by MediaWiki's
date parser function. This is simple name-for-name replacement and may not work for all languages.
if xlat_dig is true, this function will also translate Western (English) digits to the local language's digits.
This will also translate ymd dates.
]]
local function date_name_xlate (date_parameters_list, xlt_dig)
local xlate;
local mode; -- long or short month names
local modified = false;
local date;
local sources_t = {
{cfg.date_names.en.long, cfg.date_names.inv_local_long}, -- for translating long English month names to long local month names
{cfg.date_names.en.short, cfg.date_names.inv_local_short}, -- short month names
{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter}, -- quarter date names
{cfg.date_names.en.season, cfg.date_names.inv_local_season}, -- season date nam
{cfg.date_names.en.named, cfg.date_names.inv_local_named}, -- named dates
}
local function is_xlateable (month) -- local function to get local date name that replaces existing English-language date name
for _, date_names_t in ipairs (sources_t) do -- for each sequence table in date_names_t
if date_names_t[1][month] then -- if date name is English month (long or short), quarter, season or named and
if date_names_t[2][date_names_t[1][month]] then -- if there is a matching local date name
return date_names_t[2][date_names_t[1][month]]; -- return the local date name
end
end
end
end
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(param_val.val) then -- if the parameter has a value
date = param_val.val;
for month in mw.ustring.gmatch (date, '[%a ]+') do -- iterate through all date names in the date (single date or date range)
month = mw.text.trim (month); -- this because quarterly dates contain whitespace
xlate = is_xlateable (month); -- get translate <month>; returns translation or nil
if xlate then
date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
if xlt_dig then -- shall we also translate digits?
date = date:gsub ('%d', cfg.date_names.xlate_digits); -- translate digits from Western to 'local digits'
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
end
return modified;
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
add_prop_cat = utilities_page_ptr.add_prop_cat ; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
set_message = utilities_page_ptr.set_message;
substitute = utilities_page_ptr.substitute;
wrap_style = utilities_page_ptr.wrap_style;
cfg = cfg_table_ptr; -- import tables from selected Module:Citation/CS1/Configuration
end
--[[--------------------------< A R C H I V E _ D A T E _ C H E C K >------------------------------------------
Compare value in |archive-date= with the timestamp in Wayback machine urls. Emits an error message with suggested
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match
the timestamp.
this function never called when any date in a cs1|2 template has errors
error message suggests new |archive-date= value in an appropriate format specified by <df>. <df> is either
|df= or cfg.global_df in that order. If <df> is nil, suggested date has format from |archive-date=. There is
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format
is not changed.
]]
local function archive_date_check (archive_date, archive_url_timestamp, df)
local archive_date_format = 'dmy-y'; -- holds the date format of date in |archive-date; default to ymd; 'dmy' used here to spoof reformat_dates()
for _, v_t in ipairs ({{'dMy', 'dmy-all'}, {'Mdy', 'mdy-all'}}) do -- is |archive-date= format dmy or mdy?
if archive_date:match (patterns_t[v_t[1]][1]) then -- does the pattern match?
archive_date_format = cfg.keywords_xlate[v_t[2]]; -- get appropriate |df= supported keyword from the i18n translator table
break;
end
end
local dates_t = {};
dates_t['archive-date'] = {val=archive_date, name=''}; -- setup to call reformat_dates(); never called when errors so <name> unset as not needed
reformat_dates (dates_t, 'dmy-y'); -- reformat |archive-date= to ymd; 'dmy' used here to spoof reformat_dates()
local archive_url_date = archive_url_timestamp:gsub ('(%d%d%d%d)(%d%d)(%d%d)%d*', '%1-%2-%3'); -- make ymd format date from timestamp
if dates_t['archive-date'].val == archive_url_date then -- are the two dates the same
return; -- yes, done
else
dates_t['archive-date'] = {val=archive_url_date, name=''}; -- setup to call reformat_dates() with the timestamp date
reformat_dates (dates_t, df or archive_date_format); -- reformat timestamp to format specified by <df> or format used in |archive-date=
archive_url_date = dates_t['archive-date'].val;
set_message ('err_archive_date_url_ts_mismatch', archive_url_date); -- emit an error message
end
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return { -- return exported functions
archive_date_check = archive_date_check,
date_hyphen_to_dash = date_hyphen_to_dash,
date_name_xlate = date_name_xlate,
dates = dates,
is_valid_date = is_valid_date,
reformat_dates = reformat_dates,
set_selected_modules = set_selected_modules,
year_check = year_check,
year_date_check = year_date_check,
}
039z8dc7ugbbv8w4tsnejz5bfud8dgw
392039
392036
2026-08-07T06:56:17Z
محک
1023
z.ai
392039
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style; -- imported functions from selected Module:Citation/CS1/Utilities
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration
--[[--------------------------< F I L E - S C O P E D E C L A R A T I O N S >--------------------------------
File-scope variables are declared here
]]
local lang_object = mw.getContentLanguage(); -- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?
local year_limit; -- used by is_valid_year()
--[=[-------------------------< I S _ V A L I D _ A C C E S S D A T E >----------------------------------------
returns true if:
Wikipedia start date <= accessdate < today + 2 days
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)
accessdate is the date provided in |access-date= at time 00:00:00 UTC
today is the current date at time 00:00:00 UTC plus 48 hours
if today is 2015-01-01T00:00:00 then
adding 24 hours gives 2015-01-02T00:00:00 – one second more than today
adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow
This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser
apparently doesn't understand non-English date month names. This function will always return false when the date
contains a non-English month name because good1 is false after the call to lang.formatDate(). To get around that
call this function with YYYY-MM-DD format dates.
]=]
local function is_valid_accessdate (accessdate)
local good1, good2;
local access_ts, tomorrow_ts; -- to hold Unix time stamps representing the dates
good1, access_ts = pcall (lang_object.formatDate, lang_object, 'U', accessdate ); -- convert accessdate value to Unix timestamp
good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, 'U', 'today + 2 days' ); -- today midnight + 2 days is one second more than all day tomorrow
if good1 and good2 then -- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand
access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts); -- convert to numbers for the comparison;
tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);
else
return false; -- one or both failed to convert to Unix time stamp
end
if 979516800 <= access_ts and access_ts < tomorrow_ts then -- Wikipedia start date <= accessdate < tomorrow's date
return true;
else
return false; -- accessdate out of range
end
end
--[[--------------------------< G E T _ M O N T H _ N U M B E R >----------------------------------------------
returns a number according to the month in a date: 1 for January, etc. Capitalization and spelling must be correct.
If not a valid month, returns 0
]]
local function get_month_number (month)
return cfg.date_names['local'].long[month] or cfg.date_names['local'].short[month] or -- look for local names first
cfg.date_names['en'].long[month] or cfg.date_names['en'].short[month] or -- failing that, look for English names
0; -- not a recognized month name
end
--[[--------------------------< G E T _ S E A S O N _ N U M B E R >--------------------------------------------
returns a number according to the sequence of seasons in a year: 21 for Spring, etc. Capitalization and spelling
must be correct. If not a valid season, returns 0.
21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”
returns 0 when <param> is not |date=
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons. EDTF does support the distinction between north and south
hemisphere seasons but cs1|2 has no way to make that distinction.
These additional divisions not currently supported:
25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere
29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_season_number (season, param)
if 'date' ~= param then
return 0; -- season dates only supported by |date=
end
return cfg.date_names['local'].season[season] or -- look for local names first
cfg.date_names['en'].season[season] or -- failing that, look for English names
0; -- not a recognized season name
end
--[[--------------------------< G E T _ Q U A R T E R _ N U M B E R >------------------------------------------
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc. Capitalization and spelling
must be correct. If not a valid quarter, returns 0.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
returns 0 when <param> is not |date=
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons and quarters.
These additional divisions not currently supported:
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_quarter_number (quarter, param)
if 'date' ~= param then
return 0; -- quarter dates only supported by |date=
end
quarter = mw.ustring.gsub (quarter, ' +', ' '); -- special case replace multiple space chars with a single space char
return cfg.date_names['local'].quarter[quarter] or -- look for local names first
cfg.date_names['en'].quarter[quarter] or -- failing that, look for English names
0; -- not a recognized quarter name
end
--[[--------------------------< G E T _ P R O P E R _ N A M E _ N U M B E R >----------------------------------
returns a non-zero number if date contains a recognized proper-name. Capitalization and spelling must be correct.
returns 0 when <param> is not |date=
]]
local function get_proper_name_number (name, param)
if 'date' ~= param then
return 0; -- proper-name dates only supported by |date=
end
return cfg.date_names['local'].named[name] or -- look for local names dates first
cfg.date_names['en'].named[name] or -- failing that, look for English names
0; -- not a recognized named date
end
--[[--------------------------< G E T _ E L E M E N T _ N U M B E R <------------------------------------------
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)
]]
local function get_element_number (element, param)
local num;
local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number}; -- list of functions to execute in order
for _, func in ipairs (funcs) do -- spin through the function list
num = func (element, param); -- call the function and get the returned number
if 0 ~= num then -- non-zero when valid month season quarter
return num; -- return that number
end
end
return nil; -- not valid
end
--[[--------------------------< I S _ V A L I D _ Y E A R >----------------------------------------------------
Function gets current year from the server and compares it to year from a citation parameter. Years more than one
year in the future are not acceptable.
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable
]]
local function is_valid_year (year, param)
if not is_set (year_limit) then
year_limit = tonumber(os.date("%Y"))+1; -- global variable so we only have to fetch it once
end
year = tonumber (year) or lang_object:parseFormattedNumber (year); -- convert to number for the comparison
if year and (100 > year) then -- years less than 100 not supported
return false;
end
if 'pmc-embargo-date' == param then -- special case for |pmc-embargo-date=
return year and (year <= tonumber(os.date("%Y"))+2) or false; -- years more than two years in the future are not accepted
end
return year and (year <= year_limit) or false;
end
--[[--------------------------< I S _ V A L I D _ D A T E >----------------------------------------------------
Returns true if day is less than or equal to the number of days in month and year is no farther into the future
than next year; else returns false.
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately
1923) dates are assumed to be Gregorian.
]]
local function is_valid_date (year, month, day, param)
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
local month_length;
if not is_valid_year (year, param) then -- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future
return false;
end
month = tonumber (month); -- required for YYYY-MM-DD dates
if (2 == month) then -- if February
month_length = 28; -- then 28 days unless
if 1582 > tonumber(year) then -- Julian calendar
if 0 == (year%4) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
else -- Gregorian calendar
if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
end
else
month_length = days_in_month[month] or 0; -- invalid month number is nil so default <month_length> to 0
end
if tonumber (day) > month_length then
return false;
end
return true;
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E >--------------------------
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August.
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are
listed in the short subtable. When both have the same style (both are listed in the same table), returns true; false else
]]
local function is_valid_month_range_style (month1, month2)
if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or -- are both English names listed in the long subtable?
(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or -- are both English names listed in the short subtable?
(cfg.date_names['local'].long[month1] and cfg.date_names['local'].long[month2]) or -- are both local names listed in the long subtable?
(cfg.date_names['local'].short[month1] and cfg.date_names['local'].short[month2]) then -- are both local names listed in the short subtable?
return true;
end
return false; -- names are mixed
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E >------------------------
Check a pair of months or seasons to see if both are valid members of a month or season pair.
Month pairs are expected to be left to right, earliest to latest in time.
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok
]]
local function is_valid_month_season_range(range_start, range_end, param)
local range_start_number = get_month_number (range_start);
local range_end_number;
if 0 == range_start_number then -- is this a month range?
range_start_number = get_season_number (range_start, param); -- not a month; is it a season? get start season number
range_end_number = get_season_number (range_end, param); -- get end season number
if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then
return true; -- any season pairing is accepted except when both are the same
end
return false; -- range_start and/or range_end is not a season
end
-- here when range_start is a month
range_end_number = get_month_number (range_end); -- get end month number
if range_start_number < range_end_number and -- range_start is a month; does range_start precede range_end?
is_valid_month_range_style (range_start, range_end) then -- do months have the same style?
return true; -- proper order and same style
end
return false; -- range_start month number is greater than or equal to range end number; or range end isn't a month
end
--[[--------------------------< M A K E _ C O I N S _ D A T E >------------------------------------------------
This function receives a table of date parts for one or two dates and an empty table reference declared in
Module:Citation/CS1. The function is called only for |date= parameters and only if the |date=<value> is
determined to be a valid date format. The question of what to do with invalid date formats is not answered here.
The date parts in the input table are converted to an ISO 8601 conforming date string:
single whole dates: yyyy-mm-dd
month and year dates: yyyy-mm
year dates: yyyy
ranges: yyyy-mm-dd/yyyy-mm-dd
yyyy-mm/yyyy-mm
yyyy/yyyy
Dates in the Julian calendar are reduced to year or year/year so that we don't have to do calendar conversion from
Julian to Proleptic Gregorian.
The input table has:
year, year2 – always present; if before 1582, ignore months and days if present
month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas
day, day2 – 0 if not provided, 1-31 for days
the output table receives:
rftdate: an ISO 8601 formatted date
rftchron: a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)
rftssn: one of four season keywords: winter, spring, summer, fall (lowercase)
rftquarter: one of four values: 1, 2, 3, 4
]]
local function make_COinS_date (input, tCOinS_date)
local date; -- one date or first date in a range
local date2 = ''; -- end of range date
input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year); -- language-aware tonumber()
input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2); -- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals
if ((1582 == input.year) and (10 > tonumber(input.month))) or (1582 > input.year) then -- if a Julian calendar date
tCOinS_date.rftdate = tostring (input.year); -- &rft.date gets year only
return; -- done
end
-- here for all forms of Gregorian dates
if 20 < tonumber (input.month) then -- if season, quarter, or proper-name date
date = input.year; -- &rft.date gets year only
if 0 ~= input.year2 and input.year ~= input.year2 then -- if a range, only the second year portion when not the same as range start year
date = string.format ('%.4d/%.4d', input.year, input.year2) -- assemble the date range
end
local season = {[24] = 'winter', [21] = 'spring', [22] = 'summer', [23] = 'fall', [33] = '1', [34] = '2', [35] = '3', [36] = '4', [98] = 'Easter', [99] = 'Christmas'}; -- seasons lowercase, no autumn; proper-names use title case
if 0 == input.month2 then -- single season, quarter, or proper-name date
if 40 < tonumber(input.month) then
tCOinS_date.rftchron = season[input.month]; -- proper-name date; used in journal metadata only
elseif 30 < tonumber(input.month) then
tCOinS_date.rftquarter = season[input.month]; -- quarter date; used in journal metadata only
else
tCOinS_date.rftssn = season[input.month]; -- season date; used in journal metadata only
end
else -- season ranges are lumped into &rft.chron; &rft.ssn and &rft.quarter are left blank
if input.year ~= input.year2 then -- season year – season year range or season year–year
if 0 ~= input.month2 then
tCOinS_date.rftchron = string.format ('%s %s – %s %s', season[input.month], input.year, season[input.month2], input.year2); -- used in journal metadata only
end
else -- season–season year range
tCOinS_date.rftchron = season[input.month] .. '–' .. season[input.month2]; -- season–season year range; used in journal metadata only
end
end
tCOinS_date.rftdate = tostring (date);
return; -- done
end
-- here for gregorian calendar dates
if 0 ~= input.day then
date = string.format ('%s-%.2d-%.2d', input.year, tonumber(input.month), tonumber(input.day)); -- whole date
elseif 0 ~= input.month then
date = string.format ('%s-%.2d', input.year, tonumber(input.month)); -- year and month
else
date = string.format ('%s', input.year); -- just year
end
if 0 ~= input.year2 then
if 0 ~= input.day2 then
date2 = string.format ('/%s-%.2d-%.2d', input.year2, tonumber(input.month2), tonumber(input.day2)); -- whole date
elseif 0 ~= input.month2 then
date2 = string.format ('/%s-%.2d', input.year2, tonumber(input.month2)); -- year and month
else
date2 = string.format ('/%s', input.year2); -- just year
end
end
tCOinS_date.rftdate = date .. date2; -- date2 has the '/' separator
return;
end
--[[--------------------------< P A T T E R N S _ T >----------------------------------------------------------
this is the list of patterns for date formats that this module recognizes. Approximately the first half of these
patterns represent formats that might be reformatted into another format. Those that might be reformatted have
'indicator' letters that identify the content of the matching capture: 'd' (day), 'm' (month), 'a' (anchor year),
'y' (year); second day, month, year have a '2' suffix.
These patterns are used for both date validation and for reformatting. This table should not be moved to ~/Configuration
because changes to this table require changes to check_date() and to reformatter() and reformat_date()
]]
local patterns_t = {
-- year-initial numerical year-month-day
['ymd'] = {'^([1-9]%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'},
-- month-initial: month day, year
['Mdy'] = {'^(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'a', 'y'},
-- month-initial day range: month day–day, year; days are separated by endash
['Md-dy'] = {'^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'd2', 'a', 'y'},
-- day-initial: day month year
['dMy'] = {'^([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'a', 'y'},
-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki
-- ['yMd'] = {'^(([1-9]%d%d%d?)%a?) +(%D-) +(%d%d?)$', 'a', 'y', 'm', 'd'},
-- day-range-initial: day–day month year; days are separated by endash
['d-dMy'] = {'^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'd2', 'm', 'a', 'y'},
-- day initial month-day-range: day month - day month year; uses spaced endash
['dM-dMy'] = {'^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'd2', 'm2', 'a', 'y'},
-- month initial month-day-range: month day – month day, year; uses spaced endash
['Md-Mdy'] = {'^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$','m', 'd', 'm2', 'd2', 'a', 'y'},
-- day initial month-day-year-range: day month year - day month year; uses spaced endash
['dMy-dMy'] = {'^([1-9]%d?) +(%D-) +([1-9]%d%d%d?) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'y', 'd2', 'm2', 'a', 'y2'},
-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
['Mdy-Mdy'] = {'^(%D-) +([1-9]%d?), +([1-9]%d%d%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'y', 'm2', 'd2', 'a', 'y2'},
-- these date formats cannot be converted, per se, but month name can be rendered short or long
-- month/season year - month/season year; separated by spaced endash
['My-My'] = {'^(%D-) +([1-9]%d%d%d?) +[%-–] +(%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'y', 'm2', 'a', 'y2'},
-- month/season range year; months separated by endash
['M-My'] = {'^(%D-)[%-–](%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'm2', 'a', 'y'},
-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.
['My'] = {'^([^%d–]-) +(([1-9]%d%d%d?)%a?)$', 'm', 'a', 'y'}, -- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn't
-- these date formats cannot be converted
['Sy4-y2'] = {'^(%D-) +(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
['Sy-y'] = {'^(%D-) +([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- special case Winter/Summer year-year; year separated with unspaced endash
['y-y'] = {'^([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
['y4-y2'] = {'^(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- year range: YYYY–YY; separated by unspaced endash
['y'] = {'^(([1-9]%d%d%d?)%a?)$'}, -- year; here accept either YYY or YYYY
}
--[[--------------------------< I S _ V A L I D _ E M B A R G O _ D A T E >------------------------------------
returns true and date value if that value has proper dmy, mdy, ymd format.
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.
]]
local function is_valid_embargo_date (v)
if v:match (patterns_t['ymd'][1]) or -- ymd
v:match (patterns_t['Mdy'][1]) or -- dmy
v:match (patterns_t['dMy'][1]) then -- mdy
return true, v;
end
return false, '9999'; -- if here not good date so return false and set embargo date to long time in future
end
--[[--------------------------< C H E C K _ D A T E >----------------------------------------------------------
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only
allowed range separator is endash. Additionally, check the date to see that it is a real date: no 31 in 30-day
months; no 29 February when not a leap year. Months, both long-form and three character abbreviations, and seasons
must be spelled correctly. Future years beyond next year are not allowed.
If the date fails the format tests, this function returns false and does not return values for anchor_year and
COinS_date. When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets
its year from the year parameter if present otherwise CITEREF does not get a date value.
Inputs:
date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)
Returns:
false if date string is not a real date; else
true, anchor_year, COinS_date
anchor_year can be used in CITEREF anchors
COinS_date is ISO 8601 format date; see make_COInS_date()
]]
local function check_date (date_string, param, tCOinS_date)
local year; -- assume that year2, months, and days are not used;
local year2 = 0; -- second year in a year range
local month = 0;
local month2 = 0; -- second month in a month range
local day = 0;
local day2 = 0; -- second day in a day range
local anchor_year;
local coins_date;
if date_string:match (patterns_t['ymd'][1]) then -- year-initial numerical year month day format
year, month, day = date_string:match (patterns_t['ymd'][1]);
if 12 < tonumber(month) or 1 > tonumber(month) or 1582 > tonumber(year) or 0 == tonumber(day) then return false; end -- month or day number not valid or not Gregorian calendar
anchor_year = year;
elseif mw.ustring.match(date_string, patterns_t['Mdy'][1]) then -- month-initial: month day, year
month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t['Mdy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
elseif mw.ustring.match(date_string, patterns_t['Md-dy'][1]) then -- month-initial day range: month day–day, year; days are separated by endash
month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-dy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2=month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy'][1]) then -- day-initial: day month year
day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['dMy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
--[[ NOT supported at en.wiki
elseif mw.ustring.match(date_string, patterns_t['yMd'][1]) then -- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed
anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t['yMd'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
-- end NOT supported at en.wiki ]]
elseif mw.ustring.match(date_string, patterns_t['d-dMy'][1]) then -- day-range-initial: day–day month year; days are separated by endash
day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['d-dMy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2 = month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dM-dMy'][1]) then -- day initial month-day-range: day month - day month year; uses spaced endash
day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['dM-dMy'][1]);
if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end -- date range order is left to right: earlier to later;
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]) then -- month initial month-day-range: month day – month day, year; uses spaced endash
month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]);
if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]) then -- day initial month-day-year-range: day month year - day month year; uses spaced endash
day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]) then -- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]) then -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
local century;
month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]);
if 'Winter' ~= month and 'Summer' ~= month then return false end; -- 'month' can only be Winter or Summer
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
year2 = century..year2; -- add the century to year2 for comparisons
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
month = get_season_number(month, param);
elseif mw.ustring.match(date_string, patterns_t['Sy-y'][1]) then -- special case Winter/Summer year-year; year separated with unspaced endash
month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy-y'][1]);
month = get_season_number (month, param); -- <month> can only be winter or summer; also for metadata
if (month ~= cfg.date_names['en'].season['Winter']) and (month ~= cfg.date_names['en'].season['Summer']) then
return false; -- not Summer or Winter; abandon
end
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['My-My'][1]) then -- month/season year - month/season year; separated by spaced endash
month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['My-My'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then -- both must be month year, same month style
month = get_month_number(month);
month2 = get_month_number(month2);
elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then -- both must be season year, not mixed
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
else
return false;
end
elseif mw.ustring.match(date_string, patterns_t['M-My'][1]) then -- month/season range year; months separated by endash
month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['M-My'][1]);
if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end
if 0 ~= get_month_number(month) then -- determined to be a valid range so just check this one to know if month or season
month = get_month_number(month);
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end
else
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
end
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['My'][1]) then -- month/season/quarter/proper-name year
month, anchor_year, year = mw.ustring.match(date_string, patterns_t['My'][1]);
if not is_valid_year(year) then return false; end
month = get_element_number(month, param); -- get month season quarter proper-name number or nil
if not month then return false; end -- not valid whatever it is
elseif mw.ustring.match(date_string, patterns_t['y-y'][1]) then -- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y-y'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['y4-y2'][1]) then -- Year range: YYYY–YY; separated by unspaced endash
local century;
year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y4-y2'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if 13 > tonumber(year2) then return false; end -- don't allow 2003-05 which might be May 2003
year2 = century .. year2; -- add the century to year2 for comparisons
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if in_array (param, {'date', 'publication-date', 'year'}) then -- here when 'valid' abbreviated year range; if one of these parameters
add_prop_cat ('year-range-abbreviated'); -- add properties cat
end
elseif mw.ustring.match(date_string, patterns_t['y'][1]) then -- year; here accept either YYY or YYYY
anchor_year, year = mw.ustring.match(date_string, patterns_t['y'][1]);
if false == is_valid_year(year) then
return false;
end
else
return false; -- date format not one of the MOS:DATE approved formats
end
if param ~= 'date' then -- CITEREF disambiguation only allowed in |date=; |year= & |publication-date= promote to date
if anchor_year:match ('%l$') then
return false;
end
end
if 'access-date' == param then -- test access-date here because we have numerical date parts
if 0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2 then -- none of these; access-date must not be a range
if not is_valid_accessdate(year .. '-' .. month .. '-' .. day) then
return false; -- return false when access-date out of bounds
end
else
return false; -- return false when access-date is a range of two dates
end
end
if 'archive-date' == param then -- test archive-date here because we have numerical date parts
if not (0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2) then -- none of these; archive-date must not be a range
return false; -- return false when archive-date is a range of two dates
end
end
local result=true; -- check whole dates for validity; assume true because not all dates will go through this test
if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD (simple whole date)
result = is_valid_date (year, month, day, param); -- <param> for |pmc-embargo-date=
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then -- YMD-d (day range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-md (day month range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month2, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-ymd (day month year range)
result = is_valid_date(year, month, day);
result = result and is_valid_date(year2, month2, day2);
end
if false == result then return false; end
if nil ~= tCOinS_date then -- this table only passed into this function when testing |date= parameter values
make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date); -- make an ISO 8601 date string for COinS
end
return true, anchor_year; -- format is good and date string represents a real date
end
--[[--------------------------< D A T E S >--------------------------------------------------------------------
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in
the COinS metadata) are derived. The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords "n.d." or "nd" (without quotes).
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,
parameters with errors are added to the <error_list> sequence table as the dates are tested.
]]
local function dates(date_parameters_list, tCOinS_date, error_list)
local anchor_year; -- will return as nil if the date being tested is not |date=
local COinS_date; -- will return as nil if the date being tested is not |date=
local embargo_date; -- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999
local good_date = false;
for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(v.val) then -- if the parameter has a value
v.val = mw.ustring.gsub(v.val, '%d', cfg.date_names.local_digits); -- translate 'local' digits to Western 0-9
v.val = mw.ustring.gsub (v.val, '%[%[([^%]|]*)|([^%]]*)%]%]', '%2'); -- remove wikilinks [[X|Y]] -> Y
v.val = mw.ustring.gsub (v.val, '%[%[([^%]|]*)%]%]', '%1'); -- remove wikilinks [[X]] -> X
v.val = mw.ustring.gsub (v.val, '%s+', ' '); -- clean extra spaces
if v.val:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
local year = v.val:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
if 'date' == k then
anchor_year, COinS_date = v.val:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
good_date = is_valid_year(year);
elseif 'year' == k then
good_date = is_valid_year(year);
else
good_date = false;
end
elseif 'date' == k then -- if the parameter is |date=
if v.val:match("^n%.d%.%a?$") then -- ToDo: I18N -- if |date=n.d. with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((n%.d%.)%a?)"); -- ToDo: I18N -- "n.d."; no error when date parameter is set to no date
elseif v.val:match("^nd%a?$") then -- ToDo: I18N -- if |date=nd with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((nd)%a?)"); -- ToDo: I18N -- "nd"; no error when date parameter is set to no date
else
good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date); -- go test the date
end
elseif 'year' == k then -- if the parameter is |year= it should hold only a year value
if v.val:match("^[1-9]%d%d%d?%a?$") then -- if |year = 3 or 4 digits only with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((%d+)%a?)");
else
good_date = false;
end
elseif 'pmc-embargo-date' == k then -- if the parameter is |pmc-embargo-date=
good_date = check_date (v.val, k); -- go test the date
if true == good_date then -- if the date is a valid date
good_date, embargo_date = is_valid_embargo_date (v.val); -- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999
end
else -- any other date-holding parameter
good_date = check_date (v.val, k); -- go test the date
end
if false == good_date then -- assemble one error message so we don't add the tracking category multiple times
table.insert (error_list, wrap_style ('parameter', v.name)); -- make parameter name suitable for error message list
end
end
end
return anchor_year, embargo_date; -- and done
end
--[[--------------------------< Y E A R _ C H E C K >----------------------------------------------------------
Temporary function to test |year= for acceptable values:
YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-
less useless
]]
local function year_check (year)
year = year:gsub ('c%. *', ''); -- remove circa annotation (if present) before testing <year>
for _, index in ipairs ({'y-y', 'y4-y2', 'y'}) do -- spin through these indexes into patterns_t
if mw.ustring.match (year, patterns_t[index][1]) then
return; -- if a match then |year= holds a valid 'year'
end
end
set_message ('maint_year'); -- if here, |year= value is not an accepted value; add a maint cat
end
--[[--------------------------< Y E A R _ D A T E _ C H E C K >------------------------------------------------
Compare the value provided in |year= with the year value(s) provided in |date=. This function sets a local numeric value:
0 - year value does not match the year value in date
1 - (default) year value matches the year value in date or one of the year values when date contains two years
2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)
the numeric value in <result> determines the 'output' if any from this function:
0 – adds error message to error_list sequence table
1 – adds maint cat
2 – does nothing
]]
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)
local year;
local date1;
local date2;
local result = 1; -- result of the test; assume that the test passes
year = year_string:match ('(%d%d%d%d?)');
if date_string:match ('%d%d%d%d%-%d%d%-%d%d') then --special case where both date and year are required YYYY-MM-DD and YYYYx
date1 = date_string:match ('(%d%d%d%d)');
year = year_string:match ('(%d%d%d%d)');
if year ~= date1 then
result = 0; -- years don't match
elseif year_string:match ('%d%d%d%d%a') then
result = 2; -- years match; but because disambiguated, don't add to maint cat
end
elseif date_string:match ("%d%d%d%d?.-%d%d%d%d?") then -- any of the standard range formats of date with two three- or four-digit years
date1, date2 = date_string:match ("(%d%d%d%d?).-(%d%d%d%d?)");
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif mw.ustring.match(date_string, "%d%d%d%d[%-–]%d%d") then -- YYYY-YY date ranges
local century;
date1, century, date2 = mw.ustring.match(date_string, "((%d%d)%d%d)[%-–]+(%d%d)");
date2 = century..date2; -- convert YY to YYYY
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif date_string:match ("%d%d%d%d?") then -- any of the standard formats of date with one year
date1 = date_string:match ("(%d%d%d%d?)");
if year ~= date1 then
result = 0;
end
else -- should never get here; this function called only when no other date errors
result = 0; -- no recognizable year in date
end
if 0 == result then -- year / date mismatch
table.insert (error_list, substitute (cfg.messages['mismatch'], {year_origin, date_origin})); -- add error message to error_list sequence table
elseif 1 == result then -- redundant year / date
set_message ('maint_date_year'); -- add a maint cat
end
end
--[[--------------------------< R E F O R M A T T E R >--------------------------------------------------------
reformat 'date' into new format specified by format_param if pattern_idx (the current format of 'date') can be
reformatted. Does the grunt work for reformat_dates().
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:
format string used by string.format()
identifier letters ('d', 'm', 'y', 'd2', 'm2', 'y2') that serve as indexes into a table t{} that holds captures
from mw.ustring.match() for the various date parts specified by patterns_t[pattern_idx][1]
Items in patterns_t{} have the general form:
['ymd'] = {'^(%d%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'}, where:
['ymd'] is pattern_idx
patterns_t['ymd'][1] is the match pattern with captures for mw.ustring.match()
patterns_t['ymd'][2] is an indicator letter identifying the content of the first capture
patterns_t['ymd'][3] ... the second capture etc.
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier
characters as indexes into t{} For the above, a ymd date is in t{} as:
t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)
To reformat, this function is called with the pattern_idx that matches the current format of the date and with
format_param set to the desired format. This function loads table t{} as described and then calls string.format()
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..
]]
local re_formats = {
['ymd'] = { -- date format is ymd; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Mdy'] = { -- date format is Mdy; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['dMy'] = { -- date format is dMy; reformat to:
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Md-dy'] = { -- date format is Md-dy; reformat to:
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- |df=dmy -> d-dMy
},
['d-dMy'] = { -- date format is d-d>y; reformat to:
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- |df=mdy -> Md-dy
},
['dM-dMy'] = { -- date format is dM-dMy; reformat to:
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- |df=mdy -> Md-Mdy
},
['Md-Mdy'] = { -- date format is Md-Mdy; reformat to:
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- |df=dmy -> dM-dMy
},
['dMy-dMy'] = { -- date format is dMy-dMy; reformat to:
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- |df=mdy -> Mdy-Mdy
},
['Mdy-Mdy'] = { -- date format is Mdy-Mdy; reformat to:
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- for long/short reformatting
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- |df=dmy -> dMy-dMy
},
['My-My'] = { -- these for long/short reformatting
['any'] = {'%s %s – %s %s', 'm', 'y', 'm2', 'y2'}, -- dmy/mdy agnostic
},
['M-My'] = { -- these for long/short reformatting
['any'] = {'%s–%s %s', 'm', 'm2', 'y'}, -- dmy/mdy agnostic
},
['My'] = { -- these for long/short reformatting
['any'] = {'%s %s', 'm', 'y'}, -- dmy/mdy agnostic
},
-- ['yMd'] = { -- not supported at en.wiki
-- ['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
-- ['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- },
}
local function reformatter (date, pattern_idx, format_param, mon_len)
if not in_array (pattern_idx, {'ymd', 'Mdy', 'Md-dy', 'dMy', 'yMd', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- not in this set of date format patterns_t then not a reformattable date
end
if 'ymd' == format_param and in_array (pattern_idx, {'ymd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd
end
if in_array (pattern_idx, {'My', 'M-My', 'My-My'}) then -- these are not dmy/mdy so can't be 'reformatted' into either
format_param = 'any'; -- so format-agnostic
end
-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line
-- if 'yMd' == format_param and in_array (pattern_idx, {'yMd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy'}) then -- these formats not convertable; yMd not supported at en.wiki
if 'yMd' == format_param then -- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line
return; -- not a reformattable date
end
local c1, c2, c3, c4, c5, c6, c7; -- these hold the captures specified in patterns_t[pattern_idx][1]
c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]); -- get the captures
local t = { -- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]
[patterns_t[pattern_idx][2]] = c1; -- at minimum there is always one capture with a matching indicator letter
[patterns_t[pattern_idx][3] or 'x'] = c2; -- patterns_t can have a variable number of captures; each capture requires an indicator letter;
[patterns_t[pattern_idx][4] or 'x'] = c3; -- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;
[patterns_t[pattern_idx][5] or 'x'] = c4; -- the 'x' here spoofs an indicator letter to prevent 'table index is nil' error
[patterns_t[pattern_idx][6] or 'x'] = c5;
[patterns_t[pattern_idx][7] or 'x'] = c6;
[patterns_t[pattern_idx][8] or 'x'] = c7;
};
if t.a then -- if this date has an anchor year capture (all convertable date formats except ymd)
if t.y2 then -- for year range date formats
t.y2 = t.a; -- use the anchor year capture when reassembling the date
else -- here for single date formats (except ymd)
t.y = t.a; -- use the anchor year capture when reassembling the date
end
end
if tonumber(t.m) then -- if raw month is a number (converting from ymd)
if 's' == mon_len then -- if we are to use abbreviated month names
t.m = cfg.date_names['inv_local_short'][tonumber(t.m)]; -- convert it to a month name
else
t.m = cfg.date_names['inv_local_long'][tonumber(t.m)]; -- convert it to a month name
end
t.d = t.d:gsub ('0(%d)', '%1'); -- strip leading '0' from day if present
elseif 'ymd' == format_param then -- when converting to ymd
t.y = t.y:gsub ('%a', ''); -- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?
if 1582 > tonumber (t.y) then -- ymd format dates not allowed before 1582
return;
end
t.m = string.format ('%02d', get_month_number (t.m)); -- make sure that month and day are two digits
t.d = string.format ('%02d', t.d);
elseif mon_len then -- if mon_len is set to either 'short' or 'long'
for _, mon in ipairs ({'m', 'm2'}) do -- because there can be two month names, check both
if t[mon] then
t[mon] = get_month_number (t[mon]); -- get the month number for this month (is length agnostic)
if 0 == t[mon] then return; end -- seasons and named dates can't be converted
t[mon] = (('s' == mon_len) and cfg.date_names['inv_local_short'][t[mon]]) or cfg.date_names['inv_local_long'][t[mon]]; -- fetch month name according to length
end
end
end
local new_date = string.format (re_formats[pattern_idx][format_param][1], -- format string
t[re_formats[pattern_idx][format_param][2]], -- named captures from t{}
t[re_formats[pattern_idx][format_param][3]],
t[re_formats[pattern_idx][format_param][4]],
t[re_formats[pattern_idx][format_param][5]],
t[re_formats[pattern_idx][format_param][6]],
t[re_formats[pattern_idx][format_param][7]],
t[re_formats[pattern_idx][format_param][8]]
);
return new_date;
end
--[[-------------------------< R E F O R M A T _ D A T E S >--------------------------------------------------
Reformats existing dates into the format specified by format.
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all. The -all version includes
access- and archive-dates; otherwise these dates are not reformatted.
This function allows automatic date formatting. In ~/Configuration, the article source is searched for one of
the {{use xxx dates}} templates. If found, xxx becomes the global date format as xxx-all. If |cs1-dates= in
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered. Legitimate
values for |cs1-dates= are:
l - all dates are rendered with long month names
ls - publication dates use long month names; access-/archive-dates use abbreviated month names
ly - publication dates use long month names; access-/archive-dates rendered in ymd format
s - all dates are rendered with abbreviated (short) month names
sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format
y - all dates are rendered in ymd format
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the
list in the new format. Dates in date_parameters_list are presumed here to be valid (no errors). This function
returns true when a date has been reformatted, false else. Actual reformatting is done by reformatter().
]]
local function reformat_dates (date_parameters_list, format)
local all = false; -- set to false to skip access- and archive-dates
local len_p = 'l'; -- default publication date length shall be long
local len_a = 'l'; -- default access-/archive-date length shall be long
local result = false;
local new_date;
if format:match('%a+%-all') then -- manual df keyword; auto df keyword when length not specified in {{use xxx dates}};
format = format:match('(%a+)%-all'); -- extract the format
all = true; -- all dates are long format dates because this keyword doesn't specify length
elseif format:match('%a+%-[lsy][sy]?') then -- auto df keywords; internal only
all = true; -- auto df applies to all dates; use length specified by capture len_p for all dates
format, len_p, len_a = format:match('(%a+)%-([lsy])([sy]?)'); -- extract the format and length keywords
if 'y' == len_p then -- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted
format = 'ymd'; -- override {{use xxx dates}}
elseif (not is_set(len_a)) or (len_p == len_a) then -- no access-/archive-date length specified or same length as publication dates then
len_a = len_p; -- in case len_a not set
end
end -- else only publication dates and they are long
for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) then -- if the parameter has a value
if not (not all and in_array (param_name, {'access-date', 'archive-date'})) then -- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way
for pattern_idx, pattern in pairs (patterns_t) do
if mw.ustring.match (param_val.val, pattern[1]) then
if all and in_array (param_name, {'access-date', 'archive-date'}) then -- if this date is an access- or archive-date
new_date = reformatter (param_val.val, pattern_idx, (('y' == len_a) and 'ymd') or format, len_a); -- choose ymd or dmy/mdy according to len_a setting
else -- all other dates
new_date = reformatter (param_val.val, pattern_idx, format, len_p);
end
if new_date then -- set when date was reformatted
date_parameters_list[param_name].val = new_date; -- update date in date list
result = true; -- and announce that changes have been made
break;
end
end -- if
end -- for
end -- if
end -- if
end -- for
return result; -- declare boolean result and done
end
--[[--------------------------< D A T E _ H Y P H E N _ T O _ D A S H >----------------------------------------
Loops through the list of date-holding parameters and converts any hyphen to an ndash. Not called if the cs1|2
template has any date errors.
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.
]]
local function date_hyphen_to_dash (date_parameters_list)
local result = false;
local n;
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) and
not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then -- for those that are not ymd dates (ustring because here digits may not be Western)
param_val.val, n = param_val.val:gsub ('%-', '–'); -- replace any hyphen with ndash
if 0 ~= n then
date_parameters_list[param_name].val = param_val.val; -- update the list
result = true;
end
end
end
return result; -- so we know if any hyphens were replaced
end
--[[-------------------------< D A T E _ N A M E _ X L A T E >------------------------------------------------
Attempts to translate English date names to local-language date names using names supplied by MediaWiki's
date parser function. This is simple name-for-name replacement and may not work for all languages.
if xlat_dig is true, this function will also translate Western (English) digits to the local language's digits.
This will also translate ymd dates.
]]
local function date_name_xlate (date_parameters_list, xlt_dig)
local xlate;
local mode; -- long or short month names
local modified = false;
local date;
local sources_t = {
{cfg.date_names.en.long, cfg.date_names.inv_local_long}, -- for translating long English month names to long local month names
{cfg.date_names.en.short, cfg.date_names.inv_local_short}, -- short month names
{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter}, -- quarter date names
{cfg.date_names.en.season, cfg.date_names.inv_local_season}, -- season date nam
{cfg.date_names.en.named, cfg.date_names.inv_local_named}, -- named dates
}
local function is_xlateable (month) -- local function to get local date name that replaces existing English-language date name
for _, date_names_t in ipairs (sources_t) do -- for each sequence table in date_names_t
if date_names_t[1][month] then -- if date name is English month (long or short), quarter, season or named and
if date_names_t[2][date_names_t[1][month]] then -- if there is a matching local date name
return date_names_t[2][date_names_t[1][month]]; -- return the local date name
end
end
end
end
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(param_val.val) then -- if the parameter has a value
date = param_val.val;
for month in mw.ustring.gmatch (date, '[%a ]+') do -- iterate through all date names in the date (single date or date range)
month = mw.text.trim (month); -- this because quarterly dates contain whitespace
xlate = is_xlateable (month); -- get translate <month>; returns translation or nil
if xlate then
date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
if xlt_dig then -- shall we also translate digits?
date = date:gsub ('%d', cfg.date_names.xlate_digits); -- translate digits from Western to 'local digits'
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
end
return modified;
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
add_prop_cat = utilities_page_ptr.add_prop_cat ; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
set_message = utilities_page_ptr.set_message;
substitute = utilities_page_ptr.substitute;
wrap_style = utilities_page_ptr.wrap_style;
cfg = cfg_table_ptr; -- import tables from selected Module:Citation/CS1/Configuration
end
--[[--------------------------< A R C H I V E _ D A T E _ C H E C K >------------------------------------------
Compare value in |archive-date= with the timestamp in Wayback machine urls. Emits an error message with suggested
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match
the timestamp.
this function never called when any date in a cs1|2 template has errors
error message suggests new |archive-date= value in an appropriate format specified by <df>. <df> is either
|df= or cfg.global_df in that order. If <df> is nil, suggested date has format from |archive-date=. There is
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format
is not changed.
]]
local function archive_date_check (archive_date, archive_url_timestamp, df)
local archive_date_format = 'dmy-y'; -- holds the date format of date in |archive-date; default to ymd; 'dmy' used here to spoof reformat_dates()
for _, v_t in ipairs ({{'dMy', 'dmy-all'}, {'Mdy', 'mdy-all'}}) do -- is |archive-date= format dmy or mdy?
if archive_date:match (patterns_t[v_t[1]][1]) then -- does the pattern match?
archive_date_format = cfg.keywords_xlate[v_t[2]]; -- get appropriate |df= supported keyword from the i18n translator table
break;
end
end
local dates_t = {};
dates_t['archive-date'] = {val=archive_date, name=''}; -- setup to call reformat_dates(); never called when errors so <name> unset as not needed
reformat_dates (dates_t, 'dmy-y'); -- reformat |archive-date= to ymd; 'dmy' used here to spoof reformat_dates()
local archive_url_date = archive_url_timestamp:gsub ('(%d%d%d%d)(%d%d)(%d%d)%d*', '%1-%2-%3'); -- make ymd format date from timestamp
if dates_t['archive-date'].val == archive_url_date then -- are the two dates the same
return; -- yes, done
else
dates_t['archive-date'] = {val=archive_url_date, name=''}; -- setup to call reformat_dates() with the timestamp date
reformat_dates (dates_t, df or archive_date_format); -- reformat timestamp to format specified by <df> or format used in |archive-date=
archive_url_date = dates_t['archive-date'].val;
set_message ('err_archive_date_url_ts_mismatch', archive_url_date); -- emit an error message
end
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return { -- return exported functions
archive_date_check = archive_date_check,
date_hyphen_to_dash = date_hyphen_to_dash,
date_name_xlate = date_name_xlate,
dates = dates,
is_valid_date = is_valid_date,
reformat_dates = reformat_dates,
set_selected_modules = set_selected_modules,
year_check = year_check,
year_date_check = year_date_check,
}
9obdlnp49x69no1jc3z9ovz037fmza5
392040
392039
2026-08-07T06:58:06Z
محک
1023
نسخهٔ [[Special:Diff/392039|392039]] از [[Special:Contributions/محک|محک]] ([[User talk:محک|بحث]]) خنثی شد
392040
Scribunto
text/plain
--[[--------------------------< F O R W A R D D E C L A R A T I O N S >--------------------------------------
]]
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style; -- imported functions from selected Module:Citation/CS1/Utilities
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration
--[[--------------------------< F I L E - S C O P E D E C L A R A T I O N S >--------------------------------
File-scope variables are declared here
]]
local lang_object = mw.getContentLanguage(); -- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?
local year_limit; -- used by is_valid_year()
--[=[-------------------------< I S _ V A L I D _ A C C E S S D A T E >----------------------------------------
returns true if:
Wikipedia start date <= accessdate < today + 2 days
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)
accessdate is the date provided in |access-date= at time 00:00:00 UTC
today is the current date at time 00:00:00 UTC plus 48 hours
if today is 2015-01-01T00:00:00 then
adding 24 hours gives 2015-01-02T00:00:00 – one second more than today
adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow
This function does not work if it is fed month names for languages other than English. Wikimedia #time: parser
apparently doesn't understand non-English date month names. This function will always return false when the date
contains a non-English month name because good1 is false after the call to lang.formatDate(). To get around that
call this function with YYYY-MM-DD format dates.
]=]
local function is_valid_accessdate (accessdate)
local good1, good2;
local access_ts, tomorrow_ts; -- to hold Unix time stamps representing the dates
good1, access_ts = pcall (lang_object.formatDate, lang_object, 'U', accessdate ); -- convert accessdate value to Unix timestamp
good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, 'U', 'today + 2 days' ); -- today midnight + 2 days is one second more than all day tomorrow
if good1 and good2 then -- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand
access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts); -- convert to numbers for the comparison;
tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);
else
return false; -- one or both failed to convert to Unix time stamp
end
if 979516800 <= access_ts and access_ts < tomorrow_ts then -- Wikipedia start date <= accessdate < tomorrow's date
return true;
else
return false; -- accessdate out of range
end
end
--[[--------------------------< G E T _ M O N T H _ N U M B E R >----------------------------------------------
returns a number according to the month in a date: 1 for January, etc. Capitalization and spelling must be correct.
If not a valid month, returns 0
]]
local function get_month_number (month)
return cfg.date_names['local'].long[month] or cfg.date_names['local'].short[month] or -- look for local names first
cfg.date_names['en'].long[month] or cfg.date_names['en'].short[month] or -- failing that, look for English names
0; -- not a recognized month name
end
--[[--------------------------< G E T _ S E A S O N _ N U M B E R >--------------------------------------------
returns a number according to the sequence of seasons in a year: 21 for Spring, etc. Capitalization and spelling
must be correct. If not a valid season, returns 0.
21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”
returns 0 when <param> is not |date=
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons. EDTF does support the distinction between north and south
hemisphere seasons but cs1|2 has no way to make that distinction.
These additional divisions not currently supported:
25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere
29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_season_number (season, param)
if 'date' ~= param then
return 0; -- season dates only supported by |date=
end
return cfg.date_names['local'].season[season] or -- look for local names first
cfg.date_names['en'].season[season] or -- failing that, look for English names
0; -- not a recognized season name
end
--[[--------------------------< G E T _ Q U A R T E R _ N U M B E R >------------------------------------------
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc. Capitalization and spelling
must be correct. If not a valid quarter, returns 0.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
returns 0 when <param> is not |date=
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard defines various divisions using
numbers 21-41. cs1|2 only supports generic seasons and quarters.
These additional divisions not currently supported:
37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)
40-41 = Semestral 1, Semestral-2 (6 months each)
]]
local function get_quarter_number (quarter, param)
if 'date' ~= param then
return 0; -- quarter dates only supported by |date=
end
quarter = mw.ustring.gsub (quarter, ' +', ' '); -- special case replace multiple space chars with a single space char
return cfg.date_names['local'].quarter[quarter] or -- look for local names first
cfg.date_names['en'].quarter[quarter] or -- failing that, look for English names
0; -- not a recognized quarter name
end
--[[--------------------------< G E T _ P R O P E R _ N A M E _ N U M B E R >----------------------------------
returns a non-zero number if date contains a recognized proper-name. Capitalization and spelling must be correct.
returns 0 when <param> is not |date=
]]
local function get_proper_name_number (name, param)
if 'date' ~= param then
return 0; -- proper-name dates only supported by |date=
end
return cfg.date_names['local'].named[name] or -- look for local names dates first
cfg.date_names['en'].named[name] or -- failing that, look for English names
0; -- not a recognized named date
end
--[[--------------------------< G E T _ E L E M E N T _ N U M B E R <------------------------------------------
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)
]]
local function get_element_number (element, param)
local num;
local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number}; -- list of functions to execute in order
for _, func in ipairs (funcs) do -- spin through the function list
num = func (element, param); -- call the function and get the returned number
if 0 ~= num then -- non-zero when valid month season quarter
return num; -- return that number
end
end
return nil; -- not valid
end
--[[--------------------------< I S _ V A L I D _ Y E A R >----------------------------------------------------
Function gets current year from the server and compares it to year from a citation parameter. Years more than one
year in the future are not acceptable.
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable
]]
local function is_valid_year (year, param)
if not is_set (year_limit) then
year_limit = tonumber(os.date("%Y"))+1; -- global variable so we only have to fetch it once
end
year = tonumber (year) or lang_object:parseFormattedNumber (year); -- convert to number for the comparison
if year and (100 > year) then -- years less than 100 not supported
return false;
end
if 'pmc-embargo-date' == param then -- special case for |pmc-embargo-date=
return year and (year <= tonumber(os.date("%Y"))+2) or false; -- years more than two years in the future are not accepted
end
return year and (year <= year_limit) or false;
end
--[[--------------------------< I S _ V A L I D _ D A T E >----------------------------------------------------
Returns true if day is less than or equal to the number of days in month and year is no farther into the future
than next year; else returns false.
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately
1923) dates are assumed to be Gregorian.
]]
local function is_valid_date (year, month, day, param)
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
local month_length;
if not is_valid_year (year, param) then -- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future
return false;
end
month = tonumber (month); -- required for YYYY-MM-DD dates
if (2 == month) then -- if February
month_length = 28; -- then 28 days unless
if 1582 > tonumber(year) then -- Julian calendar
if 0 == (year%4) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
else -- Gregorian calendar
if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then -- is a leap year?
month_length = 29; -- if leap year then 29 days in February
end
end
else
month_length = days_in_month[month] or 0; -- invalid month number is nil so default <month_length> to 0
end
if tonumber (day) > month_length then
return false;
end
return true;
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E >--------------------------
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August.
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are
listed in the short subtable. When both have the same style (both are listed in the same table), returns true; false else
]]
local function is_valid_month_range_style (month1, month2)
if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or -- are both English names listed in the long subtable?
(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or -- are both English names listed in the short subtable?
(cfg.date_names['local'].long[month1] and cfg.date_names['local'].long[month2]) or -- are both local names listed in the long subtable?
(cfg.date_names['local'].short[month1] and cfg.date_names['local'].short[month2]) then -- are both local names listed in the short subtable?
return true;
end
return false; -- names are mixed
end
--[[--------------------------< I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E >------------------------
Check a pair of months or seasons to see if both are valid members of a month or season pair.
Month pairs are expected to be left to right, earliest to latest in time.
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok
]]
local function is_valid_month_season_range(range_start, range_end, param)
local range_start_number = get_month_number (range_start);
local range_end_number;
if 0 == range_start_number then -- is this a month range?
range_start_number = get_season_number (range_start, param); -- not a month; is it a season? get start season number
range_end_number = get_season_number (range_end, param); -- get end season number
if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then
return true; -- any season pairing is accepted except when both are the same
end
return false; -- range_start and/or range_end is not a season
end
-- here when range_start is a month
range_end_number = get_month_number (range_end); -- get end month number
if range_start_number < range_end_number and -- range_start is a month; does range_start precede range_end?
is_valid_month_range_style (range_start, range_end) then -- do months have the same style?
return true; -- proper order and same style
end
return false; -- range_start month number is greater than or equal to range end number; or range end isn't a month
end
--[[--------------------------< M A K E _ C O I N S _ D A T E >------------------------------------------------
This function receives a table of date parts for one or two dates and an empty table reference declared in
Module:Citation/CS1. The function is called only for |date= parameters and only if the |date=<value> is
determined to be a valid date format. The question of what to do with invalid date formats is not answered here.
The date parts in the input table are converted to an ISO 8601 conforming date string:
single whole dates: yyyy-mm-dd
month and year dates: yyyy-mm
year dates: yyyy
ranges: yyyy-mm-dd/yyyy-mm-dd
yyyy-mm/yyyy-mm
yyyy/yyyy
Dates in the Julian calendar are reduced to year or year/year so that we don't have to do calendar conversion from
Julian to Proleptic Gregorian.
The input table has:
year, year2 – always present; if before 1582, ignore months and days if present
month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas
day, day2 – 0 if not provided, 1-31 for days
the output table receives:
rftdate: an ISO 8601 formatted date
rftchron: a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)
rftssn: one of four season keywords: winter, spring, summer, fall (lowercase)
rftquarter: one of four values: 1, 2, 3, 4
]]
local function make_COinS_date (input, tCOinS_date)
local date; -- one date or first date in a range
local date2 = ''; -- end of range date
input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year); -- language-aware tonumber()
input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2); -- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals
if ((1582 == input.year) and (10 > tonumber(input.month))) or (1582 > input.year) then -- if a Julian calendar date
tCOinS_date.rftdate = tostring (input.year); -- &rft.date gets year only
return; -- done
end
-- here for all forms of Gregorian dates
if 20 < tonumber (input.month) then -- if season, quarter, or proper-name date
date = input.year; -- &rft.date gets year only
if 0 ~= input.year2 and input.year ~= input.year2 then -- if a range, only the second year portion when not the same as range start year
date = string.format ('%.4d/%.4d', input.year, input.year2) -- assemble the date range
end
local season = {[24] = 'winter', [21] = 'spring', [22] = 'summer', [23] = 'fall', [33] = '1', [34] = '2', [35] = '3', [36] = '4', [98] = 'Easter', [99] = 'Christmas'}; -- seasons lowercase, no autumn; proper-names use title case
if 0 == input.month2 then -- single season, quarter, or proper-name date
if 40 < tonumber(input.month) then
tCOinS_date.rftchron = season[input.month]; -- proper-name date; used in journal metadata only
elseif 30 < tonumber(input.month) then
tCOinS_date.rftquarter = season[input.month]; -- quarter date; used in journal metadata only
else
tCOinS_date.rftssn = season[input.month]; -- season date; used in journal metadata only
end
else -- season ranges are lumped into &rft.chron; &rft.ssn and &rft.quarter are left blank
if input.year ~= input.year2 then -- season year – season year range or season year–year
if 0 ~= input.month2 then
tCOinS_date.rftchron = string.format ('%s %s – %s %s', season[input.month], input.year, season[input.month2], input.year2); -- used in journal metadata only
end
else -- season–season year range
tCOinS_date.rftchron = season[input.month] .. '–' .. season[input.month2]; -- season–season year range; used in journal metadata only
end
end
tCOinS_date.rftdate = tostring (date);
return; -- done
end
-- here for gregorian calendar dates
if 0 ~= input.day then
date = string.format ('%s-%.2d-%.2d', input.year, tonumber(input.month), tonumber(input.day)); -- whole date
elseif 0 ~= input.month then
date = string.format ('%s-%.2d', input.year, tonumber(input.month)); -- year and month
else
date = string.format ('%s', input.year); -- just year
end
if 0 ~= input.year2 then
if 0 ~= input.day2 then
date2 = string.format ('/%s-%.2d-%.2d', input.year2, tonumber(input.month2), tonumber(input.day2)); -- whole date
elseif 0 ~= input.month2 then
date2 = string.format ('/%s-%.2d', input.year2, tonumber(input.month2)); -- year and month
else
date2 = string.format ('/%s', input.year2); -- just year
end
end
tCOinS_date.rftdate = date .. date2; -- date2 has the '/' separator
return;
end
--[[--------------------------< P A T T E R N S _ T >----------------------------------------------------------
this is the list of patterns for date formats that this module recognizes. Approximately the first half of these
patterns represent formats that might be reformatted into another format. Those that might be reformatted have
'indicator' letters that identify the content of the matching capture: 'd' (day), 'm' (month), 'a' (anchor year),
'y' (year); second day, month, year have a '2' suffix.
These patterns are used for both date validation and for reformatting. This table should not be moved to ~/Configuration
because changes to this table require changes to check_date() and to reformatter() and reformat_date()
]]
local patterns_t = {
-- year-initial numerical year-month-day
['ymd'] = {'^([1-9]%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'},
-- month-initial: month day, year
['Mdy'] = {'^(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'a', 'y'},
-- month-initial day range: month day–day, year; days are separated by endash
['Md-dy'] = {'^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'd2', 'a', 'y'},
-- day-initial: day month year
['dMy'] = {'^([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'a', 'y'},
-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki
-- ['yMd'] = {'^(([1-9]%d%d%d?)%a?) +(%D-) +(%d%d?)$', 'a', 'y', 'm', 'd'},
-- day-range-initial: day–day month year; days are separated by endash
['d-dMy'] = {'^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'd2', 'm', 'a', 'y'},
-- day initial month-day-range: day month - day month year; uses spaced endash
['dM-dMy'] = {'^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'd2', 'm2', 'a', 'y'},
-- month initial month-day-range: month day – month day, year; uses spaced endash
['Md-Mdy'] = {'^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$','m', 'd', 'm2', 'd2', 'a', 'y'},
-- day initial month-day-year-range: day month year - day month year; uses spaced endash
['dMy-dMy'] = {'^([1-9]%d?) +(%D-) +([1-9]%d%d%d?) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$', 'd', 'm', 'y', 'd2', 'm2', 'a', 'y2'},
-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
['Mdy-Mdy'] = {'^(%D-) +([1-9]%d?), +([1-9]%d%d%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$', 'm', 'd', 'y', 'm2', 'd2', 'a', 'y2'},
-- these date formats cannot be converted, per se, but month name can be rendered short or long
-- month/season year - month/season year; separated by spaced endash
['My-My'] = {'^(%D-) +([1-9]%d%d%d?) +[%-–] +(%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'y', 'm2', 'a', 'y2'},
-- month/season range year; months separated by endash
['M-My'] = {'^(%D-)[%-–](%D-) +(([1-9]%d%d%d?)%a?)$', 'm', 'm2', 'a', 'y'},
-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.
['My'] = {'^([^%d–]-) +(([1-9]%d%d%d?)%a?)$', 'm', 'a', 'y'}, -- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn't
-- these date formats cannot be converted
['Sy4-y2'] = {'^(%D-) +(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
['Sy-y'] = {'^(%D-) +([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- special case Winter/Summer year-year; year separated with unspaced endash
['y-y'] = {'^([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$'}, -- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
['y4-y2'] = {'^(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$'}, -- year range: YYYY–YY; separated by unspaced endash
['y'] = {'^(([1-9]%d%d%d?)%a?)$'}, -- year; here accept either YYY or YYYY
}
--[[--------------------------< I S _ V A L I D _ E M B A R G O _ D A T E >------------------------------------
returns true and date value if that value has proper dmy, mdy, ymd format.
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.
]]
local function is_valid_embargo_date (v)
if v:match (patterns_t['ymd'][1]) or -- ymd
v:match (patterns_t['Mdy'][1]) or -- dmy
v:match (patterns_t['dMy'][1]) then -- mdy
return true, v;
end
return false, '9999'; -- if here not good date so return false and set embargo date to long time in future
end
--[[--------------------------< C H E C K _ D A T E >----------------------------------------------------------
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only
allowed range separator is endash. Additionally, check the date to see that it is a real date: no 31 in 30-day
months; no 29 February when not a leap year. Months, both long-form and three character abbreviations, and seasons
must be spelled correctly. Future years beyond next year are not allowed.
If the date fails the format tests, this function returns false and does not return values for anchor_year and
COinS_date. When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets
its year from the year parameter if present otherwise CITEREF does not get a date value.
Inputs:
date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)
Returns:
false if date string is not a real date; else
true, anchor_year, COinS_date
anchor_year can be used in CITEREF anchors
COinS_date is ISO 8601 format date; see make_COInS_date()
]]
local function check_date (date_string, param, tCOinS_date)
local year; -- assume that year2, months, and days are not used;
local year2 = 0; -- second year in a year range
local month = 0;
local month2 = 0; -- second month in a month range
local day = 0;
local day2 = 0; -- second day in a day range
local anchor_year;
local coins_date;
if date_string:match (patterns_t['ymd'][1]) then -- year-initial numerical year month day format
year, month, day = date_string:match (patterns_t['ymd'][1]);
if 12 < tonumber(month) or 1 > tonumber(month) or 1582 > tonumber(year) or 0 == tonumber(day) then return false; end -- month or day number not valid or not Gregorian calendar
anchor_year = year;
elseif mw.ustring.match(date_string, patterns_t['Mdy'][1]) then -- month-initial: month day, year
month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t['Mdy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
elseif mw.ustring.match(date_string, patterns_t['Md-dy'][1]) then -- month-initial day range: month day–day, year; days are separated by endash
month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-dy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2=month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy'][1]) then -- day-initial: day month year
day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['dMy'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
--[[ NOT supported at en.wiki
elseif mw.ustring.match(date_string, patterns_t['yMd'][1]) then -- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed
anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t['yMd'][1]);
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
-- end NOT supported at en.wiki ]]
elseif mw.ustring.match(date_string, patterns_t['d-dMy'][1]) then -- day-range-initial: day–day month year; days are separated by endash
day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t['d-dMy'][1]);
if tonumber(day) >= tonumber(day2) then return false; end -- date range order is left to right: earlier to later; dates may not be the same;
month = get_month_number (month);
if 0 == month then return false; end -- return false if month text isn't one of the twelve months
month2 = month; -- for metadata
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dM-dMy'][1]) then -- day initial month-day-range: day month - day month year; uses spaced endash
day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['dM-dMy'][1]);
if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end -- date range order is left to right: earlier to later;
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]) then -- month initial month-day-range: month day – month day, year; uses spaced endash
month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t['Md-Mdy'][1]);
if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]) then -- day initial month-day-year-range: day month year - day month year; uses spaced endash
day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['dMy-dMy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number (month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]) then -- month initial month-day-year-range: month day, year – month day, year; uses spaced endash
month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Mdy-Mdy'][1]);
if tonumber(year2) <= tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end -- year2 no more than one year in the future; months same style
month = get_month_number (month); -- for metadata
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end -- both must be valid
elseif mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]) then -- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash
local century;
month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy4-y2'][1]);
if 'Winter' ~= month and 'Summer' ~= month then return false end; -- 'month' can only be Winter or Summer
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
year2 = century..year2; -- add the century to year2 for comparisons
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
month = get_season_number(month, param);
elseif mw.ustring.match(date_string, patterns_t['Sy-y'][1]) then -- special case Winter/Summer year-year; year separated with unspaced endash
month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['Sy-y'][1]);
month = get_season_number (month, param); -- <month> can only be winter or summer; also for metadata
if (month ~= cfg.date_names['en'].season['Winter']) and (month ~= cfg.date_names['en'].season['Summer']) then
return false; -- not Summer or Winter; abandon
end
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if 1 ~= tonumber(year2) - tonumber(year) then return false; end -- must be sequential years, left to right, earlier to later
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['My-My'][1]) then -- month/season year - month/season year; separated by spaced endash
month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['My-My'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor_year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then -- both must be month year, same month style
month = get_month_number(month);
month2 = get_month_number(month2);
elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then -- both must be season year, not mixed
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
else
return false;
end
elseif mw.ustring.match(date_string, patterns_t['M-My'][1]) then -- month/season range year; months separated by endash
month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t['M-My'][1]);
if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end
if 0 ~= get_month_number(month) then -- determined to be a valid range so just check this one to know if month or season
month = get_month_number(month);
month2 = get_month_number(month2);
if 0 == month or 0 == month2 then return false; end
else
month = get_season_number(month, param);
month2 = get_season_number(month2, param);
end
year2 = year;
elseif mw.ustring.match(date_string, patterns_t['My'][1]) then -- month/season/quarter/proper-name year
month, anchor_year, year = mw.ustring.match(date_string, patterns_t['My'][1]);
if not is_valid_year(year) then return false; end
month = get_element_number(month, param); -- get month season quarter proper-name number or nil
if not month then return false; end -- not valid whatever it is
elseif mw.ustring.match(date_string, patterns_t['y-y'][1]) then -- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999
year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y-y'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
elseif mw.ustring.match(date_string, patterns_t['y4-y2'][1]) then -- Year range: YYYY–YY; separated by unspaced endash
local century;
year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t['y4-y2'][1]);
anchor_year = year .. '–' .. anchor_year; -- assemble anchor year from both years
if 13 > tonumber(year2) then return false; end -- don't allow 2003-05 which might be May 2003
year2 = century .. year2; -- add the century to year2 for comparisons
if tonumber(year) >= tonumber(year2) then return false; end -- left to right, earlier to later, not the same
if not is_valid_year(year2) then return false; end -- no year farther in the future than next year
if in_array (param, {'date', 'publication-date', 'year'}) then -- here when 'valid' abbreviated year range; if one of these parameters
add_prop_cat ('year-range-abbreviated'); -- add properties cat
end
elseif mw.ustring.match(date_string, patterns_t['y'][1]) then -- year; here accept either YYY or YYYY
anchor_year, year = mw.ustring.match(date_string, patterns_t['y'][1]);
if false == is_valid_year(year) then
return false;
end
else
return false; -- date format not one of the MOS:DATE approved formats
end
if param ~= 'date' then -- CITEREF disambiguation only allowed in |date=; |year= & |publication-date= promote to date
if anchor_year:match ('%l$') then
return false;
end
end
if 'access-date' == param then -- test access-date here because we have numerical date parts
if 0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2 then -- none of these; access-date must not be a range
if not is_valid_accessdate(year .. '-' .. month .. '-' .. day) then
return false; -- return false when access-date out of bounds
end
else
return false; -- return false when access-date is a range of two dates
end
end
if 'archive-date' == param then -- test archive-date here because we have numerical date parts
if not (0 ~= year and 0 ~= month and 0 ~= day and -- all parts of a single date required
0 == year2 and 0 == month2 and 0 == day2) then -- none of these; archive-date must not be a range
return false; -- return false when archive-date is a range of two dates
end
end
local result=true; -- check whole dates for validity; assume true because not all dates will go through this test
if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then -- YMD (simple whole date)
result = is_valid_date (year, month, day, param); -- <param> for |pmc-embargo-date=
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then -- YMD-d (day range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-md (day month range)
result = is_valid_date (year, month, day);
result = result and is_valid_date (year, month2, day2);
elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then -- YMD-ymd (day month year range)
result = is_valid_date(year, month, day);
result = result and is_valid_date(year2, month2, day2);
end
if false == result then return false; end
if nil ~= tCOinS_date then -- this table only passed into this function when testing |date= parameter values
make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date); -- make an ISO 8601 date string for COinS
end
return true, anchor_year; -- format is good and date string represents a real date
end
--[[--------------------------< D A T E S >--------------------------------------------------------------------
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in
the COinS metadata) are derived. The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords "n.d." or "nd" (without quotes).
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,
parameters with errors are added to the <error_list> sequence table as the dates are tested.
]]
local function dates(date_parameters_list, tCOinS_date, error_list)
local anchor_year; -- will return as nil if the date being tested is not |date=
local COinS_date; -- will return as nil if the date being tested is not |date=
local embargo_date; -- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999
local good_date = false;
for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(v.val) then -- if the parameter has a value
v.val = mw.ustring.gsub(v.val, '%d', cfg.date_names.local_digits); -- translate 'local' digits to Western 0-9
if v.val:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
local year = v.val:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
if 'date' == k then
anchor_year, COinS_date = v.val:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
good_date = is_valid_year(year);
elseif 'year' == k then
good_date = is_valid_year(year);
else
good_date = false;
end
elseif 'date' == k then -- if the parameter is |date=
if v.val:match("^n%.d%.%a?$") then -- ToDo: I18N -- if |date=n.d. with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((n%.d%.)%a?)"); -- ToDo: I18N -- "n.d."; no error when date parameter is set to no date
elseif v.val:match("^nd%a?$") then -- ToDo: I18N -- if |date=nd with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((nd)%a?)"); -- ToDo: I18N -- "nd"; no error when date parameter is set to no date
else
good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date); -- go test the date
end
elseif 'year' == k then -- if the parameter is |year= it should hold only a year value
if v.val:match("^[1-9]%d%d%d?%a?$") then -- if |year = 3 or 4 digits only with or without a CITEREF disambiguator
good_date, anchor_year, COinS_date = true, v.val:match("((%d+)%a?)");
else
good_date = false;
end
elseif 'pmc-embargo-date' == k then -- if the parameter is |pmc-embargo-date=
good_date = check_date (v.val, k); -- go test the date
if true == good_date then -- if the date is a valid date
good_date, embargo_date = is_valid_embargo_date (v.val); -- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999
end
else -- any other date-holding parameter
good_date = check_date (v.val, k); -- go test the date
end
if false == good_date then -- assemble one error message so we don't add the tracking category multiple times
table.insert (error_list, wrap_style ('parameter', v.name)); -- make parameter name suitable for error message list
end
end
end
return anchor_year, embargo_date; -- and done
end
--[[--------------------------< Y E A R _ C H E C K >----------------------------------------------------------
Temporary function to test |year= for acceptable values:
YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-
less useless
]]
local function year_check (year)
year = year:gsub ('c%. *', ''); -- remove circa annotation (if present) before testing <year>
for _, index in ipairs ({'y-y', 'y4-y2', 'y'}) do -- spin through these indexes into patterns_t
if mw.ustring.match (year, patterns_t[index][1]) then
return; -- if a match then |year= holds a valid 'year'
end
end
set_message ('maint_year'); -- if here, |year= value is not an accepted value; add a maint cat
end
--[[--------------------------< Y E A R _ D A T E _ C H E C K >------------------------------------------------
Compare the value provided in |year= with the year value(s) provided in |date=. This function sets a local numeric value:
0 - year value does not match the year value in date
1 - (default) year value matches the year value in date or one of the year values when date contains two years
2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)
the numeric value in <result> determines the 'output' if any from this function:
0 – adds error message to error_list sequence table
1 – adds maint cat
2 – does nothing
]]
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)
local year;
local date1;
local date2;
local result = 1; -- result of the test; assume that the test passes
year = year_string:match ('(%d%d%d%d?)');
if date_string:match ('%d%d%d%d%-%d%d%-%d%d') then --special case where both date and year are required YYYY-MM-DD and YYYYx
date1 = date_string:match ('(%d%d%d%d)');
year = year_string:match ('(%d%d%d%d)');
if year ~= date1 then
result = 0; -- years don't match
elseif year_string:match ('%d%d%d%d%a') then
result = 2; -- years match; but because disambiguated, don't add to maint cat
end
elseif date_string:match ("%d%d%d%d?.-%d%d%d%d?") then -- any of the standard range formats of date with two three- or four-digit years
date1, date2 = date_string:match ("(%d%d%d%d?).-(%d%d%d%d?)");
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif mw.ustring.match(date_string, "%d%d%d%d[%-–]%d%d") then -- YYYY-YY date ranges
local century;
date1, century, date2 = mw.ustring.match(date_string, "((%d%d)%d%d)[%-–]+(%d%d)");
date2 = century..date2; -- convert YY to YYYY
if year ~= date1 and year ~= date2 then
result = 0;
end
elseif date_string:match ("%d%d%d%d?") then -- any of the standard formats of date with one year
date1 = date_string:match ("(%d%d%d%d?)");
if year ~= date1 then
result = 0;
end
else -- should never get here; this function called only when no other date errors
result = 0; -- no recognizable year in date
end
if 0 == result then -- year / date mismatch
table.insert (error_list, substitute (cfg.messages['mismatch'], {year_origin, date_origin})); -- add error message to error_list sequence table
elseif 1 == result then -- redundant year / date
set_message ('maint_date_year'); -- add a maint cat
end
end
--[[--------------------------< R E F O R M A T T E R >--------------------------------------------------------
reformat 'date' into new format specified by format_param if pattern_idx (the current format of 'date') can be
reformatted. Does the grunt work for reformat_dates().
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:
format string used by string.format()
identifier letters ('d', 'm', 'y', 'd2', 'm2', 'y2') that serve as indexes into a table t{} that holds captures
from mw.ustring.match() for the various date parts specified by patterns_t[pattern_idx][1]
Items in patterns_t{} have the general form:
['ymd'] = {'^(%d%d%d%d)%-(%d%d)%-(%d%d)$', 'y', 'm', 'd'}, where:
['ymd'] is pattern_idx
patterns_t['ymd'][1] is the match pattern with captures for mw.ustring.match()
patterns_t['ymd'][2] is an indicator letter identifying the content of the first capture
patterns_t['ymd'][3] ... the second capture etc.
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier
characters as indexes into t{} For the above, a ymd date is in t{} as:
t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)
To reformat, this function is called with the pattern_idx that matches the current format of the date and with
format_param set to the desired format. This function loads table t{} as described and then calls string.format()
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..
]]
local re_formats = {
['ymd'] = { -- date format is ymd; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Mdy'] = { -- date format is Mdy; reformat to:
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['dMy'] = { -- date format is dMy; reformat to:
['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- ['yMd'] = {'%s %s %s', 'y', 'm', 'd'}, -- |df=yMd; not supported at en.wiki
},
['Md-dy'] = { -- date format is Md-dy; reformat to:
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- |df=dmy -> d-dMy
},
['d-dMy'] = { -- date format is d-d>y; reformat to:
['dmy'] = {'%s–%s %s %s', 'd', 'd2', 'm', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s–%s, %s', 'm', 'd', 'd2', 'y'}, -- |df=mdy -> Md-dy
},
['dM-dMy'] = { -- date format is dM-dMy; reformat to:
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- for long/short reformatting
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- |df=mdy -> Md-Mdy
},
['Md-Mdy'] = { -- date format is Md-Mdy; reformat to:
['mdy'] = {'%s %s – %s %s, %s', 'm', 'd', 'm2', 'd2', 'y'}, -- for long/short reformatting
['dmy'] = {'%s %s – %s %s %s', 'd', 'm', 'd2', 'm2', 'y'}, -- |df=dmy -> dM-dMy
},
['dMy-dMy'] = { -- date format is dMy-dMy; reformat to:
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- for long/short reformatting
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- |df=mdy -> Mdy-Mdy
},
['Mdy-Mdy'] = { -- date format is Mdy-Mdy; reformat to:
['mdy'] = {'%s %s, %s – %s %s, %s', 'm', 'd', 'y', 'm2', 'd2', 'y2'}, -- for long/short reformatting
['dmy'] = {'%s %s %s – %s %s %s', 'd', 'm', 'y', 'd2', 'm2', 'y2'}, -- |df=dmy -> dMy-dMy
},
['My-My'] = { -- these for long/short reformatting
['any'] = {'%s %s – %s %s', 'm', 'y', 'm2', 'y2'}, -- dmy/mdy agnostic
},
['M-My'] = { -- these for long/short reformatting
['any'] = {'%s–%s %s', 'm', 'm2', 'y'}, -- dmy/mdy agnostic
},
['My'] = { -- these for long/short reformatting
['any'] = {'%s %s', 'm', 'y'}, -- dmy/mdy agnostic
},
-- ['yMd'] = { -- not supported at en.wiki
-- ['mdy'] = {'%s %s, %s', 'm', 'd', 'y'}, -- |df=mdy
-- ['dmy'] = {'%s %s %s', 'd', 'm', 'y'}, -- |df=dmy
-- ['ymd'] = {'%s-%s-%s', 'y', 'm', 'd'}, -- |df=ymd
-- },
}
local function reformatter (date, pattern_idx, format_param, mon_len)
if not in_array (pattern_idx, {'ymd', 'Mdy', 'Md-dy', 'dMy', 'yMd', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- not in this set of date format patterns_t then not a reformattable date
end
if 'ymd' == format_param and in_array (pattern_idx, {'ymd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy', 'My-My', 'M-My', 'My'}) then
return; -- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd
end
if in_array (pattern_idx, {'My', 'M-My', 'My-My'}) then -- these are not dmy/mdy so can't be 'reformatted' into either
format_param = 'any'; -- so format-agnostic
end
-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line
-- if 'yMd' == format_param and in_array (pattern_idx, {'yMd', 'Md-dy', 'd-dMy', 'dM-dMy', 'Md-Mdy', 'dMy-dMy', 'Mdy-Mdy'}) then -- these formats not convertable; yMd not supported at en.wiki
if 'yMd' == format_param then -- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line
return; -- not a reformattable date
end
local c1, c2, c3, c4, c5, c6, c7; -- these hold the captures specified in patterns_t[pattern_idx][1]
c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]); -- get the captures
local t = { -- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]
[patterns_t[pattern_idx][2]] = c1; -- at minimum there is always one capture with a matching indicator letter
[patterns_t[pattern_idx][3] or 'x'] = c2; -- patterns_t can have a variable number of captures; each capture requires an indicator letter;
[patterns_t[pattern_idx][4] or 'x'] = c3; -- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;
[patterns_t[pattern_idx][5] or 'x'] = c4; -- the 'x' here spoofs an indicator letter to prevent 'table index is nil' error
[patterns_t[pattern_idx][6] or 'x'] = c5;
[patterns_t[pattern_idx][7] or 'x'] = c6;
[patterns_t[pattern_idx][8] or 'x'] = c7;
};
if t.a then -- if this date has an anchor year capture (all convertable date formats except ymd)
if t.y2 then -- for year range date formats
t.y2 = t.a; -- use the anchor year capture when reassembling the date
else -- here for single date formats (except ymd)
t.y = t.a; -- use the anchor year capture when reassembling the date
end
end
if tonumber(t.m) then -- if raw month is a number (converting from ymd)
if 's' == mon_len then -- if we are to use abbreviated month names
t.m = cfg.date_names['inv_local_short'][tonumber(t.m)]; -- convert it to a month name
else
t.m = cfg.date_names['inv_local_long'][tonumber(t.m)]; -- convert it to a month name
end
t.d = t.d:gsub ('0(%d)', '%1'); -- strip leading '0' from day if present
elseif 'ymd' == format_param then -- when converting to ymd
t.y = t.y:gsub ('%a', ''); -- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?
if 1582 > tonumber (t.y) then -- ymd format dates not allowed before 1582
return;
end
t.m = string.format ('%02d', get_month_number (t.m)); -- make sure that month and day are two digits
t.d = string.format ('%02d', t.d);
elseif mon_len then -- if mon_len is set to either 'short' or 'long'
for _, mon in ipairs ({'m', 'm2'}) do -- because there can be two month names, check both
if t[mon] then
t[mon] = get_month_number (t[mon]); -- get the month number for this month (is length agnostic)
if 0 == t[mon] then return; end -- seasons and named dates can't be converted
t[mon] = (('s' == mon_len) and cfg.date_names['inv_local_short'][t[mon]]) or cfg.date_names['inv_local_long'][t[mon]]; -- fetch month name according to length
end
end
end
local new_date = string.format (re_formats[pattern_idx][format_param][1], -- format string
t[re_formats[pattern_idx][format_param][2]], -- named captures from t{}
t[re_formats[pattern_idx][format_param][3]],
t[re_formats[pattern_idx][format_param][4]],
t[re_formats[pattern_idx][format_param][5]],
t[re_formats[pattern_idx][format_param][6]],
t[re_formats[pattern_idx][format_param][7]],
t[re_formats[pattern_idx][format_param][8]]
);
return new_date;
end
--[[-------------------------< R E F O R M A T _ D A T E S >--------------------------------------------------
Reformats existing dates into the format specified by format.
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all. The -all version includes
access- and archive-dates; otherwise these dates are not reformatted.
This function allows automatic date formatting. In ~/Configuration, the article source is searched for one of
the {{use xxx dates}} templates. If found, xxx becomes the global date format as xxx-all. If |cs1-dates= in
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered. Legitimate
values for |cs1-dates= are:
l - all dates are rendered with long month names
ls - publication dates use long month names; access-/archive-dates use abbreviated month names
ly - publication dates use long month names; access-/archive-dates rendered in ymd format
s - all dates are rendered with abbreviated (short) month names
sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format
y - all dates are rendered in ymd format
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the
list in the new format. Dates in date_parameters_list are presumed here to be valid (no errors). This function
returns true when a date has been reformatted, false else. Actual reformatting is done by reformatter().
]]
local function reformat_dates (date_parameters_list, format)
local all = false; -- set to false to skip access- and archive-dates
local len_p = 'l'; -- default publication date length shall be long
local len_a = 'l'; -- default access-/archive-date length shall be long
local result = false;
local new_date;
if format:match('%a+%-all') then -- manual df keyword; auto df keyword when length not specified in {{use xxx dates}};
format = format:match('(%a+)%-all'); -- extract the format
all = true; -- all dates are long format dates because this keyword doesn't specify length
elseif format:match('%a+%-[lsy][sy]?') then -- auto df keywords; internal only
all = true; -- auto df applies to all dates; use length specified by capture len_p for all dates
format, len_p, len_a = format:match('(%a+)%-([lsy])([sy]?)'); -- extract the format and length keywords
if 'y' == len_p then -- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted
format = 'ymd'; -- override {{use xxx dates}}
elseif (not is_set(len_a)) or (len_p == len_a) then -- no access-/archive-date length specified or same length as publication dates then
len_a = len_p; -- in case len_a not set
end
end -- else only publication dates and they are long
for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) then -- if the parameter has a value
if not (not all and in_array (param_name, {'access-date', 'archive-date'})) then -- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way
for pattern_idx, pattern in pairs (patterns_t) do
if mw.ustring.match (param_val.val, pattern[1]) then
if all and in_array (param_name, {'access-date', 'archive-date'}) then -- if this date is an access- or archive-date
new_date = reformatter (param_val.val, pattern_idx, (('y' == len_a) and 'ymd') or format, len_a); -- choose ymd or dmy/mdy according to len_a setting
else -- all other dates
new_date = reformatter (param_val.val, pattern_idx, format, len_p);
end
if new_date then -- set when date was reformatted
date_parameters_list[param_name].val = new_date; -- update date in date list
result = true; -- and announce that changes have been made
break;
end
end -- if
end -- for
end -- if
end -- if
end -- for
return result; -- declare boolean result and done
end
--[[--------------------------< D A T E _ H Y P H E N _ T O _ D A S H >----------------------------------------
Loops through the list of date-holding parameters and converts any hyphen to an ndash. Not called if the cs1|2
template has any date errors.
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.
]]
local function date_hyphen_to_dash (date_parameters_list)
local result = false;
local n;
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set (param_val.val) and
not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then -- for those that are not ymd dates (ustring because here digits may not be Western)
param_val.val, n = param_val.val:gsub ('%-', '–'); -- replace any hyphen with ndash
if 0 ~= n then
date_parameters_list[param_name].val = param_val.val; -- update the list
result = true;
end
end
end
return result; -- so we know if any hyphens were replaced
end
--[[-------------------------< D A T E _ N A M E _ X L A T E >------------------------------------------------
Attempts to translate English date names to local-language date names using names supplied by MediaWiki's
date parser function. This is simple name-for-name replacement and may not work for all languages.
if xlat_dig is true, this function will also translate Western (English) digits to the local language's digits.
This will also translate ymd dates.
]]
local function date_name_xlate (date_parameters_list, xlt_dig)
local xlate;
local mode; -- long or short month names
local modified = false;
local date;
local sources_t = {
{cfg.date_names.en.long, cfg.date_names.inv_local_long}, -- for translating long English month names to long local month names
{cfg.date_names.en.short, cfg.date_names.inv_local_short}, -- short month names
{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter}, -- quarter date names
{cfg.date_names.en.season, cfg.date_names.inv_local_season}, -- season date nam
{cfg.date_names.en.named, cfg.date_names.inv_local_named}, -- named dates
}
local function is_xlateable (month) -- local function to get local date name that replaces existing English-language date name
for _, date_names_t in ipairs (sources_t) do -- for each sequence table in date_names_t
if date_names_t[1][month] then -- if date name is English month (long or short), quarter, season or named and
if date_names_t[2][date_names_t[1][month]] then -- if there is a matching local date name
return date_names_t[2][date_names_t[1][month]]; -- return the local date name
end
end
end
end
for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
if is_set(param_val.val) then -- if the parameter has a value
date = param_val.val;
for month in mw.ustring.gmatch (date, '[%a ]+') do -- iterate through all date names in the date (single date or date range)
month = mw.text.trim (month); -- this because quarterly dates contain whitespace
xlate = is_xlateable (month); -- get translate <month>; returns translation or nil
if xlate then
date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
if xlt_dig then -- shall we also translate digits?
date = date:gsub ('%d', cfg.date_names.xlate_digits); -- translate digits from Western to 'local digits'
date_parameters_list[param_name].val = date; -- save the translated date
modified = true;
end
end
end
return modified;
end
--[[--------------------------< S E T _ S E L E C T E D _ M O D U L E S >--------------------------------------
Sets local imported functions table to same (live or sandbox) as that used by the other modules.
]]
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)
add_prop_cat = utilities_page_ptr.add_prop_cat ; -- import functions from selected Module:Citation/CS1/Utilities module
is_set = utilities_page_ptr.is_set;
in_array = utilities_page_ptr.in_array;
set_message = utilities_page_ptr.set_message;
substitute = utilities_page_ptr.substitute;
wrap_style = utilities_page_ptr.wrap_style;
cfg = cfg_table_ptr; -- import tables from selected Module:Citation/CS1/Configuration
end
--[[--------------------------< A R C H I V E _ D A T E _ C H E C K >------------------------------------------
Compare value in |archive-date= with the timestamp in Wayback machine urls. Emits an error message with suggested
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match
the timestamp.
this function never called when any date in a cs1|2 template has errors
error message suggests new |archive-date= value in an appropriate format specified by <df>. <df> is either
|df= or cfg.global_df in that order. If <df> is nil, suggested date has format from |archive-date=. There is
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format
is not changed.
]]
local function archive_date_check (archive_date, archive_url_timestamp, df)
local archive_date_format = 'dmy-y'; -- holds the date format of date in |archive-date; default to ymd; 'dmy' used here to spoof reformat_dates()
for _, v_t in ipairs ({{'dMy', 'dmy-all'}, {'Mdy', 'mdy-all'}}) do -- is |archive-date= format dmy or mdy?
if archive_date:match (patterns_t[v_t[1]][1]) then -- does the pattern match?
archive_date_format = cfg.keywords_xlate[v_t[2]]; -- get appropriate |df= supported keyword from the i18n translator table
break;
end
end
local dates_t = {};
dates_t['archive-date'] = {val=archive_date, name=''}; -- setup to call reformat_dates(); never called when errors so <name> unset as not needed
reformat_dates (dates_t, 'dmy-y'); -- reformat |archive-date= to ymd; 'dmy' used here to spoof reformat_dates()
local archive_url_date = archive_url_timestamp:gsub ('(%d%d%d%d)(%d%d)(%d%d)%d*', '%1-%2-%3'); -- make ymd format date from timestamp
if dates_t['archive-date'].val == archive_url_date then -- are the two dates the same
return; -- yes, done
else
dates_t['archive-date'] = {val=archive_url_date, name=''}; -- setup to call reformat_dates() with the timestamp date
reformat_dates (dates_t, df or archive_date_format); -- reformat timestamp to format specified by <df> or format used in |archive-date=
archive_url_date = dates_t['archive-date'].val;
set_message ('err_archive_date_url_ts_mismatch', archive_url_date); -- emit an error message
end
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return { -- return exported functions
archive_date_check = archive_date_check,
date_hyphen_to_dash = date_hyphen_to_dash,
date_name_xlate = date_name_xlate,
dates = dates,
is_valid_date = is_valid_date,
reformat_dates = reformat_dates,
set_selected_modules = set_selected_modules,
year_check = year_check,
year_date_check = year_date_check,
}
039z8dc7ugbbv8w4tsnejz5bfud8dgw
رج:هند ایالتون و یکپشت سامونها
14
42492
392014
181563
2026-08-06T17:51:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392014
wikitext
text/x-wiki
[[رج:هند]]
[[رج:ایالتون، کشور په]]
8xg6asr6j7jisgo1r77vzfy3p2i6eea
رج:عربی کتابون
14
42519
391949
181603
2026-08-06T17:39:38Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391949
wikitext
text/x-wiki
[[رج:عربی زوون|کتابون]]
[[رج:کتابون، زوون په]]
27hl7yzij0i7xsnfh0xzo2ndysy5bpw
نوسال موارکا (۲۰۱۴ فیلم)
0
43335
391825
187078
2026-08-06T16:53:29Z
محک
1023
کارور محک، [[نوسال موارکا(2014 فیلم)]] ِصفحه ره دَکشییه [[نوسال موارکا (۲۰۱۴ فیلم)]] دله
187078
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''نوسال موارکا''' {{به انگلیسی|Happy New Year}} اتا شمشمامی(هیندی) فیلم هسه کا 2014 دله پخش بویه کا مزقونی(میوزیکال) و سرقتی فیلم هسه کا ونه دله شاهروخ خون و جکی شاروف ، نخش کا هاکردنه .
== ممبعئون ==
{{بنبنویشت}}{{ویکی منبع|پیوند=https://en.wikipedia.org/w/index.php?title=Happy_New_Year_(2014_film)&oldid=637237471|عنوان=Happy New Year (2014 film)|زبان=انگلیسی|بازیابی=۸ دسامبر ۲۰۱۴}}
[[رج:هندی فیلمون]]
[[رج:۲۰۱۴ فیلمون]]
eb4gkf0sg8emy3g1w3nnykgn0m66eho
رج:افغانستان ولایتون
14
43376
391978
182888
2026-08-06T17:46:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391978
wikitext
text/x-wiki
[[رج:افغانستان]]
[[رج:ایالتون، کشور په]]
qhjjgdho9okbrr29qsgsdhxxoskrm9b
رج:ایرلند ایالتون
14
43399
391987
182923
2026-08-06T17:47:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391987
wikitext
text/x-wiki
[[رج:ایرلند]]
[[رج:ایالتون، کشور په]]
[[رج:بریتانیا جوغرافی]]
sffpms21uk2atvyv74sg3jvedpba6he
رج:آلمان ایالتون
14
43437
391970
182983
2026-08-06T17:45:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391970
wikitext
text/x-wiki
[[رج:آلمان|ایالتون]]
[[رج:ایالتون، کشور په]]
hr11m8mgmc7ugeahoyfa9krkxg4rpjq
رج:قزاقستون ولایتون
14
43464
392006
183035
2026-08-06T17:50:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392006
wikitext
text/x-wiki
[[رج:قزاقستون]]
[[رج:ایالتون، کشور په]]
a0hpwz7aloumyr3bt9571tbq5dnvygs
رج:هلند اوستانون
14
43508
392013
183090
2026-08-06T17:51:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392013
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:هلند]]
3h7vvx9uzgxfoo0k2tj5qv99j0u290m
رج:اندونزی اوستانون
14
43565
391981
183178
2026-08-06T17:46:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391981
wikitext
text/x-wiki
[[رج:اندونزی]]
[[رج:ایالتون، کشور په]]
r2qsjqkpzixx6b2qrk657mczc4o2blw
رج:عراق اوستانون
14
43741
392004
183577
2026-08-06T17:49:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392004
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:عراق|ا]]
lxoo03qf5eovxcoovrth7uekm7agyxn
رج:ترکیه اوستانون
14
43861
391996
183717
2026-08-06T17:48:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391996
wikitext
text/x-wiki
[[رج:ترکیه]]
[[رج:ایالتون، کشور په]]
38r5w8l4umg0xni39ol5mgxr3w8a4pw
رج:پاکستان ایالتون
14
43886
392016
183765
2026-08-06T17:51:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392016
wikitext
text/x-wiki
[[رج:پاکستون]]
[[رج:ایالتون، کشور په]]
jf1ioka1nw4fxviq0l3vczdqzdtmgzb
رج:مالزی ایالتون
14
43944
392011
183925
2026-08-06T17:50:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392011
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:مالزی]]
5px2z1yxs2v49u9xiyxtegydqqliw2z
رج:لیبی اوستانون
14
43956
392009
183943
2026-08-06T17:50:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392009
wikitext
text/x-wiki
[[رج:لیبی]]
[[رج:ایالتون، کشور په]]
r2ezj7hb596la8t5ku8wakaib4umx39
هشتر شمشیل
0
44492
391877
192014
2026-08-06T17:12:51Z
محک
1023
[[رج:فیلم]] حذف شد; [[رج:چینی فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391877
wikitext
text/x-wiki
{{صندخ/فیلم}}
[[رده:مقالههای فیلم که متغییر فروش دارند]]
'''''هشتر شمشیل'''''<ref>{{وب منبع}}فارسی ویکیپدیا</ref> (انگلیسی: ''Dragon Blade'') اتا فیلم هسه کا ونه جانر اکشن و رزمی هسه، دایرکتر دانیل لی هسه و جکی چان ونه دله نخش کا کنده، و 2015 دله پخش بویه. 65 ملیون دلار اینتا فیلم وسه خرج هاکردنه تا بساتنه وه ره. فیلم زوونون ماندارین، اینگیلیسی، لاتین بیه. 127 دقه دی وی مدت بیه.
== ممبعئون ==
{{بنبنویشت|۲}}
[[رج:۲۰۱۵ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:چینی فیلمون]]
k9s5a5yk971krs9aqeht8gm1kphsdpx
مانیلیا
0
45014
391976
185663
2026-08-06T17:46:16Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391976
wikitext
text/x-wiki
{{صندخ/موجود}}
'''مانیلیا''' یا '''ادمئوئی''' یا '''منلی''' اتا دریویی آسنیئیج جونور هسه کا اغلب نصم آدمیزا و نصم دی شیم (مایی) هسه.
== ممبعئون ==
{{بنبنویشت|۲}}
[[رج:اساطیر، کشور په]]
[[رج:اجنده]]
[[رج:افسانه]]
9kn7nd73f7cpiqy5heub04foq16q3cq
رج:آذربایجون ایالتون
14
45248
391966
186089
2026-08-06T17:45:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391966
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:آذربایجون]]
br1jr1f41xcycrv30osaayhgyq54xso
اجنده
0
45319
391973
279395
2026-08-06T17:45:56Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391973
wikitext
text/x-wiki
[[پرونده:Shah_Namah,_the_Persian_Epic_of_the_Kings_Wellcome_L0035191.jpg|بندانگشتی|اتا اجنده فارسی شعر نقاشی دله]]
'''اجنده ا جند''' یا '''ازمابهترون''' اسلومی اساطیر و عامیونه باورئون دله اتا چی هسه کا ونه جینس بوغ یا [[تش]] هسه کا هوشدار هسه و [[آدم|آدمیزائون]] وشون ره نویننه و وشون توننه شه [[دیم]] ره دگش هاکنن. وشون توننه گت گت و سخت کار انجوم هادن . قرئون دله دی اتا سوره دره کا ونه نوم [[جن (سوره)|جن]] هسه کا همون اجنده معنی ره دنّه.
== اجندون و سلیمون پیغومبر ==
اسلوم دله ، [[سلیمون]] اتا موهم پیغومبر هسه . اسلوم گنه سلیمون داوود وچه بیه کا [[خادا|خدا]] وه ره حکمت هادائه . وه خدا اذن جا دشت جونورن ره مسلط بیه . وه وا ره دی مسلط بیه و خدا اذن جا وه اجندون ره دی مسلط بویه .
== ممبعئون ==
{{بنبنویشت|۲}}
[[رج:جن]]
[[رج:شیطون]]
[[رج:اسلام]]
[[رج:اساطیر، کشور په]]
lor7z6mgvgk03wki0eccgtdcx0p2wao
نو کانتری فور اولد من
0
45597
391760
187147
2026-08-06T15:36:37Z
محک
1023
391760
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:No Country for Old Men poster.jpg
|نوم = پیرمردون وسّه هیچکجه دنییه
}}
'''نو کانتری فور اولد من''' یعنن '''پیرمردها وسّه هیچکجه جا دنییه''' {{انگلیسی جه|No Country for Old Men}} اتا جنایی و هیجانی فیلم هسته که [[کوئن برارون]] سال ۲۰۰۷ بساته.
== منابع ==
{{پانویس}}
[[رج:۲۰۰۷ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:هیجانی فیلمون]]
tldb9fjzwu79p9ztwmq1oy6tgydth3u
391762
391760
2026-08-06T15:37:09Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391762
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:No Country for Old Men poster.jpg
|نوم = پیرمردون وسّه هیچکجه دنییه
}}
'''نو کانتری فور اولد من''' یعنن '''پیرمردها وسّه هیچکجه جا دنییه''' {{انگلیسی جه|No Country for Old Men}} اتا جنایی و هیجانی فیلم هسته که [[کوئن برارون]] سال ۲۰۰۷ بساته.
== منابع ==
{{پانویس}}
[[رج:۲۰۰۷ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:هیجانی فیلمون]]
[[رج:اوسکار بیته فیلمون]]
7u2s3p4n84an7864vqe3ypa9t8gmoe0
تایتانیک فیلم
0
45652
391757
187231
2026-08-06T15:35:48Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391757
wikitext
text/x-wiki
{{صندخ/فیلم|عکس=Titanic_poster.jpg}}
'''''تایتانیک''''' اتا تاریخی-رومانتیک فیلم هسته که سال ۱۹۹۷ [[جیمز کامرون]] بساته. این فیلم دله [[لئوناردو دی کاپریو]] و [[کیت وینسلت]] اصلی نقش دارنه. فیلمِ آسنی (داستان) اتا کشتی خَوِر هسته که ونه نوم ره [[تایتانیک]] گتنه و خله خدم-حشم داشته و پیلکسون ره سوار هاکرده بییه ولی اوقیانوس دله غرق وونه. این فیلم، تاریخِ پرفروشترین فیلمها جه هسته.
== منابع ==
{{پانویس|2}}
[[رج:تایتانیک]]
[[رج:۱۹۹۷ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:رومانتیک فیلمون]]
[[رج:تاریخی فیلمون]]
[[رج:اوسکار بیته فیلمون]]
bt3lt4yt2vui6ihziswvkr4qv6ji8zq
رج:۲۰۲۳ فیلمون
14
46021
391935
188300
2026-08-06T17:25:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391935
wikitext
text/x-wiki
[[رج:۲۰۲۳]]
[[رج:فیلم، سال په]]
282uzjg5b8782i8lrquobrg4ilu6k05
رج:۲۰۲۱ فیلمون
14
46026
391932
191638
2026-08-06T17:24:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391932
wikitext
text/x-wiki
[[رج:۲۰۲۱]]
[[رج:فیلم، سال په]]
g41kiusonutzudlpscrzixg35tc7sgc
گاد فادر
0
46041
391779
188337
2026-08-06T15:53:04Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391779
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''دِ گادفادِر''' که یعنن '''پدرخانده''' {{انگلیسی جه|The Godfather}} اتا گانگستری فیلم هسته که [[فرانسیس فورد کاپولا]] سال ۱۹۷۲ بساته و تاریخ ِمعروفترین فیلمها جه حیساب انه. اینتا فیلم شه سه قسمت داشته.
== آسنی ==
اولین قسمت دله اصلی نقش «دون ویتور کورلئون»، [[مارلون براندو]] نقش، کسی هسته که اتا [[ایتالیا]]یی گانگستر گروه ِرهبری ره آمریکا دله بعهده دارنه. وه دِتا ریکا دارنه که اتا ره ونه دِشمنون کشنّه و دومی، که «میشل» هسته و [[آل پاچینو]] ونه نقش ره دارنه، دِ قسمت بعدی گروهِ ریاست ره بعهده گیرنه و شه پییر جاسر نیشرنه و ونه خطرات جه دیم-به-دیم وونه.
== منابع ==
{{پانویس}}
[[رج:گانگستری فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:ایتالیایی فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:۱۹۷۲ فیلمون]]
[[رج:فرانسیس فورد کاپولا]]
[[رج:اوسکار بیته فیلمون]]
skrvsyu2fgtsdcxob6ol43tylsaw5ka
رج:استرالیا ایالتون
14
46167
391977
188624
2026-08-06T17:46:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391977
wikitext
text/x-wiki
[[رج:استرالیا]]
[[رج:ایالتون، کشور په]]
pw5gkvpvjhc3qsahn8bc7op2yet9efi
شیندلر لیست
0
46399
391766
189035
2026-08-06T15:38:38Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391766
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= Schindler's List p.jpg
}}
'''''شیندلر لیست''''' {{انگلیسی جه|Schindler's List}} اتا آمریکایی فیلم هسته که سال ۱۹۹۳ شنه و [[استیون اسپیلبرگ]] وه ره بساته. این فیلم [[هولوکاست]] خَوِری هسته و واقعی آسنی سر جه وه ره بساتنه. [[لیام نیسون]] فیلم دله اصلی نقش ره کا کنده و اتا آلمانی تاجرِ نقش ره دارنه که [[لهستون]] دله دره و خانه [[نازی آلمان|نازیها]] ره کلک بزنه که شه [[جهود]] ِکارگرون جان ره حفظ هاکنه.
== منابع ==
{{پانویس}}
* انگلیسی ویکیپدیا
[[رج:۱۹۹۳ فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:آلمانی فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:هولوکاست فیلمون]]
[[رج:اوسکار بیته فیلمون]]
2ialonb5o4f0dglvmp7qtbelco6gp4w
فارست گامپ
0
46404
391767
390700
2026-08-06T15:38:55Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391767
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس=Forrest Gump p.jpg
}}
'''''فارست گامپ''''' {{انگلیسی جه|Forrest Gump}} اتا آمریکایی فیلم هسته که سال ۱۹۹۴، [[وندی فینرمن]] بساته. فارست گامپ شیشتا [[اوسکار جایزه]] ره بَوِرده که بتترین فیلم ره هم شامل بییه.
این فیلم دله [[تام هنکس]] اتا عقبدکت ریکا نقش ره دارنه که وچگی جه ونه راه بوردن و گپ بزوئن و فکر هکردن اتکه اشکال دارنه ولی خله شانس یارنه. فیلم دله خله از آمریکایِ تاریخی اتفاقات و دکتهئون جه اشاره وونه و گنه که بصتینکلا فارست گامپ این اتفاقات ره باعث بیّه.
== منابع ==
{{پانویس}}
[[رج:۱۹۹۴ فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:اوسکار بیته فیلمون]]
9hej706xe5cso68huaqgrycpdp1ztzk
رج:۱۹۹۴ فیلمون
14
46418
391887
189067
2026-08-06T17:15:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391887
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۹۴|فیلم]]
b73p5ka1s6mhqy1ywobjhptygt9hcf4
رج:چین اوستانون
14
46431
392019
189145
2026-08-06T17:51:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392019
wikitext
text/x-wiki
[[رج:چین|ایالات]]
[[رج:ایالتون، کشور په]]
ol2hf14izptmoymj76847ypa7dks0io
رج:روسیه تقسیمات
14
46500
392000
189301
2026-08-06T17:49:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392000
wikitext
text/x-wiki
[[رج:روسیه]]
[[رج:ایالتون، کشور په]]
[[رج:روسیه جوغرافی]]
402et4ij21bpfxxd4l7uq1kmpgrmycu
رج:۲۰۰۹ فیلمون
14
46598
391908
191634
2026-08-06T17:20:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391908
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۹|ف]]
osjdd2c5zgvwm4gjq4f8vrvoetyqpn1
رج:کاندا ایالتون
14
46612
392020
189538
2026-08-06T17:52:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392020
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:کانادا جوغرافی]]
[[رج:کانادا]]
g3b74rv0jwqpiid63wm4v2ywi6dm4kk
رج:بنین اوستانون
14
46655
391993
189662
2026-08-06T17:48:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391993
wikitext
text/x-wiki
[[رج:بنین]]
[[رج:ایالتون، کشور په]]
73v77crv9prlrqmq4ebj27a88u8ul93
رج:جاپونی فیلمون
14
46693
391852
189726
2026-08-06T17:08:15Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391852
wikitext
text/x-wiki
[[رج:جاپونی زوون]]
[[رج:فیلم، کشور په]]
[[رج:فیلمون با حیساب زوون]]
fmdphj5ja0gfn4qijhfowty6wrcnsvp
391863
391852
2026-08-06T17:09:49Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391863
wikitext
text/x-wiki
[[رج:جاپونی زوون]]
[[رج:فیلمون با حیساب جوغرافی]]
[[رج:فیلم، زوون په]]
7hxuea7n8iczkcgk0ooy1tu3hz9e00d
دیپارتد
0
46694
391763
390732
2026-08-06T15:37:37Z
محک
1023
[[رج:اوسکار بیته فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391763
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = بوردهئون
|عکس= File:Departed234.jpg
}}
'''دِ دیپارتد''' که یعنن '''بوردهئون''' {{انگلیسی جه| The Departed}} اتا آمریکایی فیلم هسته که سال ۲۰۰۶ [[مارتین اسکورسیزی]] بساته. این فیلم چارتا اوسکار بیته.
== آسنی ==
این فیلم دله دتا صغیر وچه زندگی ره سراق دنه که اتا [[گانگستر]]ون دله گت وونه و اتی پلیس بار انه. اولی ره ونه مافیایی خانواده رسندنه افسری و نظام دله کارگاه وونه که مافیا ره راپورت هاده.اتی که پلیس دله گت بیه هم جاسوسی رسنه مافیا دله جاسوسی هاکنه. وشون دتا آخر هیی جه درگیر وونه.
== منابع ==
{{پانویس}}
[[رج:گانگستری فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:مارتین اسکورسیزی]]
[[رج:۲۰۰۶ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
jm330qfoskcnhtkuxyt6jpyfg6hso1u
رج:۲۰۰۶ فیلمون
14
46695
391902
189735
2026-08-06T17:19:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391902
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۶]]
joj3ggq8vrrlwc33yvig29dzy1e00e0
اوپنهایمر
0
46704
391719
391708
2026-08-06T15:08:12Z
محک
1023
391719
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Oppenheimer (film).jpg
}}
'''اوپنهایمر''' اتا فیلم هسته که [[رابرت اوپنهایمر]] زندگی خَوِری بساتنه. این فیلم ره سال ۲۰۲۳، [[کریستوفر نولان]] بساته.
اوپنهایمر و [[باربی فیلم]] خله رقابت داشتنه و دِتا فیلمی بینه که ویشترین فروش ره بدست بیاردنه. اوپنهایمر فیلم [[گولدن گلوب]] ویشتر جوایز ره این سال وسّه بیته. نولان شه اولین [[اوسکار جایزه|اوسکار]] (هم بتترین فیلم و هم بتترین کارگردان) ره اینتا فیلم سره بیته.
اوپنهایمر اتا آمریکایی شیمیدون بییه. وه کسی بییه که [[اتمی بومب]] بساتن وسه خله کار هکرده و گروهی ره رهبری کرده که اولین بومب ره تست هاکردنه و بساتنه.
== منابع ==
{{پانویس}}
[[رج:۲۰۲۳ فیلمون]]
[[رج:کریستوفر نولان]]
[[رج:آمریکایی فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج: بیوگرافی فیلمون ]]
[[رج:اوسکار بیته فیلمون]]
reohvurvhxzw27b73sb335bpddi0efj
رج:ترکمونستون ولایتون
14
46825
391995
190258
2026-08-06T17:48:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391995
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:ترکمونستون]]
964ols8yaaf3jigaett2p14l50s3p01
رج:آرژانتین اوستانون
14
46864
391967
190369
2026-08-06T17:45:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391967
wikitext
text/x-wiki
[[رج:آرژانتین]]
[[رج:آرژانتین جوغرافی]]
[[رج:ایالتون، کشور په]]
73089nn9dyz6nemx4tbm735feuypmty
رج:برزیل ایالتون
14
47221
391990
191262
2026-08-06T17:47:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391990
wikitext
text/x-wiki
[[رج:برزیل]]
[[رج:ایالتون، کشور په]]
a8xvrptkruhz5w2fi0fw3dos3i4gup8
رج:۱۹۹۵ فیلمون
14
47308
391888
191587
2026-08-06T17:15:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391888
wikitext
text/x-wiki
[[رج:۱۹۹۵|فیلم]]
[[رج:فیلم، سال په]]
6avp5n277aqwle44kzwkpnobu36d150
رج:۲۰۰۸ فیلمون
14
47325
391906
191622
2026-08-06T17:20:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391906
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۸|ف]]
9u0foz92h8j8nw1hguw407z8lnzbewb
رج:۲۰۰۵ فیلمون
14
47326
391900
191624
2026-08-06T17:19:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391900
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۵|ف]]
5nwebpdfqel7w6zil74f81qthoprdmn
رج:۲۰۰۳ فیلمون
14
47332
391897
191631
2026-08-06T17:18:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391897
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۳|ف]]
l4wd1onh593soi6ixaarhf3ju9o0zmx
رج:۲۰۰۴ فیلمون
14
47334
391898
191633
2026-08-06T17:18:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391898
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۴|فیلم]]
6udurj3vqsfwdpp3sfbt8vlo1r47ebm
رج:۲۰۰۷ فیلمون
14
47335
391904
191639
2026-08-06T17:19:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391904
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۷|ف]]
3knpewzwtrk2te0n7cfwjbemf76911q
رج:۲۰۱۰ فیلمون
14
47336
391910
191641
2026-08-06T17:20:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391910
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۰|ف]]
k4tvg7in098ywvo74utk66om22an71q
رج:۲۰۱۱ فیلمون
14
47337
391912
191642
2026-08-06T17:21:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391912
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۱۱|ف]]
bsxm4caq6pn0o9spei04w8qhjgkm0ti
انیمال کینگدام
0
47373
391739
391707
2026-08-06T15:15:02Z
محک
1023
391739
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = جانورونِ سامون
|عکس= File:Le Règne animal 2023 film poster.jpg
}}
'''انیمال کینگدِم''' یا '''جونورون ِسامون''' اتا [[فرانسوی]] علمی-تخیلی فیلم هسته که سال ۲۰۲۳ وه ره [[توماس کیلی]] بساته. این فیلم که [[فرانسه]] و [[بلجیک]] دله بساتنه ره [[رومن دوریس]]، [[پاول کرچر]]، [[ادل اگزارچوپولوس]]، [[تام مرسیر ]] و [[بیلی بلین ]] نقش بازی هاکردنه.
== آسنی ==
دنیا دله اتا مریضی دکته که آدمون ره گیرنه و حیوون شکل کنده و فرانسهیِ دولت این آدمونی که ناخشی گیرنه ره دستگیر کنده و بند کشنه. این دنیا دله اتا خانوادهیِ مار اینتی ناخِشی بیته و ونه شی و ریکا آسنی ره پیش وَرنه. وشون ره راهی کنّه اتا دیر-شر که اونجه مریضخنه دله مار ره دوا-درمون هاکنن و پییر-پسر ونه نزدیکی دوون. ولی مریضخنه جه این مریض ِجونورون فرار کنّه و شهرِ کناره جا خِرنه. این میونه پییر-وچه شه اتایِ دمبالکِت چرخهتو کنّه و همهجا ره گردنّه ولی زنا ره پیدا نکنه. ریکا هم کمکم در وَرنه که دره مریض وونه. ونه [[پشتمرزی]] درکفنه و ونه انگوس تِک ناخون گت وونه و… این پییر-وچه رابطه و این ریکایِ رابطه شه همکلاسیها جه تغییر کنده و ریکا سعی کنده این تغییر جه کنار بئه و کمکم [[ورگ]] وونه و…
== منابع ==
{{پانویس}}
[[رج:فرانسوی فیلمون]]
[[رج:فرانسهای فیلمون]]
[[رج:علمی-تخیلی فیلمون]]
[[رج: ۲۰۲۳ فیلمون]]
12vm4k9m3638imnyybrgsm787xqa7ms
دیپلومسری
0
47518
392024
389778
2026-08-06T17:53:46Z
Kontributor 2K
39435
([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:HKBU Associate Degree Certificate.jpg]] → [[File:HKBU CIE Associate Degree Certificate in 2012.jpg]] [[c:COM:FR#FR1|Criterion 1]] (original uploader’s request)
392024
wikitext
text/x-wiki
'''دیپلومسری''' {{به انگلیسی|associate degree}} اتا دوره هسه اکادمیک بمسنیون دله کا وانه دیپلوم ره بیته بوئه تا بتونده ایطنتا دوره دله دووشه. هرکه اینتا دوره ره دشت واحدون ره پاس هاکنه وه ره دیپلوم سری مدرک دننه.
[[پرونده:HKBU CIE Associate Degree Certificate in 2012.jpg|بندانگشتی|اتا دیپلومسری مدرک تصفیر]]
== پیدرپشوئون ==
=== -[[لیسونس]] ===
-'''[[دونشخا]]'''
=== -[[دونشجار]] ===
== ممبعئون ==
{{بنبنویشت}}
* «فصل دوم»، انتخاب رشته، انتخاب آینده، راهنمای انتخاب رشته آزمون سراسری … تألیف دکتر کورش پرند، غلامرضا یادگارزاده و دکتر ابراهیم خدایی، تهران: مرکز انتشارات سازمان سنجش کشور، مرکز انتشارات سازمان آموزش فنی و حرفهای کشور، ۱۳۹۱، شابک ۹۷۸-۹۶۴-۱۵۳-۱۷۹-۱.mw-parser-output cite.citation{font-style:inherit}.mw-parser-output q{quotes:"\"""\"""'""'"}.mw-parser-output code.cs1-code{color:inherit;background:inherit;border:inherit;padding:inherit}.mw-parser-output .cs1-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/6/65/Lock-green.svg/9px-Lock-green.svg.png")no-repeat;background-position:right .1em center;padding-right:1em;padding-left:0}.mw-parser-output .cs1-lock-limited a,.mw-parser-output .cs1-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Lock-gray-alt-2.svg/9px-Lock-gray-alt-2.svg.png")no-repeat;background-position:right .1em center;padding-right:1em;padding-left:0}.mw-parser-output .cs1-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Lock-red-alt-2.svg/9px-Lock-red-alt-2.svg.png")no-repeat;background-position:right .1em center;padding-right:1em;padding-left:0}.mw-parser-output div[dir=ltr] .cs1-lock-free a,.mw-parser-output div[dir=ltr] .cs1-lock-subscription a,.mw-parser-output div[dir=ltr] .cs1-lock-limited a,.mw-parser-output div[dir=ltr] .cs1-lock-registration a{background-position:left .1em center;padding-left:1em;padding-right:0}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration{color:#555}.mw-parser-output .cs1-subscription span,.mw-parser-output .cs1-registration span{border-bottom:1px dotted;cursor:help}.mw-parser-output .cs1-hidden-error{display:none;font-size:100%}.mw-parser-output .cs1-visible-error{font-size:100%}.mw-parser-output .cs1-subscription,.mw-parser-output .cs1-registration,.mw-parser-output .cs1-format{font-size:95%}.mw-parser-output .cs1-kern-left,.mw-parser-output .cs1-kern-wl-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right,.mw-parser-output .cs1-kern-wl-right{padding-right:0.2em}
[[رج:تحصیل]]
[[رج:دوشنجار]]
[[رج:اکادمیک]]
[[رج:آکادمیک]]
[[رج:آکادمیک بمسنیون]]
[[رج:تحصیلات]]
[[رج:عالیه]]
[[رج:درس]]
ivir9sfun17ren92401mdcgqyv3ym79
رج:کویت اوستانون
14
47596
392022
193478
2026-08-06T17:52:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392022
wikitext
text/x-wiki
[[رج:کویت]]
[[رج:ایالتون، کشور په]]
seeqdrs36lw9ujd0alpdeph6dejd3jf
رج:لبنان اوستانون
14
47600
392007
193488
2026-08-06T17:50:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392007
wikitext
text/x-wiki
[[رج:لبنان]]
[[رج:ایالتون، کشور په]]
j8tad0q992jw6amzbkoeuk9cfm1ojwe
رج:سانسکریت کتابون
14
47645
391948
193646
2026-08-06T17:39:28Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391948
wikitext
text/x-wiki
[[رج:سانسکریت]]
[[رج:کتابون، زوون په]]
h4j2bc6gk61k20idp2yryyyto3ailrn
رج:۲۰۲۴ فیلمون
14
48019
391936
194868
2026-08-06T17:25:20Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391936
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۲۴]]
tlcn74q9u43b6ygbug9m6k1f32ll19c
رج:اردن اوستانون
14
48648
391974
196017
2026-08-06T17:46:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391974
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:اردن]]
n1fv0anwpejefkr4p2t7ur79tv28yu8
رج:امارات اوستانون
14
53082
391980
202311
2026-08-06T17:46:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391980
wikitext
text/x-wiki
[[رج:امارات]]
[[رج:ایالتون، کشور په]]
sdolu378y9lgbvnxzz51y21qnspr6a7
رج:۲۰۲۲ فیلمون
14
64782
391934
220798
2026-08-06T17:24:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391934
wikitext
text/x-wiki
[[رج:۲۰۲۲|ف]]
[[رج:فیلم، سال په]]
01eupz0tylpiifqh3rtbbrunmj8ivo3
رج:۲۰۱۶ فیلمون
14
64783
391922
220799
2026-08-06T17:22:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391922
wikitext
text/x-wiki
[[رج:۲۰۱۶|ف]]
[[رج:فیلم، سال په]]
svlwzoli4tenv22d4amuhrj62ee2pnu
رج:۲۰۱۲ فیلمون
14
64784
391914
220800
2026-08-06T17:21:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391914
wikitext
text/x-wiki
[[رج:۲۰۱۲|ف]]
[[رج:فیلم، سال په]]
16c1xhl74nsknuilhxfx8pwkh29wpaf
رج:۱۹۹۹ فیلمون
14
64786
391892
220803
2026-08-06T17:17:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391892
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۹۹|ف]]
nouii0actljigc8qjdi8l5ey5tp6qy8
رج:ویکتور هوگو
14
69156
391962
323686
2026-08-06T17:41:18Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391962
wikitext
text/x-wiki
[[رج:کتابون، نویسنده په]]
d38ozg4ce1y40lp924n1mqof46pylyu
رج:آلبرت کامو
14
69157
391963
323685
2026-08-06T17:41:38Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391963
wikitext
text/x-wiki
[[رج:کتابون، نویسنده په]]
d38ozg4ce1y40lp924n1mqof46pylyu
پرنسس نپسی بزوئن
0
93116
391879
324473
2026-08-06T17:13:19Z
محک
1023
[[رج:فیلم]] حذف شد; [[رج:جاپونی فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391879
wikitext
text/x-wiki
{{صندخ/فیلم}}
'''''پرنسس نپسی بزوئن''''' ([[جاپونی زوون|ژاپنی]]: ひるね姫 〜知ら هないワタシの物語〜,اتا [[جاپون|جاپونی]] انیمه هسه کا 2017 دله وه ره [[تنککری|منتشر]] کاردنه.
== ممبعئون ==
1-فارسی ویکیپدیاء
[[رج:۲۰۱۷ فیلمون]]
[[رج:انیمه]]
[[رج:جاپونی فیلمون]]
erb0xbnobqdg3h7apwm3ktdp7qf13dc
آنورا
0
93229
391754
278872
2026-08-06T15:34:55Z
محک
1023
391754
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Anora (2024 film) poster.jpg
}}
'''آنورا''' اتا آمریکایی فیلم هسته که ۲۰۲۴ سال [[شان بیکر]] بساته.
فیلم کؤمدی هسته و اتا مولزنا و پولدار روس مردی عاشقی آسنی هسته که هدی ره خانه ولی...
اینتا فیلم [[اوسکار جایزه]] ره چنتا چله درون بیته و ۲۰۲۵ بتترین فیلم انتخاب بیه.
== منابع ==
{{پهنویس}}
[[رج: انگلیسی فیلمون ]]
[[رج:۲۰۲۴ فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:کمدی فیلمون]]
[[رج:اوسکار_بیته_فیلمون]]
d3yvukh6hi9d1ysq9lg1yrvsifzhhei
392025
391754
2026-08-06T18:04:51Z
محک
1023
[[رج:انگلیسی فیلمون]] حذف شد با استفاده از [[ویکیپدیا:رجساز]]
392025
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Anora (2024 film) poster.jpg
}}
'''آنورا''' اتا آمریکایی فیلم هسته که ۲۰۲۴ سال [[شان بیکر]] بساته.
فیلم کؤمدی هسته و اتا مولزنا و پولدار روس مردی عاشقی آسنی هسته که هدی ره خانه ولی...
اینتا فیلم [[اوسکار جایزه]] ره چنتا چله درون بیته و ۲۰۲۵ بتترین فیلم انتخاب بیه.
== منابع ==
{{پهنویس}}
[[رج:۲۰۲۴ فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:کمدی فیلمون]]
[[رج:اوسکار_بیته_فیلمون]]
5o70blccs14j50pxr3onnt33llatdc3
رج:۲۰۰۰ فیلمون
14
93393
391893
279724
2026-08-06T17:17:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391893
wikitext
text/x-wiki
[[رج:۲۰۰۰|فیلم]]
[[رج:فیلم، سال په]]
dzsfbprh9h7pmjjmnfhzlhci0xcl8te
ریدر
0
93397
391837
281213
2026-08-06T16:58:37Z
محک
1023
391837
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Reader ver2.jpg
|نوم= کتابخون
}}
'''''ریدر''''' {{انگلیسی جه|Reader}} یعنن '''''کىتابخوون''''' اتا درام فیلم بییه که ۲۰۰۸ سال، بساتنه. فیلمِ آسنی (داستان) آلمان دله گذرنه و اتا بیشی زنا ([[کیت وینسلت]]) و اتا جوون ریکا خَوری هسته. زنا سىواد ندارنه و ریکا شونه ونهسه کىتاب خوندنه تا هئی جه نزدیک وونه و جنسی رابطه برقرار کنه تا وابسته وونه و زنا همینسه بیخور ریکا ره سر یلنه و شونه. خله سال گذرنه و ریکا حقوق رشته ره دمبال کنده و [[جئونی دیمین الجه|جنگ په]]، ونه زنانی که جنگی جنایت هاکردنه ره دادگاه دله قضاوت هنیشنه ولی سرصاب وونه که اون زنا که ونه اولین عشق بییه، این مجرمین میون دره...
== منابع ==
{{پهنویس}}
[[رج:۲۰۰۸ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:جهونی جنگ فیلمون]]
[[رج:درام فیلمون]]
[[رج:آلمانی فیلمون]]
9oa5q9w8g4mavyz60qwey1n2xro1dvn
آرگو
0
93400
391749
279738
2026-08-06T15:33:35Z
محک
1023
391749
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Argo2012Poster.jpg
}}
'''''آرگو''''' {{انگلیسی جه|Argo}} اتا تاریخی و اکشن فیلم بییه که ۲۰۱۲ سال، [[بن افلک]] بساته و شه اصلی نقش ره هم داشته و همین نقش وسه [[اوسکار جایزه]] ره هم بیته.
آسنی (=داستان) [[ایران انقلاب]] په شروع چونه که آمریکاییشون ره سفارتخنه دله اسیر بیتنه و اتا مخفی مأمور راهی هاکردنه که بئه و اسیرون جان ره در-بَوره....
== منابع ==
{{پهنویس}}
[[رج:تاریخی فیلمون]]
[[رج:۲۰۱۲ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:اوسکار_بیته_فیلمون]]
[[رج:اکشن فیلمون]]
1fzvwid3c7ygguufq83p4852ov5cf48
رج:بنگلادش اوستانون
14
93557
391992
280167
2026-08-06T17:48:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391992
wikitext
text/x-wiki
[[رج:بنگلادش]]
[[رج:ایالتون، کشور په]]
pilma36jni8f59ne708i7fvc7omwt1o
رج:۱۹۹۸ فیلمون
14
98696
391891
287743
2026-08-06T17:16:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391891
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۹۸]]
ar2d1o1nnctao9klw15cufghwzi2gic
رج:۱۹۹۷ فیلمون
14
98697
391890
287744
2026-08-06T17:16:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391890
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۹۷]]
fw0rxwj5fzkhcr81ka2a2xfv67gkc39
رج:۲۰۲۵ فیلمون
14
98698
391937
287745
2026-08-06T17:25:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391937
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۲۵]]
bwqujd0hebcvthqo0w21ly0ubux05b7
رج:۲۰۰۱ فیلمون
14
98699
391894
287746
2026-08-06T17:17:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391894
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۱]]
9itjj9xc6vw1gtvudfjtd2pq4r919h0
رج:۲۰۰۲ فیلمون
14
98700
391895
287747
2026-08-06T17:18:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391895
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۰۲]]
ojzpml4evefs6vidqds82cglpthuq4z
رج:خدائون
14
104941
391991
304562
2026-08-06T17:47:56Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391991
wikitext
text/x-wiki
[[رج:دین]]
[[رج:اساطیر، کشور په]]
nrb2iamg4gu98vpuq1yeqa2fnae3fp0
رج:دانمارک اوستانون
14
106951
391999
307818
2026-08-06T17:49:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391999
wikitext
text/x-wiki
[[رج:ایالتون، کشور په]]
[[رج:دانمارک|اوستانون]]
pe2puwti22x1kcfl91vayh4jp61ckd9
رج:ایتالیا اوستانون
14
107020
391983
307892
2026-08-06T17:47:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391983
wikitext
text/x-wiki
[[رج:ایتالیا]]
[[رج:ایالتون، کشور په]]
gu9b7dxpb1lu3q8pwzfpoxwu0g75ug4
رج:ایسپانیا اوستانون
14
107021
391975
307895
2026-08-06T17:46:12Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391975
wikitext
text/x-wiki
[[رج:ایسپانیا]]
[[رج:ایالتون، کشور په]]
npbqzix8vvjl2rb4z18ra79yq5saqgn
رج:چک اوستانون
14
107025
392017
307900
2026-08-06T17:51:42Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392017
wikitext
text/x-wiki
[[رج:چک جمهوری]]
[[رج:ایالتون، کشور په]]
4tfv8v7y0un2pyim9gxl2t8fuunjn8s
رج:لهستون اوستانون
14
107040
392008
307917
2026-08-06T17:50:32Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392008
wikitext
text/x-wiki
[[رج:لهستون]]
[[رج:ایالتون، کشور په]]
124jw9cs2l4qeqkzzo2rd78vqw55fbu
رج:سوئد اوستانون
14
107044
392001
307921
2026-08-06T17:49:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392001
wikitext
text/x-wiki
[[رج:سوئد]]
[[رج:ایالتون، کشور په]]
967o45jzkwjq6u4hbq48zgv2niv9gs7
رج:فلاند اوستانون
14
107047
392005
307924
2026-08-06T17:50:02Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
392005
wikitext
text/x-wiki
[[رج:فلاند]]
[[رج:ایالتون، کشور په]]
gg4acnpvp4w7m5s7djh2ve5wkr46ahy
رج:اتریش اوستانون
14
107105
391972
308010
2026-08-06T17:45:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391972
wikitext
text/x-wiki
[[رج:اتریش]]
[[رج:ایالتون، کشور په]]
mv1iv6mkmo9senkfut6jv4zci7plrc2
رج:جنوبی آفریخا اوستانون
14
107234
391998
308255
2026-08-06T17:48:52Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391998
wikitext
text/x-wiki
[[رج:جنوبی آفریقا]]
[[رج:ایالتون، کشور په]]
pejo97e6i8wy6vrgluv4hebvjqpr9as
رج:آلبانی شهرستانون
14
108342
391969
309710
2026-08-06T17:45:22Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ ایالتون با حیساب کشورون با [[:رج:ایالتون، کشور په|ایالتون، کشور په]]
391969
wikitext
text/x-wiki
[[رج:آلبانی]]
[[رج:ایالتون، کشور په]]
56ot8zcy0jj5us9nzy52hjoz2imehty
رج:هندی کتابون
14
112582
391955
315285
2026-08-06T17:40:18Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391955
wikitext
text/x-wiki
[[رج:هند]]
[[رج:کتابون، زوون په]]
60npi9od9u7vrxvvt000ynhkeii3qtu
رج:چینی فیلمون
14
112774
391859
319922
2026-08-06T17:09:05Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391859
wikitext
text/x-wiki
[[رج:فیلم، کشور په]]
[[رج:فیلمون با حیساب زوون]]
[[رج:چین فرهنگ]]
bdwaernffrxvuezfnib2i5qphb0p1f6
391871
391859
2026-08-06T17:11:49Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391871
wikitext
text/x-wiki
[[رج:فیلمون با حیساب جوغرافی]]
[[رج:فیلم، زوون په]]
[[رج:چین فرهنگ]]
hb6pv4ade8aacu1xie5zjdvj1fit88i
د ایمیتیشن گیم
0
112949
391829
321914
2026-08-06T16:54:21Z
محک
1023
[[رج:جهونی جنگ دوم فیلمون]] حذف شد; [[رج:جهونی جنگ فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391829
wikitext
text/x-wiki
{{صندخ/فیلم|عکس=The_Imitation_Game_(2014).png}}
''دِ '''ایمیتِیشِن گِیم''''' اتا بیوگرافی فیلم هسته که [[آلن تورینگ]] زندگی سر جه، ۲۰۱۴ سال، بساتنه. [[ مورتن تیلدام ]] ونه کارگردون بییه و [[بندیکت کامبربچ]] اصلی نقش ره جا یارده و [[کیرا ناتالی]] ونه زنایِ نقش ره داشته. [[گراهام مور]] این فیلم جه [[اوسکار جایزه]]، ره بتترین رُمانسرِ فیلمنومه وسه، بیته.
== منابع ==
{{پانویس|2}}
[[رج:بیوگرافی فیلمون]]
[[رج:۲۰۱۴ فیلمون]]
[[رج:جهونی جنگ فیلمون]]
[[رج:تاریخی فیلمون]]
rivtjk2bk3l877u8fnenndqipgstt4m
391838
391829
2026-08-06T16:59:47Z
محک
1023
[[رج:همجنسخاهی فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391838
wikitext
text/x-wiki
{{صندخ/فیلم|عکس=The_Imitation_Game_(2014).png}}
''دِ '''ایمیتِیشِن گِیم''''' اتا بیوگرافی فیلم هسته که [[آلن تورینگ]] زندگی سر جه، ۲۰۱۴ سال، بساتنه. [[ مورتن تیلدام ]] ونه کارگردون بییه و [[بندیکت کامبربچ]] اصلی نقش ره جا یارده و [[کیرا ناتالی]] ونه زنایِ نقش ره داشته. [[گراهام مور]] این فیلم جه [[اوسکار جایزه]]، ره بتترین رُمانسرِ فیلمنومه وسه، بیته.
== منابع ==
{{پانویس|2}}
[[رج:بیوگرافی فیلمون]]
[[رج:۲۰۱۴ فیلمون]]
[[رج:جهونی جنگ فیلمون]]
[[رج:تاریخی فیلمون]]
[[رج:همجنسخاهی فیلمون]]
id9dra67k8tokcsp41v5gnhrioso8nk
رج:۱۹۷۳ فیلمون
14
113328
391875
324027
2026-08-06T17:12:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391875
wikitext
text/x-wiki
[[رج:۱۹۷۳]]
[[رج:فیلم، سال په]]
p6w8an6on5tnd491kpt4kfvrett4qak
رج:۱۹۹۳ فیلمون
14
114065
391886
326488
2026-08-06T17:15:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391886
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۹۳|ف]]
1fhtapxp2k9fhfjb25mbhj4ys7agqmk
رج:دانمارکی کتابون
14
114295
391945
327532
2026-08-06T17:39:08Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391945
wikitext
text/x-wiki
[[رج:کتابون، زوون په]]
[[رج:دانمارک|ک]]
cdoi49862xwc1pzmdi599zeia5fear2
رج:۲۰۲۶ فیلمون
14
114357
391938
328110
2026-08-06T17:25:40Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391938
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۲۰۲۶]]
30544oakplcv0gkv74hsuzis44ens68
رج:اوریپید
14
114392
391950
328229
2026-08-06T17:39:38Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391950
wikitext
text/x-wiki
[[رج:یونانی کتابون]]
[[رج:کتابون، نویسنده په]]
6frrs0y8aok0ru4wgbeec8x565lh3rc
رج:سوفوکلس
14
114395
391953
328228
2026-08-06T17:39:58Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391953
wikitext
text/x-wiki
[[رج:یونانی کتابون]]
[[رج:کتابون، نویسنده په]]
6frrs0y8aok0ru4wgbeec8x565lh3rc
رج:روسی کتابون
14
114426
391946
328399
2026-08-06T17:39:18Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب زوون با [[:رج:کتابون، زوون په|کتابون، زوون په]]
391946
wikitext
text/x-wiki
[[رج:کتابون، زوون په]]
[[رج:روسی زوون]]
c85wp2p3l2dvtuj35re5w7199im9fic
رج:آریستوفان
14
114490
391947
328669
2026-08-06T17:39:18Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ کتابون با حیساب نویسنده با [[:رج:کتابون، نویسنده په|کتابون، نویسنده په]]
391947
wikitext
text/x-wiki
[[رج:یونانی کتابون]]
[[رج:کتابون، نویسنده په]]
6frrs0y8aok0ru4wgbeec8x565lh3rc
رج:لهستونی فیلمون
14
114577
391856
329319
2026-08-06T17:08:45Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391856
wikitext
text/x-wiki
[[رج:لهستون]]
[[رج:فیلم، کشور په]]
[[رج:فیلمون با حیساب زوون]]
ryw0shf92xpx3i8y1yu7laecvnprcqw
391867
391856
2026-08-06T17:11:09Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391867
wikitext
text/x-wiki
[[رج:لهستون]]
[[رج:فیلمون با حیساب جوغرافی]]
[[رج:فیلم، زوون په]]
jh42dwf4cx0sqx1a1f0hg2xa2an9d0z
رج:روسی فیلمون
14
114578
391853
329320
2026-08-06T17:08:25Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب جوغرافی با [[:رج:فیلم، کشور په|فیلم، کشور په]]
391853
wikitext
text/x-wiki
[[رج:روسیه]]
[[رج:فیلم، کشور په]]
[[رج:فیلمون با حیساب زوون]]
[[رج:روسی زوون]]
i8d1kkuyrf456w0xkc95fr04n3uz8jj
391864
391853
2026-08-06T17:10:09Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب زوون با [[:رج:فیلم، زوون په|فیلم، زوون په]]
391864
wikitext
text/x-wiki
[[رج:روسیه]]
[[رج:فیلمون با حیساب جوغرافی]]
[[رج:فیلم، زوون په]]
[[رج:روسی زوون]]
legrd4qufzuoybmgyuzripu6jph2558
گپ:نوسال موارکا (۲۰۱۴ فیلم)
1
156621
391827
373622
2026-08-06T16:53:29Z
محک
1023
کارور محک، [[گپ:نوسال موارکا(2014 فیلم)]] ِصفحه ره دَکشییه [[گپ:نوسال موارکا (۲۰۱۴ فیلم)]] دله
373622
wikitext
text/x-wiki
{{شاپزن}}
{{گپ صفحه}}
1vjigdfx9z1fnd3v7eklhi54qleb3gu
رج:۱۹۹۰ فیلمون
14
172112
391883
390705
2026-08-06T17:14:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391883
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۹۰|ف]]
aj58f0b9md56fhlfrz31mhd9zb4fg9c
رج:۱۹۸۲ فیلمون
14
172113
391878
390707
2026-08-06T17:13:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391878
wikitext
text/x-wiki
[[رج:فیلم، سال په]]
[[رج:۱۹۸۲|ف]]
[[fa:رده:فیلمهای ۱۹۸۲ (میلادی)]]
innr9kl9v1mz2xs7rswa8qvk9kwfv3j
کراکن
0
172117
391982
390722
2026-08-06T17:46:56Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ اساطیر با حیساب جوغرافی با [[:رج:اساطیر، کشور په|اساطیر، کشور په]]
391982
wikitext
text/x-wiki
[[پرونده:Colossal_octopus_by_Pierre_Denys_de_Montfort.jpg|بندانگشتی|چپ|200px|ونه اتا نقاشی، سال ۱۸۱۰]]
'''کِراکِن''' ([[انگلیسی]] جه: Kraken) اتا [[ئونه]] هسته که [[نروژ]] و [[ایسلند]] دریو دله دره و خله گت هسته. وه اتا اوختاپوس ره مونه که أنده گت هسته که تونده شه لینگ - لینگ ره کشتی دور چرخ هاده و وه ره دماسه و له هاکنه. این آسنی جه [[ویکتور هوگو]] و [[ژول ورن]] إستىفاده هاکردنه و [[پایرتس آف کاراییبن]] دله هم دره.<ref>{{یادکرد-ویکی
|پیوند = http://en.wikipedia.org/wiki/Kraken
|عنوان = Kraken
|زبان = انگلیسی
|بازیابی =۲۲ اکتبر ۲۰۱۰
}}</ref>
== منابع ==
{{پهنویس}}
[[رج:اساطیر، کشور په]]
n0r9r9t7bi2gaf516jhjp5kf8nzr6wx
رج:گانگستری فیلمون
14
172122
391842
390733
2026-08-06T17:03:07Z
محک
1023
[[رج:فیلم ژانر]] حذف شد; [[رج:فیلم، موضوع په]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391842
wikitext
text/x-wiki
[[رج:فیلم، موضوع په]]
[[رج:جنایی فیلمون]]
64c7g1j3qnbk1lu7j82ha6jdxvjm5z6
ال دار
0
172127
391743
390742
2026-08-06T15:25:47Z
محک
1023
تغییر هدف تغییرمسیر از [[سیو ال]] به [[گوشوارک (جنس)]]
391743
wikitext
text/x-wiki
#بور [[گوشوارک (جنس)]]
t7u2wuiih70l23pzekd1nz297oj5cdq
گوشوارک (جنس)
0
172368
391742
391200
2026-08-06T15:25:38Z
محک
1023
391742
wikitext
text/x-wiki
{{صندخ/موجود}}
'''گوشوارِک''' یا '''أل''' {{علمی نوم| Euonymus}} اتا [[جنس]] [[گیاه]] هسته که چندین جور [[دار]] ره شامل وونه. [[ال اسبی]]، [[سیاه شن]] و [[سیو ال]] واری.<ref>{{کتاب منبع | عنوان = واژه نامه مازندرانی| نام خانوادگی = نجف زاده بارفروش| نام = محمدباقر| ناشر= نشر بلخ| شهر = نیشابور| سال = 1368 | صفحه = 234}}</ref>
== منابع ==
{{پهنویس}}
{{گیاهون-پچیک}}
<!--- رجئون: --->
[[رج:گوشوارک|*]]
86xdomp64c9kztd94790opjixed1yx9
مستر اند کاماندر
0
172527
391726
391683
2026-08-06T15:10:38Z
محک
1023
391726
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Master and Commander-The Far Side of the World poster.png
|نوم= ناخدا و فرمونده:{{سخ}}دنیایِ دیرِ شَر
}}
'''''مَستر أند کاماندِر''''' {{به انگلیسی|Master and Commander: The Far Side of the World}} ونه نوم معنی وونه '''ناخدا و فرمونده: دنیای دیر شر''' اتا تاریخی فیلم هسته که ۲۰۰۳ سال شىنه و [[بریتانیا]] و [[فرانسه ]] دریایی جنگ خَوِری هسته. [[پیتر ویر]] ونه کارگردان بییه و [[راسل کرو]] اصلی نقش ره کا بکرده که بستینکلا کاپتان [[جک آبری]] هسته.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۲۰۰۳ فیلمون]]
[[رج: انگلیسی فیلمون ]]
[[رج:تاریخی فیلمون]]
[[رج:بیوگرافی فیلمون]]
dngwz7sjgohmo1wfp2zh89h2w2c7oun
گلادیاتور ۲
0
172534
391731
391693
2026-08-06T15:11:54Z
محک
1023
391731
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس = File:Gladiator II (2024) poster.jpg
}}
'''گلادیاتور ۲''' اتا تاریخی فیلم هسته که ۲۰۲۴ سال [[گلادیاتور (فیلم)|''گلادیاتور'' فیلم]]ِ دمباله وسّه بساتنه.
این فیلم دله ماکسیموس بمرده په، ونه ریکا تبعید وونه و اتا برده دسوری ، آفریقا دله گت وونه و أی ورگردنه روم تا شه پییر و مار انتقام ره بیره. ونه شورش دله ضعیف إمپراتورون حکومت په کفنه و آخرسر قدرت ره بدست یارنه.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۲۰۲۴ فیلمون]]
[[رج: تاریخی فیلمون ]]
[[رج: انگلیسی فیلمون ]]
r8bpqlsdsj2r2tv4q4tvfmuljh3f0gc
نورمبرگ (۲۰۲۵ فیلم)
0
172535
391734
391695
2026-08-06T15:13:23Z
محک
1023
391734
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Nuremberg 2025 film theatrical poster.jpg
| نوم= نورِمبِرگ
}}
'''''نورمبرگ''''' اتا ۲۰۲۵ تاریخی فیلم هسته که [[جهونی جنگ دوم]] په إتفاقون خوری داستان گنه. این فیلمِ بگذشتی واقعی هسته و [[جیمز وندربیلت]] وه ره اتا مردی خاطرات سر جه بساته.
== آسنی ==
جنگ درست بیه په، [[نازی آلمان]] مقامات ره اتا-اتا گیرنه. وشون گت که دستگیر بیه، [[هرمان گورینگ]] ([[راسل کرو]] نقش) هسته. وه ره اتا روانشناس، [[داگلاس کلی]] ([[رامی ملک]] نقش)، ره نشون دنّه و وه خانه شه دیسیپلین و شخصیت ره حفظ داره و روانشناس ره تحت تأثیر قرار هاده و از طرفی، شه خد ره دادگاه دلهی دفاعیه وسه آماده کنده چون اولینبار وسه اتا جهونی دادگاه خانه بییلن و چنتا کشور همبازی اینان ره محاکمه هاکنن. روانشناس ونجه نزدیک وونه و حتا ونسه چنکش نومه و پغوم ورنه-یارنه. ولی آخر سر شونه دادستان پلی و ونه یادداشت کؤمک جه هرمان ره محکوم کنّه.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۲۰۲۵ فیلمون]]
[[رج:تاریخی فیلمون]]
[[رج:جهونی جنگ فیلمون]]
h1p9lsh8t8miu847jqz6cq8hl0wmwpa
بیوتیفول مایند
0
172537
391714
391709
2026-08-06T15:06:14Z
محک
1023
391714
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:A Beautiful Mind Poster.jpg
|نوم= قشنگِ عَقِل
}}
'''بیوتیفول مایند''' یعنن '''''قشنگِ عقل''''' (Beautiful Mind) اتا بیوگرافی فیلم هسته که [[جان نش]] زندگی خَوریئه؛ وه اتا ریاضیدون بییه که [[اوسکار جایزه ]] ره إقتىصاد رشته وسه، بهیته ولی اواخر مریض بیه و [[اسکیزوفرنی]] ره دچار بئییه. [[راسل کرو]] ونه نقش ره کا بکرده و [[ران هاوارد]] فیلم ره بساته.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج: بیوگرافی فیلمون]]
[[رج:۲۰۰۱ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
jf5fekvxjps3yjl7jfkx9rv9ivyjq3o
391745
391714
2026-08-06T15:30:55Z
محک
1023
:)
391745
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:A Beautiful Mind Poster.jpg
|نوم= قشنگِ عَقِل
}}
'''بیوتیفول مایند''' یعنن '''''قشنگِ عقل''''' (Beautiful Mind) اتا بیوگرافی فیلم هسته که [[جان نش]] زندگی خَوریئه؛ وه اتا ریاضیدون بییه که [[نوبل جایزه]] ره إقتىصاد رشته وسه، بهیته ولی اواخر مریض بیه و [[اسکیزوفرنی]] ره دچار بئییه. [[راسل کرو]] ونه نقش ره کا بکرده و [[ران هاوارد]] فیلم ره بساته. این فیلم چنتا بخش دله [[اوسکار جایزه]] ره بیته و اون سالِ بتترین فیلم بیّه.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج: بیوگرافی فیلمون]]
[[رج:۲۰۰۱ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
70oomkg4b60mryayjk688sr9bdssoql
پاپز اکسورسیست
0
172540
391722
391706
2026-08-06T15:09:08Z
محک
1023
391722
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:ThePopesExorcistPoster.png
|نوم= پاپِ جنگیر
}}
'''''پاپِ جنگیر''''' {{به انگلیسی|The Pope's Exorcist}} اتا ترسناک فیلم هسته که ۲۰۲۳ سال شىنه. [[جولیوس ایوری]] فیلم ره کارگردانی هکرده و [[راسل کرو]] ونه اصلی نقش ره داشته.
اتا کشیش که [[پاپ|پاپِ]] جنگیر هسته، آدمونی که شیطون بورده وشون جلد دله، ره بستینکلا نجات دنه.
== منابع ==
{{پهنویس}}
[[رج: انگلیسی فیلمون]]
[[رج:دلتوآر فیلمون]]
[[رج:۲۰۲۳ فیلمون]]
0srjnu8genq2www58grr3xqardrfrgq
پرونده:A Beautiful Mind Poster.jpg
6
172541
391712
2026-04-18T01:03:20Z
en>DeltaQuadBot
0
(Image Revdel) Orphaned non-free file(s) deleted per [[WP:F5|F5]] ([[User:AmandaNP/Imagerevdel/Run|disable]])
391712
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Article = A Beautiful Mind (film)
| Use = Infobox
| Name = A Beautiful Mind
| Distributor = [[Universal Pictures]]
| Publisher =
| Website = [http://www.impawards.com/2001/beautiful_mind.html IMP Awards]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
[[Category:Film posters for English-language films]]
d0x0ez94fnvob6fqz714h4p85bdecif
391713
391712
2026-08-06T15:05:51Z
محک
1023
۱ نسخه واردشده از [[:en:File:A_Beautiful_Mind_Poster.jpg]]
391712
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Article = A Beautiful Mind (film)
| Use = Infobox
| Name = A Beautiful Mind
| Distributor = [[Universal Pictures]]
| Publisher =
| Website = [http://www.impawards.com/2001/beautiful_mind.html IMP Awards]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
[[Category:Film posters for English-language films]]
d0x0ez94fnvob6fqz714h4p85bdecif
391715
391713
2026-08-06T15:06:32Z
محک
1023
محک [[پرونده:A Beautiful Mind Poster.jpg]] ره بار بییشته
391712
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Article = A Beautiful Mind (film)
| Use = Infobox
| Name = A Beautiful Mind
| Distributor = [[Universal Pictures]]
| Publisher =
| Website = [http://www.impawards.com/2001/beautiful_mind.html IMP Awards]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
[[Category:Film posters for English-language films]]
d0x0ez94fnvob6fqz714h4p85bdecif
پرونده:Oppenheimer (film).jpg
6
172542
391716
2024-07-14T00:13:21Z
en>TAnthony
0
/* Licensing */Image category
391716
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Oppenheimer (film)
| Use = Infobox
| Media = film
| Name = Oppenheimer
| Distributor = [[Universal Pictures]]
| Source = [https://assets.gettyimages.com/bf-boulder-whitelabelbucket-getty-prod/p83rf4nzhg676c69qpb639/v/1109991157/original/386651id1_OPR_Final_27x40_1Sht_RGB.jpg Universal Pictures Publicity]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
3en38i0oqd7amly65brupyuthiwdpy6
391717
391716
2026-08-06T15:07:39Z
محک
1023
۱ نسخه واردشده از [[:en:File:Oppenheimer_(film).jpg]]
391716
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Oppenheimer (film)
| Use = Infobox
| Media = film
| Name = Oppenheimer
| Distributor = [[Universal Pictures]]
| Source = [https://assets.gettyimages.com/bf-boulder-whitelabelbucket-getty-prod/p83rf4nzhg676c69qpb639/v/1109991157/original/386651id1_OPR_Final_27x40_1Sht_RGB.jpg Universal Pictures Publicity]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
3en38i0oqd7amly65brupyuthiwdpy6
391718
391717
2026-08-06T15:08:11Z
محک
1023
محک [[پرونده:Oppenheimer (film).jpg]] ره بار بییشته
391716
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Oppenheimer (film)
| Use = Infobox
| Media = film
| Name = Oppenheimer
| Distributor = [[Universal Pictures]]
| Source = [https://assets.gettyimages.com/bf-boulder-whitelabelbucket-getty-prod/p83rf4nzhg676c69qpb639/v/1109991157/original/386651id1_OPR_Final_27x40_1Sht_RGB.jpg Universal Pictures Publicity]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
3en38i0oqd7amly65brupyuthiwdpy6
پرونده:ThePopesExorcistPoster.png
6
172543
391720
2025-12-10T15:21:14Z
en>TAnthony
0
/* Licensing */ Add image categories
391720
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale 2
|Description = Film poster for [[The Pope's Exorcist]] (2023)
|Source = [https://i0.wp.com/bloody-disgusting.com/wp-content/uploads/2023/02/popes.jpg?ssl=1 Bloody Disgusting]
|Author = [[Screen Gems]]
|Article = The Pope's Exorcist
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = To only be used in the article's infobox.
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
[[Category:2020s British film posters]]
[[Category:2020s Spanish film posters]]
[[Category:2020s horror film posters]]
7zupkppjnf4nhe8jti0hsopiohllu0d
391721
391720
2026-08-06T15:08:53Z
محک
1023
۱ نسخه واردشده از [[:en:File:ThePopesExorcistPoster.png]]
391720
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale 2
|Description = Film poster for [[The Pope's Exorcist]] (2023)
|Source = [https://i0.wp.com/bloody-disgusting.com/wp-content/uploads/2023/02/popes.jpg?ssl=1 Bloody Disgusting]
|Author = [[Screen Gems]]
|Article = The Pope's Exorcist
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = To only be used in the article's infobox.
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
[[Category:2020s British film posters]]
[[Category:2020s Spanish film posters]]
[[Category:2020s horror film posters]]
7zupkppjnf4nhe8jti0hsopiohllu0d
391723
391721
2026-08-06T15:09:20Z
محک
1023
محک [[پرونده:ThePopesExorcistPoster.png]] ره بار بییشته
391720
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale 2
|Description = Film poster for [[The Pope's Exorcist]] (2023)
|Source = [https://i0.wp.com/bloody-disgusting.com/wp-content/uploads/2023/02/popes.jpg?ssl=1 Bloody Disgusting]
|Author = [[Screen Gems]]
|Article = The Pope's Exorcist
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = To only be used in the article's infobox.
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
[[Category:2020s British film posters]]
[[Category:2020s Spanish film posters]]
[[Category:2020s horror film posters]]
7zupkppjnf4nhe8jti0hsopiohllu0d
پرونده:Master and Commander-The Far Side of the World poster.png
6
172544
391724
2024-07-17T19:49:36Z
en>TAnthony
0
/* Licensing */Refine image category
391724
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale
|Article=Master and Commander: The Far Side of the World
|Description=The sheet [[movie poster]] for 2003's ''[[Master and Commander: The Far Side of the World]]''.
|Source=IMPA Awards, [http://www.impawards.com/2003/master_and_commander_the_far_side_of_the_world_xlg.html]
|Portion=Entire poster, to avoid misrepresentation of the meaning of the work.
|Low_resolution=Low; heavily decreased in resolution from the original source file (999 x 1500 pixels, or 1.5 megapixels). Copies made from it will be of inferior quality due to the reduction in size, and thus this image is unsuitable as artwork for pirated versions of the poster or other uses that would compete with the commercial purpose of the original artwork.
|Purpose=To illustrate the promotion of ''Master and Commander'' and the way the movie was marketed and sold; to provide readers with a primary means of recognizing the work discussed and assure them they have reached the proper article.
|Replaceability=As poster art, the image is not replaceable by free content; the studio has not released similar images into public domain or allowed free use, and any other image that shows the marketing of the film would also be copyrighted, and any version that is not true to the original would be inadequate for identification or commentary.
|other_information=© 2003 20th Century Fox, Miramax Films and Universal Studios; Use of poster art in the article complies with Wikipedia [[WP:NFCC|non-free content policy]] and [[fair use]] under [[United States copyright law]] as described above.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
07apftfj8k077cghul270g0hiplixqg
391725
391724
2026-08-06T15:10:09Z
محک
1023
۱ نسخه واردشده از [[:en:File:Master_and_Commander-The_Far_Side_of_the_World_poster.png]]
391724
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale
|Article=Master and Commander: The Far Side of the World
|Description=The sheet [[movie poster]] for 2003's ''[[Master and Commander: The Far Side of the World]]''.
|Source=IMPA Awards, [http://www.impawards.com/2003/master_and_commander_the_far_side_of_the_world_xlg.html]
|Portion=Entire poster, to avoid misrepresentation of the meaning of the work.
|Low_resolution=Low; heavily decreased in resolution from the original source file (999 x 1500 pixels, or 1.5 megapixels). Copies made from it will be of inferior quality due to the reduction in size, and thus this image is unsuitable as artwork for pirated versions of the poster or other uses that would compete with the commercial purpose of the original artwork.
|Purpose=To illustrate the promotion of ''Master and Commander'' and the way the movie was marketed and sold; to provide readers with a primary means of recognizing the work discussed and assure them they have reached the proper article.
|Replaceability=As poster art, the image is not replaceable by free content; the studio has not released similar images into public domain or allowed free use, and any other image that shows the marketing of the film would also be copyrighted, and any version that is not true to the original would be inadequate for identification or commentary.
|other_information=© 2003 20th Century Fox, Miramax Films and Universal Studios; Use of poster art in the article complies with Wikipedia [[WP:NFCC|non-free content policy]] and [[fair use]] under [[United States copyright law]] as described above.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
07apftfj8k077cghul270g0hiplixqg
391727
391725
2026-08-06T15:10:55Z
محک
1023
محک [[پرونده:Master and Commander-The Far Side of the World poster.png]] ره بار بییشته
391724
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale
|Article=Master and Commander: The Far Side of the World
|Description=The sheet [[movie poster]] for 2003's ''[[Master and Commander: The Far Side of the World]]''.
|Source=IMPA Awards, [http://www.impawards.com/2003/master_and_commander_the_far_side_of_the_world_xlg.html]
|Portion=Entire poster, to avoid misrepresentation of the meaning of the work.
|Low_resolution=Low; heavily decreased in resolution from the original source file (999 x 1500 pixels, or 1.5 megapixels). Copies made from it will be of inferior quality due to the reduction in size, and thus this image is unsuitable as artwork for pirated versions of the poster or other uses that would compete with the commercial purpose of the original artwork.
|Purpose=To illustrate the promotion of ''Master and Commander'' and the way the movie was marketed and sold; to provide readers with a primary means of recognizing the work discussed and assure them they have reached the proper article.
|Replaceability=As poster art, the image is not replaceable by free content; the studio has not released similar images into public domain or allowed free use, and any other image that shows the marketing of the film would also be copyrighted, and any version that is not true to the original would be inadequate for identification or commentary.
|other_information=© 2003 20th Century Fox, Miramax Films and Universal Studios; Use of poster art in the article complies with Wikipedia [[WP:NFCC|non-free content policy]] and [[fair use]] under [[United States copyright law]] as described above.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
07apftfj8k077cghul270g0hiplixqg
پرونده:Gladiator II (2024) poster.jpg
6
172545
391728
2024-12-28T15:54:01Z
en>Nthep
0
Previous version(s) deleted per [[WP:F5|F5]])
391728
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Type = 2024 film
| Article = Gladiator II
| Use = Infobox
| Owner = [[Scott Free Productions]] / [[Red Wagon Entertainment]] / [[Parkes+MacDonald Image Nation]] / [[Paramount Pictures]]
| Source = [https://www.cinemark.com/movies/gladiator-2 Cinemark]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
[[Category:Film posters for English-language films]]
st17pm4xqvgg0c45o109o7d1jghwwir
391729
391728
2026-08-06T15:11:26Z
محک
1023
۱ نسخه واردشده از [[:en:File:Gladiator_II_(2024)_poster.jpg]]
391728
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Type = 2024 film
| Article = Gladiator II
| Use = Infobox
| Owner = [[Scott Free Productions]] / [[Red Wagon Entertainment]] / [[Parkes+MacDonald Image Nation]] / [[Paramount Pictures]]
| Source = [https://www.cinemark.com/movies/gladiator-2 Cinemark]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
[[Category:Film posters for English-language films]]
st17pm4xqvgg0c45o109o7d1jghwwir
391730
391729
2026-08-06T15:11:45Z
محک
1023
محک [[پرونده:Gladiator II (2024) poster.jpg]] ره بار بییشته
391728
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Type = 2024 film
| Article = Gladiator II
| Use = Infobox
| Owner = [[Scott Free Productions]] / [[Red Wagon Entertainment]] / [[Parkes+MacDonald Image Nation]] / [[Paramount Pictures]]
| Source = [https://www.cinemark.com/movies/gladiator-2 Cinemark]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
[[Category:Film posters for English-language films]]
st17pm4xqvgg0c45o109o7d1jghwwir
پرونده:Nuremberg 2025 film theatrical poster.jpg
6
172546
391732
2026-01-22T04:37:53Z
en>FloorMadeOuttaFloor
0
/* Summary */Copyright holders as per poster
391732
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
|Description = This is a poster for the film Nuremberg (2025).
The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Source = [[IMDb]]
|Author = Nuremberg, LLC and [[Sony Pictures Entertainment]]
|Article = Nuremberg (2025 film)
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = The copy is of sufficient resolution for commentary and identification but lower resolution than the original poster. Copies made from it will be of inferior quality, unsuitable as counterfeit artwork, pirate versions or for uses that would compete with the commercial purpose of the original artwork.
Main infobox. The image is used for identification in the context of critical commentary of the work, product or service for which it serves as poster art. It makes a significant contribution to the user's understanding of the article, which could not practically be conveyed by words alone. The image is placed in the infobox at the top of the article discussing the work, to show the primary visual image associated with the work, and to help the user quickly identify the work, product or service and know they have found what they are looking for. Use for this purpose does not compete with the purposes of the original artwork, namely the creator providing graphic design services, and in turn the marketing of the promoted item.
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2020s American film posters}}
2xeixmidmz5ohplrzth2cags8f6wuhv
391733
391732
2026-08-06T15:12:45Z
محک
1023
۱ نسخه واردشده از [[:en:File:Nuremberg_2025_film_theatrical_poster.jpg]]
391732
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
|Description = This is a poster for the film Nuremberg (2025).
The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Source = [[IMDb]]
|Author = Nuremberg, LLC and [[Sony Pictures Entertainment]]
|Article = Nuremberg (2025 film)
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = The copy is of sufficient resolution for commentary and identification but lower resolution than the original poster. Copies made from it will be of inferior quality, unsuitable as counterfeit artwork, pirate versions or for uses that would compete with the commercial purpose of the original artwork.
Main infobox. The image is used for identification in the context of critical commentary of the work, product or service for which it serves as poster art. It makes a significant contribution to the user's understanding of the article, which could not practically be conveyed by words alone. The image is placed in the infobox at the top of the article discussing the work, to show the primary visual image associated with the work, and to help the user quickly identify the work, product or service and know they have found what they are looking for. Use for this purpose does not compete with the purposes of the original artwork, namely the creator providing graphic design services, and in turn the marketing of the promoted item.
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2020s American film posters}}
2xeixmidmz5ohplrzth2cags8f6wuhv
391735
391733
2026-08-06T15:13:27Z
محک
1023
محک [[پرونده:Nuremberg 2025 film theatrical poster.jpg]] ره بار بییشته
391732
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
|Description = This is a poster for the film Nuremberg (2025).
The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Source = [[IMDb]]
|Author = Nuremberg, LLC and [[Sony Pictures Entertainment]]
|Article = Nuremberg (2025 film)
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = The copy is of sufficient resolution for commentary and identification but lower resolution than the original poster. Copies made from it will be of inferior quality, unsuitable as counterfeit artwork, pirate versions or for uses that would compete with the commercial purpose of the original artwork.
Main infobox. The image is used for identification in the context of critical commentary of the work, product or service for which it serves as poster art. It makes a significant contribution to the user's understanding of the article, which could not practically be conveyed by words alone. The image is placed in the infobox at the top of the article discussing the work, to show the primary visual image associated with the work, and to help the user quickly identify the work, product or service and know they have found what they are looking for. Use for this purpose does not compete with the purposes of the original artwork, namely the creator providing graphic design services, and in turn the marketing of the promoted item.
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2020s American film posters}}
2xeixmidmz5ohplrzth2cags8f6wuhv
پرونده:Le Règne animal 2023 film poster.jpg
6
172547
391736
2024-08-08T18:20:51Z
en>TAnthony
0
/* Licensing */Refine image category
391736
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = The Animal Kingdom (2023 film)
| Use = Infobox
| Media = film
| Name = Le Règne animal
| Distributor = [[StudioCanal]]
| Type = 2023 film
| Source = https://www.parismatch.com/culture/cinema/bande-annonce-romain-duris-va-connaitre-le-regne-animal-228789
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s French film posters}}
[[Category:Film posters for French-language films]]
ojni4bb27bt98c3dbsp1jtg9kp987zr
391737
391736
2026-08-06T15:14:27Z
محک
1023
۱ نسخه واردشده از [[:en:File:Le_Règne_animal_2023_film_poster.jpg]]
391736
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = The Animal Kingdom (2023 film)
| Use = Infobox
| Media = film
| Name = Le Règne animal
| Distributor = [[StudioCanal]]
| Type = 2023 film
| Source = https://www.parismatch.com/culture/cinema/bande-annonce-romain-duris-va-connaitre-le-regne-animal-228789
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s French film posters}}
[[Category:Film posters for French-language films]]
ojni4bb27bt98c3dbsp1jtg9kp987zr
391738
391737
2026-08-06T15:14:46Z
محک
1023
محک [[پرونده:Le Règne animal 2023 film poster.jpg]] ره بار بییشته
391736
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = The Animal Kingdom (2023 film)
| Use = Infobox
| Media = film
| Name = Le Règne animal
| Distributor = [[StudioCanal]]
| Type = 2023 film
| Source = https://www.parismatch.com/culture/cinema/bande-annonce-romain-duris-va-connaitre-le-regne-animal-228789
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2020s French film posters}}
[[Category:Film posters for French-language films]]
ojni4bb27bt98c3dbsp1jtg9kp987zr
کاراییب دریایی دزدون
0
172548
391740
2026-08-06T15:16:11Z
محک
1023
ونه مسیر ره دکشییه [[پایرتس آف کاراییبن]] دله
391740
wikitext
text/x-wiki
#بور [[پایرتس آف کاراییبن]]
rq5m6nfu3xibjcsdzbe23ml491i83hu
کاراییبین: ات وردز اند
0
172549
391741
2026-08-06T15:16:51Z
محک
1023
ونه مسیر ره دکشییه [[پایرتس آف کاراییبن: ات وورلدز اند]] دله
391741
wikitext
text/x-wiki
#بور [[پایرتس آف کاراییبن: ات وورلدز اند]]
7p8dohlpyyj4fo9mm5olexqo5c1cfcn
ال
0
172550
391744
2026-08-06T15:27:55Z
محک
1023
ونه مسیر ره دکشییه [[گوشوارک (جنس)]] دله
391744
wikitext
text/x-wiki
#بور [[گوشوارک (جنس)]]
t7u2wuiih70l23pzekd1nz297oj5cdq
رج:اوسکار بیته فیلمون
14
172551
391746
2026-08-06T15:31:15Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:اوسکار بیتهئون]]» دره
391746
wikitext
text/x-wiki
[[رج:اوسکار بیتهئون]]
14dcho8i0sw7obl1ffbvyanpriov7ly
پرونده:Argo2012Poster.jpg
6
172552
391747
2024-07-14T19:24:08Z
en>TAnthony
0
Refine image category
391747
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Article = Argo (2012 film)
| Use = Infobox
| Name = Argo
| Distributor = [[Warner Bros.]]
| Publisher =
| Website = [http://www.impawards.com/2012/argo.html IMP Awards]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s American film posters}}
aimgkautugu09tlbib0o9zpopn4mvgk
391748
391747
2026-08-06T15:33:13Z
محک
1023
۱ نسخه واردشده از [[:en:File:Argo2012Poster.jpg]]
391747
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Article = Argo (2012 film)
| Use = Infobox
| Name = Argo
| Distributor = [[Warner Bros.]]
| Publisher =
| Website = [http://www.impawards.com/2012/argo.html IMP Awards]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s American film posters}}
aimgkautugu09tlbib0o9zpopn4mvgk
391750
391748
2026-08-06T15:33:55Z
محک
1023
محک [[پرونده:Argo2012Poster.jpg]] ره بار بییشته
391747
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Media = film
| Article = Argo (2012 film)
| Use = Infobox
| Name = Argo
| Distributor = [[Warner Bros.]]
| Publisher =
| Website = [http://www.impawards.com/2012/argo.html IMP Awards]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s American film posters}}
aimgkautugu09tlbib0o9zpopn4mvgk
پرونده:Anora (2024 film) poster.jpg
6
172553
391751
2024-10-16T02:02:48Z
en>DeltaQuadBot
0
(Image Revdel) Orphaned non-free file(s) deleted per [[WP:F5|F5]] ([[User:AmandaNP/Imagerevdel/Run|disable]])
391751
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Anora (film)
| Name = Anora
| Publisher = [[FilmNation Entertainment]]
| Distributor = [[Neon (company)|Neon]]
| Source = http://www.impawards.com/2024/anora_ver5.html
}}
==Licensing==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
kj5cjphdedt28qpq8o9lsvpp46uc1cr
391752
391751
2026-08-06T15:34:25Z
محک
1023
۱ نسخه واردشده از [[:en:File:Anora_(2024_film)_poster.jpg]]
391751
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Anora (film)
| Name = Anora
| Publisher = [[FilmNation Entertainment]]
| Distributor = [[Neon (company)|Neon]]
| Source = http://www.impawards.com/2024/anora_ver5.html
}}
==Licensing==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
kj5cjphdedt28qpq8o9lsvpp46uc1cr
391753
391752
2026-08-06T15:34:46Z
محک
1023
محک [[پرونده:Anora (2024 film) poster.jpg]] ره بار بییشته
391751
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Anora (film)
| Name = Anora
| Publisher = [[FilmNation Entertainment]]
| Distributor = [[Neon (company)|Neon]]
| Source = http://www.impawards.com/2024/anora_ver5.html
}}
==Licensing==
{{Non-free film poster|image has rationale=yes|2020s American film posters}}
kj5cjphdedt28qpq8o9lsvpp46uc1cr
پرونده:No Country for Old Men poster.jpg
6
172554
391758
2024-07-17T20:26:12Z
en>TAnthony
0
/* Licensing */Refine image category
391758
wikitext
text/x-wiki
== Summary ==
The publicly released theatrical poster for ''[[No Country for Old Men (film)|No Country for Old Men]]'' (2007).<br />
Copyright Miramax Pictures. 2007.
==Sources==
*[http://www.cinemablend.com/new.php?id=5830 Cinema Blend]
==Fair use rationale for ''[[No Country for Old Men (film)|No Country for Old Men]]''==
#No free equivalent exists that would effectively identify the article's subject.
#The image does not in any way limit the ability of the copyright owners to market or sell their product.
#The image is only used once and is rendered in low resolution to avoid piracy.
#The image has been published outside Wikipedia; see source above.
#The image meets general Wikipedia content requirements and is encyclopedic.
#The image meets Wikipedia's media-specific policy.
#The image is used in the article wiki-linked in the section title.
#The image is significant in identifying the subject of the article, which is the film itself.
#The image is used in the article namespace.
#The image has a brief description that identifies the image, notes the source, and provides attribution to the copyright holder.
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
[[Category:Images of Josh Brolin]]
s7khh9o5kps8f71w5c0h1kiwjlzw7p8
391759
391758
2026-08-06T15:36:15Z
محک
1023
۱ نسخه واردشده از [[:en:File:No_Country_for_Old_Men_poster.jpg]]
391758
wikitext
text/x-wiki
== Summary ==
The publicly released theatrical poster for ''[[No Country for Old Men (film)|No Country for Old Men]]'' (2007).<br />
Copyright Miramax Pictures. 2007.
==Sources==
*[http://www.cinemablend.com/new.php?id=5830 Cinema Blend]
==Fair use rationale for ''[[No Country for Old Men (film)|No Country for Old Men]]''==
#No free equivalent exists that would effectively identify the article's subject.
#The image does not in any way limit the ability of the copyright owners to market or sell their product.
#The image is only used once and is rendered in low resolution to avoid piracy.
#The image has been published outside Wikipedia; see source above.
#The image meets general Wikipedia content requirements and is encyclopedic.
#The image meets Wikipedia's media-specific policy.
#The image is used in the article wiki-linked in the section title.
#The image is significant in identifying the subject of the article, which is the film itself.
#The image is used in the article namespace.
#The image has a brief description that identifies the image, notes the source, and provides attribution to the copyright holder.
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
[[Category:Images of Josh Brolin]]
s7khh9o5kps8f71w5c0h1kiwjlzw7p8
391761
391759
2026-08-06T15:37:00Z
محک
1023
محک [[پرونده:No Country for Old Men poster.jpg]] ره بار بییشته
391758
wikitext
text/x-wiki
== Summary ==
The publicly released theatrical poster for ''[[No Country for Old Men (film)|No Country for Old Men]]'' (2007).<br />
Copyright Miramax Pictures. 2007.
==Sources==
*[http://www.cinemablend.com/new.php?id=5830 Cinema Blend]
==Fair use rationale for ''[[No Country for Old Men (film)|No Country for Old Men]]''==
#No free equivalent exists that would effectively identify the article's subject.
#The image does not in any way limit the ability of the copyright owners to market or sell their product.
#The image is only used once and is rendered in low resolution to avoid piracy.
#The image has been published outside Wikipedia; see source above.
#The image meets general Wikipedia content requirements and is encyclopedic.
#The image meets Wikipedia's media-specific policy.
#The image is used in the article wiki-linked in the section title.
#The image is significant in identifying the subject of the article, which is the film itself.
#The image is used in the article namespace.
#The image has a brief description that identifies the image, notes the source, and provides attribution to the copyright holder.
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
[[Category:Images of Josh Brolin]]
s7khh9o5kps8f71w5c0h1kiwjlzw7p8
پرونده:12 Years a Slave film poster.jpg
6
172555
391768
2026-07-19T11:29:26Z
en>Jevansen
0
+ 2010s Luxembourgian film posters
391768
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
| Description = Theatrical poster for ''[[12 Years a Slave (film)|12 Years a Slave]]'', Copyright © 2013 by Fox Searchlight Pictures. All Rights Reserved.
| Source = [http://www.foxsearchlight.com/post/3761/exclusive-trailer-debut-for-12-years-a-slave/ Official site]
| Article = 12 Years a Slave (film)
| Portion = Small portion of commercial product
| Low_resolution = Yes
| Purpose = Serves as "cover art" to identify the article's topic
| Replaceability = No
| Minimality = Single item used to identify the topic, which is copyrighted
| Commercial = Low-resolution file used
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s American film posters}}
[[Category:Film posters for English-language films]]
[[Category:2010s Luxembourgian film posters]]
qpmk6egchvusgmc36209pobwh07e8r2
391769
391768
2026-08-06T15:39:49Z
محک
1023
۱ نسخه واردشده از [[:en:File:12_Years_a_Slave_film_poster.jpg]]
391768
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
| Description = Theatrical poster for ''[[12 Years a Slave (film)|12 Years a Slave]]'', Copyright © 2013 by Fox Searchlight Pictures. All Rights Reserved.
| Source = [http://www.foxsearchlight.com/post/3761/exclusive-trailer-debut-for-12-years-a-slave/ Official site]
| Article = 12 Years a Slave (film)
| Portion = Small portion of commercial product
| Low_resolution = Yes
| Purpose = Serves as "cover art" to identify the article's topic
| Replaceability = No
| Minimality = Single item used to identify the topic, which is copyrighted
| Commercial = Low-resolution file used
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s American film posters}}
[[Category:Film posters for English-language films]]
[[Category:2010s Luxembourgian film posters]]
qpmk6egchvusgmc36209pobwh07e8r2
391770
391769
2026-08-06T15:40:05Z
محک
1023
محک [[پرونده:12 Years a Slave film poster.jpg]] ره بار بییشته
391768
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
| Description = Theatrical poster for ''[[12 Years a Slave (film)|12 Years a Slave]]'', Copyright © 2013 by Fox Searchlight Pictures. All Rights Reserved.
| Source = [http://www.foxsearchlight.com/post/3761/exclusive-trailer-debut-for-12-years-a-slave/ Official site]
| Article = 12 Years a Slave (film)
| Portion = Small portion of commercial product
| Low_resolution = Yes
| Purpose = Serves as "cover art" to identify the article's topic
| Replaceability = No
| Minimality = Single item used to identify the topic, which is copyrighted
| Commercial = Low-resolution file used
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s American film posters}}
[[Category:Film posters for English-language films]]
[[Category:2010s Luxembourgian film posters]]
qpmk6egchvusgmc36209pobwh07e8r2
۱۲ سال بردگی
0
172556
391771
2026-08-06T15:43:51Z
محک
1023
اتا نو ولگ بساته که ونه دله «{{صندخ/فیلم |عکس= File:12 Years a Slave film poster.jpg }} '''۱۲ سال بردگی''' (انگلیسی جه: Years a Slave 12) اتا تاریخی و بیوگرافی فیلم هسته که [[سالومون نورثاپ]] خاطرات سر جه بساتنه. وه اتا آمریکایی سیو دیم آدِم بییه که [[نیویورک]] دیّه و وه ره اتا روز بدزدینه و بَوِردنه جن...» دره
391771
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:12 Years a Slave film poster.jpg
}}
'''۱۲ سال بردگی''' (انگلیسی جه: Years a Slave 12) اتا تاریخی و بیوگرافی فیلم هسته که [[سالومون نورثاپ]] خاطرات سر جه بساتنه. وه اتا آمریکایی سیو دیم آدِم بییه که [[نیویورک]] دیّه و وه ره اتا روز بدزدینه و بَوِردنه جنوب بَروتنه و [[برده|زر خرید]] بیّه و وه ره دوازده سال بردگی داشتنه.
== منابع ==
{{پهنویس}}
[[رج:آمریکایی فیلمون]]
[[رج:اوسکار بیته فیلمون]]
[[رج:۲۰۱۳ فیلمون]]
[[رج:بیوگرافی فیلمون]]
pfhch48ctlmj3u1x2tv2xuvohlrx5ez
پرونده:Parasite (2019 film).png
6
172557
391772
2025-10-19T06:19:40Z
en>TAnthony
0
/* Licensing */ Refine image category
391772
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Parasite (2019 film)
| Use = Infobox
| Media = film
<!-- ADDITIONAL INFORMATION -->
| Name =
| Distributor = [[CJ Entertainment]]
| Publisher =
| Graphic Artist =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source = [https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967 Naver]
| Portion =
| Low resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section -->
| Replaceability =
| Other information =
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2010s South Korean film posters}}
[[Category:Film posters for Korean-language films]]
1ps0c6em6382uoeadcjp7zzzy8wzukb
391773
391772
2026-08-06T15:50:39Z
محک
1023
۱ نسخه واردشده از [[:en:File:Parasite_(2019_film).png]]
391772
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Parasite (2019 film)
| Use = Infobox
| Media = film
<!-- ADDITIONAL INFORMATION -->
| Name =
| Distributor = [[CJ Entertainment]]
| Publisher =
| Graphic Artist =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source = [https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967 Naver]
| Portion =
| Low resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section -->
| Replaceability =
| Other information =
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2010s South Korean film posters}}
[[Category:Film posters for Korean-language films]]
1ps0c6em6382uoeadcjp7zzzy8wzukb
391774
391773
2026-08-06T15:50:57Z
محک
1023
محک [[پرونده:Parasite (2019 film).png]] ره بار بییشته
391772
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Parasite (2019 film)
| Use = Infobox
| Media = film
<!-- ADDITIONAL INFORMATION -->
| Name =
| Distributor = [[CJ Entertainment]]
| Publisher =
| Graphic Artist =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source = [https://movie.naver.com/movie/bi/mi/basic.nhn?code=161967 Naver]
| Portion =
| Low resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section -->
| Replaceability =
| Other information =
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2010s South Korean film posters}}
[[Category:Film posters for Korean-language films]]
1ps0c6em6382uoeadcjp7zzzy8wzukb
پارازایت (فیلم)
0
172558
391775
2026-08-06T15:51:01Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391775
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Parasite (2019 film).png
|نوم= انگل
}}
'''پارازیت''' یعنی '''انگل''' ([[کرهای]] جه: 기생충; هانجا: 寄生蟲; لاتیننویسی جه: Gisaengchung) اتا [[جنوبی کره]]یِ فیلم هسته که ۲۰۱۹ سالِ [[اوسکار جایزه]] ره بیته و بتترین فیلم بئی بییه. وه اولینکش بییه که اتا خارجی زوون فیلم ره بتترین فیلم بخش وسّه اوسکار هدانه.
فیلم اتا خانواده ره سٮراق دنه که فقیر هستنه و هرچی تجنّه سِره و زندگی ندارنه. وشون اتا غنی خانواده ره گیر یارنه و شونّه وشون سِره دله بٮستایی و یواشکی درنه. اوضاع زمونی خراب وونه که در وَرنه اتی دیگه خانواده هم پیش از وشون بئن، همینجه دئینه و سره دله درنه.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۲۰۱۹ فیلمون]]
[[رج:کرهای فیلمون]]
[[رج:اوسکار بیته فیلمون]]
[[رج:تل کمدی فیلمون]]
2yj84yse4cpfj8u62597k74yhl9vj21
391776
391775
2026-08-06T15:51:50Z
محک
1023
کارور محک، [[پارازیت (فیلم)]] ِصفحه ره دَکشییه [[پارازایت (فیلم)]] دله
391775
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Parasite (2019 film).png
|نوم= انگل
}}
'''پارازیت''' یعنی '''انگل''' ([[کرهای]] جه: 기생충; هانجا: 寄生蟲; لاتیننویسی جه: Gisaengchung) اتا [[جنوبی کره]]یِ فیلم هسته که ۲۰۱۹ سالِ [[اوسکار جایزه]] ره بیته و بتترین فیلم بئی بییه. وه اولینکش بییه که اتا خارجی زوون فیلم ره بتترین فیلم بخش وسّه اوسکار هدانه.
فیلم اتا خانواده ره سٮراق دنه که فقیر هستنه و هرچی تجنّه سِره و زندگی ندارنه. وشون اتا غنی خانواده ره گیر یارنه و شونّه وشون سِره دله بٮستایی و یواشکی درنه. اوضاع زمونی خراب وونه که در وَرنه اتی دیگه خانواده هم پیش از وشون بئن، همینجه دئینه و سره دله درنه.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۲۰۱۹ فیلمون]]
[[رج:کرهای فیلمون]]
[[رج:اوسکار بیته فیلمون]]
[[رج:تل کمدی فیلمون]]
2yj84yse4cpfj8u62597k74yhl9vj21
پارازیت (فیلم)
0
172559
391777
2026-08-06T15:51:51Z
محک
1023
کارور محک، [[پارازیت (فیلم)]] ِصفحه ره دَکشییه [[پارازایت (فیلم)]] دله
391777
wikitext
text/x-wiki
#بور [[پارازایت (فیلم)]]
4n154uug2kch1kjjqx15v6g3sma5be6
پرونده:One Flew Over the Cuckoo's Nest poster.jpg
6
172560
391780
2026-02-24T00:18:44Z
en>Jevansen
0
+ [[Category:Film posters for English-language films]]
391780
wikitext
text/x-wiki
== Summary ==
{{Film poster fur
| Article = One Flew Over the Cuckoo's Nest (film)
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = One Flew Over the Cuckoo's Nest
| Distributor = [[United Artists]]
| Publisher =
| Type =
| Website = http://www.impawards.com/1975/one_flew_over_the_cuckoos_nest_ver1.html
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source =
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1970s American film posters}}
[[Category:Film posters for English-language films]]
rwdyscpqo813dt6lep7amn6aqaegjlc
391781
391780
2026-08-06T16:00:03Z
محک
1023
۱ نسخه واردشده از [[:en:File:One_Flew_Over_the_Cuckoo's_Nest_poster.jpg]]
391780
wikitext
text/x-wiki
== Summary ==
{{Film poster fur
| Article = One Flew Over the Cuckoo's Nest (film)
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = One Flew Over the Cuckoo's Nest
| Distributor = [[United Artists]]
| Publisher =
| Type =
| Website = http://www.impawards.com/1975/one_flew_over_the_cuckoos_nest_ver1.html
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source =
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1970s American film posters}}
[[Category:Film posters for English-language films]]
rwdyscpqo813dt6lep7amn6aqaegjlc
391782
391781
2026-08-06T16:00:22Z
محک
1023
محک [[پرونده:One Flew Over the Cuckoo's Nest poster.jpg]] ره بار بییشته
391780
wikitext
text/x-wiki
== Summary ==
{{Film poster fur
| Article = One Flew Over the Cuckoo's Nest (film)
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = One Flew Over the Cuckoo's Nest
| Distributor = [[United Artists]]
| Publisher =
| Type =
| Website = http://www.impawards.com/1975/one_flew_over_the_cuckoos_nest_ver1.html
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source =
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1970s American film posters}}
[[Category:Film posters for English-language films]]
rwdyscpqo813dt6lep7amn6aqaegjlc
وان فلو اور د ککوز نست
0
172561
391783
2026-08-06T16:01:28Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391783
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم= پرواز کوکویِ کالی سر جه
|عکس= File:One Flew Over the Cuckoo's Nest poster.jpg
}}
'''''وان فِلو اُوِر دِ کَکوز نِست'''' {{انگلیسی جه|One Flew Over the Cuckoo's Nest}} که ونه معنی وونه '''''پرواز، کوکوی کالی سر جه'''''، اتا روانشناسی فیلم هسته که ۱۹۷۵ وه ره [[میلوش فورمن]] کارگردانی جه بساتنه. فیلمِ آسنی ره اتا کٮتاب دله جه بیتنه؛ اتا مردی که تجاوز وسّه حبس دکته، شهخد ره لوچ نشون دنه که وه ره زندون نَوِرِن. وه ره وَرنه دیوانهخنه و اونجه اتا پرستار وه ره خله مزراب اینگنده...
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:آمریکایی فیلمون]]
[[رج:۱۹۷۵ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
[[رج:روانشناسی فیلمون]]
tunllw1kvh3r67rhwtnkalhhwvl5z9y
391820
391783
2026-08-06T16:49:20Z
محک
1023
391820
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم= پرواز کوکویِ کالی سر جه
|عکس= File:One Flew Over the Cuckoo's Nest poster.jpg
}}
'''''وان فِلو اُوِر دِ کَکوز نِست''''' {{انگلیسی جه|One Flew Over the Cuckoo's Nest}} که ونه معنی وونه '''''پرواز، کوکوی کالی سر جه'''''، اتا روانشناسی فیلم هسته که ۱۹۷۵ وه ره [[میلوش فورمن]] کارگردانی جه بساتنه. فیلمِ آسنی ره اتا کٮتاب دله جه بیتنه؛ اتا مردی که تجاوز وسّه حبس دکته، شهخد ره لوچ نشون دنه که وه ره زندون نَوِرِن. وه ره وَرنه دیوانهخنه و اونجه اتا پرستار وه ره خله مزراب اینگنده...
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:آمریکایی فیلمون]]
[[رج:۱۹۷۵ فیلمون]]
[[رج:اوسکار بیته فیلمون]]
[[رج:روانشناسی فیلمون]]
31l6fyjra3rl3i7d9ardcmi9lim4k3x
پرونده:Driving Miss Daisy .jpg
6
172562
391784
2024-08-26T02:06:21Z
en>DeltaQuadBot
0
(Image Revdel) Orphaned non-free file(s) deleted per [[WP:F5|F5]] ([[User:AmandaNP/Imagerevdel/Run|disable]])
391784
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Driving Miss Daisy
| Use = Infobox
| Media = film
| Name = Driving Miss Daisy
| Distributor = [[Warner Bros.]]
| Source = [https://www.imdb.com/title/tt0097239/mediaviewer/rm2944161536/ IMDB]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1980s American film posters}}
9oip0w9u9yn4rz7dam2f5dkyzvtqmjw
391785
391784
2026-08-06T16:05:37Z
محک
1023
۱ نسخه واردشده از [[:en:File:Driving_Miss_Daisy_.jpg]]
391784
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Driving Miss Daisy
| Use = Infobox
| Media = film
| Name = Driving Miss Daisy
| Distributor = [[Warner Bros.]]
| Source = [https://www.imdb.com/title/tt0097239/mediaviewer/rm2944161536/ IMDB]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1980s American film posters}}
9oip0w9u9yn4rz7dam2f5dkyzvtqmjw
391786
391785
2026-08-06T16:05:50Z
محک
1023
محک [[پرونده:Driving Miss Daisy .jpg]] ره بار بییشته
391784
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster
| Article = Driving Miss Daisy
| Use = Infobox
| Media = film
| Name = Driving Miss Daisy
| Distributor = [[Warner Bros.]]
| Source = [https://www.imdb.com/title/tt0097239/mediaviewer/rm2944161536/ IMDB]
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1980s American film posters}}
9oip0w9u9yn4rz7dam2f5dkyzvtqmjw
درایوینگ میس دیزی
0
172563
391787
2026-08-06T16:06:40Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391787
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس= File:Driving Miss Daisy .jpg
}}
'''درایوینگ میس دیزی''' {{به انگلیسی|Driving Miss Daisy}} یعنن '''رانندگی، دیزی خانم وسه'''، اتا آمریکایی فیلم هسته که ۱۹۸۹ سال شٮنه. [[مورگان فریمن]] اتا سیو دیم راننده نقش ره دارنه که شونه اتا اسپه پیر زنایِ راننده وونه ولی زنا خله بدجور-بچم اخلاق دارنه و دکّل سیو آدمون ره هچّی حٮساب نکنده ولی مردی أنده وه ره سرور گیرنه که ونه دل ره بدست یارنه.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۱۹۸۹ فیلمون]]
[[رج:آمریکایی فیلمون]]
[[رج:تل کمدی فیلمون]]
[[رج:نژادپرستی فیلمون]]
[[رج:اوسکار_بیته_فیلمون]]
2xw3994ewksn1qwgeyoxuneh1opkhhv
امریکن بییوتی
0
172564
391788
2026-08-06T16:11:14Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391788
wikitext
text/x-wiki
{{صندخ/فیلم
|عکس = American_Beauty_1999_film_poster.jpg
}}
'''امریکن بییوتی''' (انگلیسی جه: ''American Beauty'') یعنن '''قشنگِ آمریکایی''' اتا آمریکایی فیلم بییه که [[سام مندز]] کارگردانی هاکرده و ۱۹۹۹ سال شٮنه. [[کوین اسپیسی]] این فیلم دله اتا کارمندِ نقش ره دارنه که [[میانسالی بحران]] جه دچار بئییه و شه کیجایِ همکلاسی ره خانه و شه زنا جه سٮوا وونه...
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:۱۹۹۹ فیلمون]]
[[رج:اوسکار_بیته_فیلمون]]
[[رج:آمریکایی فیلمون]]
gh4moloca5z35xyzgu9r2tkhk3izzgp
پرونده:American Beauty 1999 film poster.jpg
6
172565
391789
2026-05-05T22:58:26Z
en>TAnthony
0
Add image category (LGBTQ) (via [[WP:JWB]])
391789
wikitext
text/x-wiki
{{Non-free use rationale
| Description = Theatrical release poster for ''[[American Beauty (1999 film)|American Beauty]]'', Copyright © 1999 by DreamWorks. All Rights Reserved.
| Source = [http://www.impawards.com/1999/american_beauty.html IMP Awards]
| Article = American Beauty (1999 film)
| Portion = Small portion of commercial product
| Low_resolution = Yes
| Purpose = Serves as "cover art" to identify the article's topic
| Replaceability = No free alternative that would adequately identify the article's topic
| other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1990s American film posters}}
[[Category:1990s American LGBTQ-related film posters]]
2hfx9bhn5lmf6x152161gjymk4hyjwx
391790
391789
2026-08-06T16:11:50Z
محک
1023
۱ نسخه واردشده از [[:en:File:American_Beauty_1999_film_poster.jpg]]
391789
wikitext
text/x-wiki
{{Non-free use rationale
| Description = Theatrical release poster for ''[[American Beauty (1999 film)|American Beauty]]'', Copyright © 1999 by DreamWorks. All Rights Reserved.
| Source = [http://www.impawards.com/1999/american_beauty.html IMP Awards]
| Article = American Beauty (1999 film)
| Portion = Small portion of commercial product
| Low_resolution = Yes
| Purpose = Serves as "cover art" to identify the article's topic
| Replaceability = No free alternative that would adequately identify the article's topic
| other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1990s American film posters}}
[[Category:1990s American LGBTQ-related film posters]]
2hfx9bhn5lmf6x152161gjymk4hyjwx
391791
391790
2026-08-06T16:12:03Z
محک
1023
محک [[پرونده:American Beauty 1999 film poster.jpg]] ره بار بییشته
391789
wikitext
text/x-wiki
{{Non-free use rationale
| Description = Theatrical release poster for ''[[American Beauty (1999 film)|American Beauty]]'', Copyright © 1999 by DreamWorks. All Rights Reserved.
| Source = [http://www.impawards.com/1999/american_beauty.html IMP Awards]
| Article = American Beauty (1999 film)
| Portion = Small portion of commercial product
| Low_resolution = Yes
| Purpose = Serves as "cover art" to identify the article's topic
| Replaceability = No free alternative that would adequately identify the article's topic
| other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1990s American film posters}}
[[Category:1990s American LGBTQ-related film posters]]
2hfx9bhn5lmf6x152161gjymk4hyjwx
کینگز اسپیچ
0
172566
391792
2026-08-06T16:16:57Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391792
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = شاهِ گپ بزوئن
|عکس =File:The King's Speech poster.jpg
}}
'''کینگز اسپیچ''' یعنن '''شاهِ گپ''' {{به انگلیسی|The King's Speech}} اتا [[بریتانیا]]یی فیلم هسته که [[تام هوپر]] کارگردانی و [[دیوید سیدلر]] نویسندگی جه، ۲۰۱۰ سال، بساتنه. این فیلم، [[جورج شیشم]] بگذشتی خَوِر هسته که ونه زوون کَتِل بییه و خاسته گپ بزنه، ماسته. مملکت جنگ دله دیّه و لازم بییه شاه مردم وسّه خطابه بخونده و فیلم سٮراق دِنه چتی وه ره آماده هاکردنه که رادیو جه اتا بنویشته ره قشنگ بخوندسته.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار_بیته_فیلمون]]
[[رج:۲۰۱۰ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:بیوگرافی فیلمون]]
szb08o2btu11ymcnmarifsuds35cdkk
پرونده:The King's Speech poster.jpg
6
172567
391793
2026-02-24T04:03:15Z
en>Jevansen
0
+ [[Category:Film posters for English-language films]]
391793
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Article = The King's Speech
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = The King's Speech
| Distributor = [[Momentum Pictures]]
| Publisher =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source = http://www.impawards.com/2010/kings_speech_ver3.html
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| Other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s British film posters}}
[[Category:Film posters for English-language films]]
gds9qsxz6ibcl5n48wujj24yrf4n3p4
391794
391793
2026-08-06T16:17:42Z
محک
1023
۱ نسخه واردشده از [[:en:File:The_King's_Speech_poster.jpg]]
391793
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Article = The King's Speech
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = The King's Speech
| Distributor = [[Momentum Pictures]]
| Publisher =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source = http://www.impawards.com/2010/kings_speech_ver3.html
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| Other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s British film posters}}
[[Category:Film posters for English-language films]]
gds9qsxz6ibcl5n48wujj24yrf4n3p4
391795
391794
2026-08-06T16:17:53Z
محک
1023
محک [[پرونده:The King's Speech poster.jpg]] ره بار بییشته
391793
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Article = The King's Speech
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = The King's Speech
| Distributor = [[Momentum Pictures]]
| Publisher =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description =
| Source = http://www.impawards.com/2010/kings_speech_ver3.html
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| Other_information =
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2010s British film posters}}
[[Category:Film posters for English-language films]]
gds9qsxz6ibcl5n48wujj24yrf4n3p4
پرونده:Braveheart film poster.png
6
172568
391796
2026-07-11T01:05:34Z
en>Jevansen
0
+ [[:Category:Film posters for English-language films]]
391796
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
|Description = This is a poster for Braveheart.
The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Source = This image can be obtained from Paramount Pictures.
|Author = The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Article = Braveheart
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = hbtfgd
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1990s American film posters}}
[[Category:Film posters for English-language films]]
kmhsjoz7nc1vz41wq3yuw4am0t9i4hv
391797
391796
2026-08-06T16:22:26Z
محک
1023
۱ نسخه واردشده از [[:en:File:Braveheart_film_poster.png]]
391796
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
|Description = This is a poster for Braveheart.
The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Source = This image can be obtained from Paramount Pictures.
|Author = The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Article = Braveheart
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = hbtfgd
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1990s American film posters}}
[[Category:Film posters for English-language films]]
kmhsjoz7nc1vz41wq3yuw4am0t9i4hv
391798
391797
2026-08-06T16:22:37Z
محک
1023
محک [[پرونده:Braveheart film poster.png]] ره بار بییشته
391796
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
|Description = This is a poster for Braveheart.
The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Source = This image can be obtained from Paramount Pictures.
|Author = The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist.
|Article = Braveheart
|Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
|Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
|Minimality = hbtfgd
|Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1990s American film posters}}
[[Category:Film posters for English-language films]]
kmhsjoz7nc1vz41wq3yuw4am0t9i4hv
بریو هارت
0
172569
391799
2026-08-06T16:22:49Z
محک
1023
اتا نو ولگ بساته که ونه دله «{{صندخ/فیلم |نوم = شجاع ذل |عکس =File:Braveheart film poster.png }} '''''بِرِیو هارت''''' یعنن '''''شجاع دل''''' {{به انگلیسی|Braveheart }} اتا [[آمریکا]]یی فیلم هسته که [[مل گیبسون]] هم ونه کارگردانی ره هاکرده و هم شه ونه اصلی نقش ره کا بکرده. این فیلم، [[ویلیام والاس]] بگذشتی خَو...» دره
391799
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = شجاع ذل
|عکس =File:Braveheart film poster.png
}}
'''''بِرِیو هارت''''' یعنن '''''شجاع دل''''' {{به انگلیسی|Braveheart }} اتا [[آمریکا]]یی فیلم هسته که [[مل گیبسون]] هم ونه کارگردانی ره هاکرده و هم شه ونه اصلی نقش ره کا بکرده. این فیلم، [[ویلیام والاس]] بگذشتی خَوِر هسته که [[اسکاتلند]]ِ إستٮقلال وسّه [[بریتانیا]] جه جنگ دکته. این فیلم ۱۹۹۵ سال شٮنه و اون سال، دَهتا [[اوسکار جایزه]] وسّه نومزه بئیبییه که پنجتاش ره بَوِرده.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار_بیته_فیلمون]]
[[رج:۱۹۹۵ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:بیوگرافی فیلمون]]
[[رج:تاریخی فیلمون]]
t8r8vfakqxozmt7vj3o5wjti3wagdye
شجاعدل
0
172570
391800
2026-08-06T16:23:49Z
محک
1023
ونه مسیر ره دکشییه [[بریو هارت]] دله
391800
wikitext
text/x-wiki
#بور [[بریو هارت]]
hb0w4f5pynfdq46e3olp2jj5fw6hn3t
پرونده:One Battle After Another.jpg
6
172571
391801
2026-02-24T02:37:11Z
en>Jevansen
0
+ [[Category:Film posters for English-language films]]
391801
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
| Description = This is a poster for the 2025 American film ''[[One Battle After Another]]''.
| Source = https://www.cinematerial.com/movies/one-battle-after-another-i30144839/p/gx8enlln
| Date = 2025
| Author = [[Warner Bros. Pictures]]
| Article = One Battle After Another
| Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
| Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
| Minimality = The poster will serve as the first and primary image for this particular article.
| Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2020s American film posters}}
[[Category:Film posters for English-language films]]
pgqxd1jkuae1mw4wsy1vz9v1gfjx24c
391802
391801
2026-08-06T16:27:35Z
محک
1023
۱ نسخه واردشده از [[:en:File:One_Battle_After_Another.jpg]]
391801
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
| Description = This is a poster for the 2025 American film ''[[One Battle After Another]]''.
| Source = https://www.cinematerial.com/movies/one-battle-after-another-i30144839/p/gx8enlln
| Date = 2025
| Author = [[Warner Bros. Pictures]]
| Article = One Battle After Another
| Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
| Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
| Minimality = The poster will serve as the first and primary image for this particular article.
| Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2020s American film posters}}
[[Category:Film posters for English-language films]]
pgqxd1jkuae1mw4wsy1vz9v1gfjx24c
391803
391802
2026-08-06T16:27:46Z
محک
1023
محک [[پرونده:One Battle After Another.jpg]] ره بار بییشته
391801
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale 2
| Description = This is a poster for the 2025 American film ''[[One Battle After Another]]''.
| Source = https://www.cinematerial.com/movies/one-battle-after-another-i30144839/p/gx8enlln
| Date = 2025
| Author = [[Warner Bros. Pictures]]
| Article = One Battle After Another
| Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question.
| Replaceability = Any derivative work based upon the cover art would be a copyright violation, so creation of a free image is not possible.
| Minimality = The poster will serve as the first and primary image for this particular article.
| Commercial = The use of a low resolution image of a work's cover will not impact the commercial viability of the work.
}}
== Licensing ==
{{Non-free film poster|image_has_rationale=yes|2020s American film posters}}
[[Category:Film posters for English-language films]]
pgqxd1jkuae1mw4wsy1vz9v1gfjx24c
وان بتل افتر انادر
0
172572
391804
2026-08-06T16:27:51Z
محک
1023
اتا نو ولگ بساته که ونه دله «{{صندخ/فیلم |نوم = اتا جنگ، اتی جنگ په |عکس =File:One Battle After Another.jpg }} '''وان بَتِل اَفتِر اِنادر''' یعنن '''اتا جنگ، اتی په''' {{به انگلیسی|One Battle After Another}} اتا [[آمریکا]]یی فیلم هسته که [[ پل توماس اندرسن ]]، ۲۰۲۵ سال دله، بساته. این فیلم اتا چپی-انقلابی مردی...» دره
391804
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = اتا جنگ، اتی جنگ په
|عکس =File:One Battle After Another.jpg
}}
'''وان بَتِل اَفتِر اِنادر''' یعنن '''اتا جنگ، اتی په''' {{به انگلیسی|One Battle After Another}} اتا [[آمریکا]]یی فیلم هسته که [[ پل توماس اندرسن ]]، ۲۰۲۵ سال دله، بساته. این فیلم اتا چپی-انقلابی مردی ره نشون دِنه که شه کیجا ره اتا آمریکایِ افسر دستپه جه خانه نجات هاده...
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار_بیته_فیلمون]]
[[رج:۲۰۲۵ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
d2ev91lwo7r25j4hdgedpdc77ljpl5b
پرونده:Slumdog Millionaire poster.png
6
172573
391805
2024-07-30T23:22:19Z
en>TAnthony
0
/* Licensing */Refine image category
391805
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Slumdog Millionaire
| Source = The poster art can or could be obtained from the distributor.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s British film posters}}
6r5iv99wkvwvruc4rnq8q6lsn8xxamv
391806
391805
2026-08-06T16:30:28Z
محک
1023
۱ نسخه واردشده از [[:en:File:Slumdog_Millionaire_poster.png]]
391805
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Slumdog Millionaire
| Source = The poster art can or could be obtained from the distributor.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s British film posters}}
6r5iv99wkvwvruc4rnq8q6lsn8xxamv
391807
391806
2026-08-06T16:30:53Z
محک
1023
محک [[پرونده:Slumdog Millionaire poster.png]] ره بار بییشته
391805
wikitext
text/x-wiki
==Summary==
{{Non-free use rationale poster
| Media = film
| Use = Infobox
| Article = Slumdog Millionaire
| Source = The poster art can or could be obtained from the distributor.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s British film posters}}
6r5iv99wkvwvruc4rnq8q6lsn8xxamv
اسلامداگ میلیونر
0
172574
391808
2026-08-06T16:33:01Z
محک
1023
اتا نو ولگ بساته که ونه دله «{{صندخ/فیلم |نوم = ندارِ میلیونر |عکس =File:Slumdog Millionaire poster.png }} '''إسلامداگ میلیونر''' یعنن '''''بیخانه میلیونر''''' {{به انگلیسی|Slumdog Millionaire}} اتا [[بریتانیا]]یی فیلم هسته که [[دنی بویل]]، ۲۰۰۸ سال دله، بساته. این فیلم اتا فقیر و [[هند]]ی کیجا ره سٮراق دنه که...» دره
391808
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = ندارِ میلیونر
|عکس =File:Slumdog Millionaire poster.png
}}
'''إسلامداگ میلیونر''' یعنن '''''بیخانه میلیونر''''' {{به انگلیسی|Slumdog Millionaire}} اتا [[بریتانیا]]یی فیلم هسته که [[دنی بویل]]، ۲۰۰۸ سال دله، بساته. این فیلم اتا فقیر و [[هند]]ی کیجا ره سٮراق دنه که اتا تلویزونی مسابقه درون برنده بیّه و یک میلیون دلار جایزه بیته ولی پؤلیس وه ره گیرنه و چک-پرسی کنده که چتی دشتِ سؤالات ره جواب هدائه و وه مجبور وونه شه زندگی ره وشون وسّه تعریف هاکنه که چتی جوابها ره دونسته.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار بیته فیلمون]]
[[رج:۲۰۰۸ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:بریتانیایی فیلمون]]
dlnrbbsksrw980cq3r3g0e078we2gdb
391809
391808
2026-08-06T16:33:36Z
محک
1023
391809
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = ندارِ میلیونر
|عکس =File:Slumdog Millionaire poster.png
}}
'''إسلامداگ میلیونر''' یعنن '''''بیخانه میلیونر''''' {{به انگلیسی|Slumdog Millionaire}} اتا [[بریتانیا]]یی فیلم هسته که [[دنی بویل]]، ۲۰۰۸ سال دله، بساته. این فیلم اتا فقیر و [[هند]]ی ریکا ره سٮراق دنه که اتا تلویزونی مسابقه درون برنده بیّه و یک میلیون دلار جایزه بیته ولی پؤلیس وه ره گیرنه و چک-پرسی کنده که چتی دشتِ سؤالات ره جواب هدائه و وه مجبور وونه شه زندگی ره وشون وسّه تعریف هاکنه که چتی جوابها ره دونسته.
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار بیته فیلمون]]
[[رج:۲۰۰۸ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:بریتانیایی فیلمون]]
sk361y7wjdk0ednyigei9xik7spnm27
پرونده:Rain Man poster.jpg
6
172575
391810
2026-02-24T00:23:01Z
en>Jevansen
0
+ [[Category:Film posters for English-language films]]
391810
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster|Media=film
| Article = Rain Man
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = Rain Man
| Distributor = [[United Artists]]
| Publisher =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description = ''Rain Man'' film poster
| Source =
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| other_information = © 1988 United Artists Pictures Inc.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1980s American film posters}}
[[Category:Images of Tom Cruise]]
[[Category:Film posters for English-language films]]
15pf2z0055x5178tb0ya4sj20aqshzu
391811
391810
2026-08-06T16:38:24Z
محک
1023
۱ نسخه واردشده از [[:en:File:Rain_Man_poster.jpg]]
391810
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster|Media=film
| Article = Rain Man
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = Rain Man
| Distributor = [[United Artists]]
| Publisher =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description = ''Rain Man'' film poster
| Source =
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| other_information = © 1988 United Artists Pictures Inc.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1980s American film posters}}
[[Category:Images of Tom Cruise]]
[[Category:Film posters for English-language films]]
15pf2z0055x5178tb0ya4sj20aqshzu
391812
391811
2026-08-06T16:38:35Z
محک
1023
محک [[پرونده:Rain Man poster.jpg]] ره بار بییشته
391810
wikitext
text/x-wiki
== Summary ==
{{Non-free use rationale poster|Media=film
| Article = Rain Man
| Use = Infobox
<!-- ADDITIONAL INFORMATION -->
| Name = Rain Man
| Distributor = [[United Artists]]
| Publisher =
| Type =
| Website =
| Owner =
| Commentary =
<!--OVERRIDE FIELDS -->
| Description = ''Rain Man'' film poster
| Source =
| Portion =
| Low_resolution =
| Purpose = <!-- Must be specified if Use is not Infobox / Header / Section / Artist -->
| Replaceability =
| other_information = © 1988 United Artists Pictures Inc.
}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|1980s American film posters}}
[[Category:Images of Tom Cruise]]
[[Category:Film posters for English-language films]]
15pf2z0055x5178tb0ya4sj20aqshzu
رین من
0
172576
391813
2026-08-06T16:38:49Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391813
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = وارش مردی
|عکس =File:Rain Man poster.jpg
}}
'''رِین مَن''' یعنن '''''وارِشِ مَردی''''' {{به انگلیسی|Rain Man }} اتا [[آمریکا]]یی فیلم هسته که [[ بری لوینسون]]، ۱۹۸۸ سال دله، بساته. این فیلم دِتا برار بگذشتی هسته که اتاشون ([[داستین هافمن]] نقش) [[ساوان سندروم]] دارنه و لوچ هسته و اتی دیگر ([[تام کروز]] نقش) شه خانواده جه سٮوا زندگی کرده و إسا که ونه پییر بمرده و شه ارث ره اونا برار وسّه بییشته، بمو مریضِ برار دمبال...
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار بیته فیلمون]]
[[رج:۱۹۸۸ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:آمریکایی فیلمون]]
sstdn9362nybgjgrcloq7iy3ifhaell
لورنس آف عربیا
0
172577
391814
2026-08-06T16:44:44Z
محک
1023
مقالهئونی که گت صفحهیِ کادر جه بساتنه.
391814
wikitext
text/x-wiki
{{صندخ/فیلم
|نوم = عربستونِ لورنس
|عکس =Lawrence of arabia ver3 xxlg.jpg
}}
'''لورنس آف عربیا''' یعنن '''''عربستونِ لورنس''''' {{به انگلیسی|Lawrence of arabia }} اتا [[آمریکا]]یی فیلم هسته که [[ دیوید لین ]]، ۱۹۶۲ سال دله، بساته. این فیلم [[توماس ادوارد لورنس]] خاطرات سر جه بساته بیّه.
== آسنی==
[[توماس ادوارد لورنس]] اتا بریتانیایِ ارتشِ مأمور بییه که [[عثمانی]]ِ سامون دله چرخ-چرخ گیته و عربونِ فرهنگ ره یاد گیته. وه [[جهونی جنگ اول]] گدر عربون جه خله گپ بزو و وشون ره راقاضی دمبدا که شورش هاکنن و عربی کشورونِ تجزیه ره خاهون بووشن. وه قول دِنه که بریتانیا وشون وسّه عربی مملکت بساجه و وشونِ سران ره شاه هاکنه. وه هر تی هسته، عربِ قبائل سر ره جمع کنده و وشون کؤمک جه [[عقبه]] شهر ره عثمانی جه گیرنه...
== منابع ==
{{پهنویس}}
<!--- رجئون: --->
[[رج:اوسکار بیته فیلمون]]
[[رج:۱۹۶۲ فیلمون]]
[[رج:انگلیسی فیلمون]]
[[رج:تاریخی فیلمون]]
[[رج:بیوگرافی فیلمون]]
5n5rzcx26mb6ca4ebcw5825s8rmv8g5
رج:۱۹۶۲ فیلمون
14
172578
391815
2026-08-06T16:46:36Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۶۲ |ف]] [[رج:فیلمون با حیساب سال]]» دره
391815
wikitext
text/x-wiki
[[رج:۱۹۶۲ |ف]]
[[رج:فیلمون با حیساب سال]]
45m2zr7usphri9kewggy0sxjo2shtg3
391816
391815
2026-08-06T16:47:04Z
محک
1023
391816
wikitext
text/x-wiki
[[رج:۱۹۶۲ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1962 films]]
hckhg291nrqavqm1r6mxxz1763ik9ek
391872
391816
2026-08-06T17:11:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391872
wikitext
text/x-wiki
[[رج:۱۹۶۲|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1962 films]]
hlt4jgwty57gv1hbaisz8q6jb1fe58h
رج:۱۹۸۹ فیلمون
14
172579
391817
2026-08-06T16:47:49Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۸۹ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1989 films]]» دره
391817
wikitext
text/x-wiki
[[رج:۱۹۸۹ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1989 films]]
3ch5fhtqy2cqcwer0zxjrfbr1zd21qd
391882
391817
2026-08-06T17:13:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391882
wikitext
text/x-wiki
[[رج:۱۹۸۹|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1989 films]]
l0amx18a9l5i2qwzfyp7hnm7p1nal3y
رج:۱۹۸۸ فیلمون
14
172580
391818
2026-08-06T16:48:10Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۸۸ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1988 films]]» دره
391818
wikitext
text/x-wiki
[[رج:۱۹۸۸ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1988 films]]
en7zcral3hc6ddmooeriq6lhq0b55r8
391880
391818
2026-08-06T17:13:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391880
wikitext
text/x-wiki
[[رج:۱۹۸۸|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1988 films]]
sxn8spamsuk6gzzux13wa1irwecgzk8
رج:۱۹۷۲ فیلمون
14
172581
391819
2026-08-06T16:48:33Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۷۲ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1972 films]]» دره
391819
wikitext
text/x-wiki
[[رج:۱۹۷۲ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1972 films]]
swp9zyrs5zbqjjg5uq53cpbmw2y1426
391874
391819
2026-08-06T17:12:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391874
wikitext
text/x-wiki
[[رج:۱۹۷۲|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1972 films]]
du2xp0bc2rihc0kjouqblusl4et5w0c
رج:۱۹۷۵ فیلمون
14
172582
391821
2026-08-06T16:49:39Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۷۵ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1975 films]]» دره
391821
wikitext
text/x-wiki
[[رج:۱۹۷۵ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1975 films]]
nk2p0pfoh1dfxm0qspp2upvv054gtp4
391876
391821
2026-08-06T17:12:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391876
wikitext
text/x-wiki
[[رج:۱۹۷۵|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1975 films]]
ajdg9ukgytv0jrx8ovj8buru6a0jdu4
رج:۱۹۹۶ فیلمون
14
172583
391822
2026-08-06T16:51:03Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۹۶ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1996 films]]» دره
391822
wikitext
text/x-wiki
[[رج:۱۹۹۶ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1996 films]]
dacsk5tsrmepso3d5nxro2pjj490hnb
391889
391822
2026-08-06T17:16:10Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391889
wikitext
text/x-wiki
[[رج:۱۹۹۶|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1996 films]]
nx3vat42lndigjz3hbi93q09879ljja
رج:۱۹۹۲ فیلمون
14
172584
391823
2026-08-06T16:51:44Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۹۲ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1992 films]]» دره
391823
wikitext
text/x-wiki
[[رج:۱۹۹۲ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1992 films]]
qz9zf18895d2sd9vcl84uehurvllzgj
391885
391823
2026-08-06T17:14:50Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391885
wikitext
text/x-wiki
[[رج:۱۹۹۲|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1992 films]]
fsk1lroy117fpzf70e9nkf290h4z9w9
رج:۱۹۹۱ فیلمون
14
172585
391824
2026-08-06T16:52:05Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:۱۹۹۱ |ف]] [[رج:فیلمون با حیساب سال]] [[en:Category:1991 films]]» دره
391824
wikitext
text/x-wiki
[[رج:۱۹۹۱ |ف]]
[[رج:فیلمون با حیساب سال]]
[[en:Category:1991 films]]
bqlp139tp9314jczwvm4rlz3i3pzo2a
391884
391824
2026-08-06T17:14:30Z
TapuriaBot
3049
ربات: جایگزینی ردهٔ فیلمون با حیساب سال با [[:رج:فیلم، سال په|فیلم، سال په]]
391884
wikitext
text/x-wiki
[[رج:۱۹۹۱|ف]]
[[رج:فیلم، سال په]]
[[en:Category:1991 films]]
gymgeg62534qaw9gjy8yoye5xedrafl
نوسال موارکا(2014 فیلم)
0
172586
391826
2026-08-06T16:53:29Z
محک
1023
کارور محک، [[نوسال موارکا(2014 فیلم)]] ِصفحه ره دَکشییه [[نوسال موارکا (۲۰۱۴ فیلم)]] دله
391826
wikitext
text/x-wiki
#بور [[نوسال موارکا (۲۰۱۴ فیلم)]]
1zjlugo5p3oky754qkkxdxctm2tppsp
گپ:نوسال موارکا(2014 فیلم)
1
172587
391828
2026-08-06T16:53:29Z
محک
1023
کارور محک، [[گپ:نوسال موارکا(2014 فیلم)]] ِصفحه ره دَکشییه [[گپ:نوسال موارکا (۲۰۱۴ فیلم)]] دله
391828
wikitext
text/x-wiki
#بور [[گپ:نوسال موارکا (۲۰۱۴ فیلم)]]
rbu28qegl9xc5m1448pcddgw4g924as
رج:جهونی جنگ فیلمون
14
172588
391830
2026-08-06T16:55:00Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:جهونی جنگ دوم]] [[رج:جهونی جنگ اول]] [[رج:تاریخی فیلمون]]» دره
391830
wikitext
text/x-wiki
[[رج:جهونی جنگ دوم]]
[[رج:جهونی جنگ اول]]
[[رج:تاریخی فیلمون]]
489ki3nj6kap8q5sh07wnj6cw7yhnxy
391831
391830
2026-08-06T16:55:51Z
محک
1023
[[رج:جهونی جنگ اول]] حذف شد با استفاده از [[ویکیپدیا:رجساز]]
391831
wikitext
text/x-wiki
[[رج:جهونی جنگ دوم]]
[[رج:تاریخی فیلمون]]
12o2r4itf3cw5uv14h2ka5z0ihhn5yt
391840
391831
2026-08-06T17:02:32Z
محک
1023
[[رج:فیلم، موضوع په]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391840
wikitext
text/x-wiki
[[رج:جهونی جنگ دوم]]
[[رج:تاریخی فیلمون]]
[[رج:فیلم، موضوع په]]
rtmnqhctimuaz7adpshzk2b05z9afmt
رج:هولوکاست فیلمون
14
172589
391832
2026-08-06T16:56:16Z
محک
1023
[[رج:جهونی جنگ فیلمون]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391832
wikitext
text/x-wiki
[[رج:جهونی جنگ فیلمون]]
toe21eeebw9fnb03s7k1ol9qb9xvsto
391833
391832
2026-08-06T16:56:22Z
محک
1023
[[رج:هولوکاست]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391833
wikitext
text/x-wiki
[[رج:جهونی جنگ فیلمون]]
[[رج:هولوکاست]]
bp029ogx0xlfbul4agngjxt12lev7pg
391841
391833
2026-08-06T17:02:39Z
محک
1023
[[رج:فیلم، موضوع په]] اضافه شد با استفاده از [[ویکیپدیا:رجساز]]
391841
wikitext
text/x-wiki
[[رج:جهونی جنگ فیلمون]]
[[رج:هولوکاست]]
[[رج:فیلم، موضوع په]]
lr43hmjk2k2okmnuv4vp2vyzwyc366s
پرونده:Reader ver2.jpg
6
172590
391834
2024-07-17T23:47:02Z
en>TAnthony
0
Refine image category
391834
wikitext
text/x-wiki
{{Non-free use rationale poster| Media=film |Use=Infobox |Article=The Reader (2008 film) |Source=[http://www.impawards.com/2008/reader_ver2.html Impawards.com]}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
o188ad4vb0d8dkq7bzdao62sayubd2t
391835
391834
2026-08-06T16:58:07Z
محک
1023
۱ نسخه واردشده از [[:en:File:Reader_ver2.jpg]]
391834
wikitext
text/x-wiki
{{Non-free use rationale poster| Media=film |Use=Infobox |Article=The Reader (2008 film) |Source=[http://www.impawards.com/2008/reader_ver2.html Impawards.com]}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
o188ad4vb0d8dkq7bzdao62sayubd2t
391836
391835
2026-08-06T16:58:31Z
محک
1023
محک [[پرونده:Reader ver2.jpg]] ره بار بییشته
391834
wikitext
text/x-wiki
{{Non-free use rationale poster| Media=film |Use=Infobox |Article=The Reader (2008 film) |Source=[http://www.impawards.com/2008/reader_ver2.html Impawards.com]}}
== Licensing ==
{{Non-free film poster|image has rationale=yes|2000s American film posters}}
o188ad4vb0d8dkq7bzdao62sayubd2t
رج:همجنسخاهی فیلمون
14
172591
391839
2026-08-06T17:00:43Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:فیلم، موضوع په]] [[رج:همجنسخاهی|ف]]» دره
391839
wikitext
text/x-wiki
[[رج:فیلم، موضوع په]]
[[رج:همجنسخاهی|ف]]
30g991sqcexd8g3jb1vrgagvl8feulu
رج:فیلم، موضوع په
14
172592
391844
2026-08-06T17:03:33Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:فیلم|موضوع]]» دره
391844
wikitext
text/x-wiki
[[رج:فیلم|موضوع]]
6i22d4yxpk3ol1kavdu6rloh08166dt
رج:انیمه
14
172593
391881
2026-08-06T17:13:32Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:فیلم ژانر]]» دره
391881
wikitext
text/x-wiki
[[رج:فیلم ژانر]]
17s9gqlvspjwjvd2145h8iwvnt4sla4
رج:بلغاری کتابون
14
172594
391961
2026-08-06T17:41:17Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:کتابون، زوون په]] [[رج:بلغاری زوون|ک]]» دره
391961
wikitext
text/x-wiki
[[رج:کتابون، زوون په]]
[[رج:بلغاری زوون|ک]]
f9qpwnkezm7rkmthc7oq46nwq2tb5nv
فوتبال جهانی جام
0
172595
392027
2026-08-06T23:09:14Z
محک
1023
ونه مسیر ره دکشییه [[فوتوال جهونی جام]] دله
392027
wikitext
text/x-wiki
#بور[[فوتوال جهونی جام]]
2gcbk6g8hmp9u2y4pb4tawqehserd8x
رج:ایتالیا بازیگرون
14
172596
392037
2026-08-07T06:38:22Z
محک
1023
اتا نو ولگ بساته که ونه دله «[[رج:ایتالیا گت آدمون|ب]] [[رج:بازیگرون]]» دره
392037
wikitext
text/x-wiki
[[رج:ایتالیا گت آدمون|ب]]
[[رج:بازیگرون]]
eyttxlblbf1dfnk1gf12ytdxd0mfrlm
شابلون:Cite web/چنگمویی
10
172597
392038
2026-08-07T06:48:24Z
محک
1023
اتا نو ولگ بساته که ونه دله «{{#invoke:citation/CS1/en|citation |CitationClass=web |access-date={{#replace:{{#replace:{{{access-date|}}}|[|}}|]|}} |archive-date={{#replace:{{#replace:{{{archive-date|}}}|[|}}|]|}} }}<noinclude>{{documentation}}</noinclude>» دره
392038
wikitext
text/x-wiki
{{#invoke:citation/CS1/en|citation
|CitationClass=web
|access-date={{#replace:{{#replace:{{{access-date|}}}|[|}}|]|}}
|archive-date={{#replace:{{#replace:{{{archive-date|}}}|[|}}|]|}}
}}<noinclude>{{documentation}}</noinclude>
mly4cithde1y61evf75tjpbrc3uesyg
ماژول گپ:Wikidata.Ca/i18n
829
172598
392041
2026-08-07T07:07:53Z
محک
1023
اتا نو ولگ بساته که ونه دله «== محلی تغییرات == فورمت ره روز-ماه-سال وسّه تغییر هدامه تا براکت <nowiki>[[]]</nowiki> نداره. چون [[شابلون:وب منبع]] وه ره برسمیت نشناسییه و قرمز اخطار نوشته. وه ره نتومبه اساسی حل هاکنم و ایآی جه هم کؤمک بیتمه، حریف نیّه! --~~~~» دره
392041
wikitext
text/x-wiki
== محلی تغییرات ==
فورمت ره روز-ماه-سال وسّه تغییر هدامه تا براکت <nowiki>[[]]</nowiki> نداره. چون [[شابلون:وب منبع]] وه ره برسمیت نشناسییه و قرمز اخطار نوشته. وه ره نتومبه اساسی حل هاکنم و ایآی جه هم کؤمک بیتمه، حریف نیّه! --[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۷ آگوست ۲۰۲۶، ساعت ۰۷:۰۷ (UTC)
teqxuaed7npsoed4m6n9ce7btqgjgs6
392042
392041
2026-08-07T07:12:31Z
محک
1023
392042
wikitext
text/x-wiki
== محلی تغییرات ==
فورمت ره روز-ماه-سال وسّه تغییر هدامه تا براکت <nowiki>[[]]</nowiki> نداره. چون [[شابلون:cite web]] وه ره برسمیت نشناسییه و قرمز اخطار نوشته. وه ره نتومبه اساسی حل هاکنم و ایآی جه هم کؤمک بیتمه، حریف نیّه! --[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۷ آگوست ۲۰۲۶، ساعت ۰۷:۰۷ (UTC)
tca1ti7me73wp45zg4q74umvr3aflif
پورتال:اسایی دکتهئون/دکتهئون ۷ آگوست ۲۰۲۶
100
172599
392043
2026-08-07T11:30:00Z
محک
1023
اتا نو ولگ بساته که ونه دله «* [[ترکیه]]، [[سعودی عربستون]] و [[پاکستان]] یکپشت بئینه و پیمون دَوِستنه که منبعد هرکی وشون دله، اتا ره حمله هاکنه، دِتا دیگه کشور ونه پشت در بئن. ([https://l.euronews.com/KfOK یورونیوز])» دره
392043
wikitext
text/x-wiki
* [[ترکیه]]، [[سعودی عربستون]] و [[پاکستان]] یکپشت بئینه و پیمون دَوِستنه که منبعد هرکی وشون دله، اتا ره حمله هاکنه، دِتا دیگه کشور ونه پشت در بئن. ([https://l.euronews.com/KfOK یورونیوز])
kk985qokq0kaftowrhqjwn56pipb1e0