ویکی‌پدیا 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> &nbsp;<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