Główny moduł implementujący funkcję {{#invoke:Wikidane|P}}. Nie jest przeznaczony do bezpośredniego wywołania. Implementuje mechanizm wywoływania wtyczek używanych do formatowania cech z Wikidanych, które są wyświetlane w infoboksach.

Standardowe parametry

[edytuj]
procesor
wskazanie dedykowanej wtyczki do formatowania
link
włączenie lub wyłączenie generowania linków, jeśli obsługiwane przez wtyczkę
separator
sposób konwersji listy cech na końcową postać tekstową
bez wartości
treść dla wartości specjalnej novalue
format
tekst do formatowania treści, jeśli obsługiwane przez wtyczkę

Wtyczka

[edytuj]

Wtyczka jest tablicą asocjacyjną zawierającą następujące elementy:

scope
obowiązkowe pole typu tekstowego zawierające identyfikator akceptowanego typu danych do formatowania przez wtyczkę
format
obowiązkowe pole typu funkcyjnego zawierające funkcję zamieniającą dane na tekst do wyświetlenia
options
opcjonalne pole do definiowania parametrów dla funkcji format

Wybór wtyczki jest wybierany na podstawie parametru procesor, który zawiera pełną nazwę modułu implementującego wtyczkę, lub jeśli nie podano na podstawie identyfikatora cechy. Podanie pustego parametru procesor oznacza użycie uniwersalnej wtyczki formatującej wynik.

Szablon typowego modułu formatującego cechę to

local moduleData = require("Moduł:Wikidane/data")           -- zbiór podstawowych stałych local format = require("Moduł:Wikidane/format/snak").format -- uniwersalna wtyczka formatująca minimalną podstawową jednostkę danych  return {  scope = "prop",  format = function{prop, opcje) 	... end,  } 

scope

[edytuj]

Dopuszczalne wartości pola to:

snak
podstawowa struktura definiujące jednostkę danych, zwykle wartość cechy (mainsnak) lub kwalifikator
prop
pełna cecha zawierająca mainsnak, kwalifikatory i źródła
props
tablica cech

format

[edytuj]

Funkcja formatująca wartość cechy. Przyjmuje dwa parametry:

dane
tablica asocjacyjna z danymi w zakresie określonym polem scope
opcje
tablica asocjacyjna z parametrami
format = function{dane, opcje) 	... end, 

options

[edytuj]

Jeśli pole jest tablicą to opcje dla wtyczki są inicjowane parametrami standardowymi (oprócz pola procesor) oraz parametrami zadeklarowanymi w tabeli. Dodatkowo pole default służy do zdefiniowania parametrów z wartościami domyślnymi. Przykład:

options = { 	"kij", 	"marchewka", 	default = { 		["kij"] = "lipowy", 		["żarcik"] = true, 	}, }, 

W powyższym kodzie zostały zdefiniowane dwa parametry kij i marchewka oraz domyślna wartość dla parametru kij. Natomiast żarcik nie jest parametrem możliwym do podania w wywołaniu funkcji, jest więc jakby predefiniowaną stałą.

Jeśli pole jest funkcją to żadne parametry nie są standardowo ładowane, a za przygotowanie wszystkich opcji odpowiedzialna jest zadeklarowana funkcja.

Jeśli pole nie jest ani tablicą ani funkcją, to wtyczka jest wywołana z pustą tablicą opcji.

Zobacz też

[edytuj]



Na stronie Moduł:Wikidane/format wykorzystano treści ze strony Moduł:Wikidane/format w polskiej Wikipedii (link do wersji).
Jej autorzy wymienieni są w historii edycji. Prawa autorskie: na licencji Creative Commons CC-BY-SA.



local moduleData = mw.loadData("Module:Wikidane/data") local getArgs = require('Module:Arguments').getArgs  local function loadArgs(frame, custom)  	local args = getArgs(frame, { 		trim = false, 		removeBlanks = false, 		parentFirst = true, 		readOnly = true, 		noOverwrite = true, 	})  	local function loadArg(id) 		local result = args[id] 		return (result and (#result ~= 0)) and result or nil 	end   	local parseBool = function(arg) 		if type(arg) == "boolean" then 			return arg 		elseif arg == moduleData.boolYes then 			return true 		elseif arg == moduleData.boolNo then 			return false 		end 	end   	local parseSeparator = function(arg) 		if arg == moduleData.separatorAnd then 			return moduleData.defaultSeparator, moduleData.defaultLastAndSeparator 		elseif arg == moduleData.separatorOr then 			return moduleData.defaultSeparator, moduleData.defaultLastOrSeparator 		elseif arg == moduleData.separatorBullet then 			return "</li><li>", "</li><li>", "<ul><li>", "</li></ul>" 		elseif arg == moduleData.separatorOrdered then 			return "</li><li>", "</li><li>", "<ol><li>", "</li></ol>" 		elseif arg == moduleData.separatorOptionalBullet then 			return "</li><li>", "</li><li>", "<ul><li>", "</li></ul>", true 		elseif arg == moduleData.separatorOptionalOrdered then 			return "</li><li>", "</li><li>", "<ol><li>", "</li></ol>", true 		elseif arg == moduleData.separatorOr then 			return moduleData.defaultSeparator, moduleData.defaultLastOrSeparator 		elseif arg ~= nil then -- custom 			return arg, arg 		end 	end 	 	local function parseQualifiers(arg) 		if type(arg) == "table" then 			local result = {} 			for i, v in ipairs(arg) do 				local p = string.match(v, "^[pP](%d+)$") 				if p then 					table.insert(result, "P"..p) 				end 			end 			 			if #result > 0 then 				return result 			end 		end 	end 	 	local link = parseBool(loadArg(moduleData.argLink)) 	local sep, lastSep, before, after, optional = parseSeparator(loadArg(moduleData.argSeparator)) 	local qualifiers = parseQualifiers(loadArg("kwalifikatory"))   	local result = { 		linkCoordinates = link, 		linkDate = link, 		linkItem = link, 		separator = sep, 		lastSeparator = lastSep, 		separatorBefore = before, 		separatorAfter = after, 		separatorOptional = optional, 		novalue = loadArg(moduleData.argNoValue), 		format = loadArg(moduleData.argFormat), 		qualifiers = qualifiers, 	} 	 	if custom then 		for _, v in ipairs(custom) do 			if result[v] == nil then 				result[v] = loadArg(v) 			end 		end   		if custom.default then 			for k, v in pairs(custom.default) do 				if result[k] == nil then 					result[k] = v 				end 			end 		end 	end   	-- global defaults 	result.separator = result.separator or moduleData.defaultSeparator 	result.lastSeparator = result.lastSeparator or moduleData.defaultSeparator 	result.linkCoordinates = (result.linkCoordinates == nil) and moduleData.defaultLinkCoordinates or result.linkCoordinates 	result.linkDate = (result.linkDate == nil) and moduleData.defaultLinkDate or result.linkDate 	result.linkItem = (result.linkItem == nil) and moduleData.defaultLinkItem or result.linkItem 	result.separatorBefore = result.separatorBefore or "" 	result.separatorAfter = result.separatorAfter or ""   	return result end  local function listToText(items, options) 	if (#items == 0) then 		return 	end 	 	if (#items == 1) and options.separatorOptional then 		return items[1] 	end 	 	return options.separatorBefore..mw.text.listToText(items, options.separator, options.lastSeparator)..options.separatorAfter end  local runners = {   	["snak"] = function (processor, properties, options) 		local result = {}   		for i, p in ipairs(properties) do 			if (p.type == "statement") and p.mainsnak then 				local s = processor.format(p.mainsnak, options) 				if s and (#s > 0) then 					table.insert(result, s) 				end 			end 		end   		return listToText(result, options) 	end,   	["prop"] = function (processor, properties, options) 		local result = {}   		for i, p in ipairs(properties) do 			if (p.type == "statement") and p.mainsnak then 				local s = processor.format(p, options) 				if s and (#s > 0) then 					table.insert(result, s) 				end 			end 		end   		return listToText(result, options) 	end,   	["props"] = function (processor, properties, options) 		return processor.format(properties, options) 	end, }  return { 	 run = function(frame, pid, properties)  	local automatic = function() 		local pinfo = mw.wikibase.getEntity(pid) 		return moduleData.processor[2][pinfo and pinfo.datatype or false] 			or moduleData.processor[1] 	end 	 	local processor = getArgs(frame).procesor 		or moduleData.processor[pid] 		or ""  	local module = require(#processor > 0 and processor or automatic()) 	local options 	if module.options == nil then 		options = loadArgs(frame) 	elseif type(module.options) == "table" then 		options = loadArgs(frame, module.options) 	elseif type(module.options) == "function" then 		options = module.options(frame) 	else 		options = {} 	end  	if (#processor == 0) and (module.scope == "snak") then 		module = require(moduleData.processor[1]) 	end 	 	local runner = runners[module.scope] 	if runner then 		return runner(module, properties, options) 	end end,  }