ویکی‌پدیا mznwiki https://mzn.wikipedia.org/wiki/%DA%AF%D8%AA_%D8%B5%D9%81%D8%AD%D9%87 MediaWiki 1.47.0-wmf.10 first-letter مدیا شا گپ کارور کارور گپ ویکی‌پدیا ویکی‌پدیا گپ پرونده پرونده گپ مدیاویکی مدیاویکی گپ شابلون شابلون گپ رانما رانما گپ رج رج گپ پورتال پورتال گپ پروژه پروژه گپ TimedText TimedText talk ماژول ماژول گپ Event Event talk انگوس هاکردن 0 8683 389790 278356 2026-07-09T21:27:00Z ~2026-38991-26 46000 /* انگوس هاکردن مقعد دله */ 389790 wikitext text/x-wiki [[پرونده:Wiki-fingering.png|350px|thumb|اتا [[ریکا]] که دره شه زنا ره انگولک کانده]] '''انگوس'''، '''انگول''' یا '''انگولک''' هاکردن نوعی [[بگائستن|رابطهٔ جنسی]] هسته که با ور بوردن دستی [[چوچوله]]، [[کوس]]، [[مهبل]] و [[مقعد]] به منظور برانگیختگی و تحریک جنسی انجام وانه. انگولک هاکردن ممکن هسته به تنهایی ات رابطهٔ جنسی ره تشکیل هاده با بخشی از خودارضایی دوِجانبه، لاس بیتن و یا دیگر فعالیت‌های جنسی باشد که در این صورت با [[سکس دستی]] یعنی تحریک [[آلت تناسلی مردانه]] با دست شباهت پیدا کانده. این فعالیت‌ها تولید [[لذت جنسی]] کانّه، چه رابطهٔ جنسی کامل ممکن یا دلخاه بائه و چه نواشه. == انگوس هاکردن خید دله == [[انگوس هاکردن]] [[مقعد|خید]] دله، محیطی اعصاب پایانه‌کون وسه، ونه وری سر بتونده لذت‌بخش بوئه. همچنین هِرِه اسفنکتر ماهیچه‌کون انبساط، خید فرو بَوردن گِدِر بتونده مضاعف لذت بساجه. == اسلام دله== بر اساس استفتائاتی که از علی سیستانی، علی خامنه‌ای، ناصر مکارم شیرازی و مهدی هادوی تهرانی، شیعه ملائون بَیی‌یه، انگوس هاکردن زن مقعد شوهر دله مالش پروستات وسّه از نظر شرعی جایز هسته.<ref>[https://web.archive.org/web/20100323030427/http://farsi.islamquest.net/QuestionArchive/6130.aspx سئوال ۶۱۳۰] اسلام کوئست</ref> <gallery> پرونده:Utamaro B.jpg|اثر کیتاگاوا اوتامارو نقاش ژاپنی، ۱۷۹۹ پرونده:Urethral Fingering.jpg|اتا زنا که مردی [[دول]] ره انگوس کانده پرونده:Fingering vagina.jpg </gallery> == منابع == {{پانویس}} {{چپ‌چین}} * Wikipedia contributors, "Fingering (sexual act)," Wikipedia, The Free Encyclopedia, https://secure.wikimedia.org/wikipedia/en/w/index.php?title=Fingering_(sexual_act)&oldid=386005618 (accessed September 21, 2010). {{پایان چپ‌چین}} {{بگائستن}} ==پیوند به بیرون== {{انبار-رده|Fingering (sex)}} [[رده:بگائستن]] s424pbc42zu87v4cktnbw0b7kt9rv9z موبایل اپ 0 26313 389787 132777 2026-07-09T18:03:41Z HenryThe 27142 389787 wikitext text/x-wiki [[پرونده:Smart_phone.jpg|بندانگشتی|چپ|اپ ره دچی‌ین]] '''موبایل ِاَپ''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Mobile app'') ات جور برنومه هسته که [[موبایل]]ون وسّه سازنه و توسعه دِنّه. این برنومه‌ها ممکن هسته که شکل [[پیش نصب|پیش نصب‌بَیی]] بائِن یا کارور وشون ره نصب هاکنه. == محیط اجرا == [[اندروید]]، [[آی‌اواس]]، [[بلک‌بری]]، [[سیمبیان]]، [[بادا]] و [[ویندوز فون]] سیستم‌عاملونی هستنه که موبایل دله جه بتونّه اَپی ره پخش هاکنن که کد جه بنویشته بائه. == محیط توسعه‌ی کاتی‌ها== {| class="wikitable sortable" style="width:100%;" | ! برنومه‌نویسی ِزوون ! [[خطایاب]] ! [[برابرساز]] ! محیط یکپارچه توسعه ! چن‌کاتی توسعه ! گزینه بسته‌بندی نصب‌ساز ! هزینه ابزار توسعه |- ! [[ادوبی ایر]] | [[اکشن اسکریپت]]، [[اچ‌تی‌ام‌ال]]، [[سی‌اس‌اس]]، [[جاوا اسکریپت]] | {{بله}} | {{بله}} || [[فلش بیلدر]]، [[فلش پروفشنال]]، [[اینتل‌جی آی‌دی‌ایی‌ای(ایده)]] || آی‌اواس (آی‌فون، آی‌پد، آی‌پاد لمسی)، آندروید، بلک‌بری || بومی کد || [[فلش بیلدر]]، [[فلش پروفشنال]]، [[اینتل‌جی آی‌دی‌ایی‌ای(ایده)]] - تجاری اجازه‌نومه جه [http://www.adobe.com/products/air/sdk/ آدوبی ایرک. ت. ن (ابزار مبتنی بر خط فرمان)] - مفتکی |- ! [[ایرپلی ک. ت. م]] (مارمالاد فعلی) {{نشان|ک. ت. م}} | [[سی (زبان برنامه‌نویسی)|سی]]، [[سی++]] | {{بله}} | {{بله}} || [[ویژوال استادیو]]، [[اکس‌کد]] || همه بومی هستنه: آندروید، بلک‌بری، بِرو، آی‌اواس (آی‌فون)، مایمو، پالم/وب‌اواس، بادا از سامسونگ، سیمبیان، ویندوز موبایل ۶ به بعد و دسکتاپ، اواس‌اکس ||کد بومی برای هر دستگاه || تجاری اجازه‌نومه جه |- ! [[کدنیم وان]] (اسم‌ِرمزِ یک) | [[جاوا (زبان برنامه‌نویسی)|جاوا]] | {{بله}} | {{بله}} || [[نتبینز]]، [[اکلیپس]] || آی‌اواس (آی‌فون، آی‌پد، آی‌پاد لمسی)، آندروید، بلک‌بری، ویندوز۷، جاوا نسخه میکرو ||بومی کد دارنه || مفتکی و اُپن‌سورس + خدمات ابری پولی |- ! [[آلچه‌مو]] | [[جاوا (زبان برنامه‌نویسی)|جاوا]] || خطایاب مجتمع در محیط ویژوال استادیو، اکلیپس یا اکس‌کد || برای هر م. ی. ت {{نشان|م. ی. ت}} خطایاب موجود است. || [[ویژوال استادیو]]، [[اکلیپس]]، [[اکس‌کد]] || آندروید، بِرو، آی‌اواس (آی‌فون)، ویندوز موبایل ||بومی کد دارنه || تجاری اجازه‌نومه جه |- ! [[آندروید]] | [[جاوا (زبان برنامه‌نویسی)|جاوا]] ولی بخشی از کد [[سی (زبان برنامه‌نویسی)|سی]]، [[سی++]] جه هسته || خطایاب خطایاب مجتمع و سِواسِوا | {{بله}} || [[اکلیپس]]، [[اینتل‌جی آی‌دی‌ایی‌ای(ایده)]]، کنای آندروید، [[نتبینز]] || فقط آندروید، دالویک مجازی ماشین سه، مارس ۲۰۰۹ || اپک || مفتکی، [[اینتل‌جی آی‌دی‌ایی‌ای(ایده)|اینتل‌جی آی‌دی‌ای‌ای]] |- ! [[اپ‌فیورانس]] | [[جاوا اسکریپت]] | {{بله}} | {{بله}}، برابرساز با م. ت. م و آزمون همزمان بر روی دستگاه. || م. ت. ی مبتنی بر ابر || آندروید و آی‌اواس ||بومی کد دارنه || مفتکی |- ! [[اپلیکیشن کرافت]] | [[جاوا اسکریپت]]، [[اچ‌تی‌ام‌ال۵]]، [[سی‌اس‌اس]] | {{بله}} | {{بله}}، برابرسازی استفاده شده در ریپل || م. ت. ی مبتنی بر ابر || تمام سکوها: آندروید، آی‌اواس، بلک‌بری، ویندوز موبایل، بادا، وب‌اواس، سیمبیان. موبایل، دسکتاپ و تبلت || مبتنی بر سامانهی ابری/ مرورگری || مفتکی و اُپن‌سورس |- ! [[اپسلیتور]] | [[جاوا اسکریپت]] || بله در استودیو تیتانیوم، در مرحله بتاست. || برابرساز از طریق توسعه‌گر ثالت در دسترس است || ک. ت. ن داخلی || آندروید، آی‌فون; بلک‌بری (در آینده) ||بومی کد دارنه ||آپاچی ۲٫۰ اجازه‌نومه ، تجاری اجازه‌نومه جه |- ! [[اپسپشن]] | [[اچ‌تی‌ام‌ال۵]]، [[سی‌اس‌اس]]، [[جاوا اسکریپت]] | {{بله}} | {{بله}} || م. ت. ی ابری || آندروید، آی‌اواس ||بومی کد دارنه || مفتکی و تجاری اجازه‌نومه جه |- ! [[اپم‌وبی]] | [[اچ‌تی‌ام‌ال۵]] ([[جاوا اسکریپت]]، [[سی‌اس‌اس۳]]، [[اچ‌تی‌ام‌ال۵]]) || بله، اکس‌دی‌کی (فروشگاه برنامه گوگل کروم) || بله، در اکس‌دی‌کی || یکپارچه با ابزار مورد علاقه توسعه‌گر (و. ا{{نشان|و. ا}}، نوت‌پد++، وی‌آی) || آی‌اواس، آندروید، برنامه‌های وب اچ‌تی‌ام‌ال۵، برنامه‌های ترکیبی(هیبرید) اچ‌تی‌ام‌ال۵ ||بومی کد دارنه || مفتکی |- ! [[آکوآ (واسط کاربری)آگوآ]] | [[سی (زبان برنامه‌نویسی)|سی]]، [[سی++]]، [[جاوا اسکریپت]] | {{بله}} | {{بله}} || [[ویژوال استادیو]]، [[اکس‌کد]]، [[اکلیپس]] || آندروید، بلک‌بری پلی‌بوک، آی‌اواس، پالم/وب‌اواس، بادا از سامسونگ، ویندوز موبایل۶ به بعد، ویندوز دسکتاپ ||بومی کد دارنه || مفتکی و تجاری اجازه‌نومه جه |- ! [[آندرویدبیسیک۴]] | [[ویژوال بیسیک]] | {{بله}} | {{بله}} || اره || آندروید || || تجاری اجازه‌نومه جه |- ! [[باتری‌تک]] | [[سی (زبان برنامه‌نویسی)|سی]]، [[سی++]] | {{بله}} || با برابرسازهای بومی (آی‌اواس، آندروید...) || [[اکلیپس]]، [[ویژوال استادیو]]، [[اکس‌کد]] || آندروید، آی‌اواس (آی‌فون)، ویندوز، اواس‌اکس ||بومی کد دارنه || تجاری اجازه‌نومه جه |- ! [[بلک‌بری]] | [[جاوا (زبان برنامه‌نویسی)|جاوا]] || خطایاب مجتمع در م. ت. ی | {{بله}} || [[اکلیپس]] || فقط بلک‌بری، واسط برنومه‌نویسی آرآی‌ام وسّه || الکس، کاد || مفتکی |- ! [[بلوپرینت (زبان برنامه‌نویس)|بلوپرینت]] | [[اک‌س‌ام‌ال]] از طریق سرورهای [[یاهو موبایل]] و قابل نمایش در تمام مروگرهای بومی || بیش از یک بررسی کننده شما نیست | بدون نیاز به مترجم برای وب یا دستگاه | بدون ترجیح، هر ویرایشگر اکس‌ام‌ال | بدون ترجیح، هر مجری اکس‌م‌ال || با پیش-پیکربندی بارگذاری شده در یاهو || هر ویرایشگر کد اکس‌ام‌ال |- ! [[کوالکام بِرو|بِرو]] | [[سی (زبان برنامه‌نویسی)|سی]]; واسط م. ت. ی برنامه کاربردی به زبان سی به همراه واسطی از سی++ || خطایاب برای ای‌آرام بومی پشتیبانی شده. قابلیت استفاده با ویژوال استادیو برای آزمایش کدهای اکس-۸۶(پردازنده‌های دسکتاپ) را نیز داراست || هیچ برابر سازی برای کدهای هدف برای ای‌آرام وجود ندارد. دارای برابرساز برای معماری اکس-۸۶. || ویژوال استادیو ۶٫۰،. نت ویژوال استادیو ۲۰۰۳،. نت ویژوال استادیو ۲۰۰۵ || کامپایل برای بِرو || [[اوردایر پروگرامینگ]] (برنامه‌نویس روی هوا) || توسعه دارای هزینه‌هایی است |- ! [[سلسیوس]] | [[جاوا (زبان برنامه‌نویسی)|جاوا]] | {{بله}} | {{بله}} || [[اکلیپس]] || جاوا نسخه میکرو، آندروید، بلک‌بری، آی‌فون، سیمبیان، ویندوز موبایل ||کد بومی برای هر دستگاهِ مبتنی بر جاوا به شکل باینری || با اجازه‌نامه تجاری |- ! [[م. ت. ی موبایل]] | [[لوآ (زبان برنامه‌نویس)|لوآ]] || خیر | {{بله}} || م. ت. ی با مالیکیت خصوصی || [[آی‌فون]]، [[آی‌پد]]، [[آی‌پاد لمسی]]، [[آندروید]] ||کد بومی برای هر دستگاه || مفتکی و تجاری اجازه‌نومه جه |- ! [[ان‌ام‌ایی (چارچوب)|ان‌ام‌ایی]] | [[هاکسه]] (شبیه به اکشن اسکریپت و جاوا) | {{بله}} | {{بله}} || [[اینتل‌جی آی‌دی‌ایی‌ای(ایده)|اینتل‌جی آی‌دی‌ایی‌ای]]، [[فلش‌دولوپ]] || آی‌اواس (آی‌فون، آی‌پد، آی‌پاد لمسی)، آندروید، بلک‌بری پلی‌بوک، وب‌اواس، اچ‌تی‌ام‌ال۵، فلش، ویندوز (فایل اجرایی)، لینوکس ||کد بومی برای هر دستگاه || رایگان |- ! [[ک. ت. ن آی‌اواس]] | [[آبجکتیو-سی]] || خطایاب مجتمع در اکس‌کد م. ت. ی || محدود به آبجکتیو-سی آی‌فون و اکس‌کد م. ت. ی || [[اکس‌کد]]، [[اپ‌کد]] || [[آی‌فون]]، [[آی‌پد]]، [[آی‌پاد لمسی]] || تنها از طریق [[فروشگاه برنامه (آی‌اواس)|فروشگاه برنامه]]، نیازمند ارزیابی وتایید از سوی [[اپل]] || ابزاهای توسعهٔ اپل برای سیتم‌های مکینتاشِ مبتنی بر اینتل رایگان هستند. برابرساز نیز رایگان است اما نصب بر روی دستگاه برای توسعه‌گر نیازمند کلید امضا برای وی است. اپ‌کد- با اجازه‌نامه تجاری. |- ! [[جاوا نسخه میکرو]] (جاوا ام. ایی) | [[جاوا (زبان برنامه‌نویسی)|جاوا]] | {{بله}} || برابرساز رایگان، [http://java.sun.com/products/sjwtoolkit/ ابزار توسعه موبایل سان] || [[اکلیپس]]، بسته همراه ال‌ام‌آ از سوی [[نتبینز]] || بله از طریق ماشین مجازی مخصوص دستگاه || بسته‌بندی در قالب [[جاد (فرمت فایل)|جاد]]/[[جار (فرمت فایل)|جار]] و نیز فایل پی‌آرسی برای پالم اواس || مفتکی |- ! [[جی‌ام‌بی]] | اچ‌تی‌ام‌ال، سی‌اس‌اس، جاوا اسکریپت | {{بله}} || خطایاب برنامه. هیچ برابرسازی وجود ندارد. تنها باید آن را اجرا نمود تا آزموده شود. / || نا || آی‌اواس، آندروید (تا مارس ۲۰۱۲) ||کد بومی برای هر دستگاه || نا |- ! [[جی‌مانگ.]] | [[جی‌مانگو]] | نامعلوم | نامعلوم || م. ت. ی جی‌مانگوفلش || جاوا سکو میکرو، آندروید، بادا، بلک‌بری، آی‌فون، ویندوز موبایل۶، ویندوز فون ۷ ||کد بومی برای هر دستگاه || مفتکی |- |} == منابع == {{پانویس}} [[رج:موبایل]] [[رج:برنومه‌نویسی]] bk8tt1vu1e3m8k3rjkhypqsn4306cb1 گلادیاتور (فیلم) 0 30776 389853 136222 2026-07-10T10:39:08Z محک 1023 [[رج:۲۰۰۰ فیلمون]] اضافه شد با استفاده از [[ویکی‌پدیا:رج‌ساز]] 389853 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 |زبان = انگلیسی |بازیابی = ۱۹ نوامبر ۲۰۱۴ }} [[رج:گلادیاتور]] [[رج:انگلیسی فیلمون]] [[رج:بریتانیایی فیلمون]] [[رج:آمریکایی فیلمون]] [[رج:حماسه‌ای فیلمون]] [[رج: تاریخی فیلمون‏]] [[رج:روم دله فیلمون]] [[رج:۲۰۰۰ فیلمون]] er02zsy82vkm1gjsgg28gp2kz83zxxi جنیفر لارنس 0 35864 389819 188304 2026-07-10T09:40:09Z محک 1023 389819 wikitext text/x-wiki {{Infobox person | name = جنیفر لورنس | image = Jennifer Lawrence SDCC 2015 X-Men.jpg | alt = | caption = لورنس عکس که سال ۲۰۱۵ شنه | birth_name = جنیفر شریدر لورنس | birth_date = {{Birth date and age|1990|8|15}} | birth_place = [[ایندین هیل]]، [[کنتاکی]]، [[متحده ایالات]] | occupation = بازیگر | years_active = ۲۰۰۶–تاسا | spouse = کوک مارونی (۲۰۱۹) }} '''جنیفر لورنس''' {{Lang-en|Jennifer Shrader Lawrence}}؛ بزائه‌ی ۱۵ اوت ۱۹۹۰) آمریکایی بازیگر هسته. لارنس سال‌های ۲۰۱۵ و ۲۰۱۶ بیشترین مزد ره بازیگر زنان دله گیته و ونه فیلم‌ها سرجمع تا اسا بیش از ۶ میلیارد دلار فروش داشتنه. لورنس وچگی جه کلیسا و مدرسه دله اجرا کارده. وه ۱۴ سالگی تعطیلات شه خانواده همراهی بورده [[نیویورک]] و اتا استعدادیاب وه ره اونجه پیدا هاکرده. بعدته لورنس بورده [[لوس آنجلس]] و بعضی فیلمون دله سیولشکری نقش کا کارده. اولین اصلی نقش ره ''[[بیل انگوال شو]]'' (۲۰۰۷–۲۰۰۹) دله بدست بیارده. لورنس شه حرفه‌ای کار ره ''[[گاردن پارتی]]'' (۲۰۰۸) جه شروع هاکرده و این درام دله مکمل نقش داشته. ونه دومین کار ''[[وینترز بون]]'' (۲۰۱۰) بی‌یه که ونه نوم ره تِک‌سر بیارده. اینتی بیّه که وه ره بتتر فیلم‌ها دله هم نقش هدانه و اتا [[سوپر هیرو]] نقش ره ''[[ایکس من]]'' (۲۰۱۱–۲۰۱۹) دله بدست بیارده و [[هانگر گیمز]] (۲۰۱۲–۲۰۱۵) دله هم اصلی نقش ره داشته. وه هانگر گیمز دله جوایز و رکوردهایی داشته. وه ''[[سیلور لاینینگز]]'' (۲۰۱۲) دله اتا بی‌شی زنا نقش ره، شه ۲۲ سالگی گادر، کا هاکرده که [[اوسکار جایزه]] ره ونه وسّه بیته. وه ''[[امریکن هاستلر]]'' (۲۰۱۳) فیلم دله اتا سلیطه زنای نقش ره کا هاکرده و ونسه [[بفتای جایزه]] ره بیته. لارنس سه‌بار [[گولدن گلوب]] هم بیته که جز دِتا فیلم قبلی، سومی ''[[جوی (فیلم)|جوی]]'' (۲۰۱۵) وسّه بی‌یه. بجز اینان فیلم‌ها که بائوته بیّه، وه ''[[پسنجرز (۲۰۱۶)|پسنجرز]]'' (۲۰۱۶) علمی-تخیلی، ''[[مادر!]]'' (۲۰۱۷) ترسناک تریلر، و ''[[رد اسپارو]]'' (۲۰۱۸) جاسوسی، ''[[دونت لوک آپ]]'' (۲۰۲۱)، ''[[نو هارد فیلینگز]]'' (۲۰۲۳) سیو-کمدی و ''[[دای مای لاو ]]'' (۲۰۲۵) فیلم‌ها دله هم بازی هاکرده. == منابع == {{پانویس|چپ‌چین=بله|۲}} * انگلیسی ویکی‌پدیا [[رج:امریکا بازیگرون]] [[رج:زننه آدمون]] [[رج:اوسکار بیته‌ئون]] [[رج:گولدن گلوب بیته‌ئون]] [[رج:بفتا بیته‌ئون]] m7mo0c8bggibc3h17gessbdry0txj2b کارور گپ:محک 3 36491 389789 372341 2026-07-09T21:12:52Z Urmazdaa 38347 /* محمدعلی رجایی */ جواب 389789 wikitext text/x-wiki {{کارور گپ:محک/گپ پیغوم}} {{کارور گپ:محک/تلمبار}} {{کارور:محک/سرصفحه}} </div> <!--------ترنه پیغومون---------------> == الفبای طبری == اسکت برار ، ته خش آمدگویی جا الندارمه. طبری نویسی ر ونه دگش هادین و اتا گت کار هاکنین و طبری ر پیشرفت هادین .من تومبه با اطلاعاتی کا این چن سالی کسب هاکردمه هم طبری نویسی ر گسترش هادم و هم راحت نویسی هاکنم البته اوایل تا جا دکتن گدر خله سخته امبا عادیه .اما شه وچه بیمی مگه فارسی الفبا امسه راحت بیه؟ نا.تمرین هاکردمی امسه رات بیه. [[کارور:Kahu.mirka|Kahu.mirka]] ([[کارور گپ:Kahu.mirka|گپ]]) ‏۵ فوریه ۲۰۲۳، ساعت ۱۶:۴۰ (UTC) :@[[کارور:Kahu.mirka|Kahu.mirka]]: شوم به خدا. خله خش تشریف بیاردنی. :امه مازرونی ویکی‌پدیا اولین جایی هسته که ١۵ سال پیش تاسا این زوون جه نویسنه. امه هدف این هسته که مازرونی زوون ره اتی بنویسیم و تمرین هاکنیم که هرکس وه ره خوندنه، راحت دربَوره که چچی بنویشتوئه چون زوون، ارتباط ِوسیله هسته و زوونی که شه گپ ره حالی نکنه، بدردی نی‌یه. :هرکس که بخائه مازرونی زوون جه بنویسه و بخونده جه، اینجه استقبال کمبی. ایشالله شما هم این ویکی دله خار خار وقت بگذرندین. هر گدر کومِکی مه دس بر انه، شمه خدمت درمه. شو خش! <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۵ فوریه ۲۰۲۳، ساعت ۱۷:۳۲ (UTC) ::اسکت برار، ته سوا خش،گومبه کا چتی ونه سر تیتر صفحات مقاله تغییر هادیم؟ [[کارور:Kahu.mirka|Kahu.mirka]] ([[کارور گپ:Kahu.mirka|گپ]]) ‏۶ فوریه ۲۰۲۳، ساعت ۰۵:۲۵ (UTC) :::دسکتاپ حالت دله اتا دکمه بالا دیار وونه که بنویشتوئه «دکش هاکردن» ونه سر بزنی، اتی صفحه مین وانه که ونه دله صفحه اسم ره وونه تغییر هدائن. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۶ فوریه ۲۰۲۳، ساعت ۱۲:۱۵ (UTC) ::::اصلا همچین دکمه ای ر ندیمه،دقیقا کجه دره [[کارور:Kahu.mirka|Kahu.mirka]] ([[کارور گپ:Kahu.mirka|گپ]]) ‏۶ فوریه ۲۰۲۳، ساعت ۱۴:۱۸ (UTC) :::::موبایل جه اگه استفاده کنی، ونه دستی حالت ره دسکتاپ/رایانه سر بی‌یلین وگه‌نا این دکمه ره سراق ندنه. ::::: «بخوندستن»، «دچی‌ین» و «تاریخچه» پلی، «دکش هاکردن» هم دره. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۶ فوریه ۲۰۲۳، ساعت ۱۵:۵۲ (UTC) ::::::مه وسه اصلا دنیه [[کارور:Kahu.mirka|Kahu.mirka]] ([[کارور گپ:Kahu.mirka|گپ]]) ‏۶ فوریه ۲۰۲۳، ساعت ۱۶:۰۱ (UTC) :::::::بررسی هاکردمه؛ شمه حساب هنتا تایید نیه. شاید چند روز بکشه تا سیستم شمه کاروری حساب ره برسمیت بشناسه و تایید هاکنه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۶ فوریه ۲۰۲۳، ساعت ۱۶:۰۴ (UTC) ::::::::الندارمه برار [[کارور:Kahu.mirka|Kahu.mirka]] ([[کارور گپ:Kahu.mirka|گپ]]) ‏۶ فوریه ۲۰۲۳، ساعت ۱۶:۰۸ (UTC) ::::::::اسکت بار،چتی تومبه مقالخه ای ر بنویشتمه ر ،بین زوونای دیگه جا هادم،مثلا بهاییت ،هرکی اینتا مقاله ر تو هر زوونی بورده،قسمت ززونای دیئر ر بزو ،مازرونی رم نمایش هاده [[کارور:Kahu.mirka|Kahu.mirka]] ([[کارور گپ:Kahu.mirka|گپ]]) ‏۷ فوریه ۲۰۲۳، ساعت ۰۹:۲۵ (UTC) :::::::::دسکتاپ دله، سمت راست ِنوار دله اتا گزینه دارنه «افزودن پیوند‌های بین‌زبانی» که ونه سر کلیک هاکنی، اتا کادر وا وونه که اتی زوون نوم و مقاله‌ی معادل ره بنویسی و ذخیره ره بزنی. :::::::::اولین صوه خانی این کار ره هاکنی، شاید لازم بوو ویکی‌دیتا دله لاگین هاکنی. (https://wikidata.org) <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۷ فوریه ۲۰۲۳، ساعت ۱۷:۳۴ (UTC) == متین دو حنجره == سلام عید مبارک . چرا صفحه متین دو حنحره پاک شد؟ از شما میخوام صفحه رو برگدونید یا حداقل اخرین نسخشو به صفحه تمرینم انتقال بدین. خیلی روش زحمت کشیدم. [[کارور:Tirjc2|Tirjc2]] ([[کارور گپ:Tirjc2|گپ]]) ‏۲۱ مـارس ۲۰۲۳، ساعت ۱۹:۳۵ (UTC) :سلام [[کارور:Tirjc2|Tirjc2]]. یحتمل واسه سرشناسی و نداشتن منبع یه ویکی بد (مدیر بالادستی بنیاد) حذفش کرده. سعی می‌کنم تا چن روز دیگه برش گردونم. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۱ مـارس ۲۰۲۳، ساعت ۱۹:۴۷ (UTC) ::والا هر منبع معتبری که داشت من اضافه کردم تازه این صفحه رفته بود گوگل و داشت جا می افتاد. به نظر من که بودنش نسبت به بقیه صفحه های خواننده های ویکی مازنی سرشناس تر و کامل تره.بازم هرچی صلاحه ویکی مازنی هست.فقط اگر حذف شد اخرین نسخشو به صفحه تمرینم انتقال بدین [[کارور:Tirjc2|Tirjc2]] ([[کارور گپ:Tirjc2|گپ]]) ‏۲۱ مـارس ۲۰۲۳، ساعت ۱۹:۵۹ (UTC) :::متأسفانه درباره خوانندگان ایرانی در وب هیچ منبع معتبری وجود ندارد و مطالب معتبری درباره این موضوع نداریم. به همین خاطر اکثر خوانندگان ایرانی نمی‌توانند در ویکی‌پدیا مقاله داشته باشند. مشکل از این مقاله بخصوص که شما در آن مشارکت کردید، نیست. الان فلان خواننده امریکایی یک ویدیو چند ثانیه‌ای از خودش در شبکه‌های اجتماعی بگذارد، انقدر منابع انگلیسی زبان هستند که درباره‌اش بنویسند و نقد و تحلیلش کنند که می‌شود سریع برایش مقاله ساخت ولی در فارسی چنین منابعی وجود ندارد. حتی برای بهترین خوانندگان ایرانی هم نمی‌شود تمام تک‌آهنگ‌ها و آثارشان را در ویکی مقاله کرد. در ویکی‌مازنی سعی داریم با اتکا بر [[:fa:ویکی‌پدیا:سوگیری ذاتی سامانه]] این خلاء را پر کنیم ولی بنیاد ویکی‌مدیا چندان راضی نیست. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۱ مـارس ۲۰۲۳، ساعت ۲۰:۱۵ (UTC) ::::حرفتون کاملا درسته. موفق باشید [[کارور:Tirjc2|Tirjc2]] ([[کارور گپ:Tirjc2|گپ]]) ‏۲۲ مـارس ۲۰۲۳، ساعت ۰۵:۵۳ (UTC) ::::حتی اگه دقت کنین در ۳۰ روز گذشته بازدید این صفحه نسبتا خوب بوده و نسبت به خوانندگانی مثل تتلو که منابع و مقاله های زیادی در سایت ها دارد بیشتر بوده ::::تنها خواننده ای که مانند هنرمندان خارجی هر حرکتش موجب ایجاد یک خبر در سایت ها میشود بنظرم فقط تتلو است و بس [[کارور:Tirjc2|Tirjc2]] ([[کارور گپ:Tirjc2|گپ]]) ‏۲۲ مـارس ۲۰۲۳، ساعت ۱۱:۵۷ (UTC) :{{بیه}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱ آوریـل ۲۰۲۳، ساعت ۱۹:۴۱ (UTC) ::سلام متاسفانه صفحه ویکی دیتا متین دو حنجره هنوز برنگشته و با ساختنش هم مخالفت شده.اگر امکان داره اون رو هم برگردونید [[کارور:Tirjc2|Tirjc2]] ([[کارور گپ:Tirjc2|گپ]]) ‏۹ آوریـل ۲۰۲۳، ساعت ۱۹:۵۹ (UTC) :::در ویکی دیتا از دست من کاری بر نمیاد. هر ویکی استقلال داره و من فقط در ویکی‌مازنی مدیرم. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۰ آوریـل ۲۰۲۳، ساعت ۰۵:۱۵ (UTC) == حذف صفحه == سلام سال نو مبارک شما صفحه تنیلر و متین دو حنجره رو پاک میکنید هر باری که ساخته می‌شود میخواستم علت را بدونم من خیلی بابت مقاله ها وقت میذارم اگر کلا سیستم اینجوریه فعالیت نداشته باشم [[کارور:Hamidyff|Hamidyff]] ([[کارور گپ:Hamidyff|گپ]]) ‏۱ آوریـل ۲۰۲۳، ساعت ۲۲:۵۹ (UTC) :ونه ثابت بوو که این هنرمندون جادکت آدم هستنه. من تنیلر نوم ره گوگل چرخه‌تو هاکردمه که نتایج خله کم بینه. من راقاضی نیمه که جادکت هسته. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲ آوریـل ۲۰۲۳، ساعت ۰۸:۱۰ (UTC) ::خیلی ممنون برار🫡❤️ ::دیگه این مقاله را نسازم یعنی؟ [[کارور:Hamidyff|Hamidyff]] ([[کارور گپ:Hamidyff|گپ]]) ‏۲ آوریـل ۲۰۲۳، ساعت ۱۰:۳۰ (UTC) :::نا. خنابدون! <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲ آوریـل ۲۰۲۳، ساعت ۱۰:۴۰ (UTC) ::::🙏🏻 [[کارور:Hamidyff|Hamidyff]] ([[کارور گپ:Hamidyff|گپ]]) ‏۲ آوریـل ۲۰۲۳، ساعت ۱۰:۴۶ (UTC) :دقیقآ همینطوره ایشون متاسفانه مسئول حذف کردن صفحاتی هستند که کاربران بخاطر ایجاد کردنش کلی زحمت میکشند من به این نتیجه رسیدم که کل ویکی پدیا دارای یه مجموعه مافیایی هست که برای بعضیها منبع درآمد شده کافیه تو پیامرسانها و یا گوگل سرچ کنید ویکی نویس و برید یه مبلغی رو غیر مستقیم بهشون پرداخت کنید اونوقت مقاله تون رو خودشون میان میزارن ازش هم محافظت هم میکنن از گوشت سگ نجس تر و حروم تره این جور نون خوردن واقعا متاسفم براشون[[شا:مشارکت‌ها/5.74.211.132|5.74.211.132]] ‏۱۴ آوریـل ۲۰۲۳، ساعت ۱۳:۲۰ (UTC) == جواد نظری == سلام دلیل چی چی بوده نوشته رو حذف هکردی [[کارور:Rahai136|Rahai136]] ([[کارور گپ:Rahai136|گپ]]) ‏۱۴ آوریـل ۲۰۲۳، ساعت ۱۳:۰۴ (UTC) :دلیلش عدم پرداخت پول بوده اگر برید تو پیام رسانها و شبکه های اجتماعی یه مبلغی که خودشون تعیین میکنن رو پرداخت کنید مقاله رو خودشون با اسامی مختلف میان منتشر میکنن و ازش هم محافظت میشه درد دردِ پوله شما فکر میکنید کسی تو این زمونه میاد رایگان بصورت شبانه روزی تو ویکی پدیا کشیک میده مگه[[شا:مشارکت‌ها/5.74.211.132|5.74.211.132]] ‏۱۴ آوریـل ۲۰۲۳، ساعت ۱۳:۲۶ (UTC) ::[[کارور:Rahai136|Rahai136]]: [[ویکی‌پدیا:جادکت بی‌ین|جادکت نیه]]. ::بله؛ چنین آدم‌هایی هم هستن که رایگان شبانه روز کشیک میدن و تازه چنین تهمت‌هایی رو هم تحمل می‌کنن! <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۴ آوریـل ۲۰۲۳، ساعت ۱۳:۵۱ (UTC) == انتقاد == سلام برای چی ویکی پدیا افراد را خوب تایپ نمیکنی برو یاد بگیر چطوری از کیبورد استفاده کنی [[شا:مشارکت‌ها/95.81.102.172|95.81.102.172]] ‏۲۱ مه ۲۰۲۳، ساعت ۱۰:۲۷ (UTC) :این وبگاه فارسی نیست عزیزم. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۲ ژانویه ۲۰۲۴، ساعت ۲۲:۲۹ (UTC) == سلام == سلام شما میتونی یه مقاله ایجاد کنی [[شا:مشارکت‌ها/2.147.144.56|2.147.144.56]] ‏۱۶ اکتبر ۲۰۲۳، ساعت ۲۳:۵۸ (UTC) :چچی مقاله؟--<small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۷ اکتبر ۲۰۲۳، ساعت ۰۵:۳۷ (UTC) == محک گرامی == سلام جناب محک [[کارور:Arbanoos|Arbanoos]] ([[کارور گپ:Arbanoos|گپ]]) ‏۱۵ نوامبر ۲۰۲۳، ساعت ۰۷:۰۸ (UTC) :سلام. شرمنده پیغامتان را تازه دیدم. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۲ ژانویه ۲۰۲۴، ساعت ۲۲:۲۰ (UTC) ::سپاس بۆ تۆ. زۆرم پێ خۆشه ئێوە لە ویکی فارسی هەن. ::.Sipa bo te ,zorim pê xoşe êywe lêre hene ::سپاس از شما.خوشحالم کسی همچون شما تو ویکی فارسی هستن. [[کارور:Arbanoos|Arbanoos]] ([[کارور گپ:Arbanoos|گپ]]) ‏۲۳ ژانویه ۲۰۲۴، ساعت ۰۶:۰۸ (UTC) :::سپاسگزارم ، لطف دارید 💚 <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۳ ژانویه ۲۰۲۴، ساعت ۱۱:۳۰ (UTC) == سلام == سلام, می که ویریاییش کردنی ,آدمین ویکیپدیای تالشی ره مساژ (پیام) تبریک شما دِ, ویکیپدیای زوان تالشی ده. شما چیچی حال دره, همه چیچی وَشه؟ [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ‏۲۲ ژانویه ۲۰۲۴، ساعت ۱۹:۴۱ (UTC) :[[کارور:Vuzorg|Vuzorg]]. سلام. از تأسیس ویکی‌پدیای تالشی خیلی خوشحال شدم و هر کمکی از دستم برآید، برایش انجام می‌دهم. معنی جمله آخرتان را متأسفانه نفهمیدم. زبان‌هایمان نزدیک است ولی با این حال درک متقابل نوشته‌ها سخت است. بهترست انگلیسی یا فارسی مکاتبه کنیم. (متأسفانه ترکی بنده هم خیلی ضعیف است) {{چپ‌چین}} :Hello. I was very happy when I saw that Talishy Wikipedia was established. I will do whatever I can to help it. Unfortunately, I didn't understand the meaning of your last sentence. Our languages are related, but it is difficult to understand each other's texts. It is better to communicate in English or Farsi (Unfortunately, my Turkish is also very weak) {{پایان چپ‌چین}} :<small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۲ ژانویه ۲۰۲۴، ساعت ۲۲:۲۷ (UTC) ::فارسی یکم بلدم, ولی یک تلاش بکنم واژه به واژه بنویسم. من ویرایش میکردم، به آدمین ویکیپیدیای تالشی یپام شما دیدم، در ویکیپیدیای زبان تالشی. شما در چی حال هستید، همه چی خوبه؟ [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ‏۲۲ ژانویه ۲۰۲۴، ساعت ۲۲:۵۳ (UTC) :::متشکرم. هم من و هم ویکی‌پدیای مازندرانی با ثبات و آرام راه را ادامه می‌دهیم. اخیراً آپدیت الگوهای متصل به ویکی‌دیتا کمک بزرگی به ویکی‌پدیاهای کوچک می‌کند و تلاش می‌کنم الگوهای بیشتری را ترجمه و بومی‌سازی کنم. شما در ویکی زازاکی چه می‌کنید؟ --<small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۲ ژانویه ۲۰۲۴، ساعت ۲۳:۰۹ (UTC) ::::سلام، متشکرم، ،من خودم زیادتر در ویکی‌پدیای ترکی مشارکت می‌کنم.از یک سال بیشتر بود مشارکت در ویکی‌پدیای زازاکی نکردم.متأسّفانه شمار کاربران ویکی‌ زازاکی زیاد نیست. [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ‏۲۳ ژانویه ۲۰۲۴، ساعت ۰۸:۴۴ (UTC) :::::اتفاقاً من هم در ویکی‌پدیای فارسی بسیار فعال هستم ولی ویکی‌پدیا فرصت خوب و مفیدی برای زبان‌های کوچک ماست، چون رسانه جمعی دیگری نداریم. اینجا هم کاربر کمی دارد ولی بقای ویکی‌پدیای مازندرانی که تنها تجربه پایدار و طولانی‌مدت نوشتن به این زبان است، بسیار ارزشمند است. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۳ ژانویه ۲۰۲۴، ساعت ۱۱:۲۳ (UTC) ::::::چی خوبه، تبریک میگویم. من در ویکی‌ ترکی بیشتر نوشتارها در مورد زازاکی/زازایان و دیگر زبان‌های کوچکی ایرانی مینویسم. مردم و زبانهای ایرانی در ترکیه معروف نيستند. در ویکی فارسی هم بعضی ویرایشها در مورد زازاکی کردم ولی کاربران کردی معمولا تلاش کردند مانع من شوند. معمولا سعی می‌کنند پیوند زازاکی را با زبان های خزری نادیده گرفته، قطع کنند و آن را به عنوان گویش کردی معرفی کنند. گيران‌ترین خسارت‌ را به زازاکی وارد می‌کنند :/. [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ‏۲۳ ژانویه ۲۰۲۴، ساعت ۱۲:۱۲ (UTC) :::::::@[[کارور:Vuzorg|Vuzorg]] بنده حتما شمارا پیگیری خواهم‌کرد، مطالب ایرانی بودن زبان زازاکی به بنده ربطی ندارد و کاری باهاش ندارم، اما شما حق پاک کردن مطالبی که نشان میدهد زازاها کورد هستند را ندارید، حتما حتما به‌زودی در وپ:تاح و منابعی که افزودید را در وپ:تامم مطرح خواهم‌کرد، درصورت انکار و مخالفت در وپ:تام گزارش خواهم‌کرد. باسپاس [[کارور:Sina Khezrii|Sina Khezrii]] ([[کارور گپ:Sina Khezrii|گپ]]) ‏۲۹ فوریه ۲۰۲۴، ساعت ۰۷:۵۹ (UTC) ::::::::[[کارور:Sina Khezrii|Sina Khezrii]]: دعوای جای دیگه‌تون رو به ویکی ما نیارید و در همون ویکی بحث کنید. در صورت تکرار، دفعه بعد با شما برخورد خواهم کرد. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱ مـارس ۲۰۲۴، ساعت ۰۸:۳۳ (UTC) :::::::::بنده احترام ویژه‌ای برای شما قائل هستم بخاطر برخورد خوب و ارزنده‌تان با کاربران کورد، درست است هیچوقت با شما گفت‌وگویی نداشته‌ام، اما به هرحال انتظار همچین لحن و طرز حرف زدن را از شما نداشتم. باسپاس [[کارور:Sina Khezrii|Sina Khezrii]] ([[کارور گپ:Sina Khezrii|گپ]]) ‏۱ مـارس ۲۰۲۴، ساعت ۲۱:۱۱ (UTC) ::::::::::من خودم زخم خورده این حرکتم؛ یه یارویی از حذف مقاله چرندش ناراحت بود، رفت توی بیست تا ویکی مختلف و جاهای عجیب و غریب بهم فحش می‌داد. به همین خاطر با این مسأله که دعوای جای دیگه رو اینجا بیارید ، هر کسی که میخواد باشه، سخت برخورد میکنم و تعارف هم ندارم. پوزش اگه باعث ناراحتی شما شدم. مسأله شخصی با شما نیست. 💚 <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲ مـارس ۲۰۲۴، ساعت ۰۹:۲۶ (UTC) == ترجمه == سلام، میشه لطفا این جمله فارسی را به مازندرانی برگردانی؟ «یک روش ساخت دیوار هست که از چیدن سنگها بدون استفاده از ملات دیوار ساخته می شود.» [[کارور:Irman|Irman]] ([[کارور گپ:Irman|گپ]]) ‏۱۸ فوریه ۲۰۲۴، ساعت ۱۶:۱۴ (UTC) :سلام [[کارور:Irman|Irman]]، «اتا دیفار بساتن روش دره که ونه دله سنگ ره سر-سر-بن یلنه و ونه میونه ملات نشننّه.» <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۸ فوریه ۲۰۲۴، ساعت ۱۶:۱۵ (UTC) :: شمه خنه‌‌بدون. ولی اما نومی ونه گمی وه!--[[کارور:Irman|Irman]] ([[کارور گپ:Irman|گپ]]) ‏۱۸ فوریه ۲۰۲۴، ساعت ۱۶:۱۸ (UTC) این هم میشه ترجمه کنید: «هنر دیوارکشی با سنگ خشک در سال 2018 در فهرست نمایندگی یونسکو از میراث فرهنگی ناملموس بشریت، برای دیوارهای سنگی در کشورهایی مانند فرانسه، یونان، ایتالیا، اسلوونی، کرواسی، سوئیس و اسپانیا به ثبت رسید»--[[کارور:Irman|Irman]] ([[کارور گپ:Irman|گپ]]) ‏۱۸ فوریه ۲۰۲۴، ساعت ۱۶:۲۹ (UTC) :اختلاف لهجه بهرحال وجود دارنه. هرکس تونده شه لهجه جا بنویسه. البته ساروی لهجه دله اِما گمبی «وِن» ولی من سعی کمبه اتی بنویسم که ونه بخوندستن همه لهجه‌ئون وسّه راحت‌ته بوئه. همین‌سه «ونه» ره بتتر دومبه چون شکل کامل‌تری دارنه. :دومین جمله: «خشکِ سنگ جه دیفار هکشی‌ینِ هنر ره سال 2018 یونسکویِ فرهنگی آثار لیست که غیرمادی/ناملموس هستنه دله بی‌یشتنه که فرانسه، یونان، ایتالیا، اسلوونی، کرواسی، سوئیس و اسپانیا دستوری کشورون نوم ثبت بیّه.» <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۸ فوریه ۲۰۲۴، ساعت ۱۶:۴۵ (UTC) متوجه هسمه. خله ممنون.--[[کارور:Irman|Irman]] ([[کارور گپ:Irman|گپ]]) ‏۱۸ فوریه ۲۰۲۴، ساعت ۱۷:۰۵ (UTC) راستی [[کارور:محک|محک]] جان، من مازندرانی خیلی بلد نیستم شما اگر اشکالی دیدید خودتون برطرف کنید. --[[کارور:Irman|Irman]] ([[کارور گپ:Irman|گپ]]) ‏۱۸ فوریه ۲۰۲۴، ساعت ۲۰:۴۱ (UTC) == کمک در نبح == سلام جناب محک، ضمن تبریک نوروز به شما درخواست کمک برای ماندن یک صفحه در ویکی‌فا را دارم. صفحه [[پوتک]] را شما در ویکی‌پدیای مازندرانی ساخته‌اید، گمان کنم شما بتوانید با توجه به تجربه خود در [https://fa.m.wikipedia.org/wiki/%D9%88%DB%8C%DA%A9%DB%8C%E2%80%8C%D9%BE%D8%AF%DB%8C%D8%A7:%D9%86%D8%B8%D8%B1%D8%AE%D9%88%D8%A7%D9%87%DB%8C_%D8%A8%D8%B1%D8%A7%DB%8C_%D8%AD%D8%B0%D9%81/%D9%BE%D9%88%D8%AA%DA%A9_(%D8%AF%D9%88%D9%85%DB%8C%D9%86_%D9%86%D8%A7%D9%85%D8%B2%D8%AF%DB%8C) نبحی] که ویکی‌فا وجود دارد برای ماندن این مقاله به بنده کمک کنید. ارادتمند شما [[کارور:Harold Krabs|Harold Krabs]] ([[کارور گپ:Harold Krabs|گپ]]) ‏۲۱ مـارس ۲۰۲۴، ساعت ۱۶:۳۵ (UTC) :@[[کارور:Harold Krabs|Harold Krabs]] سلام. عید شما مبارک. لطفاً مباحث مربوط به ویکی‌پدیا فارسی را در همان ویکی مطرح کنید. ویکی‌های فارسی و مازندرانی در برخی موارد ممکن است قوانین محلی متفاوتی داشته باشند. احراز سرشناسی در ویکی‌پدیای فارسی رویه متفاوتی دارد و ممکن است این فرد بخصوص توسط کاربران آن ویکی سرشناس در نظر گرفته نشوند. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۱ مـارس ۲۰۲۴، ساعت ۱۹:۲۸ (UTC) ::اها پس برای همینه که شما خیلی از مقالات را توانسته‌اید در ویکی‌پدیای مازندرانی بسازید! فهمیدم. ممنون از توجه‌ شما [[کارور:Harold Krabs|Harold Krabs]] ([[کارور گپ:Harold Krabs|گپ]]) ‏۲۱ مـارس ۲۰۲۴، ساعت ۲۰:۰۳ (UTC) == گنجور == سلام. ضمن تبریک عید، آقا، ته هم ندنستی گنجور امیر پازواری ره [https://ganjoor.net/pazevari/divan اضافه هاکارده] یا فقط من مخبر نیمه؟ :) [[User:Hashter|<font style="color:#000;" face="Segoe print" size="4"><span style="color:#0C0">Ha</span><span style="color:#0C0">sh</span><span style="color:#0C0">t</span><span style="color:#0C0">er</span></font>]] ‏۳۱ مـارس ۲۰۲۴، ساعت ۰۸:۲۷ (UTC) :@[[کارور:Hashter|Hashter]] سلام. شمه نو سال هم موارک. نا، من هم ندی‌بیمه! اتفاقا گنجور سایت دله هم خله شومبه، سر زمبه ولی نندستمه اینتی‌چی هم دارنه. 💚 <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۳۱ مـارس ۲۰۲۴، ساعت ۱۳:۱۳ (UTC) == <span lang="fa" dir="rtl" class="mw-content-rtl">یادآوری برای رای دادن به انتخاب اعضای اولین U4C</span> == <div lang="fa" dir="rtl" class="mw-content-rtl"> <section begin="announcement-content" /> :''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – vote reminder|شما می توانید این پیام را در Meta-wiki به زبان های اضافی ترجمه کنید.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – vote reminder}}&language=&action=page&filter= {{int:please-translate}}]'' کاربران عزیز ویکی‌مدیا، <div lang="en" dir="ltr" class="mw-content-ltr"> You are receiving this message because you previously participated in the UCoC process. </div> <div class="mw-translate-fuzzy"> این یادآوری است که دوره رای‌گیری برای کمیته هماهنگی آیین‌نامه فراگیر رفتاری (U4C) در 30 آوریل 2024 به پایان می‌رسد. اطلاعات را در صفحه رأی‌گیری [[آیین‌نامه فراگیر رفتاری/کمیته هماهنگی/Election/2024|در Meta- بخوانید. wiki]] برای کسب اطلاعات بیشتر در مورد رأی دادن و واجد شرایط بودن رأی دهندگان. </div> کمیته هماهنگی آیین‌نامه فراگیر رفتاری (U4C) یک گروه جهانی است که به ارائه اجرای عادلانه و منسجم UCoC اختصاص دارد. از اعضای انجمن دعوت شد تا درخواست های خود را برای U4C ارسال کنند. برای اطلاعات بیشتر و مسئولیت‌های U4C، لطفاً [[آیین‌نامه فراگیر رفتاری/کمیته هماهنگی/منشور|منشور U4C را بررسی کنید]]. لطفا این پیام را با اعضای جامعه تان به اشتراک بگذارید تا آنها هم بتوانند در این کار شرکت کنند. از طرف تیم پروژه UCoC،<section end="announcement-content" /> </div> [[m:User:RamzyM (WMF)|RamzyM (WMF)]] ‏۲ مه ۲۰۲۴، ساعت ۲۲:۵۳ (UTC) <!-- پیام توسط کاربر:RamzyM (WMF)@metawiki با استفاده از فهرست در https://meta.wikimedia.org/w/index.php?title=Universal_Code_of_Conduct/Coordinating_Committee/Election/2024/Previous_voters_list_3&oldid=26721208 ارسال شده است --> == منبع پرچم سه رنگ == سلام برار محک، خاری، قبلا یتا بحث تی جا هشامه که سه رنگ کهو و سوز و سرخ پرچم وسه یتا منبع هدا بی، بنوم تاریخ ملک آرا، ونه صفحه رج رم گونی؟ [[کارور:Saeedmallahh|Saeedmallahh]] ([[کارور گپ:Saeedmallahh|گپ]]) ‏۱۹ ژوئن ۲۰۲۴، ساعت ۱۱:۳۱ (UTC) :[[کارور:Saeedmallahh|Saeedmallahh]] سلام. من دکال این کتاب ره هنتا نخوندستمه! دقیقاً کجه این منبع خَوری، چنین ادعایی هاکردمه؟ <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۹ ژوئن ۲۰۲۴، ساعت ۱۱:۳۵ (UTC) ::تازه بوردمه ایی هشامه، ته نی بی [[کارور:Saeedmallahh|Saeedmallahh]] ([[کارور گپ:Saeedmallahh|گپ]]) ‏۱۹ ژوئن ۲۰۲۴، ساعت ۱۱:۳۶ (UTC) ==[[شابلون:غیررسمی ملتون و اقلیتون سازمان]]== این کارور مازرونی/گِلِکی جه هِچّی نَفِهمِنه (یا خله سخت فَهمِنه). [[شابلون:غیررسمی ملتون و اقلیتون سازمان]]: [[:File:Flag of Southern Cameroons.PNG]] -> [[:File:Flag of The Federal Republic of Southern Cameroons.svg]] [[کارور:Koavf|Koavf]] ([[کارور گپ:Koavf|گپ]]) ‏۹ ژوئیه ۲۰۲۴، ساعت ۰۶:۱۳ (UTC) :I open it <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۹ ژوئیه ۲۰۲۴، ساعت ۰۶:۴۷ (UTC) ::3> [[کارور:Koavf|Koavf]] ([[کارور گپ:Koavf|گپ]]) ‏۹ ژوئیه ۲۰۲۴، ساعت ۰۶:۵۹ (UTC) == الگو جعبه اطلاعات هنرمند موسیقی == این )الگو حذف بیه من نتونستمه [[فرساد (خواننده)]] سه درست هاکنم اگه امکان دارنه صفحه ره دگاردن یا مره بار که چه تی درست هاکنم [[کارور:Farsadx|Farsadx]] ([[کارور گپ:Farsadx|گپ]]) ‏۶ آگوست ۲۰۲۴، ساعت ۰۸:۰۵ (UTC) :[[ویکی‌پدیا:جادکت بی‌ین]] ونه رعایت بوو. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۶ آگوست ۲۰۲۴، ساعت ۰۸:۰۶ (UTC) == خیله واجب! == سلام برار گمه که، برو دست هادیم و این شابلون‌ها ره خار هکنیم! ون اوضا خیله خرابه! هرکس وه خامبه اتی صفحه بسازم ماجرا و گرفتاری دارمه ولا! مه نظر template:infobox جا شروع هکنیم، هر کار مه دست جا بر بیه دریغ نکمبه ته بلاره [[کارور:Behshahri|Behshahri]] ([[کارور گپ:Behshahri|گپ]]) ‏۱۰ آگوست ۲۰۲۴، ساعت ۲۳:۳۳ (UTC) :سلام @[[کارور:Behshahri|Behshahri]] خش بمویی. لطفاً باوین کمین‌تا مقاله سر مشکل دارنه؟ و چه مشکلی؟ حکماً درست کمبه. :اتفاقاً امه مازرونی ویکی ِصندخ (اینفوباکس) خله جدید و پیشرفته هسه و فارسی ویکی جه پیش درمی؛ ندومبه دقیقاً کجه مشکل دارنی که کومِک هاکنم؟ <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۱ آگوست ۲۰۲۴، ساعت ۰۲:۲۹ (UTC) ::علک سلام برار @[[کارور:محک|محک]]. ::ندومبه ولا! شاید من وارد نیمه اینتی وونه! اشون خواستمه [[علی مهدیان]] ره خار هکنم، نتونسمه ویکی ِصندخ خار هکنم! ::من با سیستم فارسی ویکی خواستمه وره خار هکنم! ::یعنی ته گونی ای ونه مره آموزش هادین؟ [[کارور:Behshahri|Behshahri]] ([[کارور گپ:Behshahri|گپ]]) ‏۱۱ آگوست ۲۰۲۴، ساعت ۱۷:۴۹ (UTC) :::[[کارور:Behshahri|Behshahri]] امه نسخه خله-خله فارسی توم راحت‌تر هسته. مقالاتی که ویکی‌دیتا جه وصل هستنه (دیگر زوون‌ها لینک وشون سر وصل هسته) فقط اتا تک‌خطی کُد لازم دارنه که اتوماتیک صندخ دیار بوو. فی‌المثل افراد وسّه، فقط اولین خط بنویسی '''<nowiki>{{صندخ/شخص}}</nowiki>''' کفایت کنده. :::همین شیوه اماکن وسّه ''<nowiki>{{صندخ/بنا}}</nowiki>''، جونورون و گیاهون وسه ''<nowiki>{{صندخ/موجود}}</nowiki>''، شهر و استان وسه ''<nowiki>{{صندخ/شهر}}</nowiki>''، فیلم و سریال وسه ''<nowiki>{{صندخ/فیلم}}</nowiki>''، روخنه وسّه ''<nowiki>{{صندخ/رود}}</nowiki>'' و... هسته. :::البته اینجه هم تومبی سابق واری (اونتی که هنتا فارسی ویکی دله استفاده کانّه) این صندخ ره پر هاکنیم. ولی امه روش شمه زحمت ره کم کانده. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۱ آگوست ۲۰۲۴، ساعت ۱۷:۵۷ (UTC) ::::اسا خار بیه! مه حواس کلاً دنی بیه! اینطی خیله منظم وونه ::::یعنی ات دفه ویکی‌دیتا ره خار کندی، همه‌جا بتوندی کار بزنی ::::ته فدا [[کارور:Behshahri|Behshahri]] ([[کارور گپ:Behshahri|گپ]]) ‏۱۱ آگوست ۲۰۲۴، ساعت ۱۸:۴۲ (UTC) ::::[[علی مهدیان]] صفحه ره خار هکردمه! ::::اسا یک زحمت تره هادم! [[جهانگیر نصر اشرفی]] نوم جهانگیر نصری اشرفی هسته! یعنی «نصر» ون بواشه «نصری» ::::ته بلاره [[کارور:Behshahri|Behshahri]] ([[کارور گپ:Behshahri|گپ]]) ‏۱۱ آگوست ۲۰۲۴، ساعت ۱۹:۳۲ (UTC) :::::{{بیه}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۲ آگوست ۲۰۲۴، ساعت ۰۸:۰۵ (UTC) == مقاله جدید == درود بر شما خداقوت یه مقاله میخواهم بنویسید برای یه روزنامه نگار سیاسی و اقتصادی منابع هم کلی دارم ازش ولی زبان مازنی بلد نیستم یه راه ارتباطی به غیر از ویکی پدیا به من بدهید تا برای شما اطلاعات را بفرستم... با تشکر [[کارور:Mobinkhojasteboroumand|Mobinkhojasteboroumand]] ([[کارور گپ:Mobinkhojasteboroumand|گپ]]) ‏۱۲ آگوست ۲۰۲۴، ساعت ۱۴:۴۰ (UTC) :[[کارور:Mobinkhojasteboroumand|Mobinkhojasteboroumand]] سلام. خب چرا در ویکی فارسی نمی‌سازید؟ اینجا کسی سفارش قبول نمی‌کند. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱۲ آگوست ۲۰۲۴، ساعت ۱۵:۱۰ (UTC) ::@[[کارور:محک|محک]] ::متاسفانه اونجا دست کاری زیاد میشه ولی تصمیم گرفتم اینجا ساخته بشه... ::منابع زیاده از bbc گرفته تا ایران اینترنشنال و منوتو و خبرگزاری های خارجی مقاله خوبی هست ولی اگر کمک کنید ساخته بشه اینجا قطعا مورد توجه قرار میگیره... ::خواستید اطلاعات را اینجا میفرستم [[کارور:Mobinkhojasteboroumand|Mobinkhojasteboroumand]] ([[کارور گپ:Mobinkhojasteboroumand|گپ]]) ‏۱۲ آگوست ۲۰۲۴، ساعت ۱۵:۳۱ (UTC) ::@[[کارور:محک|محک]] ::من اگر بخوام خودم مقاله را درست کنم چگونه میتوانم فارسی را به مازنی ترجمه کنم میشه ابزاری یا سایتی بهم معرفی کنید؟ ::با تشکر خیلی فراوان [[کارور:Mobinkhojasteboroumand|Mobinkhojasteboroumand]] ([[کارور گپ:Mobinkhojasteboroumand|گپ]]) ‏۱۲ آگوست ۲۰۲۴، ساعت ۱۸:۱۶ (UTC) == درخواست ایجاد مقاله برای آکادمی آمارو == سلام وقت بخیر آیا این عنوان شرایط ایجاد مقاله در ویکی پدیا مازندارنی داره ؟ [[کارور:Wi2030|Wi2030]] ([[کارور گپ:Wi2030|گپ]]) ‏۱ سپتامبر ۲۰۲۴، ساعت ۰۹:۱۰ (UTC) :نا <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۱ سپتامبر ۲۰۲۴، ساعت ۰۹:۲۲ (UTC) == علت حذف صفحه علیرضا جدیدی == سلتم علت حذف صفحه علیرضا جدیدی چنه؟ سیچه حذفس کردی؟؟ [[کارور:Moretv33|Moretv33]] ([[کارور گپ:Moretv33|گپ]]) ‏۲ سپتامبر ۲۰۲۴، ساعت ۱۱:۲۸ (UTC) == علت حذف صفحه علیرضا جدیدی == سلتم مقاله علیرضا جدیدی رو چند ساعت پیش حذف کردید ، علتش چیه؟من خیلی از مقاله ها رو دیدم که منابع کمتری دارن و ویرایش ضعیفی دارن اما حذف نمیشن اما چرا این مقاله حذف شد؟؟ نمیشه براساس سلیقه مقاله حذف کرد بدون دلیل [[کارور:Jackcamera286|Jackcamera286]] ([[کارور گپ:Jackcamera286|گپ]]) ‏۲ سپتامبر ۲۰۲۴، ساعت ۱۱:۳۲ (UTC) == علیرضا جدیدی == سلام خودتون میشه این مقاله علیرضا جدیدی رو ویرایش و منتشر کنید؟ [[کارور:Jackcamera286|Jackcamera286]] ([[کارور گپ:Jackcamera286|گپ]]) ‏۲ سپتامبر ۲۰۲۴، ساعت ۱۱:۴۱ (UTC) == محمد نویری == سلام. زنده‌یاد [[محمد نویری]] (با نام کامل محمدرسول ساکن نویری)، آموزگار ادبیات دبیرستان من در تهران بودند (۱۳۸۸-۱۳۸۹) و گویا در ۱۳۹۵ مرده‌اند (در بهشت زهرا تهران دفن هستند). لطفاً مقاله ایشان را به زبان مازرونی به‌روز بفرمایید.[[کارور:The.shahab|The.shahab]] ([[کارور گپ:The.shahab|گپ]]) ‏۲۶ سپتامبر ۲۰۲۴، ساعت ۲۲:۳۵ (UTC) :{{بیه}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۲۷ سپتامبر ۲۰۲۴، ساعت ۰۹:۲۳ (UTC) == علیرضا جدیدی == سلام علت حذف علیرضا جدیدی چیست؟ [[کارور:Everythingtv|Everythingtv]] ([[کارور گپ:Everythingtv|گپ]]) ‏۶ نوامبر ۲۰۲۴، ساعت ۱۹:۱۱ (UTC) :[[ویکی‌پدیا:جادکت بی‌ین]]. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ‏۶ نوامبر ۲۰۲۴، ساعت ۱۹:۱۴ (UTC) ::این مقاله معتبر بود، از خیلی از مقاله های موجود بهتر بود [[کارور:Everythingtv|Everythingtv]] ([[کارور گپ:Everythingtv|گپ]]) ‏۶ نوامبر ۲۰۲۴، ساعت ۱۹:۱۶ (UTC) == Translation request == Hello, محک. Can you translate and upload the article about the prominent Turkish economist [[:fa:دانی رادریک]] in Mazanderani Wikipedia? Yours sincerely, [[کارور:Moroike|Moroike]] ([[کارور گپ:Moroike|گپ]]) ۱۲ دسامبر ۲۰۲۴، ساعت ۰۶:۴۷ (UTC) :{{Done}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ۱۲ دسامبر ۲۰۲۴، ساعت ۱۹:۵۱ (UTC) ::Thank you very much for the new article. [[کارور:Moroike|Moroike]] ([[کارور گپ:Moroike|گپ]]) ۱۲ دسامبر ۲۰۲۴، ساعت ۱۹:۵۵ (UTC) == ایندرا == چرا ایندرا صفحه ره کامل نکنین؟ [[کارور:Rig6veda12|Rig6veda12]] ([[کارور گپ:Rig6veda12|گپ]]) ۲۶ ژانویه ۲۰۲۵، ساعت ۱۸:۰۳ (UTC) == علیرضا جدیدی == سلام آیا مقاله علیرضا جدیدی که ساخته ام مناسبه؟؟ یکی از منابع آن صفه او در مرجع بیپ تونز است و دیگری بیوگرافی او در یک سایت بین المللی است، [[شا:مشارکت‌ها/178.131.144.62|178.131.144.62]] ۱۰ فوریه ۲۰۲۵، ساعت ۱۳:۳۴ (UTC) == امیر بنگارد == با سلام،مقاله هایی دیده شده که حتی هیچ منبعی ندارند؛مقاله امیر بنگارد با وجود حداقل ۴ منبع خبری را حذف میکنید،به نظر میرسد شما درحال تداخل دادن شخصی گری و سلیقه خودتون با ویکی نویس ها هستید! [[کارور:Tajangi|Tajangi]] ([[کارور گپ:Tajangi|گپ]]) ۵ مارس ۲۰۲۵، ساعت ۱۵:۰۵ (UTC) == پیئر == راهنمایی هاکن [[کارور:Rig6veda12|Rig6veda12]] ([[کارور گپ:Rig6veda12|گپ]]) ۶ مارس ۲۰۲۵، ساعت ۲۲:۰۱ (UTC) :@[[کارور:Rig6veda12|Rig6veda12]] I can't understand what do you want?! <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ۸ مارس ۲۰۲۵، ساعت ۰۷:۲۵ (UTC) ::Why don't you complete the page about Indra? [[کارور:Rig6veda12|Rig6veda12]] ([[کارور گپ:Rig6veda12|گپ]]) ۱۱ مارس ۲۰۲۵، ساعت ۰۹:۰۱ (UTC) :::{{بیه}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ۲۳ مارس ۲۰۲۵، ساعت ۱۹:۴۴ (UTC) ::::What about his wifes?? [[کارور:Rig6veda12|Rig6veda12]] ([[کارور گپ:Rig6veda12|گپ]]) ۲۷ مارس ۲۰۲۵، ساعت ۲۰:۱۵ (UTC) :::::Later, maybe. I haven't enough time for all of humens knowledge :) <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ بزوئن]]</sup> ۲۷ مارس ۲۰۲۵، ساعت ۲۰:۲۹ (UTC) ::::::What about Lord Shiva????? [[کارور:Rig6veda12|Rig6veda12]] ([[کارور گپ:Rig6veda12|گپ]]) ۱۱ آوریل ۲۰۲۵، ساعت ۲۱:۳۰ (UTC) == ‌ == سلام برار چتی هسی؟ شه صفحه اینجه کامل هاکردمه، اته کم رابط کاربری اینجه فرق دارنه با ویکی‌پدیا فارسی، جعبه اطلاعات ظریف کامل هاکردمه ، به‌روز هاکردمه، ولی وره نشون نداهه صفحه اصلی دله ونه دلیل چی هسته؟ [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۲ مه ۲۰۲۵، ساعت ۱۹:۵۶ (UTC) :@[[کارور:Urmazdaa|Urmazdaa]]: سلام. مازرونی ویکی‌پدیا ره خش بمویی! :اینجه صندخ (جعبه اطلاعات) اتی جدیدِ نسل هستنه ولی فارسی ویکی‌پدیایِ صندخ نسل قدیم شنه. أمه صندخ اتوماتیک شه [[ویکی‌دیتا]] اطلاعات سر جه آپدیت وونه و دستی لازم نی‌یه وه ره اتا-اتا پر هاکنیم. (فقط اتا جزئی مشکل دارمی که تاریخ حکماً ونه میلادی تقویم جه بوئه.) :البته تومبی مازرونی ویکی دله هم فارسی دسوری نسل قدیم صندخ ره دینگنیم. :{{شد}} [[محمدجواد ظریف]] مقاله ره ویکی‌دیتا دله آپدیت هاکردمه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱۲ مه ۲۰۲۵، ساعت ۲۰:۱۱ (UTC) ::چتی تومی ویکی‌مدیا دله وره آپدیت هکنیم؟ [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۲ مه ۲۰۲۵، ساعت ۲۰:۱۵ (UTC) :::@[[کارور:Urmazdaa|Urmazdaa]]: ویکی‌پدیائون هئی جه [https://www.wikidata.org/wiki/Wikidata:Main_Page ویکی‌دیتا] دله وصل هستنه. '''[[رانما:میون‌ویکی]] '''صفحه دله خار-خار توضیح هدامه که چتی اتا مقاله ره تومبی ویکی‌دیتا تن وصل هکنیم. :::ویکی‌دیتای صفحات (مثلاً [https://www.wikidata.org/wiki/Q10296812?uselang=mzn وه]) ره هم دسکتاپ حالت هارشی، ساده فورم دارنه و ونه کاربری رابط ره آدم ره شه حالی وونه. :::[https://upload.wikimedia.org/wikipedia/commons/d/d0/InterWiki%2C_mznwp%2C_9.png این عکس] سر هم ات‌که توضیح بنویشتمه که شاید کومِک هاکنه. شه هارش؛ أی سؤال داشتی، مه جه خَور های. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱۲ مه ۲۰۲۵، ساعت ۲۰:۲۵ (UTC) ::::ممنونم❤️ [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۲ مه ۲۰۲۵، ساعت ۲۰:۳۱ (UTC) == صندخ == سلام برار چتی هسی؟ اتا توضیح هده این صندخ جدیدارِ مه وسه، نفهمسه چتی کار کننه دومه ویکی‌دیتا ر آپدیت هاکنیم صندخ آپدیت بونه، اما ندومه کد صندخ چی هسه، خوامه اتا مقاله بنویسم. [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۸ مه ۲۰۲۵، ساعت ۱۷:۰۴ (UTC) :@[[کارور:Urmazdaa|Urmazdaa]] سلام. [[:رج:شابلون:صندخ|اینجه]] صندخ‌های نوم کته. هر موضوعی ات‌جور صندخ دارنه. مثلاً حیوون و دار وسه [[شابلون:صندخ/موجود]] دره و آدمون وسه [[شابلون:صندخ/شخص]] دره. پس اولین مرحله این هسته که طبق موضوعی که دارنی، اتا صندخ ره هوجینی. :دومین مرحله، بور مقاله‌ی اولین خط دله و اونجه صندخ نوم ره '''{{}}''' دله بنویس. مثلاً: '''<nowiki>{{صندخ/شخص}}</nowiki>''' :سومین مرحله هم این هسته که اگه مقاله ویکی‌دیتا جه وصل نی‌یه، وه ره طبق ''[[رانما:میون‌ویکی]]''، شناسا هادی. :[البته من کُد دچی‌ین جه إستٮفاده کمبه و هارشی‌ینی دچی‌ین (ویرایشگر دیداری) ره خله ندومبه چتی هسته ولی اگه هارشی‌ینی ره هم کار زندی، اونجه هم همین اتا خط ره بنویسی، ونه جواب هاده.] <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱۸ مه ۲۰۲۵، ساعت ۱۷:۱۴ (UTC) ::ممنون پاسخ هدایی، کومک هکن اگر تونی بوریم خش بیمونی صفحه ر ترجمه هاکنیم. [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۸ مه ۲۰۲۵، ساعت ۱۷:۲۳ (UTC) :::مه نظر، ونه جا اگه '''[https://www.mediawiki.org/wiki/Help:Contents/mzn این اتا]''' ره دگاردنیم، خله مفید و کامل‌ته هسته. ولی ونه ترجمه خله کار ورنه. مه قد نکشی‌یه. 😅 <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱۸ مه ۲۰۲۵، ساعت ۱۷:۳۳ (UTC) ::::😁😁، دیگر مدیرون ونه باویم بین امره کنم هاکنن، فکر کمه فقط مه و تو فعال هسمی اینجه دله.😂 [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۸ مه ۲۰۲۵، ساعت ۱۷:۳۷ (UTC) :::::@[[کارور:Urmazdaa|Urmazdaa]]: أره. اینجه طبیعتاً فارسی ویکی‌پدیا جه خلوت‌ته هسته. البته دیگه کارورون هم درنه که فعال هستنه. TheHenry یا P834675676 دسوری. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱۸ مه ۲۰۲۵، ساعت ۱۷:۴۲ (UTC) ::::::راستی فارسی دله مه رد درخواسته بزویی؟ [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۸ مه ۲۰۲۵، ساعت ۱۷:۴۸ (UTC) :::::::اره. خدکار گشت مهم نی‌یه. کارور کار سر تأثیری ندارنه. فقط کاروری که دونه ویکی غلق ره بییته ره دمبی که گشت‌زنون کار کم‌ته بوه. :::::::مه ره یاد ننه هیچ‌گدر گشت وسه درخاست هدا بوئم. مدیرون شه تونه هارشن و کاروری که حس کنه یاد بیته ره خدکار گشت هاکنن.<small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱۸ مه ۲۰۲۵، ساعت ۱۸:۵۶ (UTC) ::::::::وره ندونسمه، چون ونه درخواست بیه باتمه درخواست هادم چون چندتا خار مقاله بنویشت بیمه، خار بیه باتی مره، اته کم ونه باوم اتا مدیر بوینه مه سابقه ر، خاسمه اول ته جا مطرح هاکنم فکر کردمه مدیر نیی ، مدیران غیرفعال ر با مدیران پیشین اشتباه بیتمه فکر هکردمه استعفا هدایی ونه وسه بوردمه شه درخواست هدامه، امروز بدیمه لیست مدیران دله دری شه خادر باتمه سریع تره باوم چون تازه درخواست هدا بیمه [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۱۸ مه ۲۰۲۵، ساعت ۱۹:۵۰ (UTC) == Hi == Hi, it's been a long time, I hope you are doing well. Do you know an online Mazandarani dictionary? [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ۵ ژوئیه ۲۰۲۵، ساعت ۲۱:۵۴ (UTC) :Hi @[[کارور:Vuzorg|Vuzorg]], :Nice to talk to you. Unfortunately, the only online dictionary is blocked by the book publishers. :There are some independent and collaborative efforts, none of which are perfect. One of these is the [https://en.wiktionary.org/wiki/Category:Mazanderani_language English Wiktionary], where we put the basic words, but it is very small. [https://abadis.ir/idiom/mazani/ Abadis], which is a multilingual site and completed by audience volunteers. And [http://tabari-dic.ir/ this] new effort that already started. --<small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۶ ژوئیه ۲۰۲۵، ساعت ۱۷:۳۷ (UTC) ::I see. به دلیل تفاوت در رسم‌الخط، قرار دادن لینک وب‌سایت‌ها در اینجا دشوار است. من با ترجمه به فارسی ادامه خواهم داد. [https://incubator.wikimedia.org/wiki/Wt/mzn/%D8%AA%D9%84%D8%A7] و [https://incubator.wikimedia.org/wiki/Wt/mzn/%DA%A9%D8%B1%DA%AF]. من خودم دو ماده در ویکی‌واژه mzn ایجاد کردم. خودم در اینجا [https://tr.wiktionary.org/wiki/Kategori:Zazaca_s%C3%B6zc%C3%BCkler] در ویکی‌واژه بیش از ۸۰۰۰ ماده کلمه (فعل، اسم و غیره) به زبان زازاکی ایجاد کردم. خودم می‌خواهم ویکی‌واژه mzn هم بهبود پیدا کند. اما هیچ دیکشنری پیدا نکرد بودم. من یک صفحه اصلی و این صفحات را در ویکی‌واژه تالشی ایجاد کردم: [https://incubator.wikimedia.org/wiki/Special:PrefixIndex/Wt/tly] اینجا. اما کاربران تالشی نسبت به این پروژه بی علاقه به نظر می‌رسند. نمیدونم چرا. برای ویکی‌پدیای تالشی یه الفبای خیلی سختی لاتین بکار میگیرد.کاملاً با الفبای لاتین زازا و آذربایجانی متفاوته. مراقب خودت باش, ببینمت. [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ۶ ژوئیه ۲۰۲۵، ساعت ۲۰:۵۱ (UTC) :::سپاس 💚👍 <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۷ ژوئیه ۲۰۲۵، ساعت ۱۶:۵۳ (UTC) ::::راستی، @[[کارور:Vuzorg|Vuzorg]] ما یک «گروه کاربری ویکی‌مدیای ایران» داریم به آدرس https://t.me/iranwikimedia اگر دوست داشتی، در تلگرام به ما ملحق شو. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۷ ژوئیه ۲۰۲۵، ساعت ۱۶:۵۷ (UTC) :::::@[[کارور:محک|محک]] باز کردم، آستفاده کردن از آن اپلیکشن یکم سختییه. بخشهای عمومی، مسباقات، اطلاع رسانی را دیدم. چطور میتونم اونجا با تو ارتباط برقرار کنم؟ [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ۷ ژوئیه ۲۰۲۵، ساعت ۱۷:۴۲ (UTC) == بایگانی == سلام، اینجا نمی‌تونیم صفحه بایگانی درست بکنیم؟ یا دستی فکر کنم باید درست کنیم اگر بشه. اگر جعبه هست براش بدید ممنون میشم [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۳ آگوست ۲۰۲۵، ساعت ۰۷:۵۴ (UTC) :Hello, I can't speak Persian :) :فقط دستی دارمی. خله سخت نی‌یه. «دکش» صفحه ره یارنی و اسم دمباله اتا «/تلمبار ۱»... نویسنی و ذخیره. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۳ آگوست ۲۰۲۵، ساعت ۰۸:۳۶ (UTC) ::تی‌خنابدون😁 [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۳ آگوست ۲۰۲۵، ساعت ۰۸:۳۷ (UTC) == نوشتار == سلام اگه تونی [[سید رضا صالحی امیری]] اتا بررسی هکن مشکلی داشته درست هکن، اگه تونی اتا ونه ویکی‌داده ر آپدیت هکن ونه صندخ درست باوه. [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۳ آگوست ۲۰۲۵، ساعت ۰۸:۲۹ (UTC) :{{بیه}} ونه نو مقوم ره بشتمه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۳ آگوست ۲۰۲۵، ساعت ۰۸:۴۰ (UTC) == پیشنهاد == اتا پیشنهاد دارمه، مه نَظِر اتا ویکی‌پروژه اینجه دله تشکیل هدیم، سعی هکنیم هر هفته اته کم مقاله به مازرونی ترجمه هکنیم، انّه فارسی دله ویراش هکردمه مه حوصله دیگه در بورده😄 [[کارور:Urmazdaa|Urmazdaa]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۳ آگوست ۲۰۲۵، ساعت ۰۸:۴۲ (UTC) :👍 شه دلوس پروژه بساز؛ من هم عضو وومه. :(اینان جه توندی الگو بیری: [[پروژه:فلسفه]] یا [[پروژه:جوغرافی]] دسوری) <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۳ آگوست ۲۰۲۵، ساعت ۰۹:۴۷ (UTC) == ایران رییس جومورون فهرست‌‌‌‌ == سلام مه بوردمه وشون فهرست تا خامنه‌ای ترجمه هکردمه اگه تونی اتا نگاهکن اگه ترجمه مشکلی هداشته درست هکن [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۴ آگوست ۲۰۲۵، ساعت ۱۱:۵۱ (UTC) :👍 @[[کارور:Urmazdaa|Urmazdaa]] ات‌که گرامر و قواعد ره حلا یاد کندی که تمرین جه، کم‌کم بتتر وونه. اتا صفت و اضافه و اتا دیئر اضافی حروف هسته که ویشته دقت هکنی، خله خاره. :اضافه و صفت که دوندی ونه فارسی جه برعکس بوئه. همین ''زنانِ شاعر'' ← ''شاعر زنان'' :اضافی حروف هم فارسی جه فرق کنده. إما «در»، «از»، «با»، «برای» و ویشته گدر «به» ندارمی. مثلاً «در ایران» ← «ایران دله». یا «از/با زهرا» ← «زهرا جه/جا»، «به آن‌ها» ← «وشون ره»... <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۴ آگوست ۲۰۲۵، ساعت ۱۴:۰۵ (UTC) ::پ.ن) [[وپ:مازرونی ]] دله ویشته توضیح هدامه.--<small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۴ آگوست ۲۰۲۵، ساعت ۱۴:۰۷ (UTC) ::بزرگترین مشکلی که امه دارمبی این هسه کا لهجه واحد ندارمی هرکی پیش فرض ناخواسته انه شی لهجه ر وارد کنه مقاله دله. امه هم نوشتاری زیاد نتومبی بیشتر همین گفتاری جا راحت تر هسمی اینم مشکل ایجاد کنه حالا چند وقت بواشیم اینجه فکر کمه درست باوه [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۴ آگوست ۲۰۲۵، ساعت ۱۴:۳۲ (UTC) :::👍 هر زوونِ پایه و اساس ونه گرامر هسته. گرامر که رعایت بوه، لهجه و کلمات و... کم‌کم شه درست وونه. البته که درست فرمایش کندی و مازرونی زوون ره بنویشتنی هکردن ات‌که کشنه تا آدم ره چم بوو. ولی مه نظر راه دکفیم، لهجه‌ئون فرق-فصل تونده زوون ره غنی‌ته هم هاکنه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۴ آگوست ۲۰۲۵، ساعت ۱۵:۲۴ (UTC) == ایران ریاست جمهوری انتخابات(۱۳۵۸) == مقاله ر بساتمه، ولی شابلون کار نکنده. چتی کار کنده؟ [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۴ آگوست ۲۰۲۵، ساعت ۱۴:۵۵ (UTC) :@[[کارور:Urmazdaa|Urmazdaa]] متوجه نیمه کمین‌تا شابلون (الگو) ره خانی؟ فارسی ویکی جه خانی اینجه دکش هاکنی؟ <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۴ آگوست ۲۰۲۵، ساعت ۱۵:۱۸ (UTC) ::شابلون انتخابات ر خامه، ویکی فارسی که کلا ونه شابلون و صندخ اینجه‌جا فرق کنده، نتومبی وره دکش هاکنیم اینجه [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲۴ آگوست ۲۰۲۵، ساعت ۱۵:۳۵ (UTC) :::{{بیه}} چتی‌یه؟ انتخابات شابلون ره دکش هاکردمه ولی ترجمه لازم داینه. دووشه أی فرصت هکردمه، ات‌که تغییر دمبه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۴ آگوست ۲۰۲۵، ساعت ۱۵:۴۶ (UTC) == سیاستون == سلام، مه نظر ات کم روی سیاستون هم مانور هدیم بیتر هسه، اتا نگاه هکردمه مقدار خیلی کمی از سیاستونِ امه ترجمه هکردمی، وشونه هم می نظر ات کم ترجمه ر ادامه هدیم [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۳۰ آگوست ۲۰۲۵، ساعت ۲۱:۳۱ (UTC) :اصل [[ویکی‌پدیا:۵]] هسته. الباقی ره هر ویکی و زوونی شه‌سر چاره کنده. پس تا زمونی که مشکلی ندارمی، قانون و توافق هم لازم ندارمی. هرگدر مشکل ور بخردمی، ونه سر گپ زمبی و قانون إلمی. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۳۱ آگوست ۲۰۲۵، ساعت ۰۴:۴۲ (UTC) == شابلون:آری == سلام برار، اتا شابلون بیاردمه از فارسی ویکی‌پدیا، همون اَره و نا هسه منتهی هنوز نا حاضر نَیّه، باز اگر وقت هکردی نا هم درست هکن.[[شابلون:آری]] [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۳۱ آگوست ۲۰۲۵، ساعت ۰۹:۰۱ (UTC) :[[شابلون:اره]] و [[شابلون:No]] و [[شابلون:اره-نا]] دئینه کا <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۳۱ آگوست ۲۰۲۵، ساعت ۱۴:۲۸ (UTC) ::👍، بدیمه وشونه ولی ات کم مشکل داشتنه، موقتا همینِ استفاده کمی، البته اگه توندی وشونه منتقل هکن شابلون:آری وسه، ات کم معمول تر هسه. ::یا اینکه شابلون آری رِ منتقل هکنیم وشون دله، ولی سر نماینده‌ئون لیست ات کم اذیت بومی. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۳۱ آگوست ۲۰۲۵، ساعت ۲۲:۳۲ (UTC) == مسعود پزشکیانِ انتخاباتیِ سابقه == سلام ات صفحه بساتمه [[مسعود پزشکیانِ انتخاباتیِ سابقه]]، ونه لیست شابلون برد و باخته استفاده کنه اگه تونی وشونه منتقل هکن تا درست باوه. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۱ سپتامبر ۲۰۲۵، ساعت ۱۲:۰۴ (UTC) == صندخ == سلام ببخشید تی‌جه خله کار خوامه هکنی امیدوارِم ناراحت نواشی❤️ اگه تی‌سه زحمت نیه مجلس شورای اسلامی صندخِ دکش هکن مقاله دله، من شه سعی هکردمه کار نکرده. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۱ سپتامبر ۲۰۲۵، ساعت ۲۰:۲۰ (UTC) :{{بیه}} اختیار داینی 💚 فقط انگلیسی جه دله دشنیمه و ات‌که ترجمه خانه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۱ سپتامبر ۲۰۲۵، ساعت ۲۱:۵۳ (UTC) ::تی‌خنابدون، ات کم وره ترجمه هکردمه اتا بخش ترجمه خود صندخ ونه ترجمه باوه بعضی پارامتراش [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۱ سپتامبر ۲۰۲۵، ساعت ۲۲:۲۳ (UTC) :::{{بیه}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲ سپتامبر ۲۰۲۵، ساعت ۱۰:۰۴ (UTC) == میلس اسلامی شورا == سلام ترجمه مقاله کامل بیّه حالا بخواستی اتا چک هاکن، تی نظر تومی وره کاندید برگزیدگی هکنیم؟ [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲ سپتامبر ۲۰۲۵، ساعت ۱۰:۰۲ (UTC) :راسّی، ات کم ترجمه صندخ لازم دارنه(پارامترون) هروقت بتونستی درست هاکن. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲ سپتامبر ۲۰۲۵، ساعت ۱۰:۰۳ (UTC) == کارورون دسترسی سطوح == سلام برار، تو مه ره باوت بی کا اینجه قوانین ونه جدا با اجماع درست باوه، این موضوع کارورون دسترسی سطوح‌سه هم صدق کنه یا نا؟ صفحه‌ای هسه کا نشون هده این مسئله ر یا نا، اگر مه منظور واضح نیه: اتا صفحه مثل [https://fa.m.wikipedia.org/wiki/%D9%88%DB%8C%DA%A9%DB%8C%E2%80%8C%D9%BE%D8%AF%DB%8C%D8%A7:%D8%B3%D8%B7%D9%88%D8%AD_%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DB%8C ویکی‌پدیا:سطوح دسترسی کاربری] دارمی؟ یا امه دسترسی‌ئون فرقی وشون جا دارنه یا نا [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲ سپتامبر ۲۰۲۵، ساعت ۱۶:۱۷ (UTC) :@[[کارور:Urmazdaa|Urmazdaa]] ات‌که فرق کنده. خدی ویکی‌مدیا اتا پیش‌فرض دسترسیون وسه دارنه که إما ونجه کار زمبی ولی فارسی دله اجماع بیه که گشت‌زن و ویکی‌بان و... دسوری سطح بساجن که أمه وسه بنظر لازم نی‌یه. :هر ویکی دله، [[شا:آمار]] دله دشتِ دسترسیون لیست کته ؛ توندی هارشی. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲ سپتامبر ۲۰۲۵، ساعت ۱۶:۲۱ (UTC) ::👍خاسمه بوینم اگه دسترسی مثل گشت زنی هسه اتا درخواست هدم تا وره بیرم، چون بعضی اوقات با لپ‌تاپ امه تونسه کمک هکنه مه‌ره. حالا فعلا که با موبایل هسمی همینطوری پیش ورمی بوینیم چتی بونه. ::راستی گروه‌کاربری دله از امیر بپرسیمه کا چتی تومی ابزار انتقال هدیم منتظر هسمه جواب هده. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲ سپتامبر ۲۰۲۵، ساعت ۱۶:۲۷ (UTC) == انتقال ابزاری == سلام در مورد انتقال ابزار تلگرام دله تی‌سه پیغوم هدامه اگر نتونی بِیی تلگرام همینجا گپ بزنیم. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۲ سپتامبر ۲۰۲۵، ساعت ۱۹:۴۴ (UTC) == عربی خلیج کایری شورا == سلام، بهتر نیه مقاله نوم به «خلیج کایری شورا» تغییر پیدا هکنه؟ چراکه ونه اسم رو توافق نی‌یه، مه پیشنهاد این هسه کا و کلا فارس بوه از عربی، اگه نخوانی وره هکنی فارس خلیج، می نظر ونه نوم بلیم خلیج. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۵ سپتامبر ۲۰۲۵، ساعت ۱۷:۵۲ (UTC) :👎🏼 ویکی‌پدیا ونه [[ویکی‌پدیا:بی‌طرفی|بی‌طرف]] بوئه. بی‌طرفی اتا اساسی [[ویکی‌پدیا:پنج اصل|اصل]] هسته. وقتی اتا سازمان (یا امارات لیگ برتر) دله رسمی‌نوم «عربی خلیج» هسته و إما سرخود ونه نوم ره بلیم «فارس»، یعنی اتا طرف جه در پشتی کمبی. من این کار جه مخالفمه. فارسی و عربی ویکی‌پدیای شه‌وری‌گجی جه هم مخالفمه. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۶ سپتامبر ۲۰۲۵، ساعت ۰۷:۴۴ (UTC) ::اَره ت هم درست گنی، رسمی نوم ونه کار بزنیم [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۶ سپتامبر ۲۰۲۵، ساعت ۰۷:۴۷ (UTC) == راهنما:فهرست == سلام، ات روز وقت بیاردمی برو دوتایی بوریم [[mw:Help:Contents/mzn|اینجه]] رِ کامل هکنیم. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۵ سپتامبر ۲۰۲۵، ساعت ۲۲:۵۰ (UTC) :حتماً. اتفاقاً خله لازم هسته. تیناری مه ره سر نخاسته 😁 <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۶ سپتامبر ۲۰۲۵، ساعت ۰۷:۴۵ (UTC) ::مه اون ترجمه بخشِ کامل هکردمه ات کم بمونست بیه ونه زیربخشون نیاز دارننه، باز وشون زیربخشون هم لینک دارننه ای ونه وشونم ترجمه هکنیم😄 [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۶ سپتامبر ۲۰۲۵، ساعت ۰۷:۵۱ (UTC) == تلگرام == سلام هروقت بتونستی بِرو تلگرام ات پیام تیسه بشتمه. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۶ سپتامبر ۲۰۲۵، ساعت ۰۹:۵۶ (UTC) == شابلون == سلام مه رنگی نوار شابلون ر بساتمه، شه کاروری صفحه‌سه خاسمه الگو بلم، کار نکرده یعنی [[کارور:Urmazdaa/کاربری‌صفحه|اتی]] بَیه. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۸ سپتامبر ۲۰۲۵، ساعت ۱۰:۱۵ (UTC) :اگه تونی ونه [[شابلون:رنگی نوار|شابلون صفحه]] ر هارش ایراد داشته درست هکن [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۸ سپتامبر ۲۰۲۵، ساعت ۱۰:۱۶ (UTC) ::{{بیه}} <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۹ سپتامبر ۲۰۲۵، ساعت ۱۶:۳۶ (UTC) == سال نو مبارک == {{پینگ|Urmazdaa}} سال نو بر همکاران مازندرانی مبارک. 🎆🎇🎈🎉✧˚ ༘⋆2026✧˚ ༘ ⋆°⋆.*:・🎉 [[کارور:Sazwar|Sazwar]] ([[کارور گپ:Sazwar|گپ]]) ۳۰ دسامبر ۲۰۲۵، ساعت ۲۰:۳۲ (UTC) :@[[کارور:Sazwar|Sazwar]] سپاسگزارم. امیدوارم سال بهتری برای همه باشد. <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۳۰ دسامبر ۲۰۲۵، ساعت ۲۰:۳۸ (UTC) :سلام سازوار عزیز، از ته دل سال نو رو به شما تبریک میگم و آرزوی داشتن سالی خوب و پر از شادی برای خودتون و خانوادتون رو دارم. :موفق باشید!🌹❤️🎉 [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۳۰ دسامبر ۲۰۲۵، ساعت ۲۰:۵۰ (UTC) == شمه نوئه سال مبارک بووه! == نوئه میلادی سال ره شمه وسه شادباش دونّمه محک عزیز. امید دارمه که سالی خار و خِش شمه منتظر باوه. [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۳۰ دسامبر ۲۰۲۵، ساعت ۲۰:۵۴ (UTC) :ممنون، شما هم خار سال داری ❤️ <small>شمه گِگا: </small>[[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۳۰ دسامبر ۲۰۲۵، ساعت ۲۱:۰۱ (UTC) == درود == حال شما چطور است؟ برای شما پیام فرستادم اما پاسخی نگرفتم. خوب هستید؟ امیدوارم حال شما خوب باشه و سلامت باشید. [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ۲۲ ژانویه ۲۰۲۶، ساعت ۱۹:۳۷ (UTC) :@[[کارور:Vuzorg|Vuzorg]]: سلام. در ایران وضعیت بحرانی بود. :من هم دو هفته در [[:en:2026 Internet blackout in Iran|سیاه چاله]] بودم و تازه کمی اکسیژن به من رسیده :) :حالم خوب است ولی هنوز به اینترنت دسترسی کاملی ندارم. [[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۲ ژانویه ۲۰۲۶، ساعت ۱۹:۵۸ (UTC) ::Nice to know that you are doing well! از تلگرام پیام فراستاده بودم. یکی از دوستان ایرانی من گفت خیلی مردم در شمال کشته شدند، می‌ترسم اگر تو هم یکی از کشته‌شدگان باشی. مواظب خودت باش دوستم! [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ۲۹ ژانویه ۲۰۲۶، ساعت ۱۷:۱۶ (UTC) :::ممنون که در روزهای سخت به فکرم بودی. 💚🌷 [[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۳۰ ژانویه ۲۰۲۶، ساعت ۰۸:۲۹ (UTC) ::::دوستم، خیلی وقت بود خبرتو نگرفتم. چند باری بهت پیام فرستادم اما پاسخ نگرفتم. امیدوارم حالت خوبه و سلامت هستی. [[کارور:Vuzorg|Vuzorg]] ([[کارور گپ:Vuzorg|گپ]]) ۲۳ آوریل ۲۰۲۶، ساعت ۰۹:۴۸ (UTC) :::::@[[کارور:Vuzorg|Vuzorg]] سلام. من کاملا خوبم و امیدوارم تو هم خوب باشی. پس از چند ماه، امشب اینترنت برای مردم عادی در ایران وصل شده. [[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۲۶ مه ۲۰۲۶، ساعت ۱۸:۲۹ (UTC) == <span lang="en" dir="ltr">You may be eligible to vote in the U4C election</span> == <div lang="en" dir="ltr"> <section begin="announcement-content" /> I am contacting you because you previously voted in elections related to the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]]. You may be eligible to vote in the current U4C election, which is open now and closes on 2 June 2026. You can find out more about the candidates and the election on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|the election page on Meta]], and from there you can access the vote itself. Your participation in these elections is important to the governance of Wikimedia communities, and your time spent learning about the candidates and voting is appreciated. -- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" /> </div> [[m:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) ۲۰ مه ۲۰۲۶، ساعت ۱۶:۳۵ (UTC) <!-- پیام توسط کاربر:Keegan (WMF)@metawiki با استفاده از فهرست در https://meta.wikimedia.org/w/index.php?title=User:Keegan_(WMF)/test&oldid=30569740 ارسال شده است --> == Help == Hello, can you help me please to translate [[:en:Gaza_genocide|this]] article to your language. [[کارور:جودت|جودت]] ([[کارور گپ:جودت|گپ]]) ۲۵ ژوئن ۲۰۲۶، ساعت ۰۸:۲۱ (UTC) :{{بیه}} [[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۴ ژوئیه ۲۰۲۶، ساعت ۱۰:۳۹ (UTC) == محمدعلی رجایی == سلام، امیدوار هسمه تی حال خار بووه، همین الان [[محمدعلی رجایی]] مقاله ر ویکی‌ترجمه جا مازرونی دله ترجمه هکردمه، اگه زحمت نیه توندی ونه صندخ‌ه درست هکنی؟ [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۷ ژوئیه ۲۰۲۶، ساعت ۱۳:۲۳ (UTC) :@[[کارور:Urmazdaa|Urmazdaa]] سلام. ونه صندخ که خار هسته کا!؟ [[کارور:محک|<span style="font-family:IranNastaliq;">محک</span>]]<sup>[[کارور گپ:محک|گپ]]</sup> ۷ ژوئیه ۲۰۲۶، ساعت ۱۷:۰۶ (UTC) ::شه خدکار بیمو مثل اینکه [[کارور:Urmazdaa|ئورمزد]] ([[کارور گپ:Urmazdaa|گپ]]) ۹ ژوئیه ۲۰۲۶، ساعت ۲۱:۱۲ (UTC) 1plt0uuc6y1h3h7ghx5okfsudqoosp6 ماژول:String2 828 41052 389804 303059 2026-06-20T00:20:13Z en>Uzume 0 remove artificial dependence on [[Module:GetParameters]] 389804 Scribunto text/plain require ('strict'); local p = {} p.trim = function(frame) return mw.text.trim(frame.args[1] or "") end p.sentence = function (frame) -- {{lc:}} is strip-marker safe, string.lower is not. frame.args[1] = frame:callParserFunction('lc', frame.args[1]) return p.ucfirst(frame) end p.ucfirst = function (frame) local s = frame.args[1]; if not s or '' == s or s:match ('^%s+$') then -- when <s> is nil, empty, or only whitespace return s; -- abandon because nothing to do end s = mw.text.trim( frame.args[1] or "" ) local s1 = "" local prefix_patterns_t = { -- sequence of prefix patterns '^\127[^\127]*UNIQ%-%-%a+%-%x+%-QINU[^\127]*\127', -- stripmarker '^([%*;:#]+)', -- various list markup '^(\'\'\'*)', -- bold / italic markup '^(%b<>)', -- html-like tags because some templates render these '^(&%a+;)', -- html character entities because some templates render these '^(&#%d+;)', -- html numeric (decimal) entities because some templates render these '^(&#x%x+;)', -- html numeric (hexadecimal) entities because some templates render these '^(%s+)', -- any whitespace characters '^([%(%)%-%+%?%.%%!~!@%$%^&_={}/`,‘’„“”ʻ|\"\'\\]+)', -- miscellaneous punctuation } local prefixes_t = {}; -- list, bold/italic, and html-like markup, & whitespace saved here local function prefix_strip (s) -- local function to strip prefixes from <s> for _, pattern in ipairs (prefix_patterns_t) do -- spin through <prefix_patterns_t> if s:match (pattern) then -- when there is a match local prefix = s:match (pattern); -- get a copy of the matched prefix table.insert (prefixes_t, prefix); -- save it s = s:sub (prefix:len() + 1); -- remove the prefix from <s> return s, true; -- return <s> without prefix and flag; force restart at top of sequence because misc punct removal can break stripmarker end end return s; -- no prefix found; return <s> with nil flag end local prefix_removed; -- flag; boolean true as long as prefix_strip() finds and removes a prefix repeat -- one by one remove list, bold/italic, html-like markup, whitespace, etc from start of <s> s, prefix_removed = prefix_strip (s); until (not prefix_removed); -- until <prefix_removed> is nil s1 = table.concat (prefixes_t); -- recreate the prefix string for later reattachment local first_text = mw.ustring.match (s, '^%[%[[^%]]+%]%]'); -- extract wikilink at start of string if present; TODO: this can be string.match()? local upcased; if first_text then if first_text:match ('^%[%[[^|]+|[^%]]+%]%]') then -- if <first_text> is a piped link upcased = mw.ustring.match (s, '^%[%[[^|]+|%W*(%w)'); -- get first letter character upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^(%[%[[^|]+|%W*)%w', '%1' .. upcased); -- replace else -- here when <first_text> is a wikilink but not a piped link upcased = mw.ustring.match (s, '^%[%[%W*%w'); -- get '[[' and first letter upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^%[%[%W*%w', upcased); -- replace; no capture needed here end elseif s:match ('^%[%S+%s+[^%]]+%]') then -- if <s> is a ext link of some sort; must have label text upcased = mw.ustring.match (s, '^%[%S+%s+%W*(%w)'); -- get first letter character upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^(%[%S+%s+%W*)%w', '%1' .. upcased); -- replace elseif s:match ('^%[%S+%s*%]') then -- if <s> is a ext link without label text; nothing to do return s1 .. s; -- reattach prefix string (if present) and done else -- <s> is not a wikilink or ext link; assume plain text upcased = mw.ustring.match (s, '^%W*%w'); -- get the first letter character upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^%W*%w', upcased); -- replace; no capture needed here end return s1 .. s; -- reattach prefix string (if present) and done end p.title = function (frame) -- http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html -- recommended by The U.S. Government Printing Office Style Manual: -- "Capitalize all words in titles of publications and documents, -- except a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor." local alwayslower = {['a'] = 1, ['an'] = 1, ['the'] = 1, ['and'] = 1, ['but'] = 1, ['or'] = 1, ['for'] = 1, ['nor'] = 1, ['on'] = 1, ['in'] = 1, ['at'] = 1, ['to'] = 1, ['from'] = 1, ['by'] = 1, ['of'] = 1, ['up'] = 1 } local res = '' local s = mw.text.trim( frame.args[1] or "" ) local words = mw.text.split( s, " ") for i, s in ipairs(words) do -- {{lc:}} is strip-marker safe, string.lower is not. s = frame:callParserFunction('lc', s) if i == 1 or alwayslower[s] ~= 1 then s = mw.getContentLanguage():ucfirst(s) end words[i] = s end return table.concat(words, " ") end -- findlast finds the last item in a list -- the first unnamed parameter is the list -- the second, optional unnamed parameter is the list separator (default = comma space) -- returns the whole list if separator not found p.findlast = function(frame) local s = mw.text.trim( frame.args[1] or "" ) local sep = frame.args[2] or "" if sep == "" then sep = ", " end local pattern = ".*" .. sep .. "(.*)" local a, b, last = s:find(pattern) if a then return last else return s end end -- stripZeros finds the first number and strips leading zeros (apart from units) -- e.g "0940" -> "940"; "Year: 0023" -> "Year: 23"; "00.12" -> "0.12" p.stripZeros = function(frame) local s = mw.text.trim(frame.args[1] or "") local n = tonumber( string.match( s, "%d+" ) ) or "" s = string.gsub( s, "%d+", n, 1 ) return s end -- nowiki ensures that a string of text is treated by the MediaWiki software as just a string -- it takes an unnamed parameter and trims whitespace, then removes any wikicode p.nowiki = function(frame) local str = mw.text.trim(frame.args[1] or "") return mw.text.nowiki(str) end -- split splits text at boundaries specified by separator -- and returns the chunk for the index idx (starting at 1) -- #invoke:String2 |split |text |separator |index |true/false -- #invoke:String2 |split |txt=text |sep=separator |idx=index |plain=true/false -- if plain is false/no/0 then separator is treated as a Lua pattern - defaults to plain=true p.split = function(frame) local args = frame.args if not(args[1] or args.txt) then args = frame:getParent().args end local txt = args[1] or args.txt or "" if txt == "" then return nil end local sep = (args[2] or args.sep or ""):gsub('"', '') local idx = tonumber(args[3] or args.idx) or 1 local plain = (args[4] or args.plain or "true"):sub(1,1) plain = (plain ~= "f" and plain ~= "n" and plain ~= "0") local splittbl = mw.text.split( txt, sep, plain ) if idx < 0 then idx = #splittbl + idx + 1 end return splittbl[idx] end -- val2percent scans through a string, passed as either the first unnamed parameter or |txt= -- it converts each number it finds into a percentage and returns the resultant string. p.val2percent = function(frame) local args = frame.args if not(args[1] or args.txt) then args = frame:getParent().args end local txt = mw.text.trim(args[1] or args.txt or "") if txt == "" then return nil end local function v2p (x) x = (tonumber(x) or 0) * 100 if x == math.floor(x) then x = math.floor(x) end return x .. "%" end txt = txt:gsub("%d[%d%.]*", v2p) -- store just the string return txt end -- one2a scans through a string, passed as either the first unnamed parameter or |txt= -- it converts each occurrence of 'one ' into either 'a ' or 'an ' and returns the resultant string. p.one2a = function(frame) local args = frame.args if not(args[1] or args.txt) then args = frame:getParent().args end local txt = mw.text.trim(args[1] or args.txt or "") if txt == "" then return nil end txt = txt:gsub(" one ", " a "):gsub("^one", "a"):gsub("One ", "A "):gsub("a ([aeiou])", "an %1"):gsub("A ([aeiou])", "An %1") return txt end -- findpagetext returns the position of a piece of text in a page -- First positional parameter or |text is the search text -- Optional parameter |title is the page title, defaults to current page -- Optional parameter |plain is either true for plain search (default) or false for Lua pattern search -- Optional parameter |nomatch is the return value when no match is found; default is nil p._findpagetext = function(args) -- process parameters local nomatch = args.nomatch or "" if nomatch == "" then nomatch = nil end -- local text = mw.text.trim(args[1] or args.text or "") if text == "" then return nil end -- local title = args.title or "" local titleobj if title == "" then titleobj = mw.title.getCurrentTitle() else titleobj = mw.title.new(title) end -- local plain = args.plain or "" if plain:sub(1, 1) == "f" then plain = false else plain = true end -- get the page content and look for 'text' - return position or nomatch local content = titleobj and titleobj:getContent() return content and mw.ustring.find(content, text, 1, plain) or nomatch end p.findpagetext = function(frame) local args = frame.args local pargs = frame:getParent().args for k, v in pairs(pargs) do args[k] = v end if not (args[1] or args.text) then return nil end -- just the first value return (p._findpagetext(args)) end -- returns the decoded url. Inverse of parser function {{urlencode:val|TYPE}} -- Type is: -- QUERY decodes + to space (default) -- PATH does no extra decoding -- WIKI decodes _ to space p._urldecode = function(url, type) url = url or "" type = (type == "PATH" or type == "WIKI") and type return mw.uri.decode( url, type ) end -- {{#invoke:String2|urldecode|url=url|type=type}} p.urldecode = function(frame) return mw.uri.decode( frame.args.url, frame.args.type ) end -- what follows was merged from [[Module:StringFunc]] -- Argument list helper function, as per [[Module:String]] function p._getParameters( frame_args, arg_list ) local new_args = {}; local index = 1; local value; for i,arg in ipairs( arg_list ) do value = frame_args[arg] if value == nil then value = frame_args[index]; index = index + 1; end new_args[arg] = value; end return new_args; end -- Escape Pattern helper function so that all characters are treated as plain text, as per [[Module:String]] function p._escapePattern( pattern_str ) return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ) end -- Helper Function to interpret boolean strings, as per [[Module:String]] function p._getBoolean( boolean_str ) local boolean_value; if type( boolean_str ) == 'string' then boolean_str = boolean_str:lower(); if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' or boolean_str == '' then boolean_value = false; else boolean_value = true; end elseif type( boolean_str ) == 'boolean' then boolean_value = boolean_str; else error( 'No boolean value found' ); end return boolean_value end --[[ Strip This function Strips characters from string Usage: {{#invoke:String2|strip|source_string|characters_to_strip|plain_flag}} Parameters source: The string to strip chars: The pattern or list of characters to strip from string, replaced with '' plain: A flag indicating that the chars should be understood as plain text. defaults to true. Leading and trailing whitespace is also automatically stripped from the string. ]] function p.strip( frame ) local new_args = p._getParameters( frame.args, {'source', 'chars', 'plain'} ) local source_str = new_args['source'] or '' local chars = new_args['chars'] or '' or 'characters' source_str = mw.text.trim(source_str) if source_str == '' or chars == '' then return source_str end local l_plain = p._getBoolean( new_args['plain'] or true ) if l_plain then chars = p._escapePattern( chars ) end local result result = mw.ustring.gsub(source_str, "["..chars.."]", '') return result end --[[ Match any Returns the index of the first given pattern to match the input. Patterns must be consecutively numbered. Returns the empty string if nothing matches for use in {{#if:}} Usage: {{#invoke:String2|matchAll|source=123 abc|456|abc}} returns '2'. Parameters: source: the string to search plain: A flag indicating that the patterns should be understood as plain text. defaults to true. 1, 2, 3, ...: the patterns to search for ]] function p.matchAny(frame) local source_str = frame.args['source'] or error('The source parameter is mandatory.') local l_plain = p._getBoolean( frame.args['plain'] or true ) for i = 1, math.huge do local pattern = frame.args[i] if not pattern then return '' end if mw.ustring.find(source_str, pattern, 1, l_plain) then return tostring(i) end end end --[[--------------------------< H Y P H E N _ T O _ D A S H >-------------------------------------------------- Converts a hyphen to a dash under certain conditions. The hyphen must separate like items; unlike items are returned unmodified. These forms are modified: letter - letter (A - B) digit - digit (4-5) digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5) letterdigit - letterdigit (A1-A5) (an optional separator between letter and digit is supported – a.1-a.5 or a-1-a-5) digitletter - digitletter (5a - 5d) (an optional separator between letter and digit is supported – 5.a-5.d or 5-a-5-d) any other forms are returned unmodified. str may be a comma- or semicolon-separated list ]] function p.hyphen_to_dash( str, spacing ) if (str == nil or str == '') then return str end local accept str = mw.text.decode(str, true ) -- replace html entities with their characters; semicolon mucks up the text.split local out = {} local list = mw.text.split (str, '%s*[,;]%s*') -- split str at comma or semicolon separators if there are any for _, item in ipairs (list) do -- for each item in the list item = mw.text.trim(item) -- trim whitespace item, accept = item:gsub ('^%(%((.+)%)%)$', '%1') if accept == 0 and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit) item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter) item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit item:match ('^%a+%s*%-%s*%a+$') then -- letter hyphen letter item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2') -- replace hyphen, remove extraneous space characters else item = mw.ustring.gsub (item, '%s*[–—]%s*', '–') -- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace end end table.insert (out, item) -- add the (possibly modified) item to the output table end local temp_str = table.concat (out, ',' .. spacing) -- concatenate the output table into a comma separated string temp_str, accept = temp_str:gsub ('^%(%((.+)%)%)$', '%1') -- remove accept-this-as-written markup when it wraps all of concatenated out if accept ~= 0 then temp_str = str:gsub ('^%(%((.+)%)%)$', '%1') -- when global markup removed, return original str; do it this way to suppress boolean second return value end return temp_str end function p.hyphen2dash( frame ) local str = frame.args[1] or '' local spacing = frame.args[2] or ' ' -- space is part of the standard separator for normal spacing (but in conjunction with templates r/rp/ran we may need a narrower spacing return p.hyphen_to_dash(str, spacing) end -- Similar to [[Module:String#endswith]] function p.startswith(frame) return (frame.args[1]:sub(1, frame.args[2]:len()) == frame.args[2]) and 'yes' or '' end -- Implements [[Template:Isnumeric]] function p.isnumeric(frame) local s = frame.args[1] or frame:getParent().args[1] local boolean = (frame.args.boolean or frame:getParent().args.boolean) == 'true' if type(s) == 'string' and mw.getContentLanguage():parseFormattedNumber( s ) then return boolean and 1 or s end return boolean and 0 or '' end -- Checks if a value in a group of numbers is not an interger. -- Allows usage of an |empty= parameter to allow empty values to be skipped. function p.isInteger(frame) local values = frame.args or frame:getParent().args local allow_empty = frame.args.empty or frame:getParent().args.empty for _, value in ipairs(values) do -- Trim spaces value = value and value:gsub("^%s*(.-)%s*$", "%1") if value == "" or value == nil then if not allow_empty then return false -- Empty values are not allowed end else value = tonumber(value) if not (type(value) == "number" and value == math.floor(value)) then return false end end end return true end -- Returns an error found in a string. function p.getError(frame) local text = frame.args[1] or frame:getParent().args[1] local error_message = text:match('(<strong class="error">.-</strong>)') return error_message or nil end return p ph89g30kzy2uwl0t05s6jtpby1w86b8 389805 389804 2026-07-10T09:32:41Z محک 1023 ۱ نسخه واردشده از [[:en:Module:String2]]: File:TheMaster2012Poster.jpg 389804 Scribunto text/plain require ('strict'); local p = {} p.trim = function(frame) return mw.text.trim(frame.args[1] or "") end p.sentence = function (frame) -- {{lc:}} is strip-marker safe, string.lower is not. frame.args[1] = frame:callParserFunction('lc', frame.args[1]) return p.ucfirst(frame) end p.ucfirst = function (frame) local s = frame.args[1]; if not s or '' == s or s:match ('^%s+$') then -- when <s> is nil, empty, or only whitespace return s; -- abandon because nothing to do end s = mw.text.trim( frame.args[1] or "" ) local s1 = "" local prefix_patterns_t = { -- sequence of prefix patterns '^\127[^\127]*UNIQ%-%-%a+%-%x+%-QINU[^\127]*\127', -- stripmarker '^([%*;:#]+)', -- various list markup '^(\'\'\'*)', -- bold / italic markup '^(%b<>)', -- html-like tags because some templates render these '^(&%a+;)', -- html character entities because some templates render these '^(&#%d+;)', -- html numeric (decimal) entities because some templates render these '^(&#x%x+;)', -- html numeric (hexadecimal) entities because some templates render these '^(%s+)', -- any whitespace characters '^([%(%)%-%+%?%.%%!~!@%$%^&_={}/`,‘’„“”ʻ|\"\'\\]+)', -- miscellaneous punctuation } local prefixes_t = {}; -- list, bold/italic, and html-like markup, & whitespace saved here local function prefix_strip (s) -- local function to strip prefixes from <s> for _, pattern in ipairs (prefix_patterns_t) do -- spin through <prefix_patterns_t> if s:match (pattern) then -- when there is a match local prefix = s:match (pattern); -- get a copy of the matched prefix table.insert (prefixes_t, prefix); -- save it s = s:sub (prefix:len() + 1); -- remove the prefix from <s> return s, true; -- return <s> without prefix and flag; force restart at top of sequence because misc punct removal can break stripmarker end end return s; -- no prefix found; return <s> with nil flag end local prefix_removed; -- flag; boolean true as long as prefix_strip() finds and removes a prefix repeat -- one by one remove list, bold/italic, html-like markup, whitespace, etc from start of <s> s, prefix_removed = prefix_strip (s); until (not prefix_removed); -- until <prefix_removed> is nil s1 = table.concat (prefixes_t); -- recreate the prefix string for later reattachment local first_text = mw.ustring.match (s, '^%[%[[^%]]+%]%]'); -- extract wikilink at start of string if present; TODO: this can be string.match()? local upcased; if first_text then if first_text:match ('^%[%[[^|]+|[^%]]+%]%]') then -- if <first_text> is a piped link upcased = mw.ustring.match (s, '^%[%[[^|]+|%W*(%w)'); -- get first letter character upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^(%[%[[^|]+|%W*)%w', '%1' .. upcased); -- replace else -- here when <first_text> is a wikilink but not a piped link upcased = mw.ustring.match (s, '^%[%[%W*%w'); -- get '[[' and first letter upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^%[%[%W*%w', upcased); -- replace; no capture needed here end elseif s:match ('^%[%S+%s+[^%]]+%]') then -- if <s> is a ext link of some sort; must have label text upcased = mw.ustring.match (s, '^%[%S+%s+%W*(%w)'); -- get first letter character upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^(%[%S+%s+%W*)%w', '%1' .. upcased); -- replace elseif s:match ('^%[%S+%s*%]') then -- if <s> is a ext link without label text; nothing to do return s1 .. s; -- reattach prefix string (if present) and done else -- <s> is not a wikilink or ext link; assume plain text upcased = mw.ustring.match (s, '^%W*%w'); -- get the first letter character upcased = mw.ustring.upper (upcased); -- upcase first letter character s = mw.ustring.gsub (s, '^%W*%w', upcased); -- replace; no capture needed here end return s1 .. s; -- reattach prefix string (if present) and done end p.title = function (frame) -- http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html -- recommended by The U.S. Government Printing Office Style Manual: -- "Capitalize all words in titles of publications and documents, -- except a, an, the, at, by, for, in, of, on, to, up, and, as, but, or, and nor." local alwayslower = {['a'] = 1, ['an'] = 1, ['the'] = 1, ['and'] = 1, ['but'] = 1, ['or'] = 1, ['for'] = 1, ['nor'] = 1, ['on'] = 1, ['in'] = 1, ['at'] = 1, ['to'] = 1, ['from'] = 1, ['by'] = 1, ['of'] = 1, ['up'] = 1 } local res = '' local s = mw.text.trim( frame.args[1] or "" ) local words = mw.text.split( s, " ") for i, s in ipairs(words) do -- {{lc:}} is strip-marker safe, string.lower is not. s = frame:callParserFunction('lc', s) if i == 1 or alwayslower[s] ~= 1 then s = mw.getContentLanguage():ucfirst(s) end words[i] = s end return table.concat(words, " ") end -- findlast finds the last item in a list -- the first unnamed parameter is the list -- the second, optional unnamed parameter is the list separator (default = comma space) -- returns the whole list if separator not found p.findlast = function(frame) local s = mw.text.trim( frame.args[1] or "" ) local sep = frame.args[2] or "" if sep == "" then sep = ", " end local pattern = ".*" .. sep .. "(.*)" local a, b, last = s:find(pattern) if a then return last else return s end end -- stripZeros finds the first number and strips leading zeros (apart from units) -- e.g "0940" -> "940"; "Year: 0023" -> "Year: 23"; "00.12" -> "0.12" p.stripZeros = function(frame) local s = mw.text.trim(frame.args[1] or "") local n = tonumber( string.match( s, "%d+" ) ) or "" s = string.gsub( s, "%d+", n, 1 ) return s end -- nowiki ensures that a string of text is treated by the MediaWiki software as just a string -- it takes an unnamed parameter and trims whitespace, then removes any wikicode p.nowiki = function(frame) local str = mw.text.trim(frame.args[1] or "") return mw.text.nowiki(str) end -- split splits text at boundaries specified by separator -- and returns the chunk for the index idx (starting at 1) -- #invoke:String2 |split |text |separator |index |true/false -- #invoke:String2 |split |txt=text |sep=separator |idx=index |plain=true/false -- if plain is false/no/0 then separator is treated as a Lua pattern - defaults to plain=true p.split = function(frame) local args = frame.args if not(args[1] or args.txt) then args = frame:getParent().args end local txt = args[1] or args.txt or "" if txt == "" then return nil end local sep = (args[2] or args.sep or ""):gsub('"', '') local idx = tonumber(args[3] or args.idx) or 1 local plain = (args[4] or args.plain or "true"):sub(1,1) plain = (plain ~= "f" and plain ~= "n" and plain ~= "0") local splittbl = mw.text.split( txt, sep, plain ) if idx < 0 then idx = #splittbl + idx + 1 end return splittbl[idx] end -- val2percent scans through a string, passed as either the first unnamed parameter or |txt= -- it converts each number it finds into a percentage and returns the resultant string. p.val2percent = function(frame) local args = frame.args if not(args[1] or args.txt) then args = frame:getParent().args end local txt = mw.text.trim(args[1] or args.txt or "") if txt == "" then return nil end local function v2p (x) x = (tonumber(x) or 0) * 100 if x == math.floor(x) then x = math.floor(x) end return x .. "%" end txt = txt:gsub("%d[%d%.]*", v2p) -- store just the string return txt end -- one2a scans through a string, passed as either the first unnamed parameter or |txt= -- it converts each occurrence of 'one ' into either 'a ' or 'an ' and returns the resultant string. p.one2a = function(frame) local args = frame.args if not(args[1] or args.txt) then args = frame:getParent().args end local txt = mw.text.trim(args[1] or args.txt or "") if txt == "" then return nil end txt = txt:gsub(" one ", " a "):gsub("^one", "a"):gsub("One ", "A "):gsub("a ([aeiou])", "an %1"):gsub("A ([aeiou])", "An %1") return txt end -- findpagetext returns the position of a piece of text in a page -- First positional parameter or |text is the search text -- Optional parameter |title is the page title, defaults to current page -- Optional parameter |plain is either true for plain search (default) or false for Lua pattern search -- Optional parameter |nomatch is the return value when no match is found; default is nil p._findpagetext = function(args) -- process parameters local nomatch = args.nomatch or "" if nomatch == "" then nomatch = nil end -- local text = mw.text.trim(args[1] or args.text or "") if text == "" then return nil end -- local title = args.title or "" local titleobj if title == "" then titleobj = mw.title.getCurrentTitle() else titleobj = mw.title.new(title) end -- local plain = args.plain or "" if plain:sub(1, 1) == "f" then plain = false else plain = true end -- get the page content and look for 'text' - return position or nomatch local content = titleobj and titleobj:getContent() return content and mw.ustring.find(content, text, 1, plain) or nomatch end p.findpagetext = function(frame) local args = frame.args local pargs = frame:getParent().args for k, v in pairs(pargs) do args[k] = v end if not (args[1] or args.text) then return nil end -- just the first value return (p._findpagetext(args)) end -- returns the decoded url. Inverse of parser function {{urlencode:val|TYPE}} -- Type is: -- QUERY decodes + to space (default) -- PATH does no extra decoding -- WIKI decodes _ to space p._urldecode = function(url, type) url = url or "" type = (type == "PATH" or type == "WIKI") and type return mw.uri.decode( url, type ) end -- {{#invoke:String2|urldecode|url=url|type=type}} p.urldecode = function(frame) return mw.uri.decode( frame.args.url, frame.args.type ) end -- what follows was merged from [[Module:StringFunc]] -- Argument list helper function, as per [[Module:String]] function p._getParameters( frame_args, arg_list ) local new_args = {}; local index = 1; local value; for i,arg in ipairs( arg_list ) do value = frame_args[arg] if value == nil then value = frame_args[index]; index = index + 1; end new_args[arg] = value; end return new_args; end -- Escape Pattern helper function so that all characters are treated as plain text, as per [[Module:String]] function p._escapePattern( pattern_str ) return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" ) end -- Helper Function to interpret boolean strings, as per [[Module:String]] function p._getBoolean( boolean_str ) local boolean_value; if type( boolean_str ) == 'string' then boolean_str = boolean_str:lower(); if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0' or boolean_str == '' then boolean_value = false; else boolean_value = true; end elseif type( boolean_str ) == 'boolean' then boolean_value = boolean_str; else error( 'No boolean value found' ); end return boolean_value end --[[ Strip This function Strips characters from string Usage: {{#invoke:String2|strip|source_string|characters_to_strip|plain_flag}} Parameters source: The string to strip chars: The pattern or list of characters to strip from string, replaced with '' plain: A flag indicating that the chars should be understood as plain text. defaults to true. Leading and trailing whitespace is also automatically stripped from the string. ]] function p.strip( frame ) local new_args = p._getParameters( frame.args, {'source', 'chars', 'plain'} ) local source_str = new_args['source'] or '' local chars = new_args['chars'] or '' or 'characters' source_str = mw.text.trim(source_str) if source_str == '' or chars == '' then return source_str end local l_plain = p._getBoolean( new_args['plain'] or true ) if l_plain then chars = p._escapePattern( chars ) end local result result = mw.ustring.gsub(source_str, "["..chars.."]", '') return result end --[[ Match any Returns the index of the first given pattern to match the input. Patterns must be consecutively numbered. Returns the empty string if nothing matches for use in {{#if:}} Usage: {{#invoke:String2|matchAll|source=123 abc|456|abc}} returns '2'. Parameters: source: the string to search plain: A flag indicating that the patterns should be understood as plain text. defaults to true. 1, 2, 3, ...: the patterns to search for ]] function p.matchAny(frame) local source_str = frame.args['source'] or error('The source parameter is mandatory.') local l_plain = p._getBoolean( frame.args['plain'] or true ) for i = 1, math.huge do local pattern = frame.args[i] if not pattern then return '' end if mw.ustring.find(source_str, pattern, 1, l_plain) then return tostring(i) end end end --[[--------------------------< H Y P H E N _ T O _ D A S H >-------------------------------------------------- Converts a hyphen to a dash under certain conditions. The hyphen must separate like items; unlike items are returned unmodified. These forms are modified: letter - letter (A - B) digit - digit (4-5) digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5) letterdigit - letterdigit (A1-A5) (an optional separator between letter and digit is supported – a.1-a.5 or a-1-a-5) digitletter - digitletter (5a - 5d) (an optional separator between letter and digit is supported – 5.a-5.d or 5-a-5-d) any other forms are returned unmodified. str may be a comma- or semicolon-separated list ]] function p.hyphen_to_dash( str, spacing ) if (str == nil or str == '') then return str end local accept str = mw.text.decode(str, true ) -- replace html entities with their characters; semicolon mucks up the text.split local out = {} local list = mw.text.split (str, '%s*[,;]%s*') -- split str at comma or semicolon separators if there are any for _, item in ipairs (list) do -- for each item in the list item = mw.text.trim(item) -- trim whitespace item, accept = item:gsub ('^%(%((.+)%)%)$', '%1') if accept == 0 and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit) item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter) item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit item:match ('^%a+%s*%-%s*%a+$') then -- letter hyphen letter item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2') -- replace hyphen, remove extraneous space characters else item = mw.ustring.gsub (item, '%s*[–—]%s*', '–') -- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace end end table.insert (out, item) -- add the (possibly modified) item to the output table end local temp_str = table.concat (out, ',' .. spacing) -- concatenate the output table into a comma separated string temp_str, accept = temp_str:gsub ('^%(%((.+)%)%)$', '%1') -- remove accept-this-as-written markup when it wraps all of concatenated out if accept ~= 0 then temp_str = str:gsub ('^%(%((.+)%)%)$', '%1') -- when global markup removed, return original str; do it this way to suppress boolean second return value end return temp_str end function p.hyphen2dash( frame ) local str = frame.args[1] or '' local spacing = frame.args[2] or ' ' -- space is part of the standard separator for normal spacing (but in conjunction with templates r/rp/ran we may need a narrower spacing return p.hyphen_to_dash(str, spacing) end -- Similar to [[Module:String#endswith]] function p.startswith(frame) return (frame.args[1]:sub(1, frame.args[2]:len()) == frame.args[2]) and 'yes' or '' end -- Implements [[Template:Isnumeric]] function p.isnumeric(frame) local s = frame.args[1] or frame:getParent().args[1] local boolean = (frame.args.boolean or frame:getParent().args.boolean) == 'true' if type(s) == 'string' and mw.getContentLanguage():parseFormattedNumber( s ) then return boolean and 1 or s end return boolean and 0 or '' end -- Checks if a value in a group of numbers is not an interger. -- Allows usage of an |empty= parameter to allow empty values to be skipped. function p.isInteger(frame) local values = frame.args or frame:getParent().args local allow_empty = frame.args.empty or frame:getParent().args.empty for _, value in ipairs(values) do -- Trim spaces value = value and value:gsub("^%s*(.-)%s*$", "%1") if value == "" or value == nil then if not allow_empty then return false -- Empty values are not allowed end else value = tonumber(value) if not (type(value) == "number" and value == math.floor(value)) then return false end end end return true end -- Returns an error found in a string. function p.getError(frame) local text = frame.args[1] or frame:getParent().args[1] local error_message = text:match('(<strong class="error">.-</strong>)') return error_message or nil end return p ph89g30kzy2uwl0t05s6jtpby1w86b8 ماژول:Wd 828 41062 389856 178612 2026-07-10T11:24:23Z Uzume 1313 Update from [[d:Special:GoToLinkedPage/enwiki/Q24733825|master]] using [[mw:Synchronizer| #Synchronizer]] 389856 Scribunto text/plain -- Original module located at [[:en:Module:Wd]] and [[:en:Module:Wd/i18n]]. require("strict") local p = {} local module_arg = ... local i18n local i18nPath local function loadI18n(aliasesP, frame) local title if frame then -- current module invoked by page/template, get its title from frame title = frame:getTitle() else -- current module included by other module, get its title from ... title = module_arg end if not i18n then i18nPath = title .. "/i18n" i18n = require(i18nPath).init(aliasesP) end end p.claimCommands = { property = "property", properties = "properties", qualifier = "qualifier", qualifiers = "qualifiers", reference = "reference", references = "references" } p.generalCommands = { label = "label", title = "title", description = "description", alias = "alias", aliases = "aliases", badge = "badge", badges = "badges" } p.flags = { linked = "linked", short = "short", raw = "raw", multilanguage = "multilanguage", unit = "unit", ------------- preferred = "preferred", normal = "normal", deprecated = "deprecated", best = "best", future = "future", current = "current", former = "former", edit = "edit", editAtEnd = "edit@end", mdy = "mdy", single = "single", sourced = "sourced" } p.args = { eid = "eid", page = "page", date = "date", globalSiteId = "globalSiteId" } local aliasesP = { coord = "P625", ----------------------- image = "P18", author = "P50", authorNameString = "P2093", publisher = "P123", importedFrom = "P143", wikimediaImportURL = "P4656", statedIn = "P248", pages = "P304", language = "P407", hasPart = "P527", publicationDate = "P577", startTime = "P580", endTime = "P582", chapter = "P792", retrieved = "P813", referenceURL = "P854", sectionVerseOrParagraph = "P958", archiveURL = "P1065", title = "P1476", formatterURL = "P1630", quote = "P1683", shortName = "P1813", definingFormula = "P2534", archiveDate = "P2960", inferredFrom = "P3452", typeOfReference = "P3865", column = "P3903", subjectNamedAs = "P1810", wikidataProperty = "P1687", publishedIn = "P1433", lastUpdate = "P5017" } local aliasesQ = { percentage = "Q11229", prolepticJulianCalendar = "Q1985786", citeWeb = "Q5637226", citeQ = "Q22321052" } local parameters = { property = "%p", qualifier = "%q", reference = "%r", alias = "%a", badge = "%b", separator = "%s", general = "%x" } local formats = { property = "%p[%s][%r]", qualifier = "%q[%s][%r]", reference = "%r", propertyWithQualifier = "%p[ <span style=\"font-size:85\\%\">(%q)</span>][%s][%r]", alias = "%a[%s]", badge = "%b[%s]" } local hookNames = { -- {level_1, level_2} [parameters.property] = {"getProperty"}, [parameters.reference] = {"getReferences", "getReference"}, [parameters.qualifier] = {"getAllQualifiers"}, [parameters.qualifier.."\\d"] = {"getQualifiers", "getQualifier"}, [parameters.alias] = {"getAlias"}, [parameters.badge] = {"getBadge"} } -- default value objects, should NOT be mutated but instead copied local defaultSeparators = { ["sep"] = {" "}, ["sep%s"] = {","}, ["sep%q"] = {"; "}, ["sep%q\\d"] = {", "}, ["sep%r"] = nil, -- none ["punc"] = nil -- none } local rankTable = { ["preferred"] = 1, ["normal"] = 2, ["deprecated"] = 3 } local function replaceAlias(id) if aliasesP[id] then id = aliasesP[id] end return id end local function errorText(code, ...) local text = i18n["errors"][code] if arg then text = mw.ustring.format(text, unpack(arg)) end return text end local function throwError(errorMessage, ...) error(errorText(errorMessage, unpack(arg))) end local function replaceDecimalMark(num) return mw.ustring.gsub(num, "[.]", i18n['numeric']['decimal-mark'], 1) end local function padZeros(num, numDigits) local numZeros local negative = false if num < 0 then negative = true num = num * -1 end num = tostring(num) numZeros = numDigits - num:len() for _ = 1, numZeros do num = "0"..num end if negative then num = "-"..num end return num end local function replaceSpecialChar(chr) if chr == '_' then -- replace underscores with spaces return ' ' else return chr end end local function replaceSpecialChars(str) local chr local esc = false local strOut = "" for i = 1, #str do chr = str:sub(i,i) if not esc then if chr == '\\' then esc = true else strOut = strOut .. replaceSpecialChar(chr) end else strOut = strOut .. chr esc = false end end return strOut end local function buildWikilink(target, label) if not label or target == label then return "[[" .. target .. "]]" else return "[[" .. target .. "|" .. label .. "]]" end end -- used to make frame.args mutable, to replace #frame.args (which is always 0) -- with the actual amount and to simply copy tables local function copyTable(tIn) if not tIn then return nil end local tOut = {} for i, v in pairs(tIn) do tOut[i] = v end return tOut end -- used to merge output arrays together; -- note that it currently mutates the first input array local function mergeArrays(a1, a2) for i = 1, #a2 do a1[#a1 + 1] = a2[i] end return a1 end local function split(str, del) local out = {} local i, j = str:find(del) if i and j then out[1] = str:sub(1, i - 1) out[2] = str:sub(j + 1) else out[1] = str end return out end local function parseWikidataURL(url) local id if url:match('^http[s]?://') then id = split(url, "Q") if id[2] then return "Q" .. id[2] end end return nil end local function parseDate(dateStr, precision) precision = precision or "d" local i, j, index, ptr local parts = {nil, nil, nil} if dateStr == nil then return parts[1], parts[2], parts[3] -- year, month, day end -- 'T' for snak values, '/' for outputs with '/Julian' attached i, j = dateStr:find("[T/]") if i then dateStr = dateStr:sub(1, i-1) end local from = 1 if dateStr:sub(1,1) == "-" then -- this is a negative number, look further ahead from = 2 end index = 1 ptr = 1 i, j = dateStr:find("-", from) if i then -- year parts[index] = tonumber(dateStr:sub(ptr, i-1), 10) -- explicitly give base 10 to prevent error if parts[index] == -0 then parts[index] = tonumber("0") -- for some reason, 'parts[index] = 0' may actually store '-0', so parse from string instead end if precision == "y" then -- we're done return parts[1], parts[2], parts[3] -- year, month, day end index = index + 1 ptr = i + 1 i, j = dateStr:find("-", ptr) if i then -- month parts[index] = tonumber(dateStr:sub(ptr, i-1), 10) if precision == "m" then -- we're done return parts[1], parts[2], parts[3] -- year, month, day end index = index + 1 ptr = i + 1 end end if dateStr:sub(ptr) ~= "" then -- day if we have month, month if we have year, or year parts[index] = tonumber(dateStr:sub(ptr), 10) end return parts[1], parts[2], parts[3] -- year, month, day end local function datePrecedesDate(aY, aM, aD, bY, bM, bD) if aY == nil or bY == nil then return nil end aM = aM or 1 aD = aD or 1 bM = bM or 1 bD = bD or 1 if aY < bY then return true end if aY > bY then return false end if aM < bM then return true end if aM > bM then return false end if aD < bD then return true end return false end local function getHookName(param, index) if hookNames[param] then return hookNames[param][index] elseif param:len() > 2 then return hookNames[param:sub(1, 2).."\\d"][index] else return nil end end local function alwaysTrue() return true end -- The following function parses a format string. -- -- The example below shows how a parsed string is structured in memory. -- Variables other than 'str' and 'child' are left out for clarity's sake. -- -- Example: -- "A %p B [%s[%q1]] C [%r] D" -- -- Structure: -- [ -- { -- str = "A " -- }, -- { -- str = "%p" -- }, -- { -- str = " B ", -- child = -- [ -- { -- str = "%s", -- child = -- [ -- { -- str = "%q1" -- } -- ] -- } -- ] -- }, -- { -- str = " C ", -- child = -- [ -- { -- str = "%r" -- } -- ] -- }, -- { -- str = " D" -- } -- ] -- local function parseFormat(str) local chr, esc, param, root, cur, prev, new local params = {} local function newObject(array) local obj = {} -- new object obj.str = "" array[#array + 1] = obj -- array{object} obj.parent = array return obj end local function endParam() if param > 0 then if cur.str ~= "" then cur.str = "%"..cur.str cur.param = true params[cur.str] = true cur.parent.req[cur.str] = true prev = cur cur = newObject(cur.parent) end param = 0 end end root = {} -- array root.req = {} cur = newObject(root) prev = nil esc = false param = 0 for i = 1, #str do chr = str:sub(i,i) if not esc then if chr == '\\' then endParam() esc = true elseif chr == '%' then endParam() if cur.str ~= "" then cur = newObject(cur.parent) end param = 2 elseif chr == '[' then endParam() if prev and cur.str == "" then table.remove(cur.parent) cur = prev end cur.child = {} -- new array cur.child.req = {} cur.child.parent = cur cur = newObject(cur.child) elseif chr == ']' then endParam() if cur.parent.parent then new = newObject(cur.parent.parent.parent) if cur.str == "" then table.remove(cur.parent) end cur = new end else if param > 1 then param = param - 1 elseif param == 1 then if not chr:match('%d') then endParam() end end cur.str = cur.str .. replaceSpecialChar(chr) end else cur.str = cur.str .. chr esc = false end prev = nil end endParam() -- make sure that at least one required parameter has been defined if not next(root.req) then throwError("missing-required-parameter") end -- make sure that the separator parameter "%s" is not amongst the required parameters if root.req[parameters.separator] then throwError("extra-required-parameter", parameters.separator) end return root, params end local function sortOnRank(claims) local rankPos local ranks = {{}, {}, {}, {}} -- preferred, normal, deprecated, (default) local sorted = {} for _, v in ipairs(claims) do rankPos = rankTable[v.rank] or 4 ranks[rankPos][#ranks[rankPos] + 1] = v end sorted = ranks[1] sorted = mergeArrays(sorted, ranks[2]) sorted = mergeArrays(sorted, ranks[3]) return sorted end local function isValueInTable(searchedItem, inputTable) for _, item in pairs(inputTable) do if item == searchedItem then return true end end return false end local Config = {} -- allows for recursive calls function Config:new() local cfg = {} setmetatable(cfg, self) self.__index = self cfg.separators = { -- single value objects wrapped in arrays so that we can pass by reference ["sep"] = {copyTable(defaultSeparators["sep"])}, ["sep%s"] = {copyTable(defaultSeparators["sep%s"])}, ["sep%q"] = {copyTable(defaultSeparators["sep%q"])}, ["sep%r"] = {copyTable(defaultSeparators["sep%r"])}, ["punc"] = {copyTable(defaultSeparators["punc"])} } cfg.entity = nil cfg.entityID = nil cfg.propertyID = nil cfg.propertyValue = nil cfg.qualifierIDs = {} cfg.qualifierIDsAndValues = {} cfg.bestRank = true cfg.ranks = {true, true, false} -- preferred = true, normal = true, deprecated = false cfg.foundRank = #cfg.ranks cfg.flagBest = false cfg.flagRank = false cfg.periods = {true, true, true} -- future = true, current = true, former = true cfg.flagPeriod = false cfg.atDate = {parseDate(os.date('!%Y-%m-%d'))} -- today as {year, month, day} cfg.mdyDate = false cfg.singleClaim = false cfg.sourcedOnly = false cfg.editable = false cfg.editAtEnd = false cfg.inSitelinks = false cfg.langCode = mw.language.getContentLanguage().code cfg.langName = mw.language.fetchLanguageName(cfg.langCode, cfg.langCode) cfg.langObj = mw.language.new(cfg.langCode) cfg.siteID = mw.wikibase.getGlobalSiteId() cfg.states = {} cfg.states.qualifiersCount = 0 cfg.curState = nil cfg.prefetchedRefs = nil return cfg end local State = {} function State:new(cfg, type) local stt = {} setmetatable(stt, self) self.__index = self stt.conf = cfg stt.type = type stt.results = {} stt.parsedFormat = {} stt.separator = {} stt.movSeparator = {} stt.puncMark = {} stt.linked = false stt.rawValue = false stt.shortName = false stt.anyLanguage = false stt.unitOnly = false stt.singleValue = false return stt end -- if id == nil then item connected to current page is used function Config:getLabel(id, raw, link, short) local label = nil local prefix, title= "", nil if not id then id = mw.wikibase.getEntityIdForCurrentPage() if not id then return "" end end id = id:upper() -- just to be sure if raw then -- check if given id actually exists if mw.wikibase.isValidEntityId(id) and mw.wikibase.entityExists(id) then label = id end prefix, title = "d:Special:EntityPage/", label -- may be nil else -- try short name first if requested if short then label = p._property{aliasesP.shortName, [p.args.eid] = id} -- get short name if label == "" then label = nil end end -- get label if not label then label = mw.wikibase.getLabel(id) end end if not label then label = "" elseif link then -- build a link if requested if not title then if id:sub(1,1) == "Q" then title = mw.wikibase.getSitelink(id) elseif id:sub(1,1) == "P" then -- properties have no sitelink, link to Wikidata instead prefix, title = "d:Special:EntityPage/", id end end label = mw.text.nowiki(label) -- escape raw label text so it cannot be wikitext markup if title then label = buildWikilink(prefix .. title, label) end end return label end function Config:getEditIcon() local value = "" local prefix = "" local front = "&nbsp;" local back = "" if self.entityID:sub(1,1) == "P" then prefix = "Property:" end if self.editAtEnd then front = '<span style="float:' if self.langObj:isRTL() then front = front .. 'left' else front = front .. 'right' end front = front .. '">' back = '</span>' end value = "[[File:OOjs UI icon edit-ltr-progressive.svg|frameless|text-top|10px|alt=" .. i18n['info']['edit-on-wikidata'] .. "|link=https://www.wikidata.org/wiki/" .. prefix .. self.entityID .. "?uselang=" .. self.langCode if self.propertyID then value = value .. "#" .. self.propertyID elseif self.inSitelinks then value = value .. "#sitelinks-wikipedia" end value = value .. "|" .. i18n['info']['edit-on-wikidata'] .. "]]" return front .. value .. back end -- used to create the final output string when it's all done, so that for references the -- function extensionTag("ref", ...) is only called when they really ended up in the final output function Config:concatValues(valuesArray) local outString = "" local j, skip for i = 1, #valuesArray do -- check if this is a reference if valuesArray[i].refHash then j = i - 1 skip = false -- skip this reference if it is part of a continuous row of references that already contains the exact same reference while valuesArray[j] and valuesArray[j].refHash do if valuesArray[i].refHash == valuesArray[j].refHash then skip = true break end j = j - 1 end if not skip then -- add <ref> tag with the reference's hash as its name (to deduplicate references) outString = outString .. mw.getCurrentFrame():extensionTag("ref", valuesArray[i][1], {name = valuesArray[i].refHash}) end else outString = outString .. valuesArray[i][1] end end return outString end function Config:convertUnit(unit, raw, link, short, unitOnly) local space = " " local label = "" local itemID if unit == "" or unit == "1" then return nil end if unitOnly then space = "" end itemID = parseWikidataURL(unit) if itemID then if itemID == aliasesQ.percentage then return "%" else label = self:getLabel(itemID, raw, link, short) if label ~= "" then return space .. label end end end return "" end function State:getValue(snak) return self.conf:getValue(snak, self.rawValue, self.linked, self.shortName, self.anyLanguage, self.unitOnly, false, self.type:sub(1,2)) end function Config:getValue(snak, raw, link, short, anyLang, unitOnly, noSpecial, type) if snak.snaktype == 'value' then local datatype = snak.datavalue.type local subtype = snak.datatype local datavalue = snak.datavalue.value if datatype == 'string' then if subtype == 'url' and link then -- create link explicitly if raw then -- will render as a linked number like [1] return "[" .. datavalue .. "]" else return "[" .. datavalue .. " " .. datavalue .. "]" end elseif subtype == 'commonsMedia' then if link then return buildWikilink("c:File:" .. datavalue, datavalue) elseif not raw then return "[[File:" .. datavalue .. "]]" else return datavalue end elseif subtype == 'geo-shape' and link then return buildWikilink("c:" .. datavalue, datavalue) elseif subtype == 'math' and not raw then local attribute = nil if (type == parameters.property or (type == parameters.qualifier and self.propertyID == aliasesP.hasPart)) and snak.property == aliasesP.definingFormula then attribute = {qid = self.entityID} end return mw.getCurrentFrame():extensionTag("math", datavalue, attribute) elseif subtype == 'external-id' and link then local url = p._property{aliasesP.formatterURL, [p.args.eid] = snak.property} -- get formatter URL if url ~= "" then url = mw.ustring.gsub(url, "$1", datavalue) return "[" .. url .. " " .. datavalue .. "]" else return datavalue end else return datavalue end elseif datatype == 'monolingualtext' then if anyLang or datavalue['language'] == self.langCode then return datavalue['text'] else return nil end elseif datatype == 'quantity' then local value = "" local unit if not unitOnly then -- get value and strip + signs from front value = mw.ustring.gsub(datavalue['amount'], "^%+(.+)$", "%1") if raw then return value end -- replace decimal mark based on locale value = replaceDecimalMark(value) -- add delimiters for readability value = i18n.addDelimiters(value) end unit = self:convertUnit(datavalue['unit'], raw, link, short, unitOnly) if unit then value = value .. unit end return value elseif datatype == 'time' then local y, m, d, p, yDiv, yRound, yFull, value, calendarID, dateStr local yFactor = 1 local sign = 1 local prefix = "" local suffix = "" local mayAddCalendar = false local calendar = "" local precision = datavalue['precision'] if precision == 11 then p = "d" elseif precision == 10 then p = "m" else p = "y" yFactor = 10^(9-precision) end y, m, d = parseDate(datavalue['time'], p) if y < 0 then sign = -1 y = y * sign end -- if precision is tens/hundreds/thousands/millions/billions of years if precision <= 8 then yDiv = y / yFactor -- if precision is tens/hundreds/thousands of years if precision >= 6 then mayAddCalendar = true if precision <= 7 then -- round centuries/millenniums up (e.g. 20th century or 3rd millennium) yRound = math.ceil(yDiv) if not raw then if precision == 6 then suffix = i18n['datetime']['suffixes']['millennium'] else suffix = i18n['datetime']['suffixes']['century'] end suffix = i18n.getOrdinalSuffix(yRound) .. suffix else -- if not verbose, take the first year of the century/millennium -- (e.g. 1901 for 20th century or 2001 for 3rd millennium) yRound = (yRound - 1) * yFactor + 1 end else -- precision == 8 -- round decades down (e.g. 2010s) yRound = math.floor(yDiv) * yFactor if not raw then prefix = i18n['datetime']['prefixes']['decade-period'] suffix = i18n['datetime']['suffixes']['decade-period'] end end if raw and sign < 0 then -- if BCE then compensate for "counting backwards" -- (e.g. -2019 for 2010s BCE, -2000 for 20th century BCE or -3000 for 3rd millennium BCE) yRound = yRound + yFactor - 1 end else local yReFactor, yReDiv, yReRound -- round to nearest for tens of thousands of years or more yRound = math.floor(yDiv + 0.5) if yRound == 0 then if precision <= 2 and y ~= 0 then yReFactor = 1e6 yReDiv = y / yReFactor yReRound = math.floor(yReDiv + 0.5) if yReDiv == yReRound then -- change precision to millions of years only if we have a whole number of them precision = 3 yFactor = yReFactor yRound = yReRound end end if yRound == 0 then -- otherwise, take the unrounded (original) number of years precision = 5 yFactor = 1 yRound = y mayAddCalendar = true end end if precision >= 1 and y ~= 0 then yFull = yRound * yFactor yReFactor = 1e9 yReDiv = yFull / yReFactor yReRound = math.floor(yReDiv + 0.5) if yReDiv == yReRound then -- change precision to billions of years if we're in that range precision = 0 yFactor = yReFactor yRound = yReRound else yReFactor = 1e6 yReDiv = yFull / yReFactor yReRound = math.floor(yReDiv + 0.5) if yReDiv == yReRound then -- change precision to millions of years if we're in that range precision = 3 yFactor = yReFactor yRound = yReRound end end end if not raw then if precision == 3 then suffix = i18n['datetime']['suffixes']['million-years'] elseif precision == 0 then suffix = i18n['datetime']['suffixes']['billion-years'] else yRound = yRound * yFactor if yRound == 1 then suffix = i18n['datetime']['suffixes']['year'] else suffix = i18n['datetime']['suffixes']['years'] end end else yRound = yRound * yFactor end end else yRound = y mayAddCalendar = true end if mayAddCalendar then calendarID = parseWikidataURL(datavalue['calendarmodel']) if calendarID and calendarID == aliasesQ.prolepticJulianCalendar then if not raw then if link then calendar = " ("..buildWikilink(i18n['datetime']['julian-calendar'], i18n['datetime']['julian'])..")" else calendar = " ("..i18n['datetime']['julian']..")" end else calendar = "/"..i18n['datetime']['julian'] end end end if not raw then local ce = nil if sign < 0 then ce = i18n['datetime']['BCE'] elseif precision <= 5 then ce = i18n['datetime']['CE'] end if ce then if link then ce = buildWikilink(i18n['datetime']['common-era'], ce) end suffix = suffix .. " " .. ce end value = tostring(yRound) if m then dateStr = self.langObj:formatDate("F", "1-"..m.."-1") if d then if self.mdyDate then dateStr = dateStr .. " " .. d .. "," else dateStr = d .. " " .. dateStr end end value = dateStr .. " " .. value end value = prefix .. value .. suffix .. calendar else value = padZeros(yRound * sign, 4) if m then value = value .. "-" .. padZeros(m, 2) if d then value = value .. "-" .. padZeros(d, 2) end end value = value .. calendar end return value elseif datatype == 'globecoordinate' then -- logic from https://github.com/DataValues/Geo (v4.0.1) local precision, unitsPerDegree, numDigits, strFormat, value, globe local latitude, latConv, latValue, latLink local longitude, lonConv, lonValue, lonLink local latDirection, latDirectionN, latDirectionS, latDirectionEN local lonDirection, lonDirectionE, lonDirectionW, lonDirectionEN local degSymbol, minSymbol, secSymbol, separator local latDegrees = nil local latMinutes = nil local latSeconds = nil local lonDegrees = nil local lonMinutes = nil local lonSeconds = nil local latDegSym = "" local latMinSym = "" local latSecSym = "" local lonDegSym = "" local lonMinSym = "" local lonSecSym = "" local latDirectionEN_N = "N" local latDirectionEN_S = "S" local lonDirectionEN_E = "E" local lonDirectionEN_W = "W" if not raw then latDirectionN = i18n['coord']['latitude-north'] latDirectionS = i18n['coord']['latitude-south'] lonDirectionE = i18n['coord']['longitude-east'] lonDirectionW = i18n['coord']['longitude-west'] degSymbol = i18n['coord']['degrees'] minSymbol = i18n['coord']['minutes'] secSymbol = i18n['coord']['seconds'] separator = i18n['coord']['separator'] else latDirectionN = latDirectionEN_N latDirectionS = latDirectionEN_S lonDirectionE = lonDirectionEN_E lonDirectionW = lonDirectionEN_W degSymbol = "/" minSymbol = "/" secSymbol = "/" separator = "/" end latitude = datavalue['latitude'] longitude = datavalue['longitude'] if latitude < 0 then latDirection = latDirectionS latDirectionEN = latDirectionEN_S latitude = math.abs(latitude) else latDirection = latDirectionN latDirectionEN = latDirectionEN_N end if longitude < 0 then lonDirection = lonDirectionW lonDirectionEN = lonDirectionEN_W longitude = math.abs(longitude) else lonDirection = lonDirectionE lonDirectionEN = lonDirectionEN_E end precision = datavalue['precision'] if not precision or precision <= 0 then precision = 1 / 3600 -- precision not set (correctly), set to arcsecond end -- remove insignificant detail latitude = math.floor(latitude / precision + 0.5) * precision longitude = math.floor(longitude / precision + 0.5) * precision if precision >= 1 - (1 / 60) and precision < 1 then precision = 1 elseif precision >= (1 / 60) - (1 / 3600) and precision < (1 / 60) then precision = 1 / 60 end if precision >= 1 then unitsPerDegree = 1 elseif precision >= (1 / 60) then unitsPerDegree = 60 else unitsPerDegree = 3600 end numDigits = math.ceil(-math.log10(unitsPerDegree * precision)) if numDigits <= 0 then numDigits = tonumber("0") -- for some reason, 'numDigits = 0' may actually store '-0', so parse from string instead end strFormat = "%." .. numDigits .. "f" if precision >= 1 then latDegrees = strFormat:format(latitude) lonDegrees = strFormat:format(longitude) if not raw then latDegSym = replaceDecimalMark(latDegrees) .. degSymbol lonDegSym = replaceDecimalMark(lonDegrees) .. degSymbol else latDegSym = latDegrees .. degSymbol lonDegSym = lonDegrees .. degSymbol end else latConv = math.floor(latitude * unitsPerDegree * 10^numDigits + 0.5) / 10^numDigits lonConv = math.floor(longitude * unitsPerDegree * 10^numDigits + 0.5) / 10^numDigits if precision >= (1 / 60) then latMinutes = latConv lonMinutes = lonConv else latSeconds = latConv lonSeconds = lonConv latMinutes = math.floor(latSeconds / 60) lonMinutes = math.floor(lonSeconds / 60) latSeconds = strFormat:format(latSeconds - (latMinutes * 60)) lonSeconds = strFormat:format(lonSeconds - (lonMinutes * 60)) if not raw then latSecSym = replaceDecimalMark(latSeconds) .. secSymbol lonSecSym = replaceDecimalMark(lonSeconds) .. secSymbol else latSecSym = latSeconds .. secSymbol lonSecSym = lonSeconds .. secSymbol end end latDegrees = math.floor(latMinutes / 60) lonDegrees = math.floor(lonMinutes / 60) latDegSym = latDegrees .. degSymbol lonDegSym = lonDegrees .. degSymbol latMinutes = latMinutes - (latDegrees * 60) lonMinutes = lonMinutes - (lonDegrees * 60) if precision >= (1 / 60) then latMinutes = strFormat:format(latMinutes) lonMinutes = strFormat:format(lonMinutes) if not raw then latMinSym = replaceDecimalMark(latMinutes) .. minSymbol lonMinSym = replaceDecimalMark(lonMinutes) .. minSymbol else latMinSym = latMinutes .. minSymbol lonMinSym = lonMinutes .. minSymbol end else latMinSym = latMinutes .. minSymbol lonMinSym = lonMinutes .. minSymbol end end latValue = latDegSym .. latMinSym .. latSecSym .. latDirection lonValue = lonDegSym .. lonMinSym .. lonSecSym .. lonDirection value = latValue .. separator .. lonValue if link then globe = parseWikidataURL(datavalue['globe']) if globe then globe = mw.wikibase.getLabelByLang(globe, "en"):lower() else globe = "earth" end latLink = table.concat({latDegrees, latMinutes, latSeconds}, "_") lonLink = table.concat({lonDegrees, lonMinutes, lonSeconds}, "_") value = "[https://geohack.toolforge.org/geohack.php?language="..self.langCode.."&params="..latLink.."_"..latDirectionEN.."_"..lonLink.."_"..lonDirectionEN.."_globe:"..globe.." "..value.."]" end return value elseif datatype == 'wikibase-entityid' then local label local itemID = datavalue['numeric-id'] if subtype == 'wikibase-item' then itemID = "Q" .. itemID elseif subtype == 'wikibase-property' then itemID = "P" .. itemID else return '<strong class="error">' .. errorText('unknown-data-type', subtype) .. '</strong>' end label = self:getLabel(itemID, raw, link, short) if label == "" then label = nil end return label else return '<strong class="error">' .. errorText('unknown-data-type', datatype) .. '</strong>' end elseif snak.snaktype == 'somevalue' and not noSpecial then if raw then return " " -- single space represents 'somevalue' else return i18n['values']['unknown'] end elseif snak.snaktype == 'novalue' and not noSpecial then if raw then return "" -- empty string represents 'novalue' else return i18n['values']['none'] end else return nil end end function Config:getSingleRawQualifier(claim, qualifierID) local qualifiers if claim.qualifiers then qualifiers = claim.qualifiers[qualifierID] end if qualifiers and qualifiers[1] then return self:getValue(qualifiers[1], true) -- raw = true else return nil end end function Config:snakEqualsValue(snak, value) local snakValue = self:getValue(snak, true) -- raw = true if snakValue and snak.snaktype == 'value' and snak.datavalue.type == 'wikibase-entityid' then value = value:upper() end return snakValue == value end function Config:setRank(rank) local rankPos if rank == p.flags.best then self.bestRank = true self.flagBest = true -- mark that 'best' flag was given return end if rank:sub(1,9) == p.flags.preferred then rankPos = 1 elseif rank:sub(1,6) == p.flags.normal then rankPos = 2 elseif rank:sub(1,10) == p.flags.deprecated then rankPos = 3 else return end -- one of the rank flags was given, check if another one was given before if not self.flagRank then self.ranks = {false, false, false} -- no other rank flag given before, so unset ranks self.bestRank = self.flagBest -- unsets bestRank only if 'best' flag was not given before self.flagRank = true -- mark that a rank flag was given end if rank:sub(-1) == "+" then for i = rankPos, 1, -1 do self.ranks[i] = true end elseif rank:sub(-1) == "-" then for i = rankPos, #self.ranks do self.ranks[i] = true end else self.ranks[rankPos] = true end end function Config:setPeriod(period) local periodPos if period == p.flags.future then periodPos = 1 elseif period == p.flags.current then periodPos = 2 elseif period == p.flags.former then periodPos = 3 else return end -- one of the period flags was given, check if another one was given before if not self.flagPeriod then self.periods = {false, false, false} -- no other period flag given before, so unset periods self.flagPeriod = true -- mark that a period flag was given end self.periods[periodPos] = true end function Config:qualifierMatches(claim, id, value) local qualifiers if claim.qualifiers then qualifiers = claim.qualifiers[id] end if qualifiers then for _, v in pairs(qualifiers) do if self:snakEqualsValue(v, value) then return true end end elseif value == "" then -- if the qualifier is not present then treat it the same as the special value 'novalue' return true end return false end function Config:rankMatches(rankPos) if self.bestRank then return (self.ranks[rankPos] and self.foundRank >= rankPos) else return self.ranks[rankPos] end end function Config:timeMatches(claim) local startTime = nil local startTimeY = nil local startTimeM = nil local startTimeD = nil local endTime = nil local endTimeY = nil local endTimeM = nil local endTimeD = nil if self.periods[1] and self.periods[2] and self.periods[3] then -- any time return true end startTime = self:getSingleRawQualifier(claim, aliasesP.startTime) if startTime and startTime ~= "" and startTime ~= " " then startTimeY, startTimeM, startTimeD = parseDate(startTime) end endTime = self:getSingleRawQualifier(claim, aliasesP.endTime) if endTime and endTime ~= "" and endTime ~= " " then endTimeY, endTimeM, endTimeD = parseDate(endTime) end if startTimeY ~= nil and endTimeY ~= nil and datePrecedesDate(endTimeY, endTimeM, endTimeD, startTimeY, startTimeM, startTimeD) then -- invalidate end time if it precedes start time endTimeY = nil endTimeM = nil endTimeD = nil end if self.periods[1] then -- future if startTimeY and datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], startTimeY, startTimeM, startTimeD) then return true end end if self.periods[2] then -- current if (startTimeY == nil or not datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], startTimeY, startTimeM, startTimeD)) and (endTimeY == nil or datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], endTimeY, endTimeM, endTimeD)) then return true end end if self.periods[3] then -- former if endTimeY and not datePrecedesDate(self.atDate[1], self.atDate[2], self.atDate[3], endTimeY, endTimeM, endTimeD) then return true end end return false end function Config:processFlag(flag) if not flag then return false end if flag == p.flags.linked then self.curState.linked = true return true elseif flag == p.flags.raw then self.curState.rawValue = true if self.curState == self.states[parameters.reference] then -- raw reference values end with periods and require a separator (other than none) self.separators["sep%r"][1] = {" "} end return true elseif flag == p.flags.short then self.curState.shortName = true return true elseif flag == p.flags.multilanguage then self.curState.anyLanguage = true return true elseif flag == p.flags.unit then self.curState.unitOnly = true return true elseif flag == p.flags.mdy then self.mdyDate = true return true elseif flag == p.flags.single then self.singleClaim = true return true elseif flag == p.flags.sourced then self.sourcedOnly = true return true elseif flag == p.flags.edit then self.editable = true return true elseif flag == p.flags.editAtEnd then self.editable = true self.editAtEnd = true return true elseif flag == p.flags.best or flag:match('^'..p.flags.preferred..'[+-]?$') or flag:match('^'..p.flags.normal..'[+-]?$') or flag:match('^'..p.flags.deprecated..'[+-]?$') then self:setRank(flag) return true elseif flag == p.flags.future or flag == p.flags.current or flag == p.flags.former then self:setPeriod(flag) return true elseif flag == "" then -- ignore empty flags and carry on return true else return false end end function Config:processFlagOrCommand(flag) local param = "" if not flag then return false end if flag == p.claimCommands.property or flag == p.claimCommands.properties then param = parameters.property elseif flag == p.claimCommands.qualifier or flag == p.claimCommands.qualifiers then self.states.qualifiersCount = self.states.qualifiersCount + 1 param = parameters.qualifier .. self.states.qualifiersCount self.separators["sep"..param] = {copyTable(defaultSeparators["sep%q\\d"])} elseif flag == p.claimCommands.reference or flag == p.claimCommands.references then param = parameters.reference else return self:processFlag(flag) end if self.states[param] then return false end -- create a new state for each command self.states[param] = State:new(self, param) -- use "%x" as the general parameter name self.states[param].parsedFormat = parseFormat(parameters.general) -- will be overwritten for param=="%p" -- set the separator self.states[param].separator = self.separators["sep"..param] -- will be nil for param=="%p", which will be set separately if flag == p.claimCommands.property or flag == p.claimCommands.qualifier or flag == p.claimCommands.reference then self.states[param].singleValue = true end self.curState = self.states[param] return true end function Config:processSeparators(args) local sep for i, v in pairs(self.separators) do if args[i] then sep = replaceSpecialChars(args[i]) if sep ~= "" then self.separators[i][1] = {sep} else self.separators[i][1] = nil end end end end function Config:setFormatAndSeparators(state, parsedFormat) state.parsedFormat = parsedFormat state.separator = self.separators["sep"] state.movSeparator = self.separators["sep"..parameters.separator] state.puncMark = self.separators["punc"] end -- determines if a claim has references by prefetching them from the claim using getReferences, -- which applies some filtering that determines if a reference is actually returned, -- and caches the references for later use function State:isSourced(claim) self.conf.prefetchedRefs = self:getReferences(claim) return (#self.conf.prefetchedRefs > 0) end function State:resetCaches() -- any prefetched references of the previous claim must not be used self.conf.prefetchedRefs = nil end function State:claimMatches(claim) local matches, rankPos -- first of all, reset any cached values used for the previous claim self:resetCaches() -- if a property value was given, check if it matches the claim's property value if self.conf.propertyValue then matches = self.conf:snakEqualsValue(claim.mainsnak, self.conf.propertyValue) else matches = true end -- if any qualifier values were given, check if each matches one of the claim's qualifier values for i, v in pairs(self.conf.qualifierIDsAndValues) do matches = (matches and self.conf:qualifierMatches(claim, i, v)) end -- check if the claim's rank and time period match rankPos = rankTable[claim.rank] or 4 matches = (matches and self.conf:rankMatches(rankPos) and self.conf:timeMatches(claim)) -- if only claims with references must be returned, check if this one has any if self.conf.sourcedOnly then matches = (matches and self:isSourced(claim)) -- prefetches and caches references end return matches, rankPos end function State:out() local result -- collection of arrays with value objects local valuesArray -- array with value objects local sep = nil -- value object local out = {} -- array with value objects local function walk(formatTable, result) local valuesArray = {} -- array with value objects for i, v in pairs(formatTable.req) do if not result[i] or not result[i][1] then -- we've got no result for a parameter that is required on this level, -- so skip this level (and its children) by returning an empty result return {} end end for _, v in ipairs(formatTable) do if v.param then valuesArray = mergeArrays(valuesArray, result[v.str]) elseif v.str ~= "" then valuesArray[#valuesArray + 1] = {v.str} end if v.child then valuesArray = mergeArrays(valuesArray, walk(v.child, result)) end end return valuesArray end -- iterate through the results from back to front, so that we know when to add separators for i = #self.results, 1, -1 do result = self.results[i] -- if there is already some output, then add the separators if #out > 0 then sep = self.separator[1] -- fixed separator result[parameters.separator] = {self.movSeparator[1]} -- movable separator else sep = nil result[parameters.separator] = {self.puncMark[1]} -- optional punctuation mark end valuesArray = walk(self.parsedFormat, result) if #valuesArray > 0 then if sep then valuesArray[#valuesArray + 1] = sep end out = mergeArrays(valuesArray, out) end end -- reset state before next iteration self.results = {} return out end -- level 1 hook function State:getProperty(claim) local value = {self:getValue(claim.mainsnak)} -- create one value object if #value > 0 then return {value} -- wrap the value object in an array and return it else return {} -- return empty array if there was no value end end -- level 1 hook function State:getQualifiers(claim, param) local qualifiers if claim.qualifiers then qualifiers = claim.qualifiers[self.conf.qualifierIDs[param]] end if qualifiers then -- iterate through claim's qualifier statements to collect their values; -- return array with multiple value objects return self.conf.states[param]:iterate(qualifiers, {[parameters.general] = hookNames[parameters.qualifier.."\\d"][2], count = 1}) -- pass qualifier state with level 2 hook else return {} -- return empty array end end -- level 2 hook function State:getQualifier(snak) local value = {self:getValue(snak)} -- create one value object if #value > 0 then return {value} -- wrap the value object in an array and return it else return {} -- return empty array if there was no value end end -- level 1 hook function State:getAllQualifiers(claim, param, result, hooks) local out = {} -- array with value objects local sep = self.conf.separators["sep"..parameters.qualifier][1] -- value object -- iterate through the output of the separate "qualifier(s)" commands for i = 1, self.conf.states.qualifiersCount do -- if a hook has not been called yet, call it now if not result[parameters.qualifier..i] then self:callHook(parameters.qualifier..i, hooks, claim, result) end -- if there is output for this particular "qualifier(s)" command, then add it if result[parameters.qualifier..i] and result[parameters.qualifier..i][1] then -- if there is already some output, then add the separator if #out > 0 and sep then out[#out + 1] = sep end out = mergeArrays(out, result[parameters.qualifier..i]) end end return out end -- level 1 hook function State:getReferences(claim) if self.conf.prefetchedRefs then -- return references that have been prefetched by isSourced return self.conf.prefetchedRefs end if claim.references then -- iterate through claim's reference statements to collect their values; -- return array with multiple value objects return self.conf.states[parameters.reference]:iterate(claim.references, {[parameters.general] = hookNames[parameters.reference][2], count = 1}) -- pass reference state with level 2 hook else return {} -- return empty array end end -- level 2 hook function State:getReference(statement) local citeParamMapping = i18n['cite']['param-mapping'] local citeConfig = i18n['cite']['config'] local citeTypes = i18n['cite']['output-types'] -- will hold rendered properties of the reference which are not directly from statement.snaks, -- Namely, is URL generated from an external ID. local additionalProcessedProperties = {} -- for each citation type, there will be an associative array that associates lists of rendered properties -- to citation-template parameters local candidateParams = {} -- like above, but only associates one rendered property to each parameter; if the above variable -- contains more strings for a parameter, the strings will be assigned to numbered params (e.g. "author1") local citeParams = {} local citeErrors = {} local referenceEmpty = true -- will be set to false if at least one parameter is left unremoved local version = 12 -- increment this each time the below logic is changed to avoid conflict errors if not statement.snaks then return {} end -- don't use bot-added references referencing Wikimedia projects or containing "inferred from" (such references are not usable on Wikipedia) if statement.snaks[aliasesP.importedFrom] or statement.snaks[aliasesP.wikimediaImportURL] or statement.snaks[aliasesP.inferredFrom] then return {} end -- don't include "type of reference" if statement.snaks[aliasesP.typeOfReference] then statement.snaks[aliasesP.typeOfReference] = nil end -- don't include "image" to prevent littering if statement.snaks[aliasesP.image] then statement.snaks[aliasesP.image] = nil end -- don't include "language" if it is equal to the local one if self:getReferenceDetail(statement.snaks, aliasesP.language) == self.conf.langName then statement.snaks[aliasesP.language] = nil end if statement.snaks[aliasesP.statedIn] and not statement.snaks[aliasesP.referenceURL] then -- "stated in" was given but "reference URL" was not. -- get "Wikidata property" properties from the item in "stated in" -- if any of the returned properties of the external-id datatype is in statement.snaks, generate a link from it and use the link in the reference -- find the "Wikidata property" properties in the item from "stated in" local wikidataPropertiesOfSource = mw.text.split(p._properties{p.flags.raw, aliasesP.wikidataProperty, [p.args.eid] = self.conf:getValue(statement.snaks[aliasesP.statedIn][1], true, false)}, ", ", true) for i, wikidataPropertyOfSource in pairs(wikidataPropertiesOfSource) do if statement.snaks[wikidataPropertyOfSource] and statement.snaks[wikidataPropertyOfSource][1].datatype == "external-id" then local tempLink = self:getReferenceDetail(statement.snaks, wikidataPropertyOfSource, false, true) -- not raw, linked if mw.ustring.match(tempLink, "^%[%Z- %Z+%]$") then -- getValue returned a URL in square brackets. -- the link is in wiki markup, so strip the square brackets and the display text -- gsub also returns another, discarted value, therefore the result is assigned to tempLink first tempLink = mw.ustring.gsub(tempLink, "^%[(%Z-) %Z+%]$", "%1") additionalProcessedProperties[aliasesP.referenceURL] = {tempLink} statement.snaks[wikidataPropertyOfSource] = nil break end end end end -- initialize candidateParams and citeParams for _, citeType in ipairs(citeTypes) do candidateParams[citeType] = {} citeParams[citeType] = {} end -- fill candidateParams for _, citeType in ipairs(citeTypes) do -- This will contain value--priority pairs for each param name. local candidateValuesAndPriorities = {} -- fill candidateValuesAndPriorities for refProperty in pairs(statement.snaks) do if citeErrors[citeType] then break end repeat -- just a simple wrapper to emulate "continue" -- set mappingKey and prefix local mappingKey local prefix = "" if statement.snaks[refProperty][1].datatype == 'external-id' then mappingKey = "external-id" prefix = self.conf:getLabel(refProperty) if prefix ~= "" then prefix = prefix .. " " end else mappingKey = refProperty end local paramName = citeParamMapping[citeType][mappingKey] -- skip properties with empty parameter name if paramName == "" then break -- skip this property for this value of citeType end -- handle unknown properties in the reference if not paramName then referenceEmpty = false local error_message = errorText("unknown-property-in-ref", refProperty) assert(error_message) -- Should not be nil citeErrors[citeType] = error_message break end -- set processedProperty local processedProperty local raw = false -- if the value is wanted raw if isValueInTable(paramName, citeConfig[citeType]["raw-value-params"] or {}) then raw = true end if isValueInTable(paramName, citeConfig[citeType]["numbered-params"] or {}) then -- Multiple values may be given. processedProperty = self:getReferenceDetails(statement.snaks, refProperty, raw, self.linked, true) -- anyLang = true else -- If multiple values are given, all but the first suitable one are discarted. processedProperty = {self:getReferenceDetail(statement.snaks, refProperty, raw, self.linked and (statement.snaks[refProperty][1].datatype ~= 'url'), true)} -- link = true/false, anyLang = true end if #processedProperty == 0 then break end referenceEmpty = false -- add an empty entry to candidateValuesAndPriorities, if there isn't one already if not candidateValuesAndPriorities[paramName] then candidateValuesAndPriorities[paramName] = {} end -- find the priority of refProperty local thisPropertyPriority = -1 local thisParamPrioritization = citeConfig[citeType]["prioritization"][paramName] if thisParamPrioritization then for i_priority, i_property in ipairs(thisParamPrioritization) do if i_property == refProperty then thisPropertyPriority = i_priority end end end for _, propertyValue in pairs(processedProperty) do table.insert( candidateValuesAndPriorities[paramName], {prefix .. propertyValue, thisPropertyPriority} ) end until true end -- fill candidateParams[citeType] if not citeErrors[citeType] then local compareValuePriorities = function(pair1, pair2) if pair1[2] == -1 and pair2[2] ~= -1 then return false end if pair1[2] ~= -1 and pair2[2] == -1 then return true end return pair1[2] < pair2[2] end -- fill candidateParams[citeType][paramName] for each used param for paramName, _ in pairs(candidateValuesAndPriorities) do table.sort(candidateValuesAndPriorities[paramName], compareValuePriorities) candidateParams[citeType][paramName] = {} for _, valuePriorityPair in ipairs(candidateValuesAndPriorities[paramName]) do table.insert(candidateParams[citeType][paramName], valuePriorityPair[1]) end end end end -- handle additional properties for refProperty in pairs(additionalProcessedProperties) do for _, citeType in ipairs(citeTypes) do repeat -- skip if there already have been errors if citeErrors[citeType] then break end local paramName = citeParamMapping[citeType][refProperty] -- handle unknown properties in the reference if not paramName then -- Skip this additional property, but do not cause an error. break end if paramName == "" then break end referenceEmpty = false if not candidateParams[citeType][paramName] then candidateParams[citeType][paramName] = {} end for _, propertyValue in pairs(additionalProcessedProperties[refProperty]) do table.insert(candidateParams[citeType][paramName], propertyValue) end until true end end -- fill citeParams for _, citeType in ipairs(citeTypes) do for paramName, paramValues in pairs(candidateParams[citeType]) do if #paramValues == 1 or not isValueInTable(paramName, citeConfig[citeType]["numbered-params"] or {}) then citeParams[citeType][paramName] = paramValues[1] else -- There is more than one value for this parameter - the values will -- go into separate numbered parameters (e.g. "author1", "author2") for paramNum, paramValue in pairs(paramValues) do citeParams[citeType][paramName .. paramNum] = paramValue end end end end -- handle missing mandatory parameters for the templates for _, citeType in ipairs(citeTypes) do for _, requiredCiteParam in pairs(citeConfig[citeType]["mandatory-params"] or {}) do if not citeParams[citeType][requiredCiteParam] then -- The required param is not present. if citeErrors[citeType] then -- Do not override the previous error, if it exists. break end local error_message = errorText("missing-mandatory-param", requiredCiteParam) assert(error_message) -- Should not be nil citeErrors[citeType] = error_message end end end local citeTypeToUse = nil -- choose the output template for _, citeType in ipairs(citeTypes) do if not citeErrors[citeType] then citeTypeToUse = citeType break end end -- set refContent local refContent = "" if citeTypeToUse then local templateToUse = citeConfig[citeTypeToUse]["template"] local paramsToUse = citeParams[citeTypeToUse] if not templateToUse or templateToUse == "" then throwError("no-such-reference-template", tostring(templateToUse), i18nPath, citeTypeToUse) end -- if this module is being substituted then build a regular template call, otherwise expand the template if mw.isSubsting() then for i, v in pairs(paramsToUse) do refContent = refContent .. "|" .. i .. "=" .. v end refContent = "{{" .. templateToUse .. refContent .. "}}" else xpcall( function () refContent = mw.getCurrentFrame():expandTemplate{title=templateToUse, args=paramsToUse} end, function () throwError("no-such-reference-template", templateToUse, i18nPath, citeTypeToUse) end ) end -- If the citation couldn't be displayed using any template, but is not empty (barring ignored propeties), throw an error. elseif not referenceEmpty then refContent = errorText("malformed-reference-header") for _, citeType in ipairs(citeTypes) do refContent = refContent .. errorText("template-failure-reason", citeConfig[citeType]["template"], citeErrors[citeType]) end refContent = refContent .. errorText("malformed-reference-footer") end -- wrap refContent local ref = {} if refContent ~= "" then ref = {refContent} if not self.rawValue then -- this should become a <ref> tag, so save the reference's hash for later ref.refHash = "wikidata-" .. statement.hash .. "-v" .. (tonumber(i18n['version']) + version) end return {ref} else return {} end end -- gets a detail of one particular type for a reference function State:getReferenceDetail(snaks, dType, raw, link, anyLang) local switchLang = anyLang local value = nil if not snaks[dType] then return nil end -- if anyLang, first try the local language and otherwise any language repeat for _, v in ipairs(snaks[dType]) do value = self.conf:getValue(v, raw, link, false, anyLang and not switchLang, false, true) -- noSpecial = true if value then break end end if value or not anyLang then break end switchLang = not switchLang until anyLang and switchLang return value end -- gets the details of one particular type for a reference function State:getReferenceDetails(snaks, dType, raw, link, anyLang) local values = {} if not snaks[dType] then return {} end for _, v in ipairs(snaks[dType]) do -- if nil is returned then it will not be added to the table values[#values + 1] = self.conf:getValue(v, raw, link, false, anyLang, false, true) -- noSpecial = true end return values end -- level 1 hook function State:getAlias(object) local value = object.value local title = nil if value and self.linked then if self.conf.entityID:sub(1,1) == "Q" then title = mw.wikibase.getSitelink(self.conf.entityID) elseif self.conf.entityID:sub(1,1) == "P" then title = "d:Property:" .. self.conf.entityID end if title then value = buildWikilink(title, value) end end value = {value} -- create one value object if #value > 0 then return {value} -- wrap the value object in an array and return it else return {} -- return empty array if there was no value end end -- level 1 hook function State:getBadge(value) value = self.conf:getLabel(value, self.rawValue, self.linked, self.shortName) if value == "" then value = nil end value = {value} -- create one value object if #value > 0 then return {value} -- wrap the value object in an array and return it else return {} -- return empty array if there was no value end end function State:callHook(param, hooks, statement, result) -- call a parameter's hook if it has been defined and if it has not been called before if not result[param] and hooks[param] then local valuesArray = self[hooks[param]](self, statement, param, result, hooks) -- array with value objects -- add to the result if #valuesArray > 0 then result[param] = valuesArray result.count = result.count + 1 else result[param] = {} -- an empty array to indicate that we've tried this hook already return true -- miss == true end end return false end -- iterate through claims, claim's qualifiers or claim's references to collect values function State:iterate(statements, hooks, matchHook) matchHook = matchHook or alwaysTrue local matches = false local rankPos = nil local result, gotRequired for _, v in ipairs(statements) do -- rankPos will be nil for non-claim statements (e.g. qualifiers, references, etc.) matches, rankPos = matchHook(self, v) if matches then result = {count = 0} -- collection of arrays with value objects local function walk(formatTable) local miss for i2, v2 in pairs(formatTable.req) do -- call a hook, adding its return value to the result miss = self:callHook(i2, hooks, v, result) if miss then -- we miss a required value for this level, so return false return false end if result.count == hooks.count then -- we're done if all hooks have been called; -- returning at this point breaks the loop return true end end for _, v2 in ipairs(formatTable) do if result.count == hooks.count then -- we're done if all hooks have been called; -- returning at this point prevents further childs from being processed return true end if v2.child then walk(v2.child) end end return true end gotRequired = walk(self.parsedFormat) -- only append the result if we got values for all required parameters on the root level if gotRequired then -- if we have a rankPos (only with matchHook() for complete claims), then update the foundRank if rankPos and self.conf.foundRank > rankPos then self.conf.foundRank = rankPos end -- append the result self.results[#self.results + 1] = result -- break if we only need a single value if self.singleValue then break end end end end return self:out() end local function getEntityId(arg, eid, page, allowOmitPropPrefix, globalSiteId) local id = nil local prop = nil if arg then if arg:sub(1,1) == ":" then page = arg eid = nil elseif arg:sub(1,1):upper() == "Q" or arg:sub(1,9):lower() == "property:" or allowOmitPropPrefix then eid = arg page = nil else prop = arg end end if eid then if eid:sub(1,9):lower() == "property:" then id = replaceAlias(mw.text.trim(eid:sub(10))) if id:sub(1,1):upper() ~= "P" then id = "" end else id = replaceAlias(eid) end elseif page then if page:sub(1,1) == ":" then page = mw.text.trim(page:sub(2)) end id = mw.wikibase.getEntityIdForTitle(page, globalSiteId) or "" end if not id then id = mw.wikibase.getEntityIdForCurrentPage() or "" end id = id:upper() if not mw.wikibase.isValidEntityId(id) then id = "" end return id, prop end local function nextArg(args) local arg = args[args.pointer] if arg then args.pointer = args.pointer + 1 return mw.text.trim(arg) else return nil end end local function claimCommand(args, funcName) local cfg = Config:new() cfg:processFlagOrCommand(funcName) -- process first command (== function name) local lastArg, parsedFormat, formatParams, claims, value local hooks = {count = 0} -- set the date if given; -- must come BEFORE processing the flags if args[p.args.date] then cfg.atDate = {parseDate(args[p.args.date])} cfg.periods = {false, true, false} -- change default time constraint to 'current' end -- process flags and commands repeat lastArg = nextArg(args) until not cfg:processFlagOrCommand(lastArg) -- get the entity ID from either the positional argument, the eid argument or the page argument cfg.entityID, cfg.propertyID = getEntityId(lastArg, args[p.args.eid], args[p.args.page], false, args[p.args.globalSiteId]) if cfg.entityID == "" then return "" -- we cannot continue without a valid entity ID end cfg.entity = mw.wikibase.getEntity(cfg.entityID) if not cfg.propertyID then cfg.propertyID = nextArg(args) end cfg.propertyID = replaceAlias(cfg.propertyID) if not cfg.entity or not cfg.propertyID then return "" -- we cannot continue without an entity or a property ID end cfg.propertyID = cfg.propertyID:upper() if not cfg.entity.claims or not cfg.entity.claims[cfg.propertyID] then return "" -- there is no use to continue without any claims end claims = cfg.entity.claims[cfg.propertyID] if cfg.states.qualifiersCount > 0 then -- do further processing if "qualifier(s)" command was given if #args - args.pointer + 1 > cfg.states.qualifiersCount then -- claim ID or literal value has been given cfg.propertyValue = nextArg(args) end for i = 1, cfg.states.qualifiersCount do -- check if given qualifier ID is an alias and add it cfg.qualifierIDs[parameters.qualifier..i] = replaceAlias(nextArg(args) or ""):upper() end elseif cfg.states[parameters.reference] then -- do further processing if "reference(s)" command was given cfg.propertyValue = nextArg(args) end -- check for special property value 'somevalue' or 'novalue' if cfg.propertyValue then cfg.propertyValue = replaceSpecialChars(cfg.propertyValue) if cfg.propertyValue ~= "" and mw.text.trim(cfg.propertyValue) == "" then cfg.propertyValue = " " -- single space represents 'somevalue', whereas empty string represents 'novalue' else cfg.propertyValue = mw.text.trim(cfg.propertyValue) end end -- parse the desired format, or choose an appropriate format if args["format"] then parsedFormat, formatParams = parseFormat(args["format"]) elseif cfg.states.qualifiersCount > 0 then -- "qualifier(s)" command given if cfg.states[parameters.property] then -- "propert(y|ies)" command given parsedFormat, formatParams = parseFormat(formats.propertyWithQualifier) else parsedFormat, formatParams = parseFormat(formats.qualifier) end elseif cfg.states[parameters.property] then -- "propert(y|ies)" command given parsedFormat, formatParams = parseFormat(formats.property) else -- "reference(s)" command given parsedFormat, formatParams = parseFormat(formats.reference) end -- if a "qualifier(s)" command and no "propert(y|ies)" command has been given, make the movable separator a semicolon if cfg.states.qualifiersCount > 0 and not cfg.states[parameters.property] then cfg.separators["sep"..parameters.separator][1] = {";"} end -- if only "reference(s)" has been given, set the default separator to none (except when raw) if cfg.states[parameters.reference] and not cfg.states[parameters.property] and cfg.states.qualifiersCount == 0 and not cfg.states[parameters.reference].rawValue then cfg.separators["sep"][1] = nil end -- if exactly one "qualifier(s)" command has been given, make "sep%q" point to "sep%q1" to make them equivalent if cfg.states.qualifiersCount == 1 then cfg.separators["sep"..parameters.qualifier] = cfg.separators["sep"..parameters.qualifier.."1"] end -- process overridden separator values; -- must come AFTER tweaking the default separators cfg:processSeparators(args) -- define the hooks that should be called (getProperty, getQualifiers, getReferences); -- only define a hook if both its command ("propert(y|ies)", "reference(s)", "qualifier(s)") and its parameter ("%p", "%r", "%q1", "%q2", "%q3") have been given for i, v in pairs(cfg.states) do -- e.g. 'formatParams["%q1"] or formatParams["%q"]' to define hook even if "%q1" was not defined to be able to build a complete value for "%q" if formatParams[i] or formatParams[i:sub(1, 2)] then hooks[i] = getHookName(i, 1) hooks.count = hooks.count + 1 end end -- the "%q" parameter is not attached to a state, but is a collection of the results of multiple states (attached to "%q1", "%q2", "%q3", ...); -- so if this parameter is given then this hook must be defined separately, but only if at least one "qualifier(s)" command has been given if formatParams[parameters.qualifier] and cfg.states.qualifiersCount > 0 then hooks[parameters.qualifier] = getHookName(parameters.qualifier, 1) hooks.count = hooks.count + 1 end -- create a state for "properties" if it doesn't exist yet, which will be used as a base configuration for each claim iteration; -- must come AFTER defining the hooks if not cfg.states[parameters.property] then cfg.states[parameters.property] = State:new(cfg, parameters.property) -- if the "single" flag has been given then this state should be equivalent to "property" (singular) if cfg.singleClaim then cfg.states[parameters.property].singleValue = true end end -- if the "sourced" flag has been given then create a state for "reference" if it doesn't exist yet, using default values, -- which must exist in order to be able to determine if a claim has any references; -- must come AFTER defining the hooks if cfg.sourcedOnly and not cfg.states[parameters.reference] then cfg:processFlagOrCommand(p.claimCommands.reference) -- use singular "reference" to minimize overhead end -- set the parsed format and the separators (and optional punctuation mark); -- must come AFTER creating the additonal states cfg:setFormatAndSeparators(cfg.states[parameters.property], parsedFormat) -- process qualifier matching values, analogous to cfg.propertyValue for i, v in pairs(args) do i = tostring(i) if i:match('^[Pp]%d+$') or aliasesP[i] then v = replaceSpecialChars(v) -- check for special qualifier value 'somevalue' if v ~= "" and mw.text.trim(v) == "" then v = " " -- single space represents 'somevalue' end cfg.qualifierIDsAndValues[replaceAlias(i):upper()] = v end end -- first sort the claims on rank to pre-define the order of output (preferred first, then normal, then deprecated) claims = sortOnRank(claims) -- then iterate through the claims to collect values value = cfg:concatValues(cfg.states[parameters.property]:iterate(claims, hooks, State.claimMatches)) -- pass property state with level 1 hooks and matchHook -- if desired, add a clickable icon that may be used to edit the returned values on Wikidata if cfg.editable and value ~= "" then value = value .. cfg:getEditIcon() end return value end local function generalCommand(args, funcName) local cfg = Config:new() cfg.curState = State:new(cfg) local lastArg local value = nil repeat lastArg = nextArg(args) until not cfg:processFlag(lastArg) -- get the entity ID from either the positional argument, the eid argument or the page argument cfg.entityID = getEntityId(lastArg, args[p.args.eid], args[p.args.page], true, args[p.args.globalSiteId]) if cfg.entityID == "" or not mw.wikibase.entityExists(cfg.entityID) then return "" -- we cannot continue without an entity end -- serve according to the given command if funcName == p.generalCommands.label then value = cfg:getLabel(cfg.entityID, cfg.curState.rawValue, cfg.curState.linked, cfg.curState.shortName) elseif funcName == p.generalCommands.title then cfg.inSitelinks = true if cfg.entityID:sub(1,1) == "Q" then value = mw.wikibase.getSitelink(cfg.entityID) end if cfg.curState.linked and value then value = buildWikilink(value) end elseif funcName == p.generalCommands.description then value = mw.wikibase.getDescription(cfg.entityID) else local parsedFormat, formatParams local hooks = {count = 0} cfg.entity = mw.wikibase.getEntity(cfg.entityID) if funcName == p.generalCommands.alias or funcName == p.generalCommands.badge then cfg.curState.singleValue = true end if funcName == p.generalCommands.alias or funcName == p.generalCommands.aliases then if not cfg.entity.aliases or not cfg.entity.aliases[cfg.langCode] then return "" -- there is no use to continue without any aliasses end local aliases = cfg.entity.aliases[cfg.langCode] -- parse the desired format, or parse the default aliases format if args["format"] then parsedFormat, formatParams = parseFormat(args["format"]) else parsedFormat, formatParams = parseFormat(formats.alias) end -- process overridden separator values; -- must come AFTER tweaking the default separators cfg:processSeparators(args) -- define the hook that should be called (getAlias); -- only define the hook if the parameter ("%a") has been given if formatParams[parameters.alias] then hooks[parameters.alias] = getHookName(parameters.alias, 1) hooks.count = hooks.count + 1 end -- set the parsed format and the separators (and optional punctuation mark) cfg:setFormatAndSeparators(cfg.curState, parsedFormat) -- iterate to collect values value = cfg:concatValues(cfg.curState:iterate(aliases, hooks)) elseif funcName == p.generalCommands.badge or funcName == p.generalCommands.badges then if not cfg.entity.sitelinks or not cfg.entity.sitelinks[cfg.siteID] or not cfg.entity.sitelinks[cfg.siteID].badges then return "" -- there is no use to continue without any badges end local badges = cfg.entity.sitelinks[cfg.siteID].badges cfg.inSitelinks = true -- parse the desired format, or parse the default aliases format if args["format"] then parsedFormat, formatParams = parseFormat(args["format"]) else parsedFormat, formatParams = parseFormat(formats.badge) end -- process overridden separator values; -- must come AFTER tweaking the default separators cfg:processSeparators(args) -- define the hook that should be called (getBadge); -- only define the hook if the parameter ("%b") has been given if formatParams[parameters.badge] then hooks[parameters.badge] = getHookName(parameters.badge, 1) hooks.count = hooks.count + 1 end -- set the parsed format and the separators (and optional punctuation mark) cfg:setFormatAndSeparators(cfg.curState, parsedFormat) -- iterate to collect values value = cfg:concatValues(cfg.curState:iterate(badges, hooks)) end end value = value or "" if cfg.editable and value ~= "" then -- if desired, add a clickable icon that may be used to edit the returned value on Wikidata value = value .. cfg:getEditIcon() end return value end -- modules that include this module should call the functions with an underscore prepended, e.g.: p._property(args) local function establishCommands(commandList, commandFunc) for _, commandName in pairs(commandList) do local function wikitextWrapper(frame) local args = copyTable(frame.args) args.pointer = 1 loadI18n(aliasesP, frame) return commandFunc(args, commandName) end p[commandName] = wikitextWrapper local function luaWrapper(args) args = copyTable(args) args.pointer = 1 loadI18n(aliasesP) return commandFunc(args, commandName) end p["_" .. commandName] = luaWrapper end end establishCommands(p.claimCommands, claimCommand) establishCommands(p.generalCommands, generalCommand) -- main function that is supposed to be used by wrapper templates function p.main(frame) if not mw.wikibase then return nil end local f, args loadI18n(aliasesP, frame) -- get the parent frame to take the arguments that were passed to the wrapper template frame = frame:getParent() or frame if not frame.args[1] then throwError("no-function-specified") end f = mw.text.trim(frame.args[1]) if f == "main" then throwError("main-called-twice") end assert(p["_"..f], errorText('no-such-function', f)) -- copy arguments from immutable to mutable table args = copyTable(frame.args) -- remove the function name from the list table.remove(args, 1) return p["_"..f](args) end return p j5a6l03tjwodgrvfnv3lb4x5up93wlv ماژول:Wd/i18n 828 41063 389855 178614 2026-07-10T11:24:18Z Uzume 1313 Update from [[d:Special:GoToLinkedPage/enwiki/Q29879601|master]] using [[mw:Synchronizer| #Synchronizer]] 389855 Scribunto text/plain -- The values and functions in this submodule should be localized per wiki. local p = {} function p.init(aliasesP) p = { ["version"] = "8", -- increment this each time the below parameters are changed to avoid reference conflict errors ["errors"] = { ["unknown-data-type"] = "Unknown or unsupported datatype '%s'.", ["missing-required-parameter"] = "No required parameters defined, needing at least one", ["extra-required-parameter"] = "Parameter '%s' must be defined as optional", ["no-function-specified"] = "You must specify a function to call", -- equal to the standard module error message ["main-called-twice"] = 'The function "main" cannot be called twice', ["no-such-function"] = 'The function "%s" does not exist', -- equal to the standard module error message ["no-such-reference-template"] = 'Error: template "%s", which is set in %s as the output template for the citation-output type "%s", does not exist', -- Parts of the error message signalling a malformed reference. ["malformed-reference-header"] = "<span style=\"color:#dd3333\">\nError: Unable to display the reference from Wikidata properly. Technical details:\n", ["malformed-reference-footer"] = "See [[Module:wd/doc#References|the documentation]] for further details.\n</span>\n[[Category:Module:Wd reference errors]]", ["template-failure-reason"] = "* Reason for the failure of {{tl|%s}}: %s\n", ["missing-mandatory-param"] = 'The output template call would miss the mandatory parameter <code>%s</code>.', ["unknown-property-in-ref"] = 'The Wikidata reference contains the property {{property|%s}}, which is not assigned to any parameter of this template.' }, ["info"] = { ["edit-on-wikidata"] = "Edit this on Wikidata" }, ["numeric"] = { ["decimal-mark"] = ".", ["delimiter"] = "," }, ["datetime"] = { ["prefixes"] = { ["decade-period"] = "" }, ["suffixes"] = { ["decade-period"] = "s", ["millennium"] = " millennium", ["century"] = " century", ["million-years"] = " million years", ["billion-years"] = " billion years", ["year"] = " year", ["years"] = " years" }, ["julian-calendar"] = "Julian calendar", -- linked page title ["julian"] = "Julian", ["BCE"] = "BCE", ["CE"] = "CE", ["common-era"] = "Common Era" -- linked page title }, ["coord"] = { ["latitude-north"] = "N", ["latitude-south"] = "S", ["longitude-east"] = "E", ["longitude-west"] = "W", ["degrees"] = "°", ["minutes"] = "'", ["seconds"] = '"', ["separator"] = ", " }, ["values"] = { ["unknown"] = "unknown", ["none"] = "none" }, ["cite"] = { ["output-types"] = {"web", "q"}, -- In this order, the output types will be tried ["param-mapping"] = { ["web"] = { -- <= left side: all allowed reference properties for *web page sources* per https://www.wikidata.org/wiki/Help:Sources -- => right side: corresponding parameter names in (equivalent of) [[:en:Template:Cite web]] (if non-existent, keep empty i.e. "") [aliasesP.statedIn] = "website", [aliasesP.referenceURL] = "url", [aliasesP.publicationDate] = "date", [aliasesP.lastUpdate] = "date", [aliasesP.retrieved] = "access-date", [aliasesP.title] = "title", [aliasesP.subjectNamedAs] = "title", [aliasesP.archiveURL] = "archive-url", [aliasesP.archiveDate] = "archive-date", [aliasesP.language] = "language", [aliasesP.author] = "author", [aliasesP.authorNameString] = "author", [aliasesP.publisher] = "publisher", [aliasesP.quote] = "quote", [aliasesP.pages] = "pages", -- extra option [aliasesP.publishedIn] = "website", [aliasesP.sectionVerseOrParagraph] = "at" }, ["q"] = { -- <= left side: all allowed reference properties for *sources other than web pages* per https://www.wikidata.org/wiki/Help:Sources -- => right side: corresponding parameter names in (equivalent of) [[:en:Template:Cite Q]] (if non-existent, keep empty i.e. "") [aliasesP.statedIn] = "1", [aliasesP.pages] = "pages", [aliasesP.column] = "at", [aliasesP.chapter] = "chapter", [aliasesP.sectionVerseOrParagraph] = "section", ["external-id"] = "id", -- used for any type of database property ID [aliasesP.title] = "title", [aliasesP.publicationDate] = "date", [aliasesP.lastUpdate] = "date", [aliasesP.retrieved] = "access-date" } }, ["config"] = { -- supported fields: -- - template: name of the template used for output -- - numbered-params: citation params accepting an arbitrary number of values by numbering the params (e.g. author1, author2) -- - raw-value-params: params taking a raw value (which means the property is rendered with getValue with raw=true) -- - mandatory-params: params that are required be in the template call (after potentially appending numbers to params listed in numbered-params) -- - prioritization: table associating a list of properties, in the order in which they are preferred, to template parameters; -- properties not mentioned here have the lowest priority; -- prioritization of properties handled through additionalProcessedProperties is unsupported; -- no key of this table can be from numbered-params -- Leaving out the "template" field causes the output type to be ignored. ["web"] = { ["template"] = "Cite web", ["numbered-params"] = {"author"}, ["mandatory-params"] = {"url"}, ["prioritization"] = { ["date"] = {aliasesP.lastUpdate, aliasesP.publicationDate}, ["title"] = {aliasesP.title, aliasesP.subjectNamedAs} } }, ["q"] = { ["template"] = "Cite Q", ["raw-value-params"] = {"1"}, -- the first, unnamed parameter of CiteQ takes a QID, not the name of the item cited ["mandatory-params"] = {"1"}, ["prioritization"] = { ["date"] = {aliasesP.lastUpdate, aliasesP.publicationDate} } } } } } p.getOrdinalSuffix = function(num) if tostring(num):sub(-2,-2) == '1' then return "th" -- 10th, 11th, 12th, 13th, ... 19th end num = tostring(num):sub(-1) if num == '1' then return "st" elseif num == '2' then return "nd" elseif num == '3' then return "rd" else return "th" end end p.addDelimiters = function(n) local left, num, right = string.match(n, "^([^%d]*%d)(%d*)(.-)$") if left and num and right then return left .. (num:reverse():gsub("(%d%d%d)", "%1" .. p['numeric']['delimiter']):reverse()) .. right else return n end end return p end return p pgkxz3kqyoyu0zj2nmtkjkdr0ntnin5 شاوشنک ردمپشن 0 46406 389851 189056 2026-07-10T10:35:53Z محک 1023 [[رج:جنایی فیلمون]] اضافه شد با استفاده از [[ویکی‌پدیا:رج‌ساز]] 389851 wikitext text/x-wiki {{صندخ/فیلم |عکس=Shawshank p.jpg }} '''''دِ شاؤشنگ ردمشن''''' که یعنن '''شاؤشنک ِپرند''' {{انگلیسی جه|The Shawshank Redemption}} اتا آمریکایی فیلم هسته که سال ۱۹۹۴، [[ فرانک دارابونت]] بساته و [[آی ام بی دی]] سایت دله، تاریخ ِبتترین فیلم انتخاب بئی‌یه. == آسنی == فیلم اتا کارمندِ زندگی ره سِراق دِنه که ونه نوم «اندی دوفرین» هسته و [[تیم رابینز]] ونه نقش ره دارنه. ونه زنا ونجه خیانت کنده. وه شونه زنا ره سر-به-سر پیدا کنده و تفنگ ره هم شه جه ورنه ولی وه ره دل ندنه که زنا ره بکوشه. همون شو اتا دزد شونه زنا-مردی که ونجه خیانت کردنه ره کِشنه و همینسه اندی ره بی‌گناه ورنه زندون و حبس ابد دِنّه و کفنه «شاوشنک» زندون دله. زندون دله اندی خله رفق پیدا کنده و اتا سیو مردی، رِد، جه آشنا وونه که ونه نقش ره هم [[مورگان فریمن]] دارنه. اندی زندون ِزندون‌بان‌ها و رییس وسّه مالیاتی کارون ره انجام دِنه و اونجه مخبر وونه که زندونِ رییس دره پولشویی کنده. این کارها عوض، اندی تونده زندون دله اتا کتابخنه راه دمبده و زندونی‌ها ره اکابر کلاس دله درس یاد دِنه. اتا جوون ریکا که اندی جه درس یاد گیرنه، وه ره گانه که اتی دیگه زندون دله ات نفر جه آشنا بیّه که حکماً قاتلی هسته که اندیِ زنا ره بکوشته. اندی اینتا آسنی ره رییس وسّه تعریف کنده ولی رییس که نخانه وه آزاد بوو، شونه جوون ریکا ره کاشنه و اندی ره هم دمدنه انفرادی. اندی اَی شه رابطه ره رییس جه خار کنده و ونه اعتماد ره بدست یارنه. وه رییسِ مدارک و ونه لباس و… گیرنه و اتا تونل که تموم این سال‌ها شه سلول دله در-ساته جه فرار کنده و زندون جه درشونه. رِد هم چن وقت په عفو خرنه و آزاد وونه و سرنخ‌هایی که اندی ونه خَوِری هدا بی‌یه جه موفق وونه وه ره [[مکزیک]] دله پیدا هاکنه و دِ-به-دِ اونجه اتا نو زندگی ره از سر شروع کنّه. == منابع == {{پانویس}} [[رج:۱۹۹۴ فیلمون]] [[رج:آمریکایی فیلمون]] [[رج:انگلیسی فیلمون]] [[رج:جنایی فیلمون]] ibnyvsx6oydd1c69l7cbfc18mops8nz مورگان فریمن 0 46600 389850 189514 2026-07-10T10:34:55Z محک 1023 389850 wikitext text/x-wiki {{Infobox person | name = Morgan Freeman | image = Morgan Freeman at The Pentagon on 2 August 2023 - 230802-D-PM193-3363 (cropped).jpg | caption = ونه عکس که سال ۲۰۲۳ شنه | birth_name = | birth_date = {{Birth date and age|1937|6|1}} | birth_place = [[ممفیس، تنسی]]، آمریکا. | death_date = | death_place = | education = [[Broad Street High School]] | organization = [[Revelations Entertainment]] | spouse = {{unbulleted list|{{marriage|Jeanette Adair Bradshaw|1967|1979|end=divorced}}|{{marriage|Myrna Colley-Lee|1984|2010|end=divorced}}}} | occupation = | years_active = ۱‌۹۶۴–تاسا | works = | awards = | module2 = [[File:Morgan freeman bbc radio4 film programme 12 09 2008 b00dbcdn.flac|center]]Morgan Freeman's voice from BBC Radio 4's ''[[The Film Programme]]''، September 12، 2008.<ref>{{cite episode | url=http://www.bbc.co.uk/programmes/b00dbcdn | title=12/09/2008 | date=September 12، 2008 | access-date=January 18، 2014 | series=The Film Programme | station=BBC Radio 4 | archive-url=https://web.archive.org/web/20110204180033/http://www.bbc.co.uk/programmes/b00dbcdn | archive-date=February 4، 2011 | url-status=live }}</ref> | children = چارتا | module = {{Infobox military person | embed = اره | embed_title = Military service | allegiance = {{US}} | branch = {{air force|US}} | branch_label = | serviceyears = 1955–1959 | rank = [[File:E3 USAF AM1.svg|25px]] [[ایرمن فرست کلاس]] | unit = | awards = }} }} '''مورگان فریمن'''<ref name=":0">{{Cite magazine|last1=Ross|first1=Harold Wallace|last2=White|first2=Katharine Sergeant Angell|others=[My grandmother] had been married to Morgan Herbert Freeman، and my father was Morgan Porterfield Freeman، but they forgot to give me a middle name.|date=July 3، 1978|title=Interview with Morgan Freeman|magazine=The New Yorker|url=https://books.google.com/books?id=l74eAQAAMAAJ&q=Morgan+Porterfield+Freeman|url-status=live|access-date=March 20، 2021|archive-date=March 20، 2021|archive-url=https://web.archive.org/web/20210320141310/https://books.google.co.uk/books?id=l74eAQAAMAAJ&dq=%22+my+father+was+Morgan+Porterfield+Freeman%2C+but+they+forgot+to+give+me+a+middle+name%22&q=Morgan+Porterfield+Freeman&redir_esc=y}}</ref> (بزائه‌ی ۱ ژوئن ۱۹۳۷) اتا آمریکایی بازیگر و تهیه‌کننده هسته. وه شه خار صدا جه و خاصِ شخصیت وسّه بشناسی وونه. وه حدود پنج دهه فیلم بازی کنده و خله جوایز و تحسین‌ها ره بدست بیارده که وشون دله اتا [[اوسکار جایزه]] و [[گولدن گلوب]] هم دره. وه [[تنسی]] ایالت، [[ممفیس]] شهر دله دنیا بمو و همین شهر دله درس بخوندسته و مدرسه‌یِ نمایش‌نومه‌ئون دله شرکت کرده و همونجه جه ونه دل دگرسته که بازیگر بوو و دانشگاه هم بورده [[لوس آنجلس]] و اونجه تیاتر درس ره بخونسته. وه دهه ۱۹۷۰ اتا وَچه‌گونه برنومه دله جه شه کار ره شروع هاکرده و بعداً [[ویلیام شکسپیر]] دِتا آسنی ره تیاتر دله بازی هاکرده که اتا جایزه هم ون سر بیته. سال ۱۹۷۸ وه اتا تیاتر ِنقش وسّه [[تونی جایزه]] ره کاندید بیّه. وه تیاتر جه بمو سینما و خله فیلم بازی هاکرده. فیلمی که ونجه اوسکار بیته ''[[میلیون دلار بی‌بی]]'' (۲۰۰۴) بی‌یه ولی ''[[استریت اسمارت]]'' (۱۹۸۷)، ''[[درایوینگ میس دیزی]]'' (۱۹۸۹)، ''دِ [[شاوشنک ردمپشن]]'' (۱۹۹۴) و ''[[اینویکتوس]]'' (۲۰۰۹) وسّه هم اوسکارِ کاندید بئی‌بی‌یه. ونه دیگر مشهورِ نقش‌ها جه ''[[گلوری (۱۹۸۹)|گلوری]]'' (۱۹۸۹)، ''[[لین آن می]]'' (۱۹۸۹)، ''[[رابین هود: پرنس آف تیوس]]'' (۱۹۹۱)، ''[[آنفورگیون]]'' (۱۹۹۲)، ''[[سون (۱۹۹۵)|سِۆِن]]'' (۱۹۹۵)، ''[[آمیستاد]]'' (۱۹۹۷)، ''[[گان بی‌بی گان]]'' (۲۰۰۷)، ''دِ [[باکت لیست]]'' (۲۰۰۷)، [[بتمن]] ِسه‌گانه، ''[[وانتد (۲۰۰۸)|وانتِد]]'' (۲۰۰۸)، ''[[رد (۲۰۱۰)|رِد]]'' (۲۰۱۰)، ''[[اوبلیویون|اوبلیویون]]'' (۲۰۱۳)، ''[[نو یو سی می]]'' (۲۰۱۳)، ''[[لوسی (۲۰۱۴)|لوسی]]'' (۲۰۱۴) و ''[[گوئینگ این استایل]]'' (۲۰۱۷) هستنه. == منابع == * انگلیسی ویکی‌پدیا {{پانویس}} [[رج:امریکا بازیگرون]] [[رج:زننه آدمون]] cganbvs092g2aapi2lasm58v5k5g092 کودا 0 47001 389837 190698 2026-07-10T09:53:40Z محک 1023 389837 wikitext text/x-wiki {{صندخ/فیلم |عکس=File:Coda poster.jpeg }} '''''کودا''''' {{انگلیسی جه|Coda}} اتا [[آمریکا]]یی فیلم هسته که سال ۲۰۲۱ [[شان هیدر]] بساته. این کمدی-درام فیلم که [[اوسکار جایزه]] ره هم بیته، اتا کیجا ره سِراق دِنه که ونه پییر، مار و برار همه لال-غول هستنه و وه فقط تونده شه خانواده دله بشنوئه و گپ بزنه. وه مدرسه دله آواز خوندنه و این سال دله ونه دانشگاهِ انتخاب هاکنه و ونه خانواده که خله ونه محتاج هستنه، نتونّه بدون وه شه زندگی ره دمباله بیرن... == منابع == {{په‌نویس}} [[رج:آمریکایی فیلمون]] [[رج:درام فیلمون]] [[رج:اوسکار بیته فیلمون]] [[رج:۲۰۲۱ فیلمون]] kezgaukcxnn8yatq7n1mlr04mu5qsw4 شهرداری نوشهر 0 52567 389854 283997 2026-07-10T11:19:42Z ~2026-36780-53 46007 /* */ 389854 wikitext text/x-wiki {{جعبه باشگاه فوتبال|نام باشگاه=شهرداری نوشهر|تصویر= NowShahr Futval Tim.png|نام کامل=باشگاه فرهنگی ورزشی شهرداری نوشهر|لقب=|تأسیس=[[۱۳۸۹ (خورشیدی)|۱۳۸۹]]|ورزشگاه=[[ورزشگاه شهدا نوشهر|شهدای نوشهر]]|گنجایش=۴۰۰۰ نفر|مالک=[[شهرداری نوشهر]]|مدیریت=[[عادل خزایی پول]]|لیگ=[[لیگ دسته دوم فوتبال ایران|لیگ دو]]|فصل=۱۴۰۲-۱۴۰۳|رتبه= دوم(گروه دوم)(صعود به لیگ آزادگان در پلی آف)|الگوی دست چپ۱=|الگوی بدن۱=|الگوی دست راست۱=|دست چپ۱=0945A6|بدن۱=0945A6|دست راست۱=0945A6|شلوارک۱=۰۰۰۰۰۰|جوراب۱=0945A6|الگوی دست چپ۲=|الگوی بدن۲=|الگوی دست راست۲=|دست چپ۲=۰۰۰۰۰۰|بدن۲=۰۰۰۰۰۰|دست راست۲=۰۰۰۰۰۰|شلوارک۲=۰۰۰۰۰۰|جوراب۲=۰۰۰۰۰۰|سرمربی=}} '''شهرداری نوشهر''' اتا فوتوال تیم هسته که [[نوشهر]] شنه و وه ره شورای شهر بساته.<ref>{{یادکرد وب|عنوان=احیای فوتبال نوشهر؛ با نام شهرداری و توسط یک پرسپولیسی|نشانی=https://khabarvarzeshi.com/x4KBD|ناشر=[[خبر ورزشی]]|تاریخ بازبینی=13 می 2023|کد زبان=fa|تاریخ=۶ آگوست ۲۰۲۱}}</ref> این شهر قدیم [[شموشک نوشهر]] ره داشته که لیگ برتر جه دکته و ونه جا ره است شهرداری تیم ور کنده. سال ۱۴۰۲ نوشهر باشگاه [[لیگ دسته یک]] ره صعود هاکرده و بجور بمو.<ref>[https://www.irna.ir/news/85499918/%D8%B3%D9%84%D8%A7%D9%85-%D9%86%D9%88%D8%B4%D9%87%D8%B1%DB%8C-%D9%87%D8%A7-%D8%A8%D9%87-%D9%84%DB%8C%DA%AF-%DB%8C%DA%A9-%D9%81%D9%88%D8%AA%D8%A8%D8%A7%D9%84-%DA%A9%D8%B4%D9%88%D8%B1 ایرنا]</ref> == منابع == {{پانویس}} [[رده:نوشهر شهرداری]] [[رده:نوشهر شهرستان]] [[رج:ایران فوتوال تیمون]] mufsm71d81fx779ss42104j03ifn6g7 شلبی اوکس 0 65409 389843 328173 2026-07-10T09:56:58Z محک 1023 389843 wikitext text/x-wiki {{صندخ/فیلم |عکس= File:Shelby_Oaks.jpg }} '''شلبی اوکس''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Shelby Oaks'') ات ۲۰۲۴ بسات بئی [[آمریکای متحده ایالات|آمریکایی]]، سوپر-نچرالِ ترسناک و معمایی فیلم هسّه کا [[کریس استاکمن|کریس اِستاکمَن]] (''Chris Stuckmann'') دسِّ جه بنویشته، [[کارگردون|کارگردونی]] و تهیه‌کری بیّه. اینتا فیلم ونه یَتِّمین بِلِند فیلم بساتن هسّه. شِلبی اُکس یتمین کَش ۲۰۲۴ جولای مایِ ۲۰، [[فنتیژا بین المللی فیلم فستیوال|فنتیژا فیلم فستیوالِ]] دله شه عمومی نمایش ره داشته، ۲۰۲۵ اکتبر مای ۲۴، نیئون (''Neon''؛ اتِ آمریکایی فیلم توزیع‎کَر کومپانی) اینتا فیلم ره آمریکای سینمائون وسّه بریم هدائه،<ref>DiVincenzo, Alex (September 5, 2026). [https://bloody-disgusting.com/movie/3898427/chris-stuckmanns-shelby-oaks-poster-unleashes-an-unknown-evil/ "Chris Stuckmann's 'Shelby Oaks' Poster Unleashes an Unknown Evil"]. [[:en:Bloody_Disgusting|Bloody Disgusting]]. </ref> اینتا فیلم ۸ میلیون آمریکای [[دولار|دلار]] بروته و نقدکرون اشش ونه سر ات جور نیّه. == منبع == {{په‌نویس}} * ۳۰ نوروزه مایِ ۱۵۳۵ تبری، این ولگ [[:en:Shelby_Oaks|اینگلیسی ویکی‌پدیا]] جه ترجمه بیّه. [[رج:۲۰۲۴ فیلمون]] [[رج:ترسناک فیلمون]] nsbzz60rww1pjbyvyypn2a1flb8bh5c 389844 389843 2026-07-10T09:57:21Z محک 1023 [[رج:آمریکایی فیلمون]] اضافه شد با استفاده از [[ویکی‌پدیا:رج‌ساز]] 389844 wikitext text/x-wiki {{صندخ/فیلم |عکس= File:Shelby_Oaks.jpg }} '''شلبی اوکس''' ([[اینگلیسی زوون|اینگلیسی]] جه: ''Shelby Oaks'') ات ۲۰۲۴ بسات بئی [[آمریکای متحده ایالات|آمریکایی]]، سوپر-نچرالِ ترسناک و معمایی فیلم هسّه کا [[کریس استاکمن|کریس اِستاکمَن]] (''Chris Stuckmann'') دسِّ جه بنویشته، [[کارگردون|کارگردونی]] و تهیه‌کری بیّه. اینتا فیلم ونه یَتِّمین بِلِند فیلم بساتن هسّه. شِلبی اُکس یتمین کَش ۲۰۲۴ جولای مایِ ۲۰، [[فنتیژا بین المللی فیلم فستیوال|فنتیژا فیلم فستیوالِ]] دله شه عمومی نمایش ره داشته، ۲۰۲۵ اکتبر مای ۲۴، نیئون (''Neon''؛ اتِ آمریکایی فیلم توزیع‎کَر کومپانی) اینتا فیلم ره آمریکای سینمائون وسّه بریم هدائه،<ref>DiVincenzo, Alex (September 5, 2026). [https://bloody-disgusting.com/movie/3898427/chris-stuckmanns-shelby-oaks-poster-unleashes-an-unknown-evil/ "Chris Stuckmann's 'Shelby Oaks' Poster Unleashes an Unknown Evil"]. [[:en:Bloody_Disgusting|Bloody Disgusting]]. </ref> اینتا فیلم ۸ میلیون آمریکای [[دولار|دلار]] بروته و نقدکرون اشش ونه سر ات جور نیّه. == منبع == {{په‌نویس}} * ۳۰ نوروزه مایِ ۱۵۳۵ تبری، این ولگ [[:en:Shelby_Oaks|اینگلیسی ویکی‌پدیا]] جه ترجمه بیّه. [[رج:۲۰۲۴ فیلمون]] [[رج:ترسناک فیلمون]] [[رج:آمریکایی فیلمون]] 9w5kqxzkh5q7zrgv8lua44i17yzumut فیوریوسا: مد مکس ساگا 0 86904 389848 247427 2026-07-10T09:59:19Z محک 1023 389848 wikitext text/x-wiki {{صندخ/فیلم |عکس= File:Furiosa A Mad Max Saga.jpg }} '''فیوریوسا: مد مکس ساگا''' (به انگلیسی: Furiosa: A Mad Max Saga) اتا آمریکایی فیلم هسته که[[مد مکس]] دمبال‌سر، سال ۲۰۲۴ بساتنه. [[جورج میلر]] ونه کارگردان بی‌یه و [[آنیا تیلور جوی]] اصلی نقش ره داشته. == آسنی == دنیا رقد بورده و خشکی و قحطی همه جا ره سر هایته. فقط بعضی خورد-خورد آبادی باقی هستنه که مخفی زندگی کننه. اتا پچیک کیجا، فیوریوسا، که اتا آبادی دله دره ره صحراشو موتور سوارون دزدنّه و ورنه. کیجای مار وشون دمبال‌سر شونه و ویشترشون ره کاشنه و کیجا ره هر طریقی هسته در ورنه ولی شه تله کفنه و موتورسوارون رییس، دمنتوس، وه ره صلیب کشنه و اینتی کیجا که فرار هاکرد بی‌یه، ورگردنه مار وری و ای اسیر وونه. دمنتوس کیجا بال ره وندنه و وه ره اسیر گیرنه ولی کیجا مقار ننه که ونه سره کمین وری هسته. موتورسوارون اتا مجموعه شهرون (که ونه نیشتگا سیتادل هسته) جا درگیر وونه و اتا توافق‌نومه وندنه که اتا شرط این هسته که فیوریوسا بئه سیتادل شهر و حرمسرای زنان جه بوو. فیوریوسا شه ره مرد واری دریارنه و شهر دله پیشرفت کنده تا راهی پیدا هاکنه که دربوره ولی.... == منابع == {{په‌نویس}} [[رج:۲۰۲۴ فیلمون]] [[رج:مد مکس]] [[رج: آمریکایی فیلمون]] [[رج:آخرالزمانی فیلمون]] [[رج:انگلیسی فیلمون]] gdj4k5ty1rluxisx55fhxhjfx950hpv 389849 389848 2026-07-10T10:00:29Z محک 1023 389849 wikitext text/x-wiki {{صندخ/فیلم |عکس= File:Furiosa A Mad Max Saga.jpg }} '''فیوریوسا: مد مکس ساگا''' (به انگلیسی: Furiosa: A Mad Max Saga) اتا آمریکایی فیلم هسته که ''[[مد مکس]]'' دمبال‌سر، سال ۲۰۲۴ بساتنه. [[جورج میلر]] ونه کارگردان بی‌یه و [[آنیا تیلور جوی]] اصلی نقش ره داشته. == آسنی == دنیا رقد بورده و خشکی و قحطی همه جا ره سر هایته. فقط بعضی خورد-خورد آبادی باقی هستنه که مخفی زندگی کننه. اتا پچیک کیجا، فیوریوسا، که اتا آبادی دله دره ره صحراشو موتور سوارون دزدنّه و ورنه. کیجای مار وشون دمبال‌سر شونه و ویشترشون ره کاشنه و کیجا ره هر طریقی هسته در ورنه ولی شه تله کفنه و موتورسوارون رییس، دمنتوس، وه ره صلیب کشنه و اینتی کیجا که فرار هاکرد بی‌یه، ورگردنه مار وری و ای اسیر وونه. دمنتوس کیجا بال ره وندنه و وه ره اسیر گیرنه ولی کیجا مقار ننه که ونه سره کمین وری هسته. موتورسوارون اتا مجموعه شهرون (که ونه نیشتگا سیتادل هسته) جا درگیر وونه و اتا توافق‌نومه وندنه که اتا شرط این هسته که فیوریوسا بئه سیتادل شهر و حرمسرای زنان جه بوو. فیوریوسا شه ره مرد واری دریارنه و شهر دله پیشرفت کنده تا راهی پیدا هاکنه که دربوره ولی.... == منابع == {{په‌نویس}} [[رج:۲۰۲۴ فیلمون]] [[رج:مد مکس]] [[رج: آمریکایی فیلمون]] [[رج:آخرالزمانی فیلمون]] [[رج:انگلیسی فیلمون]] 0c6ay4a4loakf2kh8jefcfvjs2zzjof رج:2010s American film posters 14 93415 389806 279780 2026-06-25T07:39:34Z en>Jevansen 0 Copying from [[Category:American film posters]] to [[Category:2010s film posters]] using [[c:Help:Cat-a-lot|Cat-a-lot]] 389806 wikitext text/x-wiki {{Category series navigation}} {{Automatic category TOC}} __NOGALLERY__ [[Category:2010s American films|Ω]] [[Category:American film posters| ]] [[Category:2010s film posters| ]] mfbxajrq02h49g4ui8cg48pzxi0mjti 389807 389806 2026-07-10T09:32:41Z محک 1023 ۱ نسخه واردشده از [[:en:Category:2010s_American_film_posters]]: File:TheMaster2012Poster.jpg 389806 wikitext text/x-wiki {{Category series navigation}} {{Automatic category TOC}} __NOGALLERY__ [[Category:2010s American films|Ω]] [[Category:American film posters| ]] [[Category:2010s film posters| ]] mfbxajrq02h49g4ui8cg48pzxi0mjti رج:2020s American film posters 14 93421 389822 279800 2026-06-25T07:39:29Z en>Jevansen 0 Copying from [[Category:American film posters]] to [[Category:2020s film posters]] using [[c:Help:Cat-a-lot|Cat-a-lot]] 389822 wikitext text/x-wiki {{Category series navigation}} {{Automatic category TOC}} __NOGALLERY__ [[Category:2020s American films|Ω]] [[Category:American film posters| ]] [[Category:2020s film posters| ]] a0a3h402xowbseblo386hw8s27m4fki 389823 389822 2026-07-10T09:41:37Z محک 1023 ۱ نسخه واردشده از [[:en:Category:2020s_American_film_posters]] 389822 wikitext text/x-wiki {{Category series navigation}} {{Automatic category TOC}} __NOGALLERY__ [[Category:2020s American films|Ω]] [[Category:American film posters| ]] [[Category:2020s film posters| ]] a0a3h402xowbseblo386hw8s27m4fki ماژول:Params 828 112844 389788 328761 2026-07-09T20:14:58Z Grufo 45757 [[:mw:Module:Params|Upstream]] updates 389788 Scribunto text/plain require[[strict]] --- --- --- PRIVATE ENVIRONMENT --- --- ________________________________ --- --- --- --[[ Abstract utilities ]]-- ---------------------------- -- Helper function for `string.gsub()` (for managing zero-padded numbers) local function zero_padded (str) return ('%03d%s'):format(#str, str) end -- Helper function for `table.sort()` (for natural sorting) local function natural_sort (var1, var2) return var1:gsub('%d+', zero_padded) < var2:gsub('%d+', zero_padded) end -- Return a copy or a reference to a table local function copy_or_ref_table (src, refonly) if refonly then return src end local newtab = {} for key, val in pairs(src) do newtab[key] = val end return newtab end -- Remove some numeric elements from a table, shifting everything to the left local function remove_numeric_keys (tbl, idx, len) local cache, tmp = {}, idx + len - 1 for key, val in pairs(tbl) do if type(key) == 'number' and key >= idx then if key > tmp then cache[key - len] = val end tbl[key] = nil end end for key, val in pairs(cache) do tbl[key] = val end end -- Make a reduced copy of a table (shifting in both directions if necessary) local function copy_table_reduced (tbl, idx, len) local ret, tmp = {}, idx + len - 1 if idx > 0 then for key, val in pairs(tbl) do if type(key) ~= 'number' or key < idx then ret[key] = val elseif key > tmp then ret[key - len] = val end end elseif tmp > 0 then local nshift = 1 - idx for key, val in pairs(tbl) do if type(key) ~= 'number' then ret[key] = val elseif key > tmp then ret[key - tmp] = val elseif key < idx then ret[key + nshift] = val end end else for key, val in pairs(tbl) do if type(key) ~= 'number' or key > tmp then ret[key] = val elseif key < idx then ret[key + len] = val end end end return ret end -- Make an expanded copy of a table (shifting in both directions if necessary) local function copy_table_expanded (tbl, idx, len) local ret, tmp = {}, idx + len - 1 if idx > 0 then for key, val in pairs(tbl) do if type(key) ~= 'number' or key < idx then ret[key] = val else ret[key + len] = val end end elseif tmp > 0 then local nshift = idx - 1 for key, val in pairs(tbl) do if type(key) ~= 'number' then ret[key] = val elseif key > 0 then ret[key + tmp] = val elseif key < 1 then ret[key + nshift] = val end end else for key, val in pairs(tbl) do if type(key) ~= 'number' or key > tmp then ret[key] = val else ret[key - len] = val end end end return ret end -- Given a table, create two new tables containing the sorted list of keys local function get_key_list_sorted (tbl, sort_fn) local nums, words, nn, nw = {}, {}, 0, 0 for key, val in pairs(tbl) do if type(key) == 'number' then nn = nn + 1 nums[nn] = key else nw = nw + 1 words[nw] = key end end table.sort(nums) table.sort(words, sort_fn) return nums, words, nn, nw end -- Parse a parameter name string and return it as a string or a number local function get_parameter_name (par_str) local ret = par_str:match'^%s*(.-)%s*$' if ret ~= '0' and ret:find'^%-?[1-9]%d*$' == nil then return ret end return tonumber(ret) end -- Move a key from a table to another, but only if under a different name and -- always parsing numeric strings as numbers local function steal_if_renamed (val, src, skey, dest, dkey) local realkey = get_parameter_name(dkey) if skey ~= realkey then dest[realkey] = val src[skey] = nil end end --[[ Public strings ]]-- ------------------------ -- Special match keywords (functions and modifiers MUST avoid these names) local mkeywords = { ['or'] = 0, pattern = 1, plain = 2, strict = 3 } -- Sort functions (functions and modifiers MUST avoid these names) local sortfunctions = { alphabetically = false, naturally = natural_sort } -- Callback styles for the `mapping_*` and `renaming_*` class of modifiers -- (functions and modifiers MUST avoid these names) --[[ Meanings of the columns: col[1] = Loop type (0-3) col[2] = Number of module arguments that the style requires (1-3) col[3] = Minimum number of sequential parameters passed to the callback col[4] = Name of the callback parameter where to place each parameter name col[5] = Name of the callback parameter where to place each parameter value col[6] = Argument in the modifier's invocation that will override `col[4]` col[7] = Argument in the modifier's invocation that will override `col[5]` A value of `-1` indicates that no meaningful value is stored (i.e. `nil`) ]]-- local mapping_styles = { names_and_values = { 3, 2, 2, 1, 2, -1, -1 }, values_and_names = { 3, 2, 2, 2, 1, -1, -1 }, values_only = { 1, 2, 1, -1, 1, -1, -1 }, names_only = { 2, 2, 1, 1, -1, -1, -1 }, names_and_values_as = { 3, 4, 0, -1, -1, 2, 3 }, names_only_as = { 2, 3, 0, -1, -1, 2, -1 }, values_only_as = { 1, 3, 0, -1, -1, -1, 2 }, blindly = { 0, 2, 0, -1, -1, -1, -1 } } -- Memory slots (functions and modifiers MUST avoid these names) local memoryslots = { h = 'header', f = 'footer', i = 'itersep', l = 'lastsep', n = 'ifngiven', p = 'pairsep', s = 'oxfordsep' } -- Possible trimming modes for the `parsing` modifier local trim_parse_opts = { trim_none = { false, false }, trim_positional = { false, true }, trim_named = { true, false }, trim_all = { true, true } } -- Possible string modes for the iteration separator in the `parsing` and -- `reinterpreting` modifiers local isep_parse_opts = { splitter_pattern = false, splitter_string = true } -- Possible string modes for the key-value separator in the `parsing` and -- `reinterpreting` modifiers local psep_parse_opts = { setter_pattern = false, setter_string = true } -- Possible position references for the `splicing` modifier local position_references = { add_nothing = 0, add_smallest_number = 1, add_last_of_sequence = 2, add_largest_number = 3 } -- Functions and modifiers MUST avoid these names too: `let`, `here`, -- `in_substack`, `without_sorting` --[[ Private constants ]]-- --------------------------- -- Hard-coded name of the module (to avoid going through `frame:getTitle()`) local modulename = 'Module:Params' -- The functions listed here declare that they don't need the `frame.args` -- metatable to be copied into a regular table; if they are modifiers they also -- guarantee that they will make their own (modified) copy available local refpipe = { call_for_each_group = true, --coins = true, count = true, evaluating = true, for_each = true, list = true, list_values = true, list_maybe_with_names = true, value_of = true } -- The functions listed here declare that they don't need the -- `frame:getParent().args` metatable to be copied into a regular table; if -- they are modifiers they also guarantee that they will make their own -- (modified) copy available local refparams = { call_for_each_group = true, combining = true, combining_by_calling = true, combining_values = true, concat_and_call = true, concat_and_invoke = true, concat_and_magic = true, count = true, grouping_by_calling = true, mixing_names_and_values = true, renaming_by_mixing = true, renaming_to_sequence = true, renaming_to_uppercase = true, renaming_to_lowercase = true, --renaming_to_values = true, shifting = true, splicing = true, --swapping_names_and_values = true, value_of = true, with_name_matching = true } -- Maximum number of numeric parameters that can be filled, if missing (we -- chose an arbitrary number for this constant; you can discuss about its -- optimal value at Module talk:Params) local maxfill = 1024 -- The private table of functions local library = {} -- Functions and modifiers that can only be invoked in first position local static_iface = {} --[[ Private functions ]]-- --------------------------- -- Create a new context local function context_new (child_frame) local ctx = {} ctx.frame = child_frame:getParent() ctx.opipe = child_frame.args ctx.oparams = ctx.frame.args ctx.firstposonly = static_iface ctx.iterfunc = pairs ctx.sorttype = 0 ctx.n_parents = 0 ctx.n_children = 0 ctx.n_available = maxfill return ctx end -- Move to the next action within the user-given list local function context_iterate (ctx, n_forward) local nextfn if ctx.pipe[n_forward] ~= nil then nextfn = ctx.pipe[n_forward]:match'^%s*(.*%S)' end if nextfn == nil then error(modulename .. ': You must specify a function to call', 0) end if library[nextfn] == nil then if ctx.firstposonly[nextfn] == nil then error(modulename .. ': The function ‘' .. nextfn .. '’ does not exist', 0) else error(modulename .. ': The ‘' .. nextfn .. '’ directive can only appear in first position', 0) end end remove_numeric_keys(ctx.pipe, 1, n_forward) return library[nextfn] end -- Main loop local function main_loop (ctx, start_with) local fn = start_with repeat fn = fn(ctx) until not fn if ctx.n_parents > 0 then error(modulename .. ': One or more ‘merging_substack’ directives are missing', 0) end if ctx.n_children > 0 then error(modulename .. ', For some of the snapshots either the ‘flushing’ directive is missing or a group has not been properly closed with ‘merging_substack’', 0) end end -- Load a `setting`-like directive string into the `dest` table local function set_strings (dest, opts, start_from) local cmd if opts[start_from] == nil then return start_from - 1 end cmd = opts[start_from]:gsub('%s+', ''):gsub('/+', '/') :match'^/*(.*[^/])' if cmd == nil then return start_from end local amap, sep, argc = {}, string.byte('/'), start_from + 1 local vname local chr for idx = 1, #cmd do chr = cmd:byte(idx) if chr == sep then for key, val in ipairs(amap) do dest[val] = opts[argc] amap[key] = nil end argc = argc + 1 else vname = memoryslots[string.char(chr)] if vname == nil then error(modulename .. ', ‘setting’: Unknown slot ‘' .. string.char(chr) .. '’', 0) end table.insert(amap, vname) end end for key, val in ipairs(amap) do dest[val] = opts[argc] end return argc end -- Add a new stack of parameters to `ctx.children` local function new_substack (ctx) local newparams = {} local currsnap = ctx.n_children + 1 if ctx.children == nil then ctx.children = { newparams } else ctx.children[currsnap] = newparams end ctx.n_children = currsnap return newparams end -- Parse a raw argument containing a `sortfunctions` directive, or -- `'without_sorting'`, or `nil` local function load_sort_opt (raw_arg) if raw_arg == nil then return nil, 1, false end local tmp = raw_arg:match'^%s*(.-)%s*$' if tmp == 'without_sorting' then return nil, 2, false end tmp = sortfunctions[tmp] if tmp == nil then return nil, 1, false end return tmp or nil, 2, true end -- Parse optional user arguments of type `...|[let]|[...][number of additional -- parameters]|[parameter 1]|[parameter 2]|[...]` local function load_child_opts (src, start_from, append_after) local tbl, pin = {}, start_from local tnamed while src[pin] ~= nil and src[pin]:match'^%s*let%s*$' and src[pin + 1] ~= nil and src[pin + 2] ~= nil do tbl[get_parameter_name(src[pin + 1])] = src[pin + 2] pin = pin + 3 end if pin ~= start_from then tnamed, tbl = tbl, {} end local tmp = tonumber(src[pin]) if tmp ~= nil and math.floor(tmp) == tmp then if tmp < 0 then tmp = -1 end local shf = append_after - pin for idx = pin + 1, pin + tmp do tbl[idx + shf] = src[idx] end pin = pin + tmp + 1 end if tnamed ~= nil then for key, val in pairs(tnamed) do tbl[key] = val end end return tbl, pin end -- Load the optional arguments of some of the `mapping_*` and `renaming_*` -- class of modifiers local function load_callback_opts (src, n_skip, default_style) local style local shf local tmp = src[n_skip + 1] if tmp ~= nil then style = mapping_styles[tmp:match'^%s*(.-)%s*$'] end if style == nil then style, shf = default_style, n_skip - 1 else shf = n_skip end local n_exist, karg, varg = style[3], style[4], style[5] tmp = style[6] if tmp > -1 then karg = src[tmp + shf]:match'^%s*(.-)%s*$' if karg == '0' or karg:find'^%-?[1-9]%d*$' ~= nil then karg = tonumber(karg) n_exist = math.max(n_exist, karg) end end tmp = style[7] if tmp > -1 then varg = src[tmp + shf]:match'^%s*(.-)%s*$' if varg == '0' or varg:find'^%-?[1-9]%d*$' ~= nil then varg = tonumber(varg) n_exist = math.max(n_exist, varg) end end local dest, nargs = load_child_opts(src, style[2] + shf, n_exist) tmp = style[1] if (tmp == 3 or tmp == 2) and dest[karg] ~= nil then tmp = tmp - 2 end if (tmp == 3 or tmp == 1) and dest[varg] ~= nil then tmp = tmp - 1 end return dest, nargs, tmp, karg, varg end -- Parse the arguments of some of the `mapping_*` and `renaming_*` class of -- modifiers local function load_replace_args (opts, whoami) if opts[1] == nil then error(modulename .. ', ‘' .. whoami .. '’: No pattern string was given', 0) end if opts[2] == nil then error(modulename .. ', ‘' .. whoami .. '’: No replacement string was given', 0) end local ptn, repl, nmax, argc = opts[1], opts[2], tonumber(opts[3]), 3 if nmax ~= nil or (opts[3] or ''):match'^%s*$' ~= nil then argc = 4 end local flg = opts[argc] if flg ~= nil then flg = mkeywords[flg:match'^%s*(.-)%s*$'] end if flg == 0 then flg = nil elseif flg ~= nil then argc = argc + 1 end return ptn, repl, nmax, flg, argc, (nmax ~= nil and nmax < 1) or (flg == 3 and ptn == repl) end -- Parse the arguments of the `with_*_matching` class of modifiers local function load_pattern_args (opts, whoami) local ptns, state, nptns, cnt = {}, 0, 0, 1 local keyw for _, val in ipairs(opts) do if state == 0 then nptns, state = nptns + 1, -1 ptns[nptns] = { val, false, false } else keyw = val:match'^%s*(.*%S)' if keyw == nil or mkeywords[keyw] == nil or ( state > 0 and mkeywords[keyw] > 0 ) then break else state = mkeywords[keyw] if state > 1 then ptns[nptns][2] = true end if state == 3 then ptns[nptns][3] = true end end end cnt = cnt + 1 end if state == 0 then error(modulename .. ', ‘' .. whoami .. '’: No pattern was given', 0) end return ptns, nptns, cnt end -- Load the optional arguments of the `parsing`, `reinterpreting` and -- `evaluating` modifiers local function load_parse_opts (opts, start_from, isp, psp) local tmp local optslots, noptslots, argc = { true, true, true }, 3, start_from local trimn, trimu, iplain, pplain = true, false, true, true repeat noptslots, tmp = noptslots - 1, opts[argc] if tmp == nil then break end tmp = tmp:match'^%s*(.-)%s*$' if optslots[1] ~= nil and trim_parse_opts[tmp] ~= nil then tmp = trim_parse_opts[tmp] trimn, trimu = tmp[1], tmp[2] optslots[1] = nil elseif optslots[2] ~= nil and isep_parse_opts[tmp] ~= nil then argc = argc + 1 iplain, isp = isep_parse_opts[tmp], opts[argc] optslots[2] = nil elseif optslots[3] ~= nil and psep_parse_opts[tmp] ~= nil then argc = argc + 1 pplain, psp = psep_parse_opts[tmp], opts[argc] optslots[3] = nil else break end argc = argc + 1 until noptslots < 1 return isp, iplain, psp, pplain, trimn, trimu, argc end -- Map parameters' values using a custom callback and a referenced table local value_maps = { [0] = function (tbl, margs, karg, varg, fn) for key in pairs(tbl) do tbl[key] = fn() end end, [1] = function (tbl, margs, karg, varg, fn) for key, val in pairs(tbl) do margs[varg] = val tbl[key] = fn() end end, [2] = function (tbl, margs, karg, varg, fn) for key in pairs(tbl) do margs[karg] = key tbl[key] = fn() end end, [3] = function (tbl, margs, karg, varg, fn) for key, val in pairs(tbl) do margs[karg] = key margs[varg] = val tbl[key] = fn() end end } -- Private table for `map_names()` local name_thieves = { [0] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do steal_if_renamed(val, tbl, key, cache, fn()) end end, [1] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do rargs[varg] = val steal_if_renamed(val, tbl, key, cache, fn()) end end, [2] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do rargs[karg] = key steal_if_renamed(val, tbl, key, cache, fn()) end end, [3] = function (cache, tbl, rargs, karg, varg, fn) for key, val in pairs(tbl) do rargs[karg] = key rargs[varg] = val steal_if_renamed(val, tbl, key, cache, fn()) end end } -- Map parameters' names using a custom callback and a referenced table local function map_names (tbl, rargs, karg, varg, looptype, fn) local cache = {} name_thieves[looptype](cache, tbl, rargs, karg, varg, fn) for key, val in pairs(cache) do tbl[key] = val end end -- Return a new table that contains `src` regrouped according to the numeric -- suffixes in its keys local function make_groups (src) -- NOTE: `src` might be the original metatable! local prefix local gid local groups = {} for key, val in pairs(src) do -- `key` must only be a string or a number... if type(key) == 'string' then prefix, gid = key:match'^%s*(.-)%s*(%-?%d*)%s*$' gid = tonumber(gid) or '' else prefix = '' gid = key end if groups[gid] == nil then groups[gid] = {} end if prefix == '0' or prefix:find'^%-?[1-9]%d*$' ~= nil then prefix = tonumber(prefix) if prefix < 1 then prefix = prefix - 1 end end groups[gid][prefix] = val end return groups end -- Split into parts a string containing the `$#` and `$@` placeholders and -- return the information as a skeleton table, a canvas table and a length local function parse_placeholder_string (target) local skel = {} local canvas = {} local idx = 1 local s_pos = 1 local e_pos = string.find(target, '%$[@#]', 1, false) while e_pos ~= nil do canvas[idx] = target:sub(s_pos, e_pos - 1) skel[idx + 1] = target:sub(e_pos, e_pos + 1) == '$@' idx = idx + 2 s_pos = e_pos + 2 e_pos = string.find(target, '%$[@#]', s_pos, false) end if (s_pos > target:len()) then idx = idx - 1 else canvas[idx] = target:sub(s_pos) end return skel, canvas, idx end -- Populate a table by parsing a parameter string (heavy lifting for `parsing`, -- `reinterpreting` and `evaluating`) local function parse_parameter_string (tbl, str, isp, ipl, psp, ppl, trn, tru) local key local val local spos1 local spos2 local pos1 local pos2 local pos3 = 0 local idx = 1 local lenplone = #str + 1 if isp == nil or isp == '' then if psp == nil or psp == '' then if tru then tbl[idx] = str:match'^%s*(.-)%s*$' else tbl[idx] = str end return idx end spos1, spos2 = str:find(psp, 1, ppl) if spos1 == nil then key = idx if tru then val = str:match'^%s*(.-)%s*$' else val = str end idx = idx + 1 else key = get_parameter_name(str:sub(1, spos1 - 1)) val = str:sub(spos2 + 1) if trn then val = val:match'^%s*(.-)%s*$' end end tbl[key] = val return idx end if psp == nil or psp == '' then repeat pos1 = pos3 + 1 pos2, pos3 = str:find(isp, pos1, ipl) val = str:sub(pos1, (pos2 or lenplone) - 1) if tru then val = val:match'^%s*(.-)%s*$' end tbl[idx] = val idx = idx + 1 until pos2 == nil return idx end repeat pos1 = pos3 + 1 pos2, pos3 = str:find(isp, pos1, ipl) val = str:sub(pos1, (pos2 or lenplone) - 1) spos1, spos2 = val:find(psp, 1, ppl) if spos1 == nil then key = idx if tru then val = val:match'^%s*(.-)%s*$' end idx = idx + 1 else key = get_parameter_name(val:sub(1, spos1 - 1)) val = val:sub(spos2 + 1) if trn then val = val:match'^%s*(.-)%s*$' end end tbl[key] = val until pos2 == nil return idx end -- Heavy lifting for `combining` and `combining_values` local function combine_parameters (ctx, keyval_fn, whoami) -- NOTE: `ctx.params` might be the original metatable! This function -- MUST create a copy of it before returning local opts = ctx.pipe if ctx.pipe[1] == nil then error(modulename .. ', ‘' .. whoami .. '’: No parameter name was provided', 0) end local tbl = ctx.params local vars = {} local sortfn, tmp, do_sort = load_sort_opt(opts[2]) local argc = set_strings(vars, opts, tmp + 1) if argc < tmp then error(modulename .. ', ‘' .. whoami .. '’: No setting directive was given', 0) end if next(tbl) == nil then if vars.ifngiven ~= nil then ctx.params = { [get_parameter_name(ctx.pipe[1])] = vars.ifngiven } elseif tbl == ctx.oparams then ctx.params = {} end return argc end local cache local len if do_sort then local words cache, words, len, tmp = get_key_list_sorted(tbl, sortfn) for idx = 1, tmp do cache[len + idx] = words[idx] end len = len + tmp else cache = {} len = 0 for key in pairs(tbl) do len = len + 1 cache[len] = key end end local pmap, nss, kvs, pps = {}, 0, vars.pairsep or '', vars.itersep or '' for idx = 1, len do tmp = cache[idx] pmap[nss + 1] = pps pmap[nss + 2] = keyval_fn(tmp, tbl[tmp], kvs) nss = nss + 2 end tmp = vars.oxfordsep or vars.lastsep if tmp ~= nil and nss > 4 then pmap[nss - 1] = tmp elseif nss > 2 and vars.lastsep ~= nil then pmap[nss - 1] = vars.lastsep end pmap[1] = vars.header or '' if vars.footer ~= nil then pmap[nss + 1] = vars.footer end ctx.params = { [get_parameter_name(ctx.pipe[1])] = table.concat(pmap) } return argc end -- Concatenate the numeric keys from the table of parameters to the numeric -- keys from the table of options; non-numeric keys from the table of options -- will prevail over colliding non-numeric keys from the table of parameters local function concat_params (ctx) local retval, tbl, nmax = {}, ctx.params, table.maxn(ctx.pipe) if ctx.subset == 1 then -- We need only the sequence for key, val in ipairs(tbl) do retval[key + nmax] = val end else if ctx.subset == -1 then for key in ipairs(tbl) do tbl[key] = nil end end for key, val in pairs(tbl) do if type(key) == 'number' and key > 0 then retval[key + nmax] = val else retval[key] = val end end end for key, val in pairs(ctx.pipe) do retval[key] = val end return retval end -- Flush the parameters by calling a custom function for each value (after this -- function has been invoked `ctx.params` will be no longer usable) local function flush_params (ctx, fn) local tbl = ctx.params if ctx.subset == 1 then for key, val in ipairs(tbl) do fn(key, val) end return end if ctx.subset == -1 then for key, val in ipairs(tbl) do tbl[key] = nil end end if ctx.sorttype > 0 then local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort) if ctx.sorttype == 2 then for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end return end for idx = 1, nn do fn(nums[idx], tbl[nums[idx]]) end for idx = 1, nw do fn(words[idx], tbl[words[idx]]) end return end if ctx.subset ~= -1 then for key, val in ipairs(tbl) do fn(key, val) tbl[key] = nil end end for key, val in pairs(tbl) do fn(key, val) end end -- Flush the parameters by calling one of two custom functions for each value -- (after this function has been invoked `ctx.params` will be no longer usable) local function mixed_flush_params (ctx, fn_seq, fn_oth) if ctx.subset == 1 then for key, val in ipairs(ctx.params) do fn_seq(key, val) end return end if ctx.subset == -1 then flush_params(ctx, fn_oth) return end local tbl = ctx.params if ctx.sorttype > 0 then local nums, words, nn, nw = get_key_list_sorted(tbl, natural_sort) local sequence = {} for key, val in ipairs(tbl) do sequence[key] = val end if ctx.sorttype == 2 then for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end end for idx = 1, nn do if sequence[nums[idx]] then fn_seq(nums[idx], sequence[nums[idx]]) else fn_oth(nums[idx], tbl[nums[idx]]) end end if ctx.sorttype ~= 2 then for idx = 1, nw do fn_oth(words[idx], tbl[words[idx]]) end end return end for key, val in ipairs(tbl) do fn_seq(key, val) tbl[key] = nil end for key, val in pairs(tbl) do fn_oth(key, val) end end -- Finalize and return a concatenated list local function finalize_and_return_concatenated_list (ctx, lst, len, modsize) if len > 0 then local tmp = ctx.oxfordsep or ctx.lastsep if tmp ~= nil and len > modsize * 2 then lst[len - modsize + 1] = tmp elseif len > modsize and ctx.lastsep ~= nil then lst[len - modsize + 1] = ctx.lastsep end lst[1] = ctx.header or '' if ctx.footer ~= nil then lst[len + 1] = ctx.footer end ctx.text = table.concat(lst) else ctx.text = ctx.ifngiven or '' end end --- --- --- PUBLIC ENVIRONMENT --- --- ________________________________ --- --- --- --[[ Modifiers ]]-- ------------------- -- Syntax: #invoke:params|sequential|pipe to library.sequential = function (ctx) if ctx.subset == 1 then error(modulename .. ': The ‘sequential’ directive has been provided more than once', 0) end if ctx.subset == -1 then error(modulename .. ': The two directives ‘non-sequential’ and ‘sequential’ are in contradiction with each other', 0) end if ctx.sorttype > 0 then error(modulename .. ': The ‘all_sorted’ and ‘reassorted’ directives are redundant when followed by ‘sequential’', 0) end ctx.iterfunc = ipairs ctx.subset = 1 return context_iterate(ctx, 1) end -- Syntax: #invoke:params|non-sequential|pipe to library['non-sequential'] = function (ctx) if ctx.subset == -1 then error(modulename .. ': The ‘non-sequential’ directive has been provided more than once', 0) end if ctx.subset == 1 then error(modulename .. ': The two directives ‘sequential’ and ‘non-sequential’ are in contradiction with each other', 0) end ctx.iterfunc = pairs ctx.subset = -1 return context_iterate(ctx, 1) end -- Syntax: #invoke:params|all_sorted|pipe to library.all_sorted = function (ctx) if ctx.sorttype == 1 then error(modulename .. ': The ‘all_sorted’ directive has been provided more than once', 0) end if ctx.subset == 1 then error(modulename .. ': The ‘all_sorted’ directive is redundant after ‘sequential’', 0) end if ctx.sorttype == 2 then error(modulename .. ': The two directives ‘reassorted’ and ‘sequential’ are in contradiction with each other', 0) end ctx.sorttype = 1 return context_iterate(ctx, 1) end -- Syntax: #invoke:params|reassorted|pipe to library.reassorted = function (ctx) if ctx.sorttype == 2 then error(modulename .. ': The ‘reassorted’ directive has been provided more than once', 0) end if ctx.subset == 1 then error(modulename .. ': The ‘reassorted’ directive is redundant after ‘sequential’', 0) end if ctx.sorttype == 1 then error(modulename .. ': The two directives ‘sequential’ and ‘reassorted’ are in contradiction with each other', 0) end ctx.sorttype = 2 return context_iterate(ctx, 1) end -- Syntax: #invoke:params|setting|directives|...|pipe to library.setting = function (ctx) local argc = set_strings(ctx, ctx.pipe, 1) if argc < 2 then error(modulename .. ', ‘setting’: No directive was given', 0) end return context_iterate(ctx, argc + 1) end -- Syntax: #invoke:params|scoring|new parameter name|[container]|pipe to library.scoring = function (ctx) if ctx.pipe[1] == nil then error(modulename .. ', ‘scoring’: No parameter name was provided', 0) end local tmp local retval, opts = 0, ctx.pipe for _ in pairs(ctx.params) do retval = retval + 1 end if opts[2] ~= nil then tmp = opts[2]:match'^%s*(.*%S)' end if tmp == 'here' then ctx.params[get_parameter_name(opts[1])] = tostring(retval) return context_iterate(ctx, 3) end new_substack(ctx)[get_parameter_name(opts[1])] = tostring(retval) return context_iterate(ctx, tmp == 'in_substack' and 3 or 2) end -- Syntax: #invoke:params|squeezing|pipe to library.squeezing = function (ctx) local store, indices, tbl, newlen = {}, {}, ctx.params, 0 for key, val in pairs(tbl) do if type(key) == 'number' then newlen = newlen + 1 indices[newlen] = key store[key] = val tbl[key] = nil end end table.sort(indices) for idx = 1, newlen do tbl[idx] = store[indices[idx]] end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|filling_the_gaps|pipe to library.filling_the_gaps = function (ctx) local tbl, tmp, nmin, nmax, nnums = ctx.params, {}, 1, nil, -1 for key, val in pairs(tbl) do if type(key) == 'number' then if nmax == nil then if key < nmin then nmin = key end nmax = key elseif key > nmax then nmax = key elseif key < nmin then nmin = key end nnums = nnums + 1 tmp[key] = val end end if nmax ~= nil and nmax - nmin > nnums then ctx.n_available = ctx.n_available + nmin + nnums - nmax if ctx.n_available < 0 then error(modulename .. ', ‘filling_the_gaps’: It is possible to fill at most ' .. tostring(maxfill) .. ' parameters', 0) end for idx = nmin, nmax, 1 do tbl[idx] = '' end for key, val in pairs(tmp) do tbl[key] = val end end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|clearing|pipe to library.clearing = function (ctx) local tbl = ctx.params local numerics = {} for key, val in pairs(tbl) do if type(key) == 'number' then numerics[key] = val tbl[key] = nil end end for key, val in ipairs(numerics) do tbl[key] = val end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|cutting|left cut|right cut|pipe to library.cutting = function (ctx) local lcut = tonumber(ctx.pipe[1]) if lcut == nil or math.floor(lcut) ~= lcut then error(modulename .. ', ‘cutting’: Left cut must be an integer number', 0) end local rcut = tonumber(ctx.pipe[2]) if rcut == nil or math.floor(rcut) ~= rcut then error(modulename .. ', ‘cutting’: Right cut must be an integer number', 0) end local tbl = ctx.params local len = #tbl if lcut < 0 then lcut = len + lcut end if rcut < 0 then rcut = len + rcut end local tot = lcut + rcut if tot > 0 then local cache = {} if tot >= len then for key in ipairs(tbl) do tbl[key] = nil end tot = len else for idx = len - rcut + 1, len, 1 do tbl[idx] = nil end for idx = 1, lcut, 1 do tbl[idx] = nil end end for key, val in pairs(tbl) do if type(key) == 'number' and key > 0 then if key > len then cache[key - tot] = val else cache[key - lcut] = val end tbl[key] = nil end end for key, val in pairs(cache) do tbl[key] = val end end return context_iterate(ctx, 3) end -- Syntax: #invoke:params|cropping|left crop|right crop|pipe to library.cropping = function (ctx) local lcut = tonumber(ctx.pipe[1]) if lcut == nil or math.floor(lcut) ~= lcut then error(modulename .. ', ‘cropping’: Left crop must be an integer number', 0) end local rcut = tonumber(ctx.pipe[2]) if rcut == nil or math.floor(rcut) ~= rcut then error(modulename .. ', ‘cropping’: Right crop must be an integer number', 0) end local tbl = ctx.params local nmin local nmax for key in pairs(tbl) do if type(key) == 'number' then if nmin == nil then nmin, nmax = key, key elseif key > nmax then nmax = key elseif key < nmin then nmin = key end end end if nmin ~= nil then local len = nmax - nmin + 1 if lcut < 0 then lcut = len + lcut end if rcut < 0 then rcut = len + rcut end if lcut + rcut - len > -1 then for key in pairs(tbl) do if type(key) == 'number' then tbl[key] = nil end end elseif lcut + rcut > 0 then for idx = nmax - rcut + 1, nmax do tbl[idx] = nil end for idx = nmin, nmin + lcut - 1 do tbl[idx] = nil end local lshift = nmin + lcut - 1 if lshift > 0 then for idx = lshift + 1, nmax, 1 do tbl[idx - lshift] = tbl[idx] tbl[idx] = nil end end end end return context_iterate(ctx, 3) end -- Syntax: #invoke:params|purging|start offset|length|pipe to library.purging = function (ctx) local idx = tonumber(ctx.pipe[1]) if idx == nil or math.floor(idx) ~= idx then error(modulename .. ', ‘purging’: Start offset must be an integer number', 0) end local len = tonumber(ctx.pipe[2]) if len == nil or math.floor(len) ~= len then error(modulename .. ', ‘purging’: Length must be an integer number', 0) end local tbl = ctx.params if len < 1 then len = len + table.maxn(tbl) if idx > len then return context_iterate(ctx, 3) end len = len - idx + 1 end ctx.params = copy_table_reduced(tbl, idx, len) return context_iterate(ctx, 3) end -- Syntax: #invoke:params|backpurging|start offset|length|pipe to library.backpurging = function (ctx) local last = tonumber(ctx.pipe[1]) if last == nil or math.floor(last) ~= last then error(modulename .. ', ‘backpurging’: Start offset must be an integer number', 0) end local len = tonumber(ctx.pipe[2]) if len == nil or math.floor(len) ~= len then error(modulename .. ', ‘backpurging’: Length must be an integer number', 0) end local idx local tbl = ctx.params if len > 0 then idx = last - len + 1 else for key in pairs(tbl) do if type(key) == 'number' and (idx == nil or key < idx) then idx = key end end if idx == nil then return context_iterate(ctx, 3) end idx = idx - len if last < idx then return context_iterate(ctx, 3) end len = last - idx + 1 end ctx.params = copy_table_reduced(ctx.params, idx, len) return context_iterate(ctx, 3) end -- Syntax: #invoke:params|shifting|addend|pipe to library.shifting = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local nshift = tonumber(ctx.pipe[1]) if nshift == nil or nshift == 0 or math.floor(nshift) ~= nshift then error(modulename .. ', ‘shifting’: A non-zero integer number must be provided', 0) end local tbl = {} for key, val in pairs(ctx.params) do if type(key) == 'number' then tbl[key + nshift] = val else tbl[key] = val end end ctx.params = tbl return context_iterate(ctx, 2) end -- Syntax: #invoke:params|reversing_numeric_names|pipe to library.reversing_numeric_names = function (ctx) local tbl, numerics, nmax = ctx.params, {}, 0 for key, val in pairs(tbl) do if type(key) == 'number' then numerics[key] = val tbl[key] = nil if key > nmax then nmax = key end end end for key, val in pairs(numerics) do tbl[nmax - key + 1] = val end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|pivoting_numeric_names|pipe to --[[ library.pivoting_numeric_names = function (ctx) local tbl = ctx.params local shift = #tbl + 1 if shift < 2 then return library.reversing_numeric_names(ctx) end local numerics = {} for key, val in pairs(tbl) do if type(key) == 'number' then numerics[key] = val tbl[key] = nil end end for key, val in pairs(numerics) do tbl[shift - key] = val end return context_iterate(ctx, 1) end ]]-- -- Syntax: #invoke:params|mirroring_numeric_names|pipe to --[[ library.mirroring_numeric_names = function (ctx) local tbl, numerics = ctx.params, {} local nmax local nmin for key, val in pairs(tbl) do if type(key) == 'number' then numerics[key] = val tbl[key] = nil if nmax == nil then nmin, nmax = key, key elseif key > nmax then nmax = key elseif key < nmin then nmin = key end end end for key, val in pairs(numerics) do tbl[nmax + nmin - key] = val end return context_iterate(ctx, 1) end ]]-- -- Syntax: #invoke:params|swapping_numeric_names|pipe to --[[ library.swapping_numeric_names = function (ctx) local tbl, cache, nsize = ctx.params, {}, 0 local tmp for key in pairs(tbl) do if type(key) == 'number' then nsize = nsize + 1 cache[nsize] = key end end table.sort(cache) for idx = math.floor(nsize / 2), 1, -1 do tmp = tbl[cache[idx] ] tbl[cache[idx] ] = tbl[cache[nsize - idx + 1] ] tbl[cache[nsize - idx + 1] ] = tmp end return context_iterate(ctx, 1) end ]]-- -- Syntax: #invoke:params|sorting_sequential_values|[criterion]|pipe to library.sorting_sequential_values = function (ctx) local sortfn if ctx.pipe[1] ~= nil then sortfn = sortfunctions[ctx.pipe[1]:match'^%s*(.-)%s*$'] end if sortfn then table.sort(ctx.params, sortfn) else table.sort(ctx.params) end -- i.e. either `false` or `nil` if sortfn == nil then return context_iterate(ctx, 1) end return context_iterate(ctx, 2) end -- Syntax: #invoke:params|splicing|[add to position]|position|increment| -- [number of elements to write]|...|pipe to library.splicing = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts, tbl = ctx.pipe, ctx.params local tmp1 = opts[1] local tmp2 local argc local pos local refp if tmp1 ~= nil then tmp2 = tonumber(tmp1) if tmp2 == nil or math.floor(tmp2) ~= tmp2 then pos, argc, tmp2 = tonumber(opts[2]), 4, tmp1:match'^%s*(.*%S)' if tmp2 ~= nil then refp = position_references[tmp2] if refp == nil then error(modulename .. ', ‘splicing’: ‘' .. tostring(tmp2) .. '’ is not a valid first argument', 0) end else refp = 0 end else pos, argc, refp = tmp2, 3, 0 end else pos, argc, refp = tonumber(opts[2]), 4, 0 end if pos == nil or math.floor(pos) ~= pos then error(modulename .. ', ‘splicing’: The position must be an integer number', 0) end local len = tonumber(opts[argc - 1]) if len == nil or math.floor(len) ~= len then error(modulename .. ', ‘splicing’: The increment must be an integer number', 0) end if refp == 2 then for _ in ipairs(tbl) do pos = pos + 1 end refp = 0 end tmp1, tmp2 = nil, nil if refp ~= 0 or len ~= 0 then for key, val in pairs(tbl) do if type(key) == 'number' then if tmp1 == nil then tmp1, tmp2 = key, key elseif key < tmp1 then tmp1 = key elseif key > tmp2 then tmp2 = key end end end end if tmp2 == nil then len = 0 elseif refp == 3 then pos = pos + tmp2 elseif refp == 1 then pos = pos + tmp1 end if len > 0 and pos + len > tmp1 and pos <= tmp2 then tbl = copy_table_expanded(tbl, pos, len) elseif len < 0 and pos - len > tmp1 and pos <= tmp2 then tbl = copy_table_reduced(tbl, pos, -len) else tbl = copy_or_ref_table(tbl, tbl ~= ctx.oparams) end ctx.params = tbl tmp1 = tonumber(opts[argc]) if len == 0 and (tmp1 == nil or tmp1 < 1) then error(modulename .. ', ‘splicing’: When the increment is zero the number of elements to add cannot be zero', 0) end if tmp1 == nil or tmp1 < 0 or math.floor(tmp1) ~= tmp1 then return context_iterate(ctx, argc) end tmp2 = argc - pos + 1 for key = pos, pos + tmp1 - 1 do tbl[key] = opts[key + tmp2] end return context_iterate(ctx, argc + tmp1 + 1) end -- Syntax: #invoke:params|imposing|name|value|pipe to library.imposing = function (ctx) if ctx.pipe[1] == nil then error(modulename .. ', ‘imposing’: Missing parameter name to impose', 0) end ctx.params[get_parameter_name(ctx.pipe[1])] = ctx.pipe[2] return context_iterate(ctx, 3) end -- Syntax: #invoke:params|providing|name|value|pipe to library.providing = function (ctx) if ctx.pipe[1] == nil then error(modulename .. ', ‘providing’: Missing parameter name to provide', 0) end local key = get_parameter_name(ctx.pipe[1]) if ctx.params[key] == nil then ctx.params[key] = ctx.pipe[2] end return context_iterate(ctx, 3) end -- Syntax: #invoke:params|discarding|name|[how many]|pipe to library.discarding = function (ctx) if ctx.pipe[1] == nil then error(modulename .. ', ‘discarding’: Missing parameter name to discard', 0) end local len = tonumber(ctx.pipe[2]) if len == nil then ctx.params[get_parameter_name(ctx.pipe[1])] = nil return context_iterate(ctx, 2) end local key = tonumber(ctx.pipe[1]) if key == nil or math.floor(key) ~= key then error(modulename .. ', ‘discarding’: A range was provided, but the initial parameter name is not an integer number', 0) end if len < 1 or math.floor(len) ~= len then error(modulename .. ', ‘discarding’: A range can only be an integer number greater than zero', 0) end for idx = key, key + len - 1 do ctx.params[idx] = nil end return context_iterate(ctx, 3) end -- Syntax: #invoke:params|excluding_non-numeric_names|pipe to library['excluding_non-numeric_names'] = function (ctx) local tmp = ctx.params for key, val in pairs(tmp) do if type(key) ~= 'number' then tmp[key] = nil end end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|excluding_numeric_names|pipe to library.excluding_numeric_names = function (ctx) local tmp = ctx.params for key, val in pairs(tmp) do if type(key) == 'number' then tmp[key] = nil end end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|with_name_matching|target 1|[plain flag 1]|[or] -- |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag -- N]|pipe to library.with_name_matching = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local targets, nptns, argc = load_pattern_args(ctx.pipe, 'with_name_matching') local tmp local ptn local tbl = ctx.params local newparams = {} for idx = 1, nptns do ptn = targets[idx] if ptn[3] then tmp = ptn[1] if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then tmp = tonumber(tmp) end newparams[tmp] = tbl[tmp] else for key, val in pairs(tbl) do if tostring(key):find(ptn[1], 1, ptn[2]) then newparams[key] = val end end end end ctx.params = newparams return context_iterate(ctx, argc) end -- Syntax: #invoke:params|with_name_not_matching|target 1|[plain flag 1] -- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain -- flag N]|pipe to library.with_name_not_matching = function (ctx) local targets, nptns, argc = load_pattern_args(ctx.pipe, 'with_name_not_matching') local tbl = ctx.params if nptns == 1 and targets[1][3] then local tmp = targets[1][1] if tmp == '0' or tmp:find'^%-?[1-9]%d*$' ~= nil then tbl[tonumber(tmp)] = nil else tbl[tmp] = nil end return context_iterate(ctx, argc) end local yesmatch local ptn for key in pairs(tbl) do yesmatch = true for idx = 1, nptns do ptn = targets[idx] if ptn[3] then if tostring(key) ~= ptn[1] then yesmatch = false break end elseif not tostring(key):find(ptn[1], 1, ptn[2]) then yesmatch = false break end end if yesmatch then tbl[key] = nil end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|with_value_matching|target 1|[plain flag 1]|[or] -- |[target 2]|[plain flag 2]|[or]|[...]|[target N]|[plain flag -- N]|pipe to library.with_value_matching = function (ctx) local tbl = ctx.params local targets, nptns, argc = load_pattern_args(ctx.pipe, 'with_value_matching') local nomatch local ptn for key, val in pairs(tbl) do nomatch = true for idx = 1, nptns do ptn = targets[idx] if ptn[3] then if val == ptn[1] then nomatch = false break end elseif val:find(ptn[1], 1, ptn[2]) then nomatch = false break end end if nomatch then tbl[key] = nil end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|with_value_not_matching|target 1|[plain flag 1] -- |[and]|[target 2]|[plain flag 2]|[and]|[...]|[target N]|[plain -- flag N]|pipe to library.with_value_not_matching = function (ctx) local tbl = ctx.params local targets, nptns, argc = load_pattern_args(ctx.pipe, 'with_value_not_matching') local yesmatch local ptn for key, val in pairs(tbl) do yesmatch = true for idx = 1, nptns do ptn = targets[idx] if ptn[3] then if val ~= ptn[1] then yesmatch = false break end elseif not val:find(ptn[1], 1, ptn[2]) then yesmatch = false break end end if yesmatch then tbl[key] = nil end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|trimming_values|pipe to library.trimming_values = function (ctx) local tbl = ctx.params for key, val in pairs(tbl) do tbl[key] = val:match'^%s*(.-)%s*$' end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|mapping_to_lowercase|pipe to library.mapping_to_lowercase = function (ctx) local tbl = ctx.params for key, val in pairs(tbl) do tbl[key] = val:lower() end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|mapping_to_uppercase|pipe to library.mapping_to_uppercase = function (ctx) local tbl = ctx.params for key, val in pairs(tbl) do tbl[key] = val:upper() end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|mapping_by_calling|template name|[call -- style]|[let]|[...][number of additional parameters]|[parameter -- 1]|[parameter 2]|[...]|[parameter N]|pipe to library.mapping_by_calling = function (ctx) local opts = ctx.pipe local tname if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘mapping_by_calling’: No template name was provided', 0) end local margs, argc, looptype, karg, varg = load_callback_opts(opts, 1, mapping_styles.values_only) local model = { title = tname, args = margs } value_maps[looptype](ctx.params, margs, karg, varg, function () return ctx.frame:expandTemplate(model) end) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_invoking|module name|function -- name|[call style]|[let]|[...]|[number of additional -- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to library.mapping_by_invoking = function (ctx) local opts = ctx.pipe local mname local fname if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘mapping_by_invoking’: No module name was provided', 0) end if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘mapping_by_invoking’: No function name was provided', 0) end local margs, argc, looptype, karg, varg = load_callback_opts(opts, 2, mapping_styles.values_only) local model = { title = 'Module:' .. mname, args = margs } local mfunc = require(model.title)[fname] if mfunc == nil then error(modulename .. ', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end value_maps[looptype](ctx.params, margs, karg, varg, function () return tostring(mfunc(ctx.frame:newChild(model))) end) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_magic|parser function|[call -- style]|[let]|[...][number of additional arguments]|[argument -- 1]|[argument 2]|[...]|[argument N]|pipe to library.mapping_by_magic = function (ctx) local opts = ctx.pipe local magic if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘mapping_by_magic’: No parser function was provided', 0) end local margs, argc, looptype, karg, varg = load_callback_opts(opts, 1, mapping_styles.values_only) value_maps[looptype](ctx.params, margs, karg, varg, function () return ctx.frame:callParserFunction(magic, margs) end) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_replacing|target|replace|[count]|[plain -- flag]|pipe to library.mapping_by_replacing = function (ctx) local ptn, repl, nmax, flg, argc, die = load_replace_args(ctx.pipe, 'mapping_by_replacing') if die then return context_iterate(ctx, argc) end local tbl = ctx.params if flg == 3 then for key, val in pairs(tbl) do if val == ptn then tbl[key] = repl end end else if flg == 2 then -- Copied from Module:String's `str._escapePattern()` ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0') end for key, val in pairs(tbl) do tbl[key] = val:gsub(ptn, repl, nmax) end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|mapping_by_mixing|mixing string|pipe to library.mapping_by_mixing = function (ctx) if ctx.pipe[1] == nil then error(modulename .. ', ‘mapping_by_mixing’: No mixing string was provided', 0) end local mix = ctx.pipe[1] local tbl = ctx.params if mix == '$#' then for key in pairs(tbl) do tbl[key] = tostring(key) end return context_iterate(ctx, 2) end local skel, cnv, n_parts = parse_placeholder_string(mix) for key, val in pairs(tbl) do for idx = 2, n_parts, 2 do if skel[idx] then cnv[idx] = val else cnv[idx] = tostring(key) end end tbl[key] = table.concat(cnv) end return context_iterate(ctx, 2) end -- Syntax: #invoke:params|mapping_to_names|pipe to --[[ library.mapping_to_names = function (ctx) local tbl = ctx.params for key in pairs(tbl) do tbl[key] = tostring(key) end return context_iterate(ctx, 1) end ]]-- -- Syntax: #invoke:params|renaming_to_lowercase|pipe to library.renaming_to_lowercase = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache = {} for key, val in pairs(ctx.params) do if type(key) == 'string' then cache[key:lower()] = val else cache[key] = val end end ctx.params = cache return context_iterate(ctx, 1) end -- Syntax: #invoke:params|renaming_to_uppercase|pipe to library.renaming_to_uppercase = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache = {} for key, val in pairs(ctx.params) do if type(key) == 'string' then cache[key:upper()] = val else cache[key] = val end end ctx.params = cache return context_iterate(ctx, 1) end -- Syntax: #invoke:params|renaming_to_sequence|[sort order]|pipe to library.renaming_to_sequence = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local tbl = ctx.params local sortfn, argc, do_sort = load_sort_opt(ctx.pipe[1]) local cache local len if do_sort then local words local wl cache, words, len, wl = get_key_list_sorted(tbl, sortfn) for idx = 1, len do cache[idx] = tbl[cache[idx]] end for idx = 1, wl do cache[len + idx] = tbl[words[idx]] end else cache = {} len = 0 for _, val in pairs(tbl) do len = len + 1 cache[len] = val end end ctx.params = cache return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_calling|template name|[call -- style]|[let]|[...][number of additional parameters]|[parameter -- 1]|[parameter 2]|[...]|[parameter N]|pipe to library.renaming_by_calling = function (ctx) local opts = ctx.pipe local tname if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘renaming_by_calling’: No template name was provided', 0) end local rargs, argc, looptype, karg, varg = load_callback_opts(opts, 1, mapping_styles.names_only) local model = { title = tname, args = rargs } map_names(ctx.params, rargs, karg, varg, looptype, function () return ctx.frame:expandTemplate(model) end) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_invoking|module name|function -- name|[call style]|[let]|[...]|[number of additional -- arguments]|[argument 1]|[argument 2]|[...]|[argument N]|pipe to library.renaming_by_invoking = function (ctx) local opts = ctx.pipe local mname local fname if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘renaming_by_invoking’: No module name was provided', 0) end if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘renaming_by_invoking’: No function name was provided', 0) end local rargs, argc, looptype, karg, varg = load_callback_opts(opts, 2, mapping_styles.names_only) local model = { title = 'Module:' .. mname, args = rargs } local mfunc = require(model.title)[fname] if mfunc == nil then error(modulename .. ', ‘renaming_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end map_names(ctx.params, rargs, karg, varg, looptype, function () return tostring(mfunc(ctx.frame:newChild(model))) end) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_magic|parser function|[call -- style]|[let]|[...][number of additional arguments]|[argument -- 1]|[argument 2]|[...]|[argument N]|pipe to library.renaming_by_magic = function (ctx) local opts = ctx.pipe local magic if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘renaming_by_magic’: No parser function was provided', 0) end local rargs, argc, looptype, karg, varg = load_callback_opts(opts, 1, mapping_styles.names_only) map_names(ctx.params, rargs, karg, varg, looptype, function () return ctx.frame:callParserFunction(magic, rargs) end) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_replacing|target|replace|[count]|[plain -- flag]|pipe to library.renaming_by_replacing = function (ctx) local ptn, repl, nmax, flg, argc, die = load_replace_args(ctx.pipe, 'renaming_by_replacing') if die then return context_iterate(ctx, argc) end local tbl = ctx.params if flg == 3 then ptn = get_parameter_name(ptn) local val = tbl[ptn] if val ~= nil then tbl[ptn] = nil tbl[get_parameter_name(repl)] = val end else if flg == 2 then -- Copied from Module:String's `str._escapePattern()` ptn = ptn:gsub('[%(%)%.%%%+%-%*%?%[%^%$%]]', '%%%0') end local cache = {} for key, val in pairs(tbl) do steal_if_renamed(val, tbl, key, cache, tostring(key):gsub(ptn, repl, nmax)) end for key, val in pairs(cache) do tbl[key] = val end end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|renaming_by_mixing|mixing string|pipe to library.renaming_by_mixing = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning if ctx.pipe[1] == nil then error(modulename .. ', ‘renaming_by_mixing’: No mixing string was provided', 0) end local mix = ctx.pipe[1]:match'^%s*(.-)%s*$' local cache = {} if mix == '$@' then for _, val in pairs(ctx.params) do cache[get_parameter_name(val)] = val end else local skel, canvas, n_parts = parse_placeholder_string(mix) for key, val in pairs(ctx.params) do for idx = 2, n_parts, 2 do if skel[idx] then canvas[idx] = val else canvas[idx] = tostring(key) end end cache[get_parameter_name(table.concat(canvas))] = val end end ctx.params = cache return context_iterate(ctx, 2) end -- Syntax: #invoke:params|renaming_to_values|pipe to --[[ library.renaming_to_values = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache = {} for _, val in pairs(ctx.params) do cache[val] = val end ctx.params = cache return context_iterate(ctx, 1) end ]]-- -- Syntax: #invoke:params|grouping_by_calling|template -- name|[let]|[...]|[number of additional arguments]|[argument -- 1]|[argument 2]|[...]|[argument N]|pipe to library.grouping_by_calling = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts = ctx.pipe local tmp if opts[1] ~= nil then tmp = opts[1]:match'^%s*(.*%S)' end if tmp == nil then error(modulename .. ', ‘grouping_by_calling’: No template name was provided', 0) end local model = { title = tmp } local argc tmp, argc = load_child_opts(opts, 2, 0) local gargs = {} for key, val in pairs(tmp) do if type(key) == 'number' and key < 1 then gargs[key - 1] = val else gargs[key] = val end end local groups = make_groups(ctx.params) for gid, group in pairs(groups) do for key, val in pairs(gargs) do group[key] = val end group[0] = gid model.args = group groups[gid] = ctx.frame:expandTemplate(model) end ctx.params = groups return context_iterate(ctx, argc) end -- Syntax: #invoke:params|parsing|string to parse|[trim flag]|[iteration -- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to library.parsing = function (ctx) local opts = ctx.pipe if opts[1] == nil then error(modulename .. ', ‘parsing’: No string to parse was provided', 0) end local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc = load_parse_opts(opts, 2, '|', '=') parse_parameter_string(ctx.params, opts[1], isep, iplain, psep, pplain, trimnamed, trimunnamed) return context_iterate(ctx, argc) end -- Syntax: #invoke:params|reinterpreting|parameter to reinterpret|[trim -- flag]|[iteration delimiter setter]|[...]|[key-value delimiter -- setter]|[...]|pipe to library.reinterpreting = function (ctx) local opts = ctx.pipe if opts[1] == nil then error(modulename .. ', ‘reinterpreting’: No parameter to reinterpret was provided', 0) end local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc = load_parse_opts(opts, 2, '|', '=') local tbl, tmp = ctx.params, get_parameter_name(opts[1]) local str = tbl[tmp] if str ~= nil then tbl[tmp] = nil parse_parameter_string(tbl, str, isep, iplain, psep, pplain, trimnamed, trimunnamed) end return context_iterate(ctx, argc) end -- Syntax: #invoke:params|evaluating|string to parse|[trim flag]|[iteration -- delimiter setter]|[...]|[key-value delimiter setter]|[...]|pipe to library.evaluating = function (ctx) -- NOTE: `ctx.pipe` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local opts = ctx.pipe if opts[1] == nil then error(modulename .. ', ‘evaluating’: No string to parse was provided', 0) end local isep, iplain, psep, pplain, trimnamed, trimunnamed, argc = load_parse_opts(opts, 2, '!', ':') if opts[1]:match'^%s*(.*%S)' == nil then ctx.pipe = copy_or_ref_table(opts, opts ~= ctx.opipe) return context_iterate(ctx, argc) end local new_opts, cache = {}, {} local shift = parse_parameter_string(cache, opts[1], isep, iplain, psep, pplain, trimnamed, trimunnamed) - argc for key, val in pairs(opts) do if type(key) ~= 'number' or key < 1 then new_opts[key] = val elseif key >= argc then new_opts[key + shift] = val end end for key, val in pairs(cache) do new_opts[key] = val end ctx.pipe = new_opts return context_iterate(ctx, 1) end -- Syntax: #invoke:params|mixing_names_and_values|mixing string|pipe to library.mixing_names_and_values = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning if ctx.pipe[1] == nil then error(modulename .. ', ‘mixing_names_and_values’: No mixing string was provided for parameter names', 0) end if ctx.pipe[2] == nil then error(modulename .. ', ‘mixing_names_and_values’: No mixing string was provided for parameter values', 0) end local cache = {} local mix_k, mix_v = ctx.pipe[1]:match'^%s*(.-)%s*$', ctx.pipe[2] local tmp if mix_k == '$@' and mix_v == '$@' then for _, val in pairs(ctx.params) do cache[get_parameter_name(val)] = val end elseif mix_k == '$@' and mix_v == '$#' then for key, val in pairs(ctx.params) do cache[get_parameter_name(val)] = tostring(key) end elseif mix_k == '$#' and mix_v == '$#' then for key in pairs(ctx.params) do cache[key] = tostring(key) end else local skel_k, cnv_k, n_parts_k = parse_placeholder_string(mix_k) local skel_v, cnv_v, n_parts_v = parse_placeholder_string(mix_v) for key, val in pairs(ctx.params) do tmp = tostring(key) for idx = 2, n_parts_k, 2 do if skel_k[idx] then cnv_k[idx] = val else cnv_k[idx] = tmp end end for idx = 2, n_parts_v, 2 do if skel_v[idx] then cnv_v[idx] = val else cnv_v[idx] = tmp end end cache[get_parameter_name(table.concat(cnv_k))] = table.concat(cnv_v) end end ctx.params = cache return context_iterate(ctx, 3) end -- Syntax: #invoke:params|swapping_names_and_values|pipe to --[[ library.swapping_names_and_values = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local cache = {} for key, val in pairs(ctx.params) do cache[val] = key end ctx.params = cache return context_iterate(ctx, 1) end ]]-- -- Syntax: #invoke:params|combining|new parameter name|[sort order]|setting -- directives|...|pipe to library.combining = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning return context_iterate(ctx, combine_parameters( ctx, function (key, val, kvs) return key .. kvs .. val end, 'combining' ) + 1) end -- Syntax: #invoke:params|combining_values|new parameter name|[sort -- order]|setting directives|...|pipe to library.combining_values = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning return context_iterate(ctx, combine_parameters( ctx, function (key, val, kvs) return val end, 'combining_values' ) + 1) end -- Syntax: #invoke:params|combining_by_calling|template name|new parameter -- name|pipe to library.combining_by_calling = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local tname = ctx.pipe[1] if tname ~= nil then tname = tname:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_calling’: No template name was provided', 0) end if ctx.pipe[2] == nil then error(modulename .. ', ‘combining_by_calling’: No parameter name was provided', 0) end ctx.params = { [get_parameter_name(ctx.pipe[2])] = ctx.frame:expandTemplate{ title = tname, args = ctx.params } } return context_iterate(ctx, 3) end -- Syntax: #invoke:params|combining_by_invoking|module name|function name|new -- parameter name|pipe to library.combining_by_invoking = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local mname = ctx.pipe[1] if mname ~= nil then mname = mname:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_invoking’: No module name was provided', 0) end local fname = ctx.pipe[2] if fname ~= nil then fname = fname:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_invoking’: No function name was provided', 0) end if ctx.pipe[3] == nil then error(modulename .. ', ‘combining_by_invoking’: No parameter name was provided', 0) end local model = { title = 'Module:' .. mname, args = ctx.params } local mfunc = require(model.title)[fname] if mfunc == nil then error(modulename .. ', ‘mapping_by_invoking’: The function ‘' .. fname .. '’ does not exist', 0) end ctx.params = { [get_parameter_name(ctx.pipe[3])] = tostring(mfunc(ctx.frame:newChild(model))) } return context_iterate(ctx, 4) end -- Syntax: #invoke:params|combining_by_magic|parser function|new parameter -- name|pipe to library.combining_by_magic = function (ctx) -- NOTE: `ctx.params` might be the original metatable! As a modifier, -- this function MUST create a copy of it before returning local magic = ctx.pipe[1] if magic ~= nil then magic = magic:match'^%s*(.*%S)' else error(modulename .. ', ‘combining_by_magic’: No parser function was provided', 0) end if ctx.pipe[2] == nil then error(modulename .. ', ‘combining_by_magic’: No parameter name was provided', 0) end ctx.params = { [get_parameter_name(ctx.pipe[2])] = ctx.frame:callParserFunction(magic, ctx.params) } return context_iterate(ctx, 3) end -- Syntax: #invoke:params|snapshotting|pipe to library.snapshotting = function (ctx) local stack = new_substack(ctx) for key, val in pairs(ctx.params) do stack[key] = val end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|remembering|pipe to library.remembering = function (ctx) local stack = new_substack(ctx) for key, val in pairs(ctx.oparams) do stack[key] = val end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|entering_substack|[new]|pipe to library.entering_substack = function (ctx) local tbl = ctx.params local ncurrparent = ctx.n_parents + 1 if ctx.parents == nil then ctx.parents = { tbl } else ctx.parents[ncurrparent] = tbl end ctx.n_parents = ncurrparent if ctx.pipe[1] ~= nil and ctx.pipe[1]:match'^%s*new%s*$' then ctx.params = {} return context_iterate(ctx, 2) end local currsnap = ctx.n_children if currsnap > 0 then ctx.params = ctx.children[currsnap] ctx.children[currsnap] = nil ctx.n_children = currsnap - 1 else local newparams = {} for key, val in pairs(tbl) do newparams[key] = val end ctx.params = newparams end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|pulling|parameter name|pipe to library.pulling = function (ctx) local opts = ctx.pipe if opts[1] == nil then error(modulename .. ', ‘pulling’: No parameter to pull was provided', 0) end local parent local tmp = ctx.n_parents if tmp < 1 then parent = ctx.oparams else parent = ctx.parents[tmp] end tmp = get_parameter_name(opts[1]) if parent[tmp] ~= nil then ctx.params[tmp] = parent[tmp] end return context_iterate(ctx, 2) end -- Syntax: #invoke:params|detaching_substack|pipe to library.detaching_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘detaching_substack’: No substack has been created', 0) end local parent = ctx.parents[ncurrparent] for key in pairs(ctx.params) do parent[key] = nil end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|dropping_substack|pipe to library.dropping_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘dropping_substack’: No substack has been created', 0) end ctx.params = ctx.parents[ncurrparent] ctx.parents[ncurrparent] = nil ctx.n_parents = ncurrparent - 1 return context_iterate(ctx, 1) end -- Syntax: #invoke:params|leaving_substack|pipe to library.leaving_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘leaving_substack’: No substack has been created', 0) end local currsnap = ctx.n_children + 1 if ctx.children == nil then ctx.children = { ctx.params } else ctx.children[currsnap] = ctx.params end ctx.params = ctx.parents[ncurrparent] ctx.parents[ncurrparent] = nil ctx.n_parents = ncurrparent - 1 ctx.n_children = currsnap return context_iterate(ctx, 1) end -- Syntax: #invoke:params|merging_substack|pipe to library.merging_substack = function (ctx) local ncurrparent = ctx.n_parents if ncurrparent < 1 then error(modulename .. ', ‘merging_substack’: No substack has been created', 0) end local parent = ctx.parents[ncurrparent] local child = ctx.params ctx.params = parent ctx.parents[ncurrparent] = nil ctx.n_parents = ncurrparent - 1 for key, val in pairs(child) do parent[key] = val end return context_iterate(ctx, 1) end -- Syntax: #invoke:params|flushing|pipe to library.flushing = function (ctx) if ctx.n_children < 1 then error(modulename .. ', ‘flushing’: There are no substacks to flush', 0) end local parent = ctx.params local currsnap = ctx.n_children for key, val in pairs(ctx.children[currsnap]) do parent[key] = val end ctx.children[currsnap] = nil ctx.n_children = currsnap - 1 return context_iterate(ctx, 1) end --[[ Functions ]]-- ----------------------------- -- Syntax: #invoke:params|count library.count = function (ctx) -- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables! local retval = 0 for _ in ctx.iterfunc(ctx.params) do retval = retval + 1 end if ctx.subset == -1 then retval = retval - #ctx.params end ctx.text = retval return false end -- Syntax: #invoke:args|concat_and_call|template name|[prepend 1]|[prepend 2] -- |[...]|[item n]|[named item 1=value 1]|[...]|[named item n=value -- n]|[...] library.concat_and_call = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local opts = ctx.pipe local tname if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘concat_and_call’: No template name was provided', 0) end remove_numeric_keys(opts, 1, 1) ctx.text = ctx.frame:expandTemplate{ title = tname, args = concat_params(ctx) } return false end -- Syntax: #invoke:args|concat_and_invoke|module name|function name|[prepend -- 1]|[prepend 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named -- item n=value n]|[...] library.concat_and_invoke = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local opts = ctx.pipe local mname local fname if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘concat_and_invoke’: No module name was provided', 0) end if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘concat_and_invoke’: No function name was provided', 0) end remove_numeric_keys(opts, 1, 2) local mfunc = require('Module:' .. mname)[fname] if mfunc == nil then error(modulename .. ', ‘concat_and_invoke’: The function ‘' .. fname .. '’ does not exist', 0) end ctx.text = mfunc(ctx.frame:newChild{ title = 'Module:' .. mname, args = concat_params(ctx) }) return false end -- Syntax: #invoke:args|concat_and_magic|parser function|[prepend 1]|[prepend -- 2]|[...]|[item n]|[named item 1=value 1]|[...]|[named item n= -- value n]|[...] library.concat_and_magic = function (ctx) -- NOTE: `ctx.params` might be the original metatable! local opts = ctx.pipe local magic if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘concat_and_magic’: No parser function was provided', 0) end remove_numeric_keys(opts, 1, 1) ctx.text = ctx.frame:callParserFunction(magic, concat_params(ctx)) return false end -- Syntax: #invoke:params|value_of|parameter name library.value_of = function (ctx) -- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables! local opts = ctx.pipe if opts[1] == nil then error(modulename .. ', ‘value_of’: No parameter name was provided', 0) end local val local key = opts[1]:match'^%s*(.-)%s*$' if key == '0' or key:find'^%-?[1-9]%d*$' ~= nil then key = tonumber(key) val = ctx.params[key] -- No worries: #ctx.params is unused when the modifier is in -- first position (and therefore `ctx.params` is a metatable) if val ~= nil and ( ctx.subset ~= -1 or key > #ctx.params or key < 1 ) and ( ctx.subset ~= 1 or (key <= #ctx.params and key > 0) ) then ctx.text = (ctx.header or '') .. val .. (ctx.footer or '') else ctx.text = ctx.ifngiven or '' end else val = ctx.params[key] if ctx.subset ~= 1 and val ~= nil then ctx.text = (ctx.header or '') .. val .. (ctx.footer or '') else ctx.text = ctx.ifngiven or '' end end return false end -- Syntax: #invoke:params|list library.list = function (ctx) -- NOTE: `ctx.pipe` might be the original metatable! local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or '' flush_params( ctx, function (key, val) ret[nss + 1] = pps ret[nss + 2] = key ret[nss + 3] = kvs ret[nss + 4] = val nss = nss + 4 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 4) return false end -- Syntax: #invoke:params|list_values library.list_values = function (ctx) -- NOTE: `ctx.pipe` might be the original metatable! -- NOTE: `library.coins()` and `library.unique_coins()` rely on us local ret, nss, pps = {}, 0, ctx.itersep or '' flush_params( ctx, function (key, val) ret[nss + 1] = pps ret[nss + 2] = val nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|list_maybe_with_names library.list_maybe_with_names = function (ctx) -- NOTE: `ctx.pipe` might be the original metatable! local ret, nss, kvs, pps = {}, 0, ctx.pairsep or '', ctx.itersep or '' mixed_flush_params( ctx, function (key, val) ret[nss + 1] = pps ret[nss + 2] = '' ret[nss + 3] = '' ret[nss + 4] = val nss = nss + 4 end, function (key, val) ret[nss + 1] = pps ret[nss + 2] = key ret[nss + 3] = kvs ret[nss + 4] = val nss = nss + 4 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 4) return false end -- Syntax: #invoke:params|coins|[first coin = value 1]|[second coin = value -- 2]|[...]|[last coin = value N] --[[ library.coins = function (ctx) -- NOTE: `ctx.pipe` might be the original metatable! local opts, tbl = ctx.pipe, ctx.params for key, val in pairs(tbl) do tbl[key] = opts[get_parameter_name(val)] end return library.list_values(ctx) end ]]-- -- Syntax: #invoke:params|unique_coins|[first coin = value 1]|[second coin = -- value 2]|[...]|[last coin = value N] library.unique_coins = function (ctx) local opts, tbl = ctx.pipe, ctx.params local tmp for key, val in pairs(tbl) do tmp = get_parameter_name(val) tbl[key] = opts[tmp] opts[tmp] = nil end return library.list_values(ctx) end -- Syntax: #invoke:params|for_each|wikitext library.for_each = function (ctx) -- NOTE: `ctx.pipe` might be the original metatable! local ret, nss, pps, txt = {}, 0, ctx.itersep or '', ctx.pipe[1] or '' local skel, cnv, n_parts = parse_placeholder_string(txt) flush_params( ctx, function (key, val) for idx = 2, n_parts, 2 do if skel[idx] then cnv[idx] = val else cnv[idx] = tostring(key) end end ret[nss + 1] = pps ret[nss + 2] = table.concat(cnv) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|call_for_each|template name|[append 1]|[append 2] -- |[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.call_for_each = function (ctx) local opts = ctx.pipe local tname if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘call_for_each’: No template name was provided', 0) end local model = { title = tname, args = opts } local ret, nss, ccs = {}, 0, ctx.itersep or '' table.insert(opts, 1, true) flush_params( ctx, function (key, val) opts[1] = key opts[2] = val ret[nss + 1] = ccs ret[nss + 2] = ctx.frame:expandTemplate(model) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|invoke_for_each|module name|module function|[append -- 1]|[append 2]|[...]|[append n]|[named param 1=value 1]|[...] -- |[named param n=value n]|[...] library.invoke_for_each = function (ctx) local opts = ctx.pipe local mname local fname if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘invoke_for_each’: No module name was provided', 0) end if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘invoke_for_each’: No function name was provided', 0) end local model = { title = 'Module:' .. mname, args = opts } local mfunc = require(model.title)[fname] local ret, nss, ccs = {}, 0, ctx.itersep or '' flush_params( ctx, function (key, val) opts[1] = key opts[2] = val ret[nss + 1] = ccs ret[nss + 2] = mfunc(ctx.frame:newChild(model)) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|magic_for_each|parser function|[append 1]|[append 2] -- |[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.magic_for_each = function (ctx) local opts = ctx.pipe local magic if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘magic_for_each’: No parser function was provided', 0) end local ret, nss, ccs = {}, 0, ctx.itersep or '' table.insert(opts, 1, true) flush_params( ctx, function (key, val) opts[1] = key opts[2] = val ret[nss + 1] = ccs ret[nss + 2] = ctx.frame:callParserFunction(magic, opts) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|call_for_each_value|template name|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.call_for_each_value = function (ctx) local opts = ctx.pipe local tname if opts[1] ~= nil then tname = opts[1]:match'^%s*(.*%S)' end if tname == nil then error(modulename .. ', ‘call_for_each_value’: No template name was provided', 0) end local model = { title = tname, args = opts } local ret, nss, ccs = {}, 0, ctx.itersep or '' flush_params( ctx, function (key, val) opts[1] = val ret[nss + 1] = ccs ret[nss + 2] = ctx.frame:expandTemplate(model) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|invoke_for_each_value|module name|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.invoke_for_each_value = function (ctx) local opts = ctx.pipe local mname local fname if opts[1] ~= nil then mname = opts[1]:match'^%s*(.*%S)' end if mname == nil then error(modulename .. ', ‘invoke_for_each_value’: No module name was provided', 0) end if opts[2] ~= nil then fname = opts[2]:match'^%s*(.*%S)' end if fname == nil then error(modulename .. ', ‘invoke_for_each_value’: No function name was provided', 0) end local model = { title = 'Module:' .. mname, args = opts } local mfunc = require(model.title)[fname] local ret, nss, ccs = {}, 0, ctx.itersep or '' remove_numeric_keys(opts, 1, 1) flush_params( ctx, function (key, val) opts[1] = val ret[nss + 1] = ccs ret[nss + 2] = mfunc(ctx.frame:newChild(model)) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|magic_for_each_value|parser function|[append 1] -- |[append 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named -- param n=value n]|[...] library.magic_for_each_value = function (ctx) local opts = ctx.pipe local magic if opts[1] ~= nil then magic = opts[1]:match'^%s*(.*%S)' end if magic == nil then error(modulename .. ', ‘magic_for_each_value’: No parser function was provided', 0) end local ret, nss, ccs = {}, 0, ctx.itersep or '' flush_params( ctx, function (key, val) opts[1] = val ret[nss + 1] = ccs ret[nss + 2] = ctx.frame:callParserFunction(magic, opts) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end -- Syntax: #invoke:params|call_for_each_group|template name|[append 1]|[append -- 2]|[...]|[append n]|[named param 1=value 1]|[...]|[named param -- n=value n]|[...] library.call_for_each_group = function (ctx) -- NOTE: `ctx.pipe` and `ctx.params` might be the original metatables! local tmp if ctx.pipe[1] ~= nil then tmp = ctx.pipe[1]:match'^%s*(.*%S)' end if tmp == nil then error(modulename .. ', ‘call_for_each_group’: No template name was provided', 0) end local model = { title = tmp } local opts, ret, nss, ccs = {}, {}, 0, ctx.itersep or '' for key, val in pairs(ctx.pipe) do if type(key) == 'number' then opts[key - 1] = val else opts[key] = val end end ctx.pipe = opts ctx.params = make_groups(ctx.params) flush_params( ctx, function (gid, group) for key, val in pairs(opts) do group[key] = val end group[0] = gid model.args = group ret[nss + 1] = ccs ret[nss + 2] = ctx.frame:expandTemplate(model) nss = nss + 2 end ) finalize_and_return_concatenated_list(ctx, ret, nss, 2) return false end --[[ First-position-only modifiers ]]-- --------------------------------------- -- Syntax: #invoke:params|new|pipe to static_iface.new = function (child_frame) local ctx = context_new(child_frame) ctx.pipe = copy_or_ref_table(ctx.opipe, false) ctx.params = {} main_loop(ctx, context_iterate(ctx, 1)) return ctx.text end --[[ First-position-only functions ]]-- --------------------------------------- -- Syntax: #invoke:params|self static_iface.self = function (frame) return frame:getParent():getTitle() end --[[ Public metatable of functions ]]-- --------------------------------------- return setmetatable({}, { __index = function (_, query) local fname = query:match'^%s*(.*%S)' if fname == nil then error(modulename .. ': You must specify a function to call', 0) end local func = static_iface[fname] if func ~= nil then return func end func = library[fname] if func == nil then error(modulename .. ': The function ‘' .. fname .. '’ does not exist', 0) end return function (child_frame) local ctx = context_new(child_frame) ctx.pipe = copy_or_ref_table(ctx.opipe, refpipe[fname]) ctx.params = copy_or_ref_table(ctx.oparams, refparams[fname]) main_loop(ctx, func) return ctx.text end end }) bx8a2av95b6jpca3zvf7xnia4bz7hsf گوئینگ این استایل 0 114220 389829 326874 2026-07-10T09:45:04Z محک 1023 389829 wikitext text/x-wiki {{صندخ/فیلم |عکس=File:Going in Style 2017 film poster.jpg }} '''''گوئینگ این استایل''''' اتا کؤمدی فیلم هسته که ۲۰۱۷ سال بساتنه . فیلم سه تا پیرمردی خوری هسته که بانک وشون حق ره بخرده و خانه همین‌سه بانک جه دزدی هاکنن. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج: آمریکایی فیلمون]] [[رج:۲۰۱۷ فیلمون]] [[رج: انگلیسی فیلمون]] [[رج:کمدی فیلمون]] j4nb3d0kbqilaliitmqywtk2xponayx 389830 389829 2026-07-10T09:46:44Z محک 1023 389830 wikitext text/x-wiki {{صندخ/فیلم |عکس=File:Going in Style 2017 film poster.jpg }} '''''گوئینگ این استایل''''' {{به انگلیسی|Going in Style}} که یعنن '''دزدی سر بوردن''' اتا کؤمدی فیلم هسته که ۲۰۱۷ سال بساتنه . فیلم سه تا پیرمردی خوری هسته که بانک وشون حق ره بخرده و خانه همین‌سه بانک جه دزدی هاکنن. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج: آمریکایی فیلمون]] [[رج:۲۰۱۷ فیلمون]] [[رج: انگلیسی فیلمون]] [[رج:کمدی فیلمون]] cm64bfxvw730jsqd8qa2avako56fdny 389852 389830 2026-07-10T10:36:11Z محک 1023 [[رج:جنایی فیلمون]] اضافه شد با استفاده از [[ویکی‌پدیا:رج‌ساز]] 389852 wikitext text/x-wiki {{صندخ/فیلم |عکس=File:Going in Style 2017 film poster.jpg }} '''''گوئینگ این استایل''''' {{به انگلیسی|Going in Style}} که یعنن '''دزدی سر بوردن''' اتا کؤمدی فیلم هسته که ۲۰۱۷ سال بساتنه . فیلم سه تا پیرمردی خوری هسته که بانک وشون حق ره بخرده و خانه همین‌سه بانک جه دزدی هاکنن. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج: آمریکایی فیلمون]] [[رج:۲۰۱۷ فیلمون]] [[رج: انگلیسی فیلمون]] [[رج:کمدی فیلمون]] [[رج:جنایی فیلمون]] 2y3fyvt8umnttwyjm1fwejqaatpcts3 د مستر 0 171617 389791 2026-07-10T06:40:39Z محک 1023 مقاله‌ئونی که گت صفحه‌یِ کادر جه بساتنه. 389791 wikitext text/x-wiki {{صندخ/فیلم<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''د ''مَستِر''''' یعنن '''مُرشد''' اتا ۲۰۱۲ سالِ فیلم هسته که [[خواکین فینیکس]] ونه اصلی نقش ره دارنه. وه این فیلم دله اتا جنگ‌دگرست سرباز نقش ره کا بکرده که روانی مشکلات دارنه و اتا فرقه جه جذب وونه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۱۲ فیلمون]] [[رج: آمریکایی فیلمون]] do694zixdw80u7t783e5zrvrqusq1u2 389809 389791 2026-07-10T09:33:58Z محک 1023 389809 wikitext text/x-wiki {{صندخ/فیلم | عکس= File:TheMaster2012Poster.jpg }} '''د ''مَستِر''''' یعنن '''مُرشد''' اتا ۲۰۱۲ سالِ فیلم هسته که [[خواکین فینیکس]] ونه اصلی نقش ره دارنه. وه این فیلم دله اتا جنگ‌دگرست سرباز نقش ره کا بکرده که روانی مشکلات دارنه و اتا فرقه جه جذب وونه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۱۲ فیلمون]] [[رج: آمریکایی فیلمون]] njie9lfpjbsd2vjgpndqtsqh0y0vmux دای مای لاو 0 171618 389792 2026-07-10T06:44:34Z محک 1023 مقاله‌ئونی که گت صفحه‌یِ کادر جه بساتنه. 389792 wikitext text/x-wiki {{صندخ/فیلم}} '''''دای مای لاو''''' یعنن '''''بمیر مه عشق''''' اتا روانشناسی و مفهومی فیلم هسته که ۲۰۲۵ سال شىنه و [[جنیفر لارنس]] ونه اصلی نقش ره دارنه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۵ فیلمون]] [[رج: آمریکایی فیلمون]] 34k0e63r03zbavsni0lgq2vw0tv5ko1 389793 389792 2026-07-10T06:48:56Z محک 1023 389793 wikitext text/x-wiki {{صندخ/فیلم}} '''''دای مای لاو''''' یعنن '''''بمیر مه عشق''''' اتا روانشناسی و مفهومی فیلم هسته که ۲۰۲۵ سال شىنه و [[لین رمزی ]] ونه کارگردان بی‌یه. [[جنیفر لارنس]] فیلمِ اصلی نقش ره دارنه. وه اتا زنای نقش ره دارنه که ونه شی جه اتا محله‌دله سره ارث برسی‌یه و وه کوچ شونه سره دله دره. وچه‌دار وونه و تک‌تیناری وه ره أفسردگی گیرنه و کم‌کم لوچ وونه و جنگل ره تش دنه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۵ فیلمون]] [[رج: آمریکایی فیلمون]] [[رج:روانشناسی فیلمون]] 9rethl0n0ncgfyewd8v48klk71odsvp 389818 389793 2026-07-10T09:38:42Z محک 1023 389818 wikitext text/x-wiki {{صندخ/فیلم |عکس= File:Die My Love 2025.jpeg }} '''''دای مای لاو''''' یعنن '''''بمیر مه عشق''''' اتا روانشناسی و مفهومی فیلم هسته که ۲۰۲۵ سال شىنه و [[لین رمزی ]] ونه کارگردان بی‌یه. [[جنیفر لارنس]] فیلمِ اصلی نقش ره دارنه. وه اتا زنای نقش ره دارنه که ونه شی جه اتا محله‌دله سره ارث برسی‌یه و وه کوچ شونه سره دله دره. وچه‌دار وونه و تک‌تیناری وه ره أفسردگی گیرنه و کم‌کم لوچ وونه و جنگل ره تش دنه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۵ فیلمون]] [[رج: آمریکایی فیلمون]] [[رج:روانشناسی فیلمون]] s7qngl7ufonf7u2p0bclcs8xd5fmqpf ان امریکن پیکل 0 171619 389794 2026-07-10T06:50:51Z محک 1023 مقاله‌ئونی که گت صفحه‌یِ کادر جه بساتنه. 389794 wikitext text/x-wiki {{صندخ/فیلم<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''''ان امریکن پیکل''''' یعنن '''اتا آمریکایی خیارشور''' اتا کؤمدی فیلم هسته که ۲۰۲۰ سال شىنه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۰ فیلمون]] kbt6tgjyq88smihiwsmd4d8cjdlqplf 389795 389794 2026-07-10T06:56:12Z محک 1023 389795 wikitext text/x-wiki {{صندخ/فیلم<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''''ان امریکن پیکل''''' یعنن '''اتا آمریکایی خیارشور''' اتا کمدی فیلم هسته که ۲۰۲۰ سال شىنه. [[برندن تراست]] وه ره کارگردانی هاکرده و [[ست روجن]] اصلی نقش بی‌یه. اتا [[جهود]] زن و شی فرار به فرار شونّه آمریکا. مردی اتا خیارشور کارخنه دله کارگر هسته که کفنه خیارشور دبّه دله و ونه سر پلمپ وونه. سال‌ها گذرنه و دبّه سر ره وا کنّه، وه ویشار وونه و وینده دنیا چنده تغییر هاکرده. شه پسرـزا ره پىدا کنده که اتا برنومه‌نویس هسته. وشون میون پول دربیاردن سر رقابت کفنه و... == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۰ فیلمون]] [[رج:کمدی فیلمون]] [[رج: آمریکایی فیلمون ]] mtb88pcrrc5bfpi83ju7jkys4p5fv8g 389825 389795 2026-07-10T09:42:39Z محک 1023 389825 wikitext text/x-wiki {{صندخ/فیلم |عکس=File:An American Pickle poster.jpg }} '''''ان امریکن پیکل''''' یعنن '''اتا آمریکایی خیارشور''' اتا کمدی فیلم هسته که ۲۰۲۰ سال شىنه. [[برندن تراست]] وه ره کارگردانی هاکرده و [[ست روجن]] اصلی نقش بی‌یه. اتا [[جهود]] زن و شی فرار به فرار شونّه آمریکا. مردی اتا خیارشور کارخنه دله کارگر هسته که کفنه خیارشور دبّه دله و ونه سر پلمپ وونه. سال‌ها گذرنه و دبّه سر ره وا کنّه، وه ویشار وونه و وینده دنیا چنده تغییر هاکرده. شه پسرـزا ره پىدا کنده که اتا برنومه‌نویس هسته. وشون میون پول دربیاردن سر رقابت کفنه و... == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۰ فیلمون]] [[رج:کمدی فیلمون]] [[رج: آمریکایی فیلمون ]] ipxw8eibf40ilqexmbg4bceerbgvg1q نورمال (۲۰۲۵) 0 171620 389796 2026-07-10T07:04:39Z محک 1023 مقاله‌ئونی که گت صفحه‌یِ کادر جه بساتنه. 389796 wikitext text/x-wiki {{صندخ/فیلم<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''نورمال (۲۰۲۵)''' اتا نو-وسترن فیلم هسته که [[دریک کوستلر]] وه ره ۲۰۲۵ بساته و [[باب اودنکرک]] ونه اصلی نقش ره دارنه. اتا سابق جاسوس و اف‌بی‌آی بازنشست مردی، شه خانواده ره ورنه مسافرت که اونجه اتا گانگستری گروه جه درگیر وونه و تک‌تینار وشون جه مقابله کنده. == منابع == {{په‌نویس}} * [https://www.imdb.com/title/tt31195136/ آی ام دی بی] <!--- رج‌ئون: ---> [[رج:۲۰۲۵ فیلمون]] [[رج: آمریکایی فیلمون ]] gvulyb8d3v37f9ody1dfft6wfob9ncb 389797 389796 2026-07-10T07:05:55Z محک 1023 389797 wikitext text/x-wiki {{صندخ/فیلم<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''نورمال''' اتا نو-وسترن فیلم هسته که [[دریک کولستاد]] وه ره ۲۰۲۵ بساته و [[باب اودنکرک]] ونه اصلی نقش ره دارنه. اتا سابق جاسوس و اف‌بی‌آی بازنشست مردی، شه خانواده ره ورنه مسافرت که اونجه اتا گانگستری گروه جه درگیر وونه و تک‌تینار وشون جه مقابله کنده. == منابع == {{په‌نویس}} * [https://www.imdb.com/title/tt31195136/ آی ام دی بی] <!--- رج‌ئون: ---> [[رج:۲۰۲۵ فیلمون]] [[رج: آمریکایی فیلمون ]] [[رج:جنایی فیلمون]] 9541biy4eqwvj0yajpzyqeku7joxg95 389814 389797 2026-07-10T09:36:35Z محک 1023 389814 wikitext text/x-wiki {{صندخ/فیلم | عکس= File:Normal poster.jpeg }} '''نورمال''' اتا نو-وسترن فیلم هسته که [[دریک کولستاد]] وه ره ۲۰۲۵ بساته و [[باب اودنکرک]] ونه اصلی نقش ره دارنه. اتا سابق جاسوس و اف‌بی‌آی بازنشست مردی، شه خانواده ره ورنه مسافرت که اونجه اتا گانگستری گروه جه درگیر وونه و تک‌تینار وشون جه مقابله کنده. == منابع == {{په‌نویس}} * [https://www.imdb.com/title/tt31195136/ آی ام دی بی] <!--- رج‌ئون: ---> [[رج:۲۰۲۵ فیلمون]] [[رج: آمریکایی فیلمون ]] [[رج:جنایی فیلمون]] cgsge6b07ifgi9z5tmybmghvsdx4vhn اوئاسیس 0 171621 389798 2026-07-10T07:11:37Z محک 1023 مقاله‌ئونی که گت صفحه‌یِ کادر جه بساتنه. 389798 wikitext text/x-wiki {{صندخ/سریال<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''اوئاسیس''' {{ایسپانیولی جه|Oasis}} اتا [[ایسپانیا|إسپانیایی]] سریال هسته. اتا توریستی عمارت دره که پولدار و غنی خانواده ئون شه وچون ره یارنه اونجه تفریح. صاحب هتلِ کیجا این‌میونه گوم وونه. ونه رفخ و اتا ریکا که تازه ونجه آشنا بئی بی‌یه، سرنخ ره دمبال کنّه که وه ره پىدا هاکنن و اینتی یواش-یواش باقیِ مسافرون ِ رمز و راز هم لو شونه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:۲۰۲۶ فیلمون]] [[رج:ایسپانیایی سریالون]] sqxdrn4rh31c0jytuankghgzclzrodb 389799 389798 2026-07-10T07:16:29Z محک 1023 389799 wikitext text/x-wiki {{صندخ/سریال<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''اوئاسیس''' {{ایسپانیولی جه|Oasis}} اتا [[ایسپانیا|إسپانیایی]] سریال هسته. اتا توریستی عمارت دره که پولدار و غنی خانواده ئون شه وچون ره یارنه اونجه تفریح. صاحب هتلِ کیجا این‌میونه گوم وونه. ونه رفخ و اتا ریکا که تازه ونجه آشنا بئی بی‌یه، سرنخ ره دمبال کنّه که وه ره پىدا هاکنن و اینتی یواش-یواش باقیِ مسافرون ِ رمز و راز هم لو شونه. == منابع == {{په‌نویس}} * [https://www.netflix.com/title/81734907 نت فلیکس ] <!--- رج‌ئون: ---> [[رج:۲۰۲۶ فیلمون]] [[رج:ایسپانیایی سریالون]] 4st7mmi01sozn57g6tg7fcdiz5ev6g7 389800 389799 2026-07-10T07:21:11Z محک 1023 389800 wikitext text/x-wiki {{صندخ/سریال |فصل = 1 |نوم = Oasis |imagen modo oscuro = <!- Acepta cualquier valor, pero se recomienda usar «sí». --> |tamaño de imagen = |pie de imagen = |título alternativo = |título español = |lema = <!-- Para teletones y telenovelas. --> |ژانر = [[Drama]] |کارگردان = [[Ramón Campos]] |basado en = <!-- {{Basada en|obra|autor}} --> |showrunner = |desarrollador = |نویسنده = Javier Chacártegui ، Jon de la Cuesta ، David Orea |guion = |historia = |کارگردان = Ana de Alva، [[David Pinillos]] |director creativo = |presentador = <!-- Organizado por el orden de crédito de su primera emisión, con nuevos en el elenco principal agregados al final de la lista. --> |بازیگرون = [[Ana Garcés]]، Tomy Aguilera، Victoria Kantch |jurado = <!-- Organizado por el orden de crédito de su primera emisión, con nuevos en el elenco principal agregados al final de la lista. --> |voces = <!-- Organizado por el orden de crédito de su primera emisión, con nuevos en el elenco principal agregados al final de la lista. --> |narrador = |tema principal = |autor tema principal = |intérprete principal = |tema principal 2 = |autor tema principal 2 = |intérprete principal 2 = |tema de cierre = |autor tema cierre = |intérprete cierre = |tema de cierre 2 = |autor tema cierre 2 = |intérprete cierre 2 = |compositor = |ambientación = <!-- Dejar en blanco si el programa se ambienta en la época contemporánea a su estreno. --> |país de origen = {{En varias líneas| | España }} |زوون = ایسپانیولی |num temporadas = <!-- Número de temporadas emitidas. Solamente actualice después de que se haya iniciado una nueva temporada. --> |num serial = <!-- Número de seriales emitidos. Solamente actualice después de que se haya iniciado un nuevo serial. --> |num partes = <!-- Número de partes emitidas. Solamente actualice después de que se haya iniciado una nueva parte. --> |اپیزود = 8 |lista episodios = |productor ejecutivo = |productor = |editor noticias = <!-- Editor de contenido o editores de un programa informativo/político. --> |localización = <!-- País en el que se filmó principalmente la serie, si es diferente al país de origen. --> |cinematografía = Raquel Fernández Nuñez |animador = |editor = |cámara = <!-- Ya sea Monocámara o Multicámara. --> |duración = <!-- Se requiere una fuente confiable. --> |empresa productora = [[Bambú Producciones]] |distribuidor = |presupuesto = |تهیه‌کننده = [[Netflix]] |edad = |horario = |audiencia = |meta inicial = <!-- Para teletones. --> |recaudación = <!-- Para teletones. --> |formato de imagen = |formato de audio = |mostrado primero = <!-- El país en el que se emitió la serie por primera vez, si es diferente del parámetro país de origen. --> |اکران = {{تاریخ|19|6|2026}} |última emisión = <!-- {{Fecha|DD|MM|AAAA}} --> |intervalos de emisión = <!-- Utilizar solamente para indicar intervalos de emisión de acuerdo a la documentación y dejar en blanco en cualquier otro caso. --> |relacionados = <!-- Para ser usado solamente para series derivadas y adaptaciones. --> |criterio sucesión = |precedido por = |sucedido por = |سایت = https://www.netflix.com/title/81734907 |imdb = 38734636 |filmaffinity = 791643 }} '''اوئاسیس''' {{ایسپانیولی جه|Oasis}} اتا [[ایسپانیا|إسپانیایی]] سریال هسته. اتا توریستی عمارت دره که پولدار و غنی خانواده ئون شه وچون ره یارنه اونجه تفریح. صاحب هتلِ کیجا این‌میونه گوم وونه. ونه رفخ و اتا ریکا که تازه ونجه آشنا بئی بی‌یه، سرنخ ره دمبال کنّه که وه ره پىدا هاکنن و اینتی یواش-یواش باقیِ مسافرون ِ رمز و راز هم لو شونه. == منابع == {{په‌نویس}} * [https://www.netflix.com/title/81734907 نت فلیکس ] <!--- رج‌ئون: ---> [[رج:۲۰۲۶ فیلمون]] [[رج:ایسپانیایی سریالون]] 1ujdw51i02s53bpooxs36537724d7il اسپایدرمن نوآر 0 171622 389801 2026-07-10T07:26:55Z محک 1023 مقاله‌ئونی که گت صفحه‌یِ کادر جه بساتنه. 389801 wikitext text/x-wiki {{صندخ/سریال<!-- اینجه تونی شه مقالهٔ کلّی موضوع ره بنویسین تا صندخ بساجه. شهر، شخص، موجود، بنا، کومپانی و... واری -->}} '''اسپایدرمن نوآر''' اتا ابر-قهرمونی سریال هسته که [[بتّو-مردی|بتّو-مردی (اسپایدرمن)]] نقش ره [[نیکولاس کیج]] دارنه. این سریال ره ۲۰۲۶ سال، دِ نسخه که اتا سیاه‌سفید و اتی دیئر رنگی هسته، تنک هاکردنه. اسپایدرمن اتا کارآگاه بیه و دفتر بزو. سال‌هایی هسته که آمریکا دله رکود بیه و مردم کار و پول دربیاردن سر مشکل ور خرنه. کارگاه وسه مشتریونی إنه که وه ره مزارب اینگنده اتا نخش پرونده وسط دکفه. == منابع == {{په‌نویس}} <!--- رج‌ئون: ---> [[رج:اسپایدرمن]] [[رج:آمریکایی سریالون]] [[رج:۲۰۲۶ فیلمون]] o1hru6etw1j06sfdrshv7zegn6o0vhk پرونده:TheMaster2012Poster.jpg 6 171623 389802 2026-02-24T01:50:40Z en>Jevansen 0 + [[Category:Film posters for English-language films]] 389802 wikitext text/x-wiki == Summary == {{Non-free use rationale poster | Media = film | Article = The Master (2012 film) | Use = Infobox <!-- ADDITIONAL INFORMATION --> | Name = The Master | Distributor = [[The Weinstein Company]] | Publisher = | Owner = [[The Weinstein Company]] | Website = [http://www.impawards.com/2012/master_ver2.html IMP Awards] }} == Licensing == {{Non-free film poster|image has rationale=yes|2010s American film posters}} [[Category:Film posters for English-language films]] 9v9pzfscxq7lhk8x7p3qrte8wqsvp9i 389803 389802 2026-07-10T09:32:41Z محک 1023 ۱ نسخه واردشده از [[:en:File:TheMaster2012Poster.jpg]]: File:TheMaster2012Poster.jpg 389802 wikitext text/x-wiki == Summary == {{Non-free use rationale poster | Media = film | Article = The Master (2012 film) | Use = Infobox <!-- ADDITIONAL INFORMATION --> | Name = The Master | Distributor = [[The Weinstein Company]] | Publisher = | Owner = [[The Weinstein Company]] | Website = [http://www.impawards.com/2012/master_ver2.html IMP Awards] }} == Licensing == {{Non-free film poster|image has rationale=yes|2010s American film posters}} [[Category:Film posters for English-language films]] 9v9pzfscxq7lhk8x7p3qrte8wqsvp9i 389808 389803 2026-07-10T09:33:20Z محک 1023 محک [[پرونده:TheMaster2012Poster.jpg]] ره بار بی‌یشته 389802 wikitext text/x-wiki == Summary == {{Non-free use rationale poster | Media = film | Article = The Master (2012 film) | Use = Infobox <!-- ADDITIONAL INFORMATION --> | Name = The Master | Distributor = [[The Weinstein Company]] | Publisher = | Owner = [[The Weinstein Company]] | Website = [http://www.impawards.com/2012/master_ver2.html IMP Awards] }} == Licensing == {{Non-free film poster|image has rationale=yes|2010s American film posters}} [[Category:Film posters for English-language films]] 9v9pzfscxq7lhk8x7p3qrte8wqsvp9i د مستر (۲۰۱۲ فیلم) 0 171624 389810 2026-07-10T09:34:30Z محک 1023 ونه مسیر ره دکشی‌یه [[د مستر]] دله 389810 wikitext text/x-wiki #بور [[د مستر]] 2iwzz55b0vrli9l6k9omj4vxx1fqrgc پرونده:Normal poster.jpeg 6 171625 389811 2026-02-20T06:21:31Z en>TAnthony 0 /* Licensing */ 389811 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = This is a poster for ''Normal''. The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist. |Source = https://www.impawards.com/2026/normal.html |Author = [[Magnolia Pictures]] |Article = Normal (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 = It will be used once for the page |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 Canadian film posters]] serieutax2asuz7d8qkov014uk7oh8t 389812 389811 2026-07-10T09:35:48Z محک 1023 ۱ نسخه واردشده از [[:en:File:Normal_poster.jpeg]] 389811 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = This is a poster for ''Normal''. The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist. |Source = https://www.impawards.com/2026/normal.html |Author = [[Magnolia Pictures]] |Article = Normal (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 = It will be used once for the page |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 Canadian film posters]] serieutax2asuz7d8qkov014uk7oh8t 389813 389812 2026-07-10T09:36:07Z محک 1023 محک [[پرونده:Normal poster.jpeg]] ره بار بی‌یشته 389811 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = This is a poster for ''Normal''. The poster art copyright is believed to belong to the distributor of the film, the publisher of the film or the graphic artist. |Source = https://www.impawards.com/2026/normal.html |Author = [[Magnolia Pictures]] |Article = Normal (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 = It will be used once for the page |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 Canadian film posters]] serieutax2asuz7d8qkov014uk7oh8t پرونده:Die My Love 2025.jpeg 6 171626 389815 2025-11-11T11:13:24Z en>KylieTastic 0 Previous version deleted per [[WP:F5|F5]] 389815 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = Die My Love movie poster |Source = [https://www.imdb.com/title/tt9362736/mediaviewer/rm3832326402/?ref_=tt_ov_i IMDb] |Author = Mubi |Article = Die My Love |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 serve as the primary means of visual identification at the top of the article dedicated to the work in question |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 poster|image_has_rationale=yes|2020s American film posters}}}} 8pzpodfyxl9jnlfih0djbchmtiw9fdq 389816 389815 2026-07-10T09:37:42Z محک 1023 ۱ نسخه واردشده از [[:en:File:Die_My_Love_2025.jpeg]] 389815 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = Die My Love movie poster |Source = [https://www.imdb.com/title/tt9362736/mediaviewer/rm3832326402/?ref_=tt_ov_i IMDb] |Author = Mubi |Article = Die My Love |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 serve as the primary means of visual identification at the top of the article dedicated to the work in question |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 poster|image_has_rationale=yes|2020s American film posters}}}} 8pzpodfyxl9jnlfih0djbchmtiw9fdq 389817 389816 2026-07-10T09:38:00Z محک 1023 محک [[پرونده:Die My Love 2025.jpeg]] ره بار بی‌یشته 389815 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = Die My Love movie poster |Source = [https://www.imdb.com/title/tt9362736/mediaviewer/rm3832326402/?ref_=tt_ov_i IMDb] |Author = Mubi |Article = Die My Love |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 serve as the primary means of visual identification at the top of the article dedicated to the work in question |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 poster|image_has_rationale=yes|2020s American film posters}}}} 8pzpodfyxl9jnlfih0djbchmtiw9fdq پرونده:An American Pickle poster.jpg 6 171627 389820 2026-02-24T02:52:54Z en>Jevansen 0 + [[Category:Film posters for English-language films]] 389820 wikitext text/x-wiki ==Summary== {{Non-free use rationale poster | Article = An American Pickle | Use = Infobox | Media = film | Distributor = [[HBO Max]] | Source = http://www.impawards.com/tv/american_pickle.html }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:Film posters for English-language films]] lahu6fbj31vccnnlj5o3jx6wk80u5pk 389821 389820 2026-07-10T09:41:36Z محک 1023 ۱ نسخه واردشده از [[:en:File:An_American_Pickle_poster.jpg]] 389820 wikitext text/x-wiki ==Summary== {{Non-free use rationale poster | Article = An American Pickle | Use = Infobox | Media = film | Distributor = [[HBO Max]] | Source = http://www.impawards.com/tv/american_pickle.html }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:Film posters for English-language films]] lahu6fbj31vccnnlj5o3jx6wk80u5pk 389824 389821 2026-07-10T09:42:11Z محک 1023 محک [[پرونده:An American Pickle poster.jpg]] ره بار بی‌یشته 389820 wikitext text/x-wiki ==Summary== {{Non-free use rationale poster | Article = An American Pickle | Use = Infobox | Media = film | Distributor = [[HBO Max]] | Source = http://www.impawards.com/tv/american_pickle.html }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:Film posters for English-language films]] lahu6fbj31vccnnlj5o3jx6wk80u5pk پرونده:Going in Style 2017 film poster.jpg 6 171628 389826 2026-02-24T02:19:10Z en>Jevansen 0 + [[Category:Film posters for English-language films]] 389826 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = Poster of ''[[Going in Style (2017 film)|Going in Style]]''. |Source = [http://www.impawards.com/2017/going_in_style.html IMP Awards] |Author = Warner Bros. Pictures |Article = Going in Style (2017 film) |Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question. |Replaceability = n.a. |Minimality = The image is placed in the infobox at the top of the article as the primary visual image associated with the work. |Commercial = n.a. }} == Licensing == {{Non-free film poster|image has rationale=yes|2010s American film posters}} [[Category:Film posters for English-language films]] 06lmueafnlnnyw8ic9nsfh8gn4jo2sh 389827 389826 2026-07-10T09:44:13Z محک 1023 ۱ نسخه واردشده از [[:en:File:Going_in_Style_2017_film_poster.jpg]] 389826 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = Poster of ''[[Going in Style (2017 film)|Going in Style]]''. |Source = [http://www.impawards.com/2017/going_in_style.html IMP Awards] |Author = Warner Bros. Pictures |Article = Going in Style (2017 film) |Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question. |Replaceability = n.a. |Minimality = The image is placed in the infobox at the top of the article as the primary visual image associated with the work. |Commercial = n.a. }} == Licensing == {{Non-free film poster|image has rationale=yes|2010s American film posters}} [[Category:Film posters for English-language films]] 06lmueafnlnnyw8ic9nsfh8gn4jo2sh 389828 389827 2026-07-10T09:44:30Z محک 1023 محک [[پرونده:Going in Style 2017 film poster.jpg]] ره بار بی‌یشته 389826 wikitext text/x-wiki ==Summary== {{Non-free use rationale 2 |Description = Poster of ''[[Going in Style (2017 film)|Going in Style]]''. |Source = [http://www.impawards.com/2017/going_in_style.html IMP Awards] |Author = Warner Bros. Pictures |Article = Going in Style (2017 film) |Purpose = to serve as the primary means of visual identification at the top of the article dedicated to the work in question. |Replaceability = n.a. |Minimality = The image is placed in the infobox at the top of the article as the primary visual image associated with the work. |Commercial = n.a. }} == Licensing == {{Non-free film poster|image has rationale=yes|2010s American film posters}} [[Category:Film posters for English-language films]] 06lmueafnlnnyw8ic9nsfh8gn4jo2sh پرونده:Still breathing 1997 film.jpg 6 171629 389831 2026-02-24T00:34:28Z en>Jevansen 0 + [[Category:Film posters for English-language films]] 389831 wikitext text/x-wiki == Licensing == {{Non-free film poster|image has rationale=yes|1990s American film posters}} == Fair use == It is believed that this image, Still breathing 1997 film.jpg, is subject to fair use in the article [[Still Breathing (film)|''Still Breathing'' (film)]] because: # This image illustrates the text next to which it appears, which describes the person in question for which it promotes. # It is of much lower resolution than the original (copies made from it will be of very inferior quality). # It does not limit the copyright owner's rights to market or sell the work in any way. # This image is used on various websites, so its use on Wikipedia does not make it significantly more accessible or visible than it already is. # The image is being used in an informative way and should not detract from the original work. # No free or public domain images have been located for this item. Creator/Source: October Films [[Category:Film posters for English-language films]] 5y8uoc3bsxgoikyglgwkze2jrxnue3k 389832 389831 2026-07-10T09:48:49Z محک 1023 ۱ نسخه واردشده از [[:en:File:Still_breathing_1997_film.jpg]] 389831 wikitext text/x-wiki == Licensing == {{Non-free film poster|image has rationale=yes|1990s American film posters}} == Fair use == It is believed that this image, Still breathing 1997 film.jpg, is subject to fair use in the article [[Still Breathing (film)|''Still Breathing'' (film)]] because: # This image illustrates the text next to which it appears, which describes the person in question for which it promotes. # It is of much lower resolution than the original (copies made from it will be of very inferior quality). # It does not limit the copyright owner's rights to market or sell the work in any way. # This image is used on various websites, so its use on Wikipedia does not make it significantly more accessible or visible than it already is. # The image is being used in an informative way and should not detract from the original work. # No free or public domain images have been located for this item. Creator/Source: October Films [[Category:Film posters for English-language films]] 5y8uoc3bsxgoikyglgwkze2jrxnue3k 389833 389832 2026-07-10T09:50:08Z محک 1023 محک [[پرونده:Still breathing 1997 film.jpg]] ره بار بی‌یشته 389831 wikitext text/x-wiki == Licensing == {{Non-free film poster|image has rationale=yes|1990s American film posters}} == Fair use == It is believed that this image, Still breathing 1997 film.jpg, is subject to fair use in the article [[Still Breathing (film)|''Still Breathing'' (film)]] because: # This image illustrates the text next to which it appears, which describes the person in question for which it promotes. # It is of much lower resolution than the original (copies made from it will be of very inferior quality). # It does not limit the copyright owner's rights to market or sell the work in any way. # This image is used on various websites, so its use on Wikipedia does not make it significantly more accessible or visible than it already is. # The image is being used in an informative way and should not detract from the original work. # No free or public domain images have been located for this item. Creator/Source: October Films [[Category:Film posters for English-language films]] 5y8uoc3bsxgoikyglgwkze2jrxnue3k پرونده:Coda poster.jpeg 6 171630 389834 2024-08-08T17:40:39Z en>TAnthony 0 Refine image category 389834 wikitext text/x-wiki ==Summary== {{Non-free use rationale poster | Article = CODA (2021 film) | Use = Infobox | Media = film | Name = CODA | Distributor = [[Apple TV+]] | Source = [http://www.impawards.com/2021/coda.html IMP Awards / 2021 Movie Poster Gallery / CODA Poster] }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:2020s French film posters]] le86ogd11pq0modmxkuttb4mvl4rcnp 389835 389834 2026-07-10T09:52:37Z محک 1023 ۱ نسخه واردشده از [[:en:File:Coda_poster.jpeg]] 389834 wikitext text/x-wiki ==Summary== {{Non-free use rationale poster | Article = CODA (2021 film) | Use = Infobox | Media = film | Name = CODA | Distributor = [[Apple TV+]] | Source = [http://www.impawards.com/2021/coda.html IMP Awards / 2021 Movie Poster Gallery / CODA Poster] }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:2020s French film posters]] le86ogd11pq0modmxkuttb4mvl4rcnp 389836 389835 2026-07-10T09:52:56Z محک 1023 محک [[پرونده:Coda poster.jpeg]] ره بار بی‌یشته 389834 wikitext text/x-wiki ==Summary== {{Non-free use rationale poster | Article = CODA (2021 film) | Use = Infobox | Media = film | Name = CODA | Distributor = [[Apple TV+]] | Source = [http://www.impawards.com/2021/coda.html IMP Awards / 2021 Movie Poster Gallery / CODA Poster] }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:2020s French film posters]] le86ogd11pq0modmxkuttb4mvl4rcnp پرونده:Shelby Oaks.jpg 6 171631 389838 2026-02-24T00:17:24Z en>Jevansen 0 + [[Category:Film posters for English-language films]] 389838 wikitext text/x-wiki {{Better source requested}} ==Summary== {{Non-free use rationale 2 |Description = Shelby Oaks film poster |Source = [https://m.media-amazon.com/images/M/MV5BOWQ1MjA5YzItMmE2NC00YWZkLWEwZjMtOTIxMDgyYmU2MTRmXkEyXkFqcGc@._V1_FMjpg_UX1000_.jpg IMDb] |Date = 2025 |Author = [[Neon (company)|Neon]] |Article = Shelby Oaks |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 = Low resolution scan. |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 horror film posters]] [[Category:Film posters for English-language films]] 31rjos4f6e8y574sex71enwnp1z3u1f 389839 389838 2026-07-10T09:55:26Z محک 1023 ۱ نسخه واردشده از [[:en:File:Shelby_Oaks.jpg]]: https://en.wikipedia.org/wiki/Shelby_Oaks#/media/File:Shelby_Oaks.jpg 389838 wikitext text/x-wiki {{Better source requested}} ==Summary== {{Non-free use rationale 2 |Description = Shelby Oaks film poster |Source = [https://m.media-amazon.com/images/M/MV5BOWQ1MjA5YzItMmE2NC00YWZkLWEwZjMtOTIxMDgyYmU2MTRmXkEyXkFqcGc@._V1_FMjpg_UX1000_.jpg IMDb] |Date = 2025 |Author = [[Neon (company)|Neon]] |Article = Shelby Oaks |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 = Low resolution scan. |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 horror film posters]] [[Category:Film posters for English-language films]] 31rjos4f6e8y574sex71enwnp1z3u1f 389842 389839 2026-07-10T09:55:43Z محک 1023 محک [[پرونده:Shelby Oaks.jpg]] ره بار بی‌یشته 389838 wikitext text/x-wiki {{Better source requested}} ==Summary== {{Non-free use rationale 2 |Description = Shelby Oaks film poster |Source = [https://m.media-amazon.com/images/M/MV5BOWQ1MjA5YzItMmE2NC00YWZkLWEwZjMtOTIxMDgyYmU2MTRmXkEyXkFqcGc@._V1_FMjpg_UX1000_.jpg IMDb] |Date = 2025 |Author = [[Neon (company)|Neon]] |Article = Shelby Oaks |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 = Low resolution scan. |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 horror film posters]] [[Category:Film posters for English-language films]] 31rjos4f6e8y574sex71enwnp1z3u1f شابلون:Better source requested 10 171632 389840 2020-11-28T17:54:05Z en>Primefac 0 Primefac moved page [[Template:Bsr]] to [[Template:Better source requested]]: per [[Special:PermaLink/991170251#Requested_move_20_November_2020|RM outcome]] 389840 wikitext text/x-wiki {{imbox | type = content | name = Bsr | text = This image has source information, but it either links '''directly to the image''' or is a '''generic base [[Uniform resource locator|URL]]''', or is not an Internet source for an image that was likely found on the Internet. Source information should be provided so that the [[Wikipedia:File copyright tags|copyright]] status can be verified by others. It is requested that a better source be provided to make determination of the copyright information easier. Please provide a URL to an [[HTML]] page that contains this image. See [[Wikipedia:Citing sources#Multimedia]] for more information. ''Please remove this template once better source information is provided.'' <small>Notify the uploader with: <nowiki>{{subst:</nowiki>[[Template:bsr-user|bsr-user]]<nowiki>|1=File:</nowiki>{{PAGENAME}}<nowiki>}} ~~~~</nowiki></small> }}{{{category|{{file other|[[Category:Files with poor sources|{{PAGENAME}}]]}}}}}<noinclude>{{Documentation}}</noinclude> 3bpe0sbxv2fko6dv6p1s29356gdhrk1 389841 389840 2026-07-10T09:55:26Z محک 1023 ۱ نسخه واردشده از [[:en:Template:Better_source_requested]]: https://en.wikipedia.org/wiki/Shelby_Oaks#/media/File:Shelby_Oaks.jpg 389840 wikitext text/x-wiki {{imbox | type = content | name = Bsr | text = This image has source information, but it either links '''directly to the image''' or is a '''generic base [[Uniform resource locator|URL]]''', or is not an Internet source for an image that was likely found on the Internet. Source information should be provided so that the [[Wikipedia:File copyright tags|copyright]] status can be verified by others. It is requested that a better source be provided to make determination of the copyright information easier. Please provide a URL to an [[HTML]] page that contains this image. See [[Wikipedia:Citing sources#Multimedia]] for more information. ''Please remove this template once better source information is provided.'' <small>Notify the uploader with: <nowiki>{{subst:</nowiki>[[Template:bsr-user|bsr-user]]<nowiki>|1=File:</nowiki>{{PAGENAME}}<nowiki>}} ~~~~</nowiki></small> }}{{{category|{{file other|[[Category:Files with poor sources|{{PAGENAME}}]]}}}}}<noinclude>{{Documentation}}</noinclude> 3bpe0sbxv2fko6dv6p1s29356gdhrk1 پرونده:Furiosa A Mad Max Saga.jpg 6 171633 389845 2026-02-24T04:06:49Z en>Jevansen 0 + [[Category:Film posters for English-language films]] 389845 wikitext text/x-wiki == Summary == {{Non-free use rationale poster | Article = Furiosa: A Mad Max Saga | Use = Infobox | Owner = [[Warner Bros. Pictures]] | Source = [https://www.imdb.com/title/tt12037194/mediaviewer/rm1584887809/ IMDb] }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:2020s Australian film posters]] [[Category:Film posters for English-language films]] sraueuu8ldqgsqvzvfgyvxaldqzksue 389846 389845 2026-07-10T09:58:36Z محک 1023 ۱ نسخه واردشده از [[:en:File:Furiosa_A_Mad_Max_Saga.jpg]] 389845 wikitext text/x-wiki == Summary == {{Non-free use rationale poster | Article = Furiosa: A Mad Max Saga | Use = Infobox | Owner = [[Warner Bros. Pictures]] | Source = [https://www.imdb.com/title/tt12037194/mediaviewer/rm1584887809/ IMDb] }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:2020s Australian film posters]] [[Category:Film posters for English-language films]] sraueuu8ldqgsqvzvfgyvxaldqzksue 389847 389846 2026-07-10T09:58:52Z محک 1023 محک [[پرونده:Furiosa A Mad Max Saga.jpg]] ره بار بی‌یشته 389845 wikitext text/x-wiki == Summary == {{Non-free use rationale poster | Article = Furiosa: A Mad Max Saga | Use = Infobox | Owner = [[Warner Bros. Pictures]] | Source = [https://www.imdb.com/title/tt12037194/mediaviewer/rm1584887809/ IMDb] }} == Licensing == {{Non-free film poster|image has rationale=yes|2020s American film posters}} [[Category:2020s Australian film posters]] [[Category:Film posters for English-language films]] sraueuu8ldqgsqvzvfgyvxaldqzksue