חב"דפדיה:לואה

מתוך חב"דפדיה, אנציקלופדיה חב"דית חופשית
קפיצה לניווט קפיצה לחיפוש

ההרחבה Scribunto, שמאפשרת כתיבת מודולים בשפת Lua ושימוש בהם בתבניות, הופעלה בוויקיפדיה העברית.

למרבה הצער קצת קשה למצוא תיעוד שימושי. תיעוד כללי לשפת Lua קיים, אבל תעוד שמסביר את השימוש בוויקיפדיה קצת יותר קשה למצוא.

תיעוד[עריכת קוד מקור]

תיעוד באנגלית ניתן לקרוא כאן.

איך זה פועל[עריכת קוד מקור]

להבדיל מתבניות, שהן בעצם דפים "רגילים" שיכולים להימצא במרחב שם כלשהו, מודולים חייבים להמצא במרחב שם חדש שנקרא "יחידה" (באנגלית module). כל יחידה מחזירה משתנה מקומי, שהשדות השונים שלו הם פונקציות שתבניות יכולות להשתמש בהן.

כך נראית יחידה שנקראת, נניח, M, (כלומר, נמצאת בדף יחידה:M) ומייצאת שתי פונקציות: f1 ו-f2:

local m = {} -- you can use any name you want - it does not have to be identical to the module name

function m.f1(frame)
	return "שלום לכולם"
end

-- these two ways to define the function are practically synonymous. the 2nd form below is more common.
m.f2 = function(frame)
	return "להתראות"
end

-- this function cannot be called using #invoke, because it's not a member of m. it can be called from other functions in the module.
function f3(x)
	return x * 2
end

-- however, we can expose a function, say, f4, by defining it first, and then adding it to m like so:
function something(frame) 
	-- do something
end

m.f4 = something

-- for Hebrew function names, use the following syntax:
m["עברית"] = function(frame)
	return "שלום בעברית"
end

return m

כדי להשתמש במודול, יש "מילת קסם" חדשה בשם invoke. למילה הזו יש לתת שני פרמטרים: שם המודול ושם הפונקציה. בנוסף, אפשר להוסיף פרמטרים נוספים ככל שנדרש - פרמטרים נוספים אלו יועברו לפונקציה. הנה דוגמה להפעלת הפונקציה f1 בלי פרמטרים:

