Module:Cite source

local util_vars = require('Module:VarsUtil') --origanlly from https://thealchemistcode.fandom.com/wiki/Module:VarsUtil local util_link = require('Module:LinkUtil') local util_text = require('Module:TextUtil') local util_smw = require('Module:SMW') local cache = require('mw.ext.LuaCache') local PREFIX = 'SC_STORE_01-' local dump local p = {} --p stands for package local h = {} --h stands for helper

function h.getAndFormatUnlinkedItems(args) --gets and formats data for items that are unlinked	in the infobox local data = {["anthology"] = "", ["writer"] = "", ["publisher"] = "", ["adapted from"] = ""} for key, val in pairs(data) do		if args[key] and args[key] ~= "" then local current = util_text.split(args[key], args["separator"]) for i = 1, #current do data[key] = data[key] .. "" .. util_link.stripPipe(util_link.stripDab(current[i])) .. "" if i == #current-1 then data[key] = data[key] .. " and " elseif i == #current then data[key] = data[key] else data[key] = data[key] .. ", "				end end end end return data end

function h.getAndFormatIssuesText(args) --formats issues text (similar concept as above but doesn't add links) local issues = "" if args["publication"] then local current = util_text.split(args["publication"], args["separator"]) for i = 1, #current do issues = issues .. current[i] if i == #current-1 then issues = issues .. " and " elseif i == #current then issues = issues else issues = issues .. ", "			end end end return issues end

function h.getAndFormatSeriesText(args) -- making series text local series = "" if args["citation series"] then series = args["citation series"] elseif args["range"] then series = "\'\'" .. util_link.stripPipe(util_link.stripDab(args["range"])) .. "\'\'" elseif args["series"] then if args["series"] == "Doctor Who television stories" then series = "\'\'Doctor Who\'\'" else series = args["series"] end if args["season number"] then series = series .. " " .. "" .. util_link.stripPipe(util_link.stripDab(args["season number"])) .. "" end end return series end

function h.getReleaseYearText(argsRaw) -- making release year text local args = argsRaw local releaseYearText = "" if args["release date"] or args["broadcast date"] or args["premiere"] or args["beta release date"] or args["cover date"] then args["release date"] = util_text.split(util_link.stripDab(args["release date"] or args["broadcast date"] or args["premiere"] or args["beta release date"] or args["cover date"]), "-") local releaseYear local releaseEndYear if #args["release date"] >= 2 then releaseYear = args["release date"][1]:gsub("%s+", ""):sub(-4) releaseEndYear = args["release date"][2]:gsub("%s+", ""):sub(-4) if tonumber(releaseEndYear) == nil then releaseEndYear = nil end if tonumber(releaseYear) == nil then releaseYear = releaseEndYear releaseEndYear = nil end else releaseYear = args["release date"][1]:gsub("%s+", ""):sub(-4) end if releaseEndYear and releaseYear and (releaseEndYear ~= releaseYear) then if (tonumber(releaseEndYear) - tonumber(releaseYear)) == 1 then releaseYearText = "in" else releaseYearText = "between" end releaseYearText = releaseYearText .. " the years " .. releaseYear .." and " .. releaseEndYear .. "" else releaseYearText = "in the year " .. releaseYear .."" end end return releaseYearText end

function h.makeOutput(data, args) -- making outputText local outputText = "" if data["edition"] ~= "" then outputText = outputText .. string.upper(string.sub(data["edition"], 1, 1)) .. string.sub(data["edition"], 2) .. " of " .. data["original"] if data["adapted from"] ~= "" then outputText = outputText .. ", adapted from ''" .. data["adapted from"] .. "''"			if data["writer"] ~= "" then outputText = outputText .. ", written by " .. data["writer"] if data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. "and released " end elseif data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. "and released " end elseif data["writer"] ~= "" then outputText = outputText .. ", written by " .. data["writer"] if data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. " and released " end elseif data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. " and released " end elseif data["adapted from"] ~= "" then outputText = outputText .. "Adapted from ''" .. data["adapted from"] .. "''"		if data["writer"] ~= "" then outputText = outputText .. ", written by " .. data["writer"] if data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. "and released " end elseif data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. "and released " end elseif data["writer"] ~= "" then outputText = outputText .. "Written by " .. data["writer"] if data["publisher"] ~= "" then outputText = outputText .. " and released by " .. data["publisher"] else outputText = outputText .. " and released " end elseif data["publisher"] ~= "" then outputText = outputText .. "Released by " .. data["publisher"] else outputText = outputText .. "Released " end if data["anthology"] ~= "" then outputText = outputText .. " as part of ''" .. data["anthology"] .. "''"			if data["series"] ~= "" then if (args["season number"] ~= "") or (args["season number"] ~= nil) then outputText = outputText .. " from " .. data["series"] else outputText = outputText .. " from the series " .. data["series"] end end elseif data["series"] ~= "" then if (args["season number"] ~= "") and (args["season number"] ~= nil) then outputText = outputText .. " as part of " .. data["series"] else outputText = outputText .. " as part of the series " .. data["series"] end end if data["release year"] ~= "" then outputText = outputText .. " " .. data["release year"] end if data["issues"] ~= "" then outputText = outputText .. " throught " .. data["issues"] end --fallback in case of an error if outputText == "" or outputText == nil then outputText = "Error code: 1 - data table empty." else outputText = outputText .. "."	end return outputText end

function h.storeText(outputText, name) util_vars.setVar(PREFIX .. name, outputText) cache.delete(PREFIX .. name) cache.set(PREFIX .. name, outputText) mw.smw.set({["Story info"] = outputText}) --Doesn't seem to work. end

function p.infoboxStore( frame ) local args = frame:getParent.args local name = frame.args[1] if args["citation text"] then outputText = args["citation text"] else if not args["separator"] then args["separator"] = "," end -- combines and if args["anthology"] and args["audio anthology"] then args["anthology"] = args["anthology"] .. ", " .. args["audio anthology"] elseif (not args["anthology"]) and args["audio anthology"] then args["anthology"] = args["audio anthology"] end -- combines and if args["adapted from"] and args["novelisation of"] then args["adapted from"] = args["adapted from"] .. ", " .. args["novelisation of"] elseif (not args["adapted from"]) and args["novelisation of"] then args["adapted from"] = args["novelisation of"] end local data = h.getAndFormatUnlinkedItems(args) data["issues"] = h.getAndFormatIssuesText(args) data["series"] = h.getAndFormatSeriesText(args) data["release year"] = h.getReleaseYearText(args) data["edition"] = "" data["original"] = "" for key, val in pairs(data) do util_vars.setVar(PREFIX .. name .. "-" .. key, val) end if args["season number"] and (args["season number"] ~= "") then util_vars.setVar(PREFIX .. name .. "-" .. "season", "true") end local outputText = h.makeOutput(data, args) --outputText = util_smw.dump(data) --for testing h.storeText(outputText, name) end end

function p.variantStore(frame) local args = frame:getParent.args local name = frame.args[1] if args["citation text"] then outputText = args["citation text"] else if not args["separator"] then args["separator"] = "," end -- combines and if args["anthology"] and args["audio anthology"] then args["anthology"] = args["anthology"] .. ", " .. args["audio anthology"] elseif (not args["anthology"]) and args["audio anthology"] then args["anthology"] = args["audio anthology"] end -- combines and if args["adapted from"] and args["novelisation of"] then args["adapted from"] = args["adapted from"] .. ", " .. args["novelisation of"] elseif (not args["adapted from"]) and args["novelisation of"] then args["adapted from"] = args["novelisation of"] end local data = h.getAndFormatUnlinkedItems(args) data["issues"] = h.getAndFormatIssuesText(args) data["series"] = h.getAndFormatSeriesText(args) data["release year"] = h.getReleaseYearText(args) for key, val in pairs(data) do			if (not val) or val == "" then data[key] = util_vars.getVar(PREFIX .. name .. "-" .. key) or "" end end data["edition"] = args["edition"] or "" data["original"] = args["original"] or ("" .. util_link.stripPipe(util_link.stripDab(name)) .. "") if util_vars.getVar(PREFIX .. name .. "-" .. "season") == "true" then args["season number"] = "true" end local outputText = h.makeOutput(data, args) h.storeText(outputText, name .. "-" .. data["edition"]) end end

function h.getInfo(story) local info if util_vars.getVar(PREFIX .. story) then info = util_vars.getVar(PREFIX .. story) elseif cache.get(PREFIX .. story) then info = cache.get(PREFIX .. story) util_vars.setVar(PREFIX .. story, info) elseif mw.smw.ask( "" .. story .. "" .. "\n|?Story info")[1]["Story info"] then info = mw.smw.ask( "" .. story .. "" .. "\n|?Story info")[1]["Story info"] util_vars.setVar(PREFIX .. story, info) cache.set(PREFIX .. story, info) else info = "Error code: 2 - no data stored in variables, cache or SMW." end return info end

function p.displayCitation(frame) local args = frame:getParent.args if not args[1] or args[1] == "" then return "Error code: 3 - no story given in template transclusion." end local story = args[1] local dataStore = story if args["v"] and args["v"] ~= "" then dataStore = story .. "-" .. args["v"] end local section = "" if args["s"] and args["s"] ~= "" then section = "#" .. args["s"] elseif args["p"] and args["p"] ~= "" then section = "#Part " .. args["p"] elseif args["e"] and args["e"] ~= "" then section = "#Episode " .. args["e"] end local display = args[2] or util_link.stripDab(story) return "" .. display .. " + " .. h.getInfo(dataStore) .. "" end

return p