יחידה:CSV

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

היחידה מייצאת פונקציה אחת, בשם wikitable, שמקבלת מידע טבלאי בפורמט CSV, ומייצרת קוד ויקי של טבלה שלמה, או רצף שורות בטבלה, לפי תוכן המידע הזה.

התאים השונים ב-CSV יכולים להכיל קוד-ויקי, דוגמת קישורים או אפילו תמונות, אבל לא פסיקים או שורות חדשות.

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

ה-CSV בדוגמאות
שנה,אירוע,דמות
1453,המצאת ה[[דפוס]],[[יוהאן גוטנברג]]
1920,[[מאורעות תל חי]],[[יוסף טרומפלדור]]
1986,[[שער יד האלוהים]],[[דייגו מראדונה]]

פרמטרים[עריכת קוד מקור]

  • csv:תוכן הטבלה, בפורמט CSV. פרמטר חובה. עליו להכיל CSV חוקי. כל שאר הפרמטרים אופציונליים:
  • content-only: אם מעבירים בפרמטר זה ערך לא ריק, הפונקציה תחזיר את שורות הטבלה, אך ללא "עטיפה". באופן זה, יכול מי שקרא לפונקציה לעטוף את התוכן (דוגמה בהמשך)
  • no-title: כאשר לפרמטר זה ערך לא ריק, אין טיפול מיוחד בשורה הראשונה של ה-CSV. כאשר הפרמטר לא קיים, או ריק, השורה הראשונה בטבלה תוצג כשורת כותרות
  • table-attrib: אטריבוטות לטבלה כולה. לא בשימוש כשמשתמשים ב-content-only. אם לא מועבר הפרמטר, הפונקצייה משתמשת באטריבוטה class = "wikitable sortable"
  • tr-attrib: אטריבוטות לכל האלמנטים מסוג tr
  • th-attrib: אטריבוטות לכל האלמנטים מסוג th
  • td-attrib: אטריבוטות לכל האלמנטים מסוג td

לפרמטרים מסוג attrib אפשר להעביר כל מה שניתן להעביר כאטריבוטות html לאלמנט מהסוג המתאים. כך למשל, לטבלה ניתן להעביר border (שמתנהג באופן שונה משדה border של אטריבוטת style), או cell-padding. בדרך כלל האטריבוטות שנעביר הן class ו-style.

האטריבוטות יוצמדו לכל האלמנטים מאותו סוג בטבלה. כשמשתמשים ביחידה מתוך תבנית, מומלץ לשלוט על העיצוב בעזרת css ומנגנון templatestyle, ולמעט בהעברת אטריבוטות שאינן class.

דוגמאות:

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

דוגמה פשוטה[עריכת קוד מקור]

מעבירים לפונקציה CSV בלבד - התנהגות לפי ברירת המחדל: עיצוב wikitable סטנדרטי, השורה הראשונה של ה-CSV משמשת כותרות, טבלה ניתנת למיון:

{{#invoke:CSV|wikitable
 | csv = 
שנה,אירוע,דמות
1453,המצאת ה[[דפוס]],[[יוהאן גוטנברג]]
1920,[[מאורעות תל חי]],[[יוסף טרומפלדור]]
1986,[[שער יד האלוהים]],[[דייגו מראדונה]]
}}

והתוצאה:

שנהאירועדמות
1453המצאת הדפוסיוהאן גוטנברג
1920מאורעות תל חייוסף טרומפלדור
1986שער יד האלוהיםדייגו מראדונה


אטריבוטות[עריכת קוד מקור]

הפעם הטבלה אינה wikitable, ואינה ניתנת למיון. במקום זה נעביר אטריבוטות style, ‏ class, וכן אטריבוטות ספציפיות לטבלה (כאן העברנו border=2).