{{#invoke:M|f1}}

כנראה גם למילת הקסם invoke יהיה תרגום לעברית.

העברת פרמטרים לפונקציה ב-Lua[עריכת קוד מקור]

הפונקציה שנקראת מ-invoke מקבלת תמיד פרמטר יחיד שנהוג (אם כי לא חובה) לקרוא לו frame. פרמטר זה אורז בתוכו מידע שהפונקציה ב-lua יכולה למצות ולהשתמש בו. לדוגמה, מידע על התבנית שמכילה את הקריאה ל-invoke ארוז ב-frame:getParent(). בדומה, הפרמטרים שמועברים מהתבנית ארוזים ב-frame.args. בדומה לפרמטרים לתבניות, פרמטרים לפונקציה יכולים להיות מבוססי סדר או שמיים. נניח שאנחנו רוצים להעביר לפונקציה king_wives שלושה פרמטרים: פרמטר שמי בשם "מלך", ושני פרמטרים מבוססי סדר:

{{#invoke:m|king_wives|מלך=שלמה|40|25}}

הפונקציה ניגשת לפרמטרים בעזרת args:

function m.king_wives(frame)
	local king   = frame.args["מלך"]
	local param1 = frame.args[1]
	local param2 = frame.args[2]
        -- do something with the parameters, e.g.:
	return string.format("ל%s המלך היו %d נשים", king, param1 * param2)
end

אם נקרא לפונקציה כמו בדוגמה למעלה, נקבל בדף "לשלמה המלך היו 1000 נשים".

לעומת זאת, הקריאה:

{{#invoke:m|king_wives|מלך=דוד|3|6}}

תניב "לדוד המלך היו 18 נשים".

הערך המוחזר מהפונקציה[עריכת קוד מקור]

הפונקציות הפנימיות במודול יכולות להחזיר ערך מסוג כלשהו - שום דבר, מספר, מחרוזת, טבלה, ערך בוליאני, או אפילו פונקציה. פונקציה "ראשית", כלומר כזו שנקראת מקוד ויקי, צריכה להחזיר מחרוזת. אחרי הקריאה לפונקציה, המחרוזת שהוחזרה מועברת לפורס (parser) להמשך העיבוד. המשמעות היא שאם הפונקציה רוצה, למשל, לצייר תמונה, היא לא אמורה להחזיר מחרוזת html עם תג img, אלא מחרוזת בקוד ויקי, כמו שהייתם שמים בדף - [[קובץ:שם הקובץ]]. אם הפונקציה רוצה לצייר טבלה, היא מחזירה את קוד הוויקי של הטבלה. בדומה, ניתן להחזיר קריאה לתבנית וכן הלאה.

פיתוח ו"ארגז חול"[עריכת קוד מקור]

ההרחבה ארגז חול לתבניות תומכת גם בסקריבונטו. במלים אחרות, ניתן לפתח ולבדוק מודולים במרחב המשתמש, לפני העברתם למרחב יחידה

הסבר ודוגמה[עריכת קוד מקור]

המשתמשת משתמשת:אלמונית רוצה לפתח מודול חדש בשם "אתגר", או לבדוק שינויים שהיא רוצה לעשות במודול קיים בשם זה. לשם כך היא מייצרת דף חדש בשם "משתמשת:אלמונית/ארגז חול/יחידה:אתגר". שימו לב לשתי נקודות עדינות:

  1. הנקודתיים בשם הדף, ש"מתחזות" לנקודתיים הרגילות שמפרידות בין מרחב שם ושם דף, אבל במקרה הזה לא מדובר בדף במרחב יחידה, אלא בדף במרחב המשתמש, ששמו מכיל נקודתיים.
  2. כשמשתמשים בשם מודול באותיות לטיניות, השם חייב להתחיל באות גדולה, ובאופן כללי השם הוא תלוי רישיות. בקריאה למודול (כלומר כשמפעילים את מילת הקסם invoke#), המערכת תחליף את האות הראשונה בשם המודול שמועבר לקריאה באותו התו מותמר לאות גדולה. במודול רגיל, אותה התמרה מתבצעת בשם הדף עצמו. בשימוש ב"ארגז חול לתבניות", האות הראשונה ב"שם המודול" היא בעצם אות שנמצאת באמצע השם (כלומר, במקום שם דף "אתגר" במרחב "יחידה", שם הדף הוא בעצם יחידה:אתגר, במרחב המשתמש) ולכן המערכת לא מתמירה אותה אוטומטית לאות גדולה. בגלל שההתמרה בקריאה למודול עדיין מתבצעת, באחריות המשתמשת לייצר את הדף בשם שנפתח באות גדולה. אם שם המודול הוא בעברית, בעיה זו לא קיימת.

כשהמשתמשת מבקשת להציג דף כלשהו בוויקיפדיה או קוד ויקי שמוזן בקופסה המתאימה ב"ארגז חול לתבניות", הדף המוצג לא נלקח מזיכרון המטמון של השרת, אלא מחושב מחדש, כשעבור כל תבנית ומודול שנמצאים בשימוש, המערכת בודקת האם דף בשם המתאים נמצא תחת "תחילית לארגז חול". אם תבנית או מודול כאלו קיימים, המערכת תשתמש בהם. אם לא, היא תשתמש בתבנית או המודול שקיים במרחב התבניות או המודולים בשם זה. בדוגמה שלנו, "תחילית לארגז חול" היא "משתמשת:אלמונית/ארגז חול", ולכן כשהמערכת תיתקל ב {{#invoke:אתגר|....}}, המערכת תריץ את הקוד שנמצא בדף "משתמשת:אלמונית/ארגז חול/יחידה:אתגר".

ראו גם[עריכת קוד מקור]

קישורים חיצוניים[עריכת קוד מקור]