Module:Cite source

local concat local dump local print local properties = {partOf, series, seriesNumber, season, writer, publisher} -- year and issue also exist but have seperate handling. local p = {} --p stands for package

-- from https://thealchemistcode.fandom.com/wiki/Module:VarsUtil do -- Remove if extension is installed. VariablesLua = VariablesLua or { var = function(var, default) return mw.getCurrentFrame:callParserFunction('#var', var, default) end, vardefine = function(var, val) return mw.getCurrentFrame:callParserFunction('#vardefine', var, val) end, vardefineecho = function(var, val) return mw.getCurrentFrame:callParserFunction('#vardefineecho', var, val) end, } end

function p.getinfo( frame ) local testtext = "" local queryResult = mw.smw.ask( [=[ Rose (TV story) || Rosa (TV story)	if queryResult == nil then       return "No data."    end    if type( queryResult ) == "table" then
 * ?Publisher
 * ?Writer
 * ?Release date ]=])

for i = 1, #queryResult do	   	local current = queryResult[i] local output = "" data = {} for i=1, #properties do		   	data[properties[i]] = "" if current["Writer"] ~= nil and type(current["Writer"]) ~= "table" then data[properties[i]] = data[properties[i]] .. current["Writer"] elseif type(current["Writer"]) == "table" then for i = 1, #current["Writer"] do data[properties[i]] = data[properties[i]] .. current["Writer"][i] if i == #current["Writer"]-1 then data[properties[i]] = data[properties[i]] .. " and " elseif i == #current["Writer"] then data[properties[i]] = data[properties[i]] else data[properties[i]] = data[properties[i]] .. ", "		   			end end end end VariablesLua.vardefine(current[1], output) end testtext = data["writer"] return testtext end end

--from https://sandbox.semantic-mediawiki.org/wiki/Module:Sm --- Concatenates a variable number of strings and numbers to one single string -- ignores tables, bools, functions, and such and replaces them with the empty string -- -- What is the benefit of using variable.concat instead of the .. operator? -- Answer: .. throws an error, when trying to concat bools, tables, functions, etc. -- This here handels them by converting them to an empty string -- -- @param ... varaibles to concatenate -- -- @return string concat = function(...) local args = {...} if #args == 0 then error('you must supply at least one argument to \'concat\' (got none)') end local firstArg = table.remove(args, 1) if type(firstArg) == 'string' or type(firstArg) == 'number' then firstArg = print(firstArg) else firstArg = '' end if #args == 0 then return firstArg else return firstArg .. concat(unpack(args)) end end

--- This dumps the variable (converts it into a string representation of itself) -- -- @param entity mixed, value to dump -- @param indent string, can bu used to set an indentation -- @param omitType bool, set to true to omit the () in front of the value -- -- @return string dump = function(entity, indent, omitType) local entity = entity local indent = indent and indent or '' local omitType = omitType if type( entity ) == 'table' then local subtable if not omitType then subtable = '(table)[' .. #entity .. ']:'       end indent = indent .. '\t' for k, v in pairs( entity ) do           subtable = concat(subtable, '\n', indent, k, ': ', dump(v, indent, omitType)) end return subtable elseif type( entity ) == 'nil' or type( entity ) == 'function' or type( entity ) == 'boolean' then return ( not omitType and '(' .. type(entity) .. ') ' or '' ) .. print(entity) elseif type( entity ) == 'string' then entity = mw.ustring.gsub(mw.ustring.gsub(entity, "\\'", "'"), "'", "\\'") return concat(omitType or '(string) ', '\, entity, '\) else -- number value expected return concat(omitType or '(' .. type( entity ) .. ') ', entity) end end

--- This function prints a variable depending on its type: -- * tables get concatenated by a comma -- * bools get printed as true or false -- * strings and numbers get simple returned as string -- * functions and nils return as emtpy string -- @return string print = function(v) if type( v ) == 'table' then return table.concat(v, ',') elseif type( v ) == 'boolean' then return ( v and 'true' or 'false' ) elseif type(v) == 'string' or type(v) == 'number' then return tostring(v) else return '' end end

return p