כמו כן נוסיף style לכותרות (th) ולתאים הרגילים בטבלה (td)
למען הקריאות, קוד הוויקי מוצג משמאל לימין. פרמטר csv הושמט, למען הבהירות - ערכו כמו בדוגמה הראשונה:
{{#invoke:CSV|wikitable
 | table-attrib = border = 2 class = "mw-collapsible mw-collapsed" style="margin:auto;" 
 | th-attrib = style="color:red;background-color:yellow;"
 | td-attrib = style="background-color:lightgreen;"
 | csv = ... כמו קודם

והתוצאה:

שנהאירועדמות
1453המצאת הדפוסיוהאן גוטנברג
1920מאורעות תל חייוסף טרומפלדור
1986שער יד האלוהיםדייגו מראדונה

תוכן בלבד, נחוצה עטיפה[עריכת קוד מקור]

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

{| class = "wikitable sortable mw-collapsible"
|-
! colspan=3 | עולם כמנהגו נוהג
{{#invoke:CSV|wikitable
 | content-only = true
 | csv = ... כמו קודם
}}
|}

הקריאה לפונקציה wikitable מוקפת בקוד ויקי רגיל של טבלה, הטבלה העוטפת אחראית בעצמה על האטריבוטות - במקרה זה מחלקות CSS שמעצבות טבלה סטנדרטית (wikitable), ומפעילות קוד שמ מדיה ויקי שגורם לטבלה להיות ניתנת למיון (sortable) וניתנת לקיפול (mw-collapsible), אבל לא מוצגת מראש במצב מקופל (בלי המחלקה mw-collapsible). העטיפה גם מוסיפה את שורת הכותרת הראשונה של הטבלה ("עולם כמנהגו נוהג"), ומורה לטבלה לפרוס כותרת זו על פני שלוש שורות (colspan=3).

והתוצאה
עולם כמנהגו נוהג
שנהאירועדמות
1453המצאת הדפוסיוהאן גוטנברג
1920מאורעות תל חייוסף טרומפלדור
1986שער יד האלוהיםדייגו מראדונה

ניתן להשתמש בעטיפה כדי לספק שורת כותרות שאינה מועברת כ-CSV, ובכך לעקוף את מגבלותיו (בלי פסיקים, הכל בשורה אחת), לכותרות עצמן.

כדי לעשות זאת, נגזור מה-CSV שלנו את השורה הראשונה, כלומר שורת הכותרות (אם יש כזו מלכתחילה ב-CSV שלנו), ונבקש מהיחידה לא להתייחס לשורה הראשונה ב-CSV כשורת כותרות, ובמעטפת, "נשתיל" שורת כותרות שאינה ב-CSV.:

{| class = "wikitable sortable"
|-
! מתי || מה || מי
{{#invoke:CSV|wikitable
 | content-only = true
 | no-title = true
 | csv = 
1453,המצאת ה[[דפוס]],[[יוהאן גוטנברג]]
1920,[[מאורעות תל חי]],[[יוסף טרומפלדור]]
1986,[[שער יד האלוהים]],[[דייגו מראדונה]]
}}
|}

והתוצאה:

מתי מה מי
1453המצאת הדפוסיוהאן גוטנברג
1920מאורעות תל חייוסף טרומפלדור
1986שער יד האלוהיםדייגו מראדונה

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


local function csv_to_table( csv )
	local tab = {}
	for row in mw.text.gsplit( csv, '\n') do
		table.insert(tab, mw.text.split(row, ','))
	end
	return tab
end

local function table_to_html( tab, th_first, table_attrib, tr_attrib, th_attrib, td_attrib, content_only ) 
	local htmlrows = {}
	for ind, line in ipairs(tab) do 
		local titlerow = th_first and ind == 1
		local opener = titlerow and '<th%s%s>' or '<td%s%s>'
		local closer = titlerow and '</th>' or '</td>'
		local row_attrib = titlerow and (th_attrib or '') or (td_attrib or '')
		mw.log(ind, ' td_attrib', td_attrib)
		opener = mw.ustring.format(opener, row_attrib and ' ' or '', row_attrib)
		local htmlrow = opener .. table.concat(line, closer .. opener) .. closer
		table.insert(htmlrows, mw.ustring.format('<tr%s%s>%s</tr>', tr_attrib and ' ' or '', tr_attrib or '', htmlrow))
	end
	local content = table.concat(htmlrows)
	return content_only and content
		or mw.ustring.format('<table%s%s>%s</table>', table_attrib and ' ' or '', table_attrib or '', content)
end

local function csv_to_wikitable( frame )
	local args = frame.args
	local csv = args.csv
	local tab = csv_to_table(csv)
	local table_attrib = args['table-attrib'] or 'class="wikitable sortable"'
	return table_to_html(tab, not args['no-title'], table_attrib, args['tr-attrib'], args['th-attrib'], args['td-attrib'], args['content-only'])
end



return {
	['wikitable'] = csv_to_wikitable,
}