Przejdź do zawartości

Moduł:Lista

Z Wikibooks, biblioteki wolnych podręczników.
 Dokumentacja modułu [zobacz] [edytuj] [historia] [odśwież]

Ten moduł generuje różnego rodzaju listy. Obecnie obsługuje listy wypunktowane, listy niepunktowane, listy poziome, listy uporządkowane (numerowane lub alfabetyczne) oraz listy uporządkowane w poziomie. Pozwala na łatwe stylizowanie css listy lub poszczególnych pozycji listy.

Stosowanie

Szybkie użycie
{{#invoke:Lista|funkcja|pierwsza pozyzcja|druga pozycja|trzecia pozycja|...}}
Wszystkie parametry
{{#invoke:Listy|funkcja
|pierwszy przedmiot|drugi przedmiot|trzeci przedmiot|...
|zacznij           = numer początkowy dla uporządkowanych list
|typ               = typ operacji dla uporządkowanych list
|typ stylu listy   = rodzaj numeracji list uporządkowanych
|klasa             = klasa
|styl              = style
|styl listy        = style dla list
|styl pozycji      = styl dla wszystkich elementów listy
|styl pozycji 1    = styl dla pierwszego elementu listy |styl pozycji 2 = styl dla drugiego elementu listy |...
|wartość pozycji 1 = wartość dla pierwszego elementu listy |wartość pozycji 2 = wartość dla drugiego elementu listy |...
|wcięcie           = wcięcie dla list poziomych
}}
Argumenty przekazane z szablonu nadrzędnego
{{#invoke:Lista|funkcja}}
Funkcje
Nazwa funkcji Co robi Wynik Szablon używający
wypunktowany Listy wypunktowane
  • Pierwsza pozycja
  • Druga pozycja
  • Trzecia pozycja
{{Wypunktowana lista}}
niewypunktowany Niepunktowane listy
  • Pierwsza pozycja
  • Druga pozycja
  • Trzecia pozycja
{{Niewypunktowana lista}}
poziomy Poziome listy wypunktowane
  • Pierwsza pozycja
  • Druga pozycja
  • Trzecia pozycja
{{Pozioma lista}}
uporządkowany Listy uporządkowane (listy numerowane i listy alfabetyczne)
  1. Pierwsza pozycja
  2. Druga pozycja
  3. Trzecia pozycja
{{Uporządkowana lista}}
poziomo uporządkowany Poziomo uporządkowane listy
  1. Pierwsza pozycja
  2. Druga pozycja
  3. Trzecia pozycja
{{Poziomo uporządkowana lista}}

Parametry

  • Parametry pozycyjne (1, 2, 3...) - to są elementy listy. Jeśli nie ma żadnych elementów listy, moduł nic nie wyświetli.
  • zacznij - ustawia pozycję początkową dla uporządkowanych list. Może to być numer początkowy dla list numerowanych lub litera początkowa dla list alfabetycznych. Poziome uporządkowane listy obsługują tylko liczby.
  • typ - rodzaj znacznika stosowanego na listach uporządkowanych. Możliwe wartości to „1” dla liczb (domyślnie), „A” dla wielkich liter, „a” dla małych liter, „I” dla wielkich liter Rzymski system zapisywania liczb oraz „i” dla małych cyfr rzymskich. Nieobsługiwane w poziomych listach uporządkowanych. Zobacz także parametr typ stylu listy.
  • typ stylu listy - rodzaj znacznika stosowanego na listach uporządkowanych. Wykorzystuje styl CSS i ma więcej dostępnych typów niż parametr typ, który wykorzystuje html. Możliwe wartości są wymienione na MDN's list-style-type page. Obsługa może się różnić w zależności od przeglądarki. typ-stylu-listy jest aliasem dla tego parametru.
  • klasa - klasa niestandardowa dla tagów < div>...</ div> otaczających listę, np. zwykłe linki.
  • styl - niestandardowy styl css dla tagów < div>...</ div> otaczających listę, np. font-size: 90%;.
  • styl listy - niestandardowy styl css dla samej listy.
  • styl pozycji - niestandardowy styl css dla wszystkich elementów listy (tagi < li>...</ li>).
  • styl pozycji 1, styl pozycji 2, styl pozycji 3... - niestandardowe style css dla każdego elementu listy.
  • wartość pozycji 1, wartość pozycji 2, wartość pozycji 3... - wartość niestandardowa dla podanego elementu listy. Elementy listy następujące po danym zwiększają się od określonej wartości. Wartość powinna być dodatnią liczbą całkowitą. (Pamiętaj, że ta opcja ma wpływ tylko na listy uporządkowane).
  • wcięcie - ten parametr wcina listę, tylko dla list poziomych i uporządkowanych poziomo. Wartość musi być liczbą, np. 2. Wcięcie jest obliczane w jednostakch w typografii, czyli Em, i jest 1,6 razy większe niż określona wartość. Jeśli nie określono wcięcia, wartością domyślną jest zero.

Przykłady

Listy wypunktowane
Code Result
{{#invoke:Lista|wypunktowany|Pierwszy poziom|Drugi poziom|Trzeci poziom}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
{{#invoke:Lista|wypunktowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|styl pozycji=color:blue;}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
{{#invoke:Lista|wypunktowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|styl pozycji 1=background-color:yellow;|styl pozycji 2=background-color:silver;}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
Niepunktowane listy
Kod Wynik
{{#invoke:Lista|niewypunktowany|Pierwszy poziom|Drugi poziom|Trzeci poziom}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
{{#invoke:Lista|niewypunktowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|styl pozycji=color:blue;}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
{{#invoke:Lista|niewypunktowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|styl pozycji 1=background-color:yellow;|styl pozycji 2=background-color:silver;}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
Poziome listy
Kod Wynik
{{#invoke:Lista|poziomy|Pierwszy poziom|Drugi poziom|Trzeci poziom}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
{{#invoke:Lista|poziomy|Pierwszy poziom|Drugi poziom|Trzeci poziom|wcięcie=2}}
  • Pierwszy poziom
  • Drugi poziom
  • Trzeci poziom
Porządkujące listy
Kod Wynik
{{#invoke:Lista|uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom}}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
{{#invoke:Lista|uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|zacznij=3}}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
{{#invoke:Lista|uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|typ=i}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
{{#invoke:Lista|uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|typ stylu listy=lower-greek}}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
Poziome porządkujące listy
Kod Wynik
{{#invoke:Lista|poziomo uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom}}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
{{#invoke:Lista|poziomo uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|zacznij=3}}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
{{#invoke:Lista|poziomo uporządkowany|Pierwszy poziom|Drugi poziom|Trzeci poziom|wcięcie=2}}
  1. Pierwszy poziom
  2. Drugi poziom
  3. Trzeci poziom
-- This module outputs different kinds of lists. At the moment, bulleted,
-- unbulleted, horizontal, ordered, and horizontal ordered lists are supported.

local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')

local p = {}

local listTypes = {
	['wypunktowany'] = true,
	['niewypunktowany'] = true,
	['poziomy'] = true,
	['uporządkowany'] = true,
	['poziomo uporządkowany'] = true
}

function p.makeListData(listType, args)
	-- Constructs a data table to be passed to p.renderList.
	local data = {}

	-- Classes
	data.classes = {}
	if listType == 'poziomy' or listType == 'poziomo uporządkowany' then
		table.insert(data.classes, 'hlist hlist-separated')
	elseif listType == 'niewypunktowany' then
		table.insert(data.classes, 'plainlist')
	end
	table.insert(data.classes, args.klasa)

	-- Main div style
	data.style = args.styl

	-- Indent for horizontal lists
	if listType == 'poziomy' or listType == 'poziomo uporządkowany' then
		local indent = tonumber(args['wcięcie'])
		indent = indent and indent * 1.6 or 0
		if indent > 0 then
			data.marginLeft = indent .. 'em'
		end
	end
	
	-- List style types for ordered lists
	-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
	-- type is either set by the "type" attribute or the "list-style-type" CSS
	-- property.
	if listType == 'uporządkowany' or listType == 'poziomo uporządkowany' then 
		data.listStyleType = args['typ stylu listy'] or args['typ-stylu-listy']
		data.type = args['typ']

		-- Detect invalid type attributes and attempt to convert them to
		-- list-style-type CSS properties.
		if data.type 
			and not data.listStyleType
			and not tostring(data.type):find('^%s*[1AaIi]%s*$')
		then
			data.listStyleType = data.type
			data.type = nil
		end
	end
	
	-- List tag type
	if listType == 'uporządkowany' or listType == 'poziomo uporządkowany' then
		data.listTag = 'ol'
	else
		data.listTag = 'ul'
	end

	-- Start number for ordered lists
	data.start = args.zacznij
	if listType == 'poziomo uporządkowany' then
		-- Apply fix to get start numbers working with horizontal ordered lists.
		local startNum = tonumber(data.start)
		if startNum then
			data.counterReset = 'listitem ' .. tostring(startNum - 1)
		end
	end

	-- List style
	 -- ul_style and ol_style are included for backwards compatibility. No
	 -- distinction is made for ordered or unordered lists.
	data.listStyle = args['styl listy']

	-- List items
	-- li_style is included for backwards compatibility. item_style was included
	-- to be easier to understand for non-coders.
	data.itemStyle = args['styl pozycji'] or args['styl li']
	data.items = {}
	for i, num in ipairs(mTableTools.numKeys(args)) do
		local item = {}
		item.content = args[num]
		item.style = args['styl pozycji ' .. tostring(num)]
		item.value = args['wartość pozycji ' .. tostring(num)]
		table.insert(data.items, item)
	end
	
	return data
end

function p.renderList(data)
	-- Renders the list HTML.
	
	-- Return the blank string if there are no list items.
	if type(data.items) ~= 'table' or #data.items < 1 then
		return ''
	end
	
	-- Render the main div tag.
	local root = mw.html.create('div')
	for i, class in ipairs(data.classes or {}) do
		root:addClass(class)
	end
	root:css{['margin-left'] = data.marginLeft}
	if data.style then
		root:cssText(data.style)
	end

	-- Render the list tag.
	local list = root:tag(data.listTag or 'ul')
	list
		:attr{start = data.start, type = data.type}
		:css{
			['counter-reset'] = data.counterReset,
			['list-style-type'] = data.listStyleType
		}
	if data.listStyle then
		list:cssText(data.listStyle)
	end

	-- Render the list items
	for i, t in ipairs(data.items or {}) do
		local item = list:tag('li')
		if data.itemStyle then
			item:cssText(data.itemStyle)
		end
		if t.style then
			item:cssText(t.style)
		end
		item
			:attr{value = t.value}
			:wikitext(t.content)
	end

	return tostring(root)
end

function p.makeList(listType, args)
	if not listType or not listTypes[listType] then
		error(string.format(
			"zły argument #1 do funckji 'makeList' ('%s' nie jest prawidłowym typem listy)",
			tostring(listType)
		), 2)
	end
	checkType('makeList', 2, args, 'table')
	local data = p.makeListData(listType, args)
	local list = p.renderList(data)
	return list
end

for listType in pairs(listTypes) do
	p[listType] = function (frame)
		local mArguments = require('Module:Arguments')
		local origArgs = mArguments.getArgs(frame, {
			valueFunc = function (key, value)
			if not value or not mw.ustring.find(value, '%S') then return nil end
			if mw.ustring.find(value, '^%s*[%*#;:]') then
				return value
			else
				return value:match('^%s*(.-)%s*$')
			end
			return nil
		end
		})
		-- Copy all the arguments to a new table, for faster indexing.
		local args = {}
		for k, v in pairs(origArgs) do
			args[k] = v
		end
		return p.makeList(listType, args)
	end
end

return p