Lua یک زبان برنامه نویسی است که از طریق پسوند Scribunto MediaWiki در ویکی پدیای انگلیسی در دسترس است . از فوریه 2013، کد Lua را می توان با استفاده از قابلیت "{{#invoke:}}" Scribunto در قالب های ویکی جاسازی کرد. این برنامه افزودنی از Lua 5.1 از اکتبر 2022 پشتیبانی می کند [به روز رسانی].
کد منبع Lua در صفحاتی به نام ماژول (به عنوان مثال، ماژول: مثال ) ذخیره می شود. سپس این ماژولهای مجزا فراخوانی میشوند (با کد {{#invoke:<Module name>|<Function name>|(optional) param1 | param2...}}
). مثال:
ماژول ها در صفحات ویکی معمولی با استفاده از تابع تجزیه کننده #invoke اجرا می شوند. سینتکس #invoke مشابه نحو قالب است، اما با برخی تفاوت ها. مهمترین تفاوت این است که باید نام تابع را مشخص کنید . تابع مجموعه ای از دستورالعمل ها است که مقادیر ورودی را می گیرد، آنها را پردازش می کند و یک مقدار خروجی را برمی گرداند. [1] این تقریباً شبیه کاری است که یک الگو انجام می دهد: شما به آن آرگومان می دهید، آنها را پردازش می کند و نتیجه می گیرید. با این حال، شما می توانید بسیاری از توابع را در یک ماژول Lua تعریف کنید، در حالی که فقط می توانید یک الگو را در یک صفحه تعریف کنید.
علاوه بر این، شما نمی توانید فقط یک ماژول Lua را مستقیماً اجرا کنید - فقط می توانید یکی از عملکردهای ماژول را اجرا کنید. ماژول فقط یک محفظه برای توابع است و به تنهایی کاری را انجام نمی دهد. بنابراین دو دلیل وجود دارد که ما باید نام تابع را وارد کنیم: نمیتوانیم یک ماژول را به تنهایی اجرا کنیم، و بدون تعیین نام تابع، Lua نمیداند کدام تابع را میخواهیم اجرا کنیم.
ساده ترین راه برای اجرای یک ماژول از یک صفحه ویکی به این صورت است:
{{#invoke: نام ماژول | نام تابع }}
برای مثال می توانیم Module:Example را به این صورت اجرا کنیم که تابعی به نام "hello" دارد.
{{#invoke:Example|hello}}
→ سلام دنیا!آرگومان ها به همان روشی که به قالب ها منتقل می شوند به ماژول ها منتقل می شوند. البته توجه داشته باشید که متن بعد از اولین کاراکتر لوله همیشه نام تابع است. اولین آرگومان موقعیتی متن بعد از لوله دوم است .
{{#invoke: نام ماژول | نام تابع | اولین استدلال موقعیتی | استدلال موقعیتی دوم | آرگومان نامگذاری شده = مقدار }}
در Module:Example ، تابع "hello_to" بسته به اولین آرگومان موقعیتی به افراد مختلف خوشامد می گوید. اینطوری کار میکنه:
{{#invoke:Example|hello_to|Kate}}
→ سلام، کیت!{{#invoke:Example|hello_to|Fred}}
→ سلام، فرد!تابع سوم در Module:Example با نام "count_fruit" از آرگومان های نامگذاری شده bananas
و apples
برای شمارش تعداد موز و سیبی که داریم استفاده می کند. می توان آن را به این صورت اجرا کرد:
{{#invoke:Example|count_fruit|apples=3|bananas=4}}
← من 4 عدد موز و 3 عدد سیب دارم{{#invoke:Example|count_fruit|bananas=5|apples=2}}
← من 5 عدد موز و 2 عدد سیب دارماکثر ماژول ها یک صفحه مستند دارند که توضیح می دهد چه آرگومان هایی را می توان استفاده کرد و اثرات آنها چه خواهد بود.
در حال حاضر، VisualEditor اجازه فراخوانی ماژول ها را از طریق رابط خود نمی دهد، حتی اگر می تواند فراخوانی های ماژول موجود را ویرایش کند. یک راه حل ممکن برای این کار استفاده از {{ invoke }} به جای آن است. نحو بسیار شبیه به #invoke است، بنابراین، برای استفاده از آن در VisualEditor، اولین آرگومان بدون نام آن باید نام ماژول باشد، دومی نام تابع، و همه آرگومان های ارسال شده به ماژول را می توان به همان روشی که برای الگوهای معمولی مشخص می شود، مشخص کرد. . توجه داشته باشید که برای ماژولهایی که انتظار خواندن دادهها از الگوی فراخوانی را دارند کار نمیکند (زیرا الگوی فراخوانی به جای صفحهای که از آن استفاده میکند {{ invoke }} است) همانطور که در مثال زیر نشان میدهد:
{{#invoke:TEMPLATENAME|main}}
← ویکی پدیا: لوا{{invoke|TEMPLATENAME|main}}
→ الگو: فراخوانیبا این حال، این یک مورد آسیب شناختی است، اکثر ماژول ها در هر صورت یکسان رفتار می کنند.
از گفتگوی ویکیپدیا: لوا دیدن کنید تا در نوشتن یک اسکریپت Lua برای انجام یک کار خاص در ویکیپدیا یا پروژه دیگری از بنیاد ویکیمدیا کمک بخواهید.
تاریخ کثیف {{ qif }} ، ParserFunctions، پسوند Lua، زبان برنامهنویسی ویکی مورد بحث (جاوا اسکریپت در مقابل Lua)، mw:Extension:WikiScripts، تیم Scribunto را با پشتیبانی اولیه از Lua مینویسد.
Lua که سالها مورد بحث قرار گرفت، در سال 2012 برای آزمایش در test2.wikipedia.org نصب شد، با دعوت آزاد از همه ویراستاران برای آزمایش با توسعه ماژولهای Lua. Lua در فوریه 2013 پس از آزمایش در mediawiki.org و ویکیهای آزمایشی ویکیمدیا در ویکیپدیای انگلیسی نصب شد.
Lua یک زبان برنامه نویسی است که می تواند برای تجزیه و تحلیل داده ها، محاسبه عبارات و قالب بندی نتایج با استفاده از توابع یا برنامه نویسی شی گرا استفاده شود . اگرچه برخی از اسکریپتهای Lua را میتوان ساده نگه داشت، اما برای درک آسان، Lua به ساختارهای پیچیده از جمله جداول، توابع پویا و آرایههای انجمنی اجازه میدهد که زیرنویسهای فهرست میتوانند کلمات و همچنین اعداد فهرست باشند. Lua همچنین از بازگشت توابع مجدد تودرتو پشتیبانی می کند، بنابراین باید مراقب باشید تا از پیچیدگی بیش از حد در جایی که سایر کاربران نمی دانند چگونه ماژول Lua را حفظ کنند، جلوگیری شود. در زیر کد منبع ماژول مورد استفاده برای مثال های بالا آمده است.
محلی p = {}; --همه ماژول های Lua در ویکی پدیا باید با تعریف یک متغیر شروع شوند -- که عملکردهای قابل دسترسی خارجی خود را حفظ می کند. -- چنین متغیرهایی می توانند هر نامی که شما می خواهید و ممکن است داشته باشند --همچنین شامل داده های مختلف و همچنین توابع است.ص . hello = تابع ( فریم ) --یک تابع به "p" اضافه کنید. -- چنین توابعی در ویکی پدیا قابل فراخوانی هستند --از طریق دستور #invoke. --"قاب" حاوی داده های ویکی پدیا خواهد بود --این تابع را هنگام اجرا ارسال می کند. -- "سلام" نامی است که شما انتخاب می کنید. هنگام استفاده از ماژول باید به همین نام اشاره شود. local str = "سلام دنیا!" - یک متغیر محلی را اعلام کرده و آن را برابر قرار دهید --"سلام دنیا!". return str -- این به ما می گوید که از این تابع خارج شده و اطلاعات را به داخل ارسال کنیم --"str" به ویکی پدیا بازگشت. پایان -- پایان تابع "hello"تابع p hello_to ( فریم ) -- یک تابع دیگر اضافه کنید نام محلی = قاب . args [ 1 ] -- برای دسترسی به آرگومان های ارسال شده به یک ماژول، از «frame.args» استفاده کنید -- «frame.args[1]» به اولین پارامتر بی نام اشاره دارد - به ماژول داده شده استبازگشت "سلام، " .. نام .. "!" -- `..` رشته ها را به هم متصل می کند. این یک سفارشی را برمی گرداند - سلام کردن بسته به نام داده شده، مانند "سلام، فرد!"پایانتابع p count_fruit ( قاب )local num_bananas = tonumber ( frame . args . bananas ) یا 0 -- آرگومان های نامگذاری شده ({{#invoke:Example|count_fruit|foo=bar}})local num_apples = tonumber ( frame . args . apples ) یا 0 - به همین ترتیب با فهرست کردن «frame.args» با نام (`frame.args["bananas"]` قابل دسترسی هستند.-- یا معادل «frame.args.bananas».local conj_bananas = num_bananas == 1 و 'موز' یا 'موز' local conj_apples = num_apples == 1 و 'apple' یا 'apples' - عملگرهای سه تایی مقادیر را بر اساس یک شرط به روش فشرده اختصاص می دهند.-- در اینجا، «conj_bananas» «موز» را دریافت میکند اگر «تعداد_موز» 1 باشد، در غیر این صورت «موز» است.-- به طور مشابه، «conj_apples» اگر «num_apples» 1 باشد، «apple» را دریافت میکند، در غیر این صورت، «apples»». بازگشت 'من ' .. num_bananas .. ' ' .. conj_bananas .. ' و ' .. num_apples .. ' ' .. conj_apples -- مانند بالا، دسته ای از رشته ها را به هم بچسبانید تا تولید شود -- جمله ای بر اساس استدلال های ارائه شده.پایانreturn p -- همه ماژول ها با برگرداندن متغیر حاوی توابع آنها به ویکی پدیا پایان می یابند.-- اکنون می توانیم با فراخوانی {{#invoke: Example | از این ماژول استفاده کنیم سلام }}،-- {{#invoke: مثال | سلام_به | foo }}، یا {{#invoke:Example|count_fruit|موز=5|سیب=6}}-- توجه داشته باشید که قسمت اول فراخوانی نام ویکی صفحه ماژول است،-- و قسمت دوم نام یکی از توابع پیوست شده است-- متغیری که برگردانده اید.- عملکرد "چاپ" در ویکی پدیا مجاز نیست. تمام خروجی انجام شده است-- از طریق رشته های "بازگشت" به ویکی پدیا.
نمونه ای از Lua با برچسب <syntaxhighlight lang="lua">...</syntaxhighlight>
قرار داده شده در اطراف کد منبع Lua برجسته می شود. برای مشاهده چند نمونه پیچیده تر از Lua، به مقاله: " Lua (زبان برنامه نویسی) " مراجعه کنید.
برای دستورالعملهای نحوه استفاده از Lua در مدیاویکی (و از این رو ویکیپدیا)، به راهنمای مرجع mw:Extension:Scribunto/Lua مراجعه کنید.
چند چارچوب تست واحد برای اسکریپت های Lua در ویکی پدیا موجود است. اینها به ویرایشگر اجازه میدهد تا ماژول را با مجموعهای از ورودیها اجرا کند و تأیید کند که خروجیهای مورد انتظار تولید شدهاند. آنها برای تشخیص سریع رگرسیون های نرم افزاری مفید هستند ، جایی که تغییرات در یک اسکریپت مشکلات جدید (یا شناسایی قدیمی) را ایجاد می کند.
طبق قرارداد، تستهای واحد برای ماژولهایی مانند Module:Example در Module:Example/testcases قرار میگیرند و روی Module talk:Example/testcases اجرا میشوند .
Module: UnitTests کد از پیش پر شده ای است که هنگام ایجاد صفحه تست مورد استفاده قرار می گیرد. شما این تست های واحد را با قرار دادن{{#invoke:Example/testcases|run_tests}}
در صفحه بحث تست مورد اجرا می کنید.
Module:ScribuntoUnit یکی دیگر از چارچوب های آزمایشی پرکاربرد است. رده:ماژولهای ابزار تست چند مورد دیگر برای بررسی دارند که ممکن است جالب باشند.
به طور کلی: Lua فقط میتواند ورودی را بهعنوان رشتههای متنی دریافت کند که {{#invoke:}}
میتواند از طریق mw.title.new(...):getContent() و frame:expandTemplate() واکشی شود. خروجی Lua از قبل پردازش نمی شود مگر اینکه ()frame:preprocess به صراحت فراخوانی شود، به این معنی که فراخوانی های قالب، توابع تجزیه کننده و غیره در خروجی به درستی کار نمی کنند. همچنین، تمام Lua در صفحه به 10 ثانیه زمان CPU محدود شده است (شما می توانید به کد منبع یک صفحه رندر شده نگاه کنید تا ببینید یک الگو یا ماژول چقدر طول کشید تا تجزیه شود). و نسبت به استاندارد Lua، Scribunto's Lua فاقد انواع توابع است (به کتابچه راهنمای مرجع mw:Extension:Scribunto/Lua مراجعه کنید § تفاوت با Lua استاندارد).
کد Lua در Scribunto فقط زمانی اجرا می شود که صفحه در حال تجزیه است. بنابراین، تنها ورودی کاربر که Lua میتواند دریافت کند، ویرایش صفحه است - نمیتواند کادری ایجاد کند که ریشه دوم عددی را که تایپ میکنید محاسبه کند، یا بسته به اینکه روی کدام قسمت از مجموعه والد کلیک میکنید، قطعهای از مجموعه Mandelbrot را دوباره محاسبه کند. در ورودیهایی که Lua میتواند دریافت کند شامل هر صفحه متنی قابل ترجمه در ویکیپدیا است. این شامل فایلهای گرافیکی نیست (حتی فایلهای SVG ، اگرچه در واقع متن هستند، مگر اینکه آن را برش داده و در صفحه متنی ویکی بچسبانید)، فهرست صفحات فهرستشده در یک دسته ، و همچنین محتوای صفحات ویژه غیرقابل انتقال را شامل نمیشود. .
سرصفحههای ویکیپدیا منتقلشده اغلب حاوی یک کد پنهان مانند «UNIQ5ae8f2aa414ff233-h-3--QINU» هستند که ممکن است لازم باشد برای تجزیه مؤثر آنها حذف شوند.
ویکیپیوندهایی که از ترفند لوله [[Wikipedia:Help| ]] استفاده میکنند ، اگر بهعنوان خروجی برگردانده شوند، کار نمیکنند - باید بهصراحت بهعنوان نوشته شوند [[Wikipedia:Help|Help]]. دیگر تبدیلهای پیش از ذخیره، مانند جایگزینی ~~~~با امضا، نیز پردازش نمیشوند. فراخوانیهای الگو، فراخوانی تابع تجزیهکننده و جایگزینهای متغیر (یعنی هر چیزی با a {{...}}
) پردازش نمیشوند و همچنین برچسبهایی مانند <ref>
یا <nowiki>
. از frame:extensionTag برای اضافه کردن برچسبهایی مانند <ref>
یا <syntaxhighlight>
خروجی استفاده کنید.
لطفاً الگوی {{ lua }} را در زیرصفحه اسناد همه الگوهایی که از Lua استفاده می کنند قرار دهید. این به برقراری ارتباط بهتر استفاده از Lua و تبدیلهای قالب کمک میکند.