وحدة:LuaCall
صُنفت هذه الوحدة على أنها في مرحلة ألفا. تكون الوحدة في هذه المرحلة جاهزة نوعا ما لأن تستخدم من طرف ثالث، أي بمعنى أخر على النطاقات في صفحات التجارب. لكن يجب أن تستخدم في صفحات محددة للغاية وأن لا يوسع إستخدامها ابدا، حتى تنتقل للمرحلة التي بعدها. يجب أن يضاف لهذه الوحدة صفحة توثيق تشرح مدخلاتها وطريقة استخدامها. يجب أن تراقب هذه الوحدة جيدا وملاحظة أي أخطاء قد تحدث والعمل على عزلها وإصلاحها. |
أنشئت هذه الوحدة للسماح باستخدام وظيفة تقدمها لوا بدلا من كتابة وحدة كاملة لاستخدام هذه الوظيفة. وتعتبر هذه الوحدة طريقة ميسرة للمستخدمين بالذات المبتدئين منهم لاستخدام وظائف لوا بدلا من خوض غمار كتابة وحدة جديدة. توجد هذه الوظائف هنا يمكنك الاطلاع عليها.
من الممكن أن تواجه رسالة خطأ عند استخدام الوحدة والسبب يعود لاستخدامك الوظيفة بشكل خاطئ. على سبيل المثال عند استخدامك الوظيفة math.fmod(value) في الوحدة على هذا النحو {{#invoke:LuaCall|main|value=1.4512|math.fmod(value)}} ينتج أخطاء في البرنامج النصي (السكربت) ويعود السبب أنك نسيت ملئ القيمة الثانية عند إستخدامك هذه الوظيفة.
الاستخدام
عدل{{#invoke:LuaCall|main|''arbitrary variables''|''parameters''|''function''}}
The arbitrary variables أو المتغيرات العشوائية هي كلمات مفتاحية من اختيارك = أي قيمة أنت تختارها. يتم تفسير القيم كسلاسل ما لم تكن وظيفة tonumber (قيمتها) ليست NaN أي ليست رقما. أنقر هنا للمزيد.
parameters أو المعايير جميعها تبدأ بـ reserved_، وهي متغيرات عشوائية يجب أن يتم استخدامها.
- reserved_return يحدد المخرجات من الوظيفة التي تريدها، ويجعل قيمته الافتراضية تساوي 1. على سبيل المثال وضع قيمته 2 لـ mw.ustring.gsub سوف يجعل الرقم الذي أستبدل به القيمة الافتراضية 1 إلى 2 وبهذا تتم عملية الاستبدال.
- reserved_debug - القيمة التي لا تكون صفرا سوف تجبر على عرض نص غير صحيح.
الوظيفة المكتوبة على النحو some.function.name(a,b,c) حيث ome.function.name تعني شيئا موجودا في Extension:Scribunto/Lua_reference_manual والقيم a,b,c هي أسماء القيم العشوائية التي اخترتها سابقا.
بعض الأمثلة
عدلفي هذا المثال تقوم الوظيفة string.rep بتكرار القيمة لعدد مختار. تحدد القيم للوظيفة عبر string.rep(a,b) حيث تكون قيمة المتغير ِa تساوي الكلمة تجربة ويكون المتغير b مسؤوول عن عدد التكرارات.
{{#invoke:LuaCall|main|a=تجربة |b=7|string.rep(a,b)}}
تجربة تجربة تجربة تجربة تجربة تجربة تجربة
{{#invoke:LuaCall|main|pattern=(%a)|replace=%1.|string=I can't get no satisfaction|mw.ustring.gsub(string,pattern,replace)|reserved_return=1}}
I. c.a.n.'t. g.e.t. n.o. s.a.t.i.s.f.a.c.t.i.o.n.
{{#invoke:LuaCall|main|pattern=(%a)|replace=%1.|string=I can't get no satisfaction|mw.ustring.gsub(string,pattern,replace)|reserved_return=2}}
22
{{#invoke:LuaCall|main|value=1.4512|math.ceil(value)}}
2
{{#invoke:LuaCall|main|value=1.4512|math.modf(value)}}
1
{{#invoke:LuaCall|main|value=1.4512|math.modf(value)|reserved_return=2}}
0.4512
local p={}
function p.main(frame)
local parent=frame.getParent(frame) or {}
local reserved_value={}
local reserved_function,reserved_contents
for k,v in pairs(parent.args or {}) do
if tonumber(v)~=NaN then v=tonumber(v) end
_G[k]=v -- transfer every parameter directly to the global variable table
-- debuglog=debuglog..k.."="..v.."</nowiki><br /><nowiki>"
end
for k,v in pairs(frame.args or {}) do
if tonumber(v)~=NaN then v=tonumber(v) end
_G[k]=v -- transfer every parameter directly to the global variable table
end
--- Alas Scribunto does NOT implement coroutines, according to
--- http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#string.format
--- this will not stop us from trying to implement one single lousy function call
if _G[1] then
reserved_function,reserved_contents=mw.ustring.match(_G[1],"^%s*(%a[^%s%(]*)%(([^%)]*)%)%s*$")
end
if reserved_contents then
local reserved_counter=0
repeat
reserved_counter=reserved_counter+1
reserved_value[reserved_counter]=_G[mw.ustring.match(reserved_contents,"([^%,]+)")]
reserved_contents=mw.ustring.match(reserved_contents,"[^%,]+,(.*)$")
until not reserved_contents
end
local reserved_arraypart=_G
while mw.ustring.match(reserved_function,"%.") do
reserved_functionpart,reserved_function=mw.ustring.match(reserved_function,"^(%a[^%.]*)%.(.*)$")
reserved_arraypart=reserved_arraypart[reserved_functionpart]
end
local reserved_call=reserved_arraypart[reserved_function]
if type(reserved_call)~="function" then
return tostring(reserved_call)
elseif reserved_debug or not reserved_function then return mw.text.nowiki(debuglog)
else reserved_output={reserved_call(unpack(reserved_value))}
return reserved_output[reserved_return or 1]
end
end
return p