Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Library citation: Difference between revisions

From ProleWiki, the proletarian encyclopedia
m (Fixing internal links and formatting)
(Auto wikilink)
Line 57: Line 57:
         str = result  -- Use the extracted part after /wiki/
         str = result  -- Use the extracted part after /wiki/
     end
     end
     -- Remove "Library:" prefix, if present
     -- Remove "Library:" prefix, if present
     str = str:gsub("^Library:", "")
     str = str:gsub("^Library:", "")


     -- Case 3: Replace underscores with spaces
     -- Replace underscores with spaces
     str = str:gsub("_", " ")
     str = str:gsub("_", " ")


Line 74: Line 73:
end
end
return title
return title
end
local function wikilinkFromAuthor(author)
-- if page exists
if mw.getCurrentFrame():callParserFunction('#ifexist',author,true) == "1" then
return "[[" .. author .. "]]"
end
return author
end
end


Line 88: Line 95:
local render = ""
local render = ""
if is_set(author) then
if is_set(author) then
render = render .. author
render = render .. wikilinkFromAuthor(author)
end
end
if is_set(year) then
if is_set(year) then

Revision as of 23:46, 7 October 2024

local p = {}

local function checkset(var)
	local rtn = nil
	if not (var == nil or var == '') then
		rtn = var
	end
	return rtn
end

local function is_set(var)
	return not (var == nil or var == '')
end

local function removeApostrophes(str)
    return str:gsub("[\"'%`]", "")
end

local function compareStrings(a,b)
	local stringA = removeApostrophes(a):lower()
    local stringB = removeApostrophes(b):lower()
    return stringA < stringB
end

function listOfWorks(author) 
	local newMethod = mw.getCurrentFrame():callParserFunction("#dpl","namespace=Library","titleregexp=" .. author .. "/[^/]+$","format=,%TITLE%\\n")
	local catMethod = mw.getCurrentFrame():callParserFunction("#dpl","namespace=Library","category=Library works by " .. author ,"format=,%TITLE%\\n")
	local list = ""
	-- Picks whatever method of recovering pages has the higher count, usually categories
	if string.len(newMethod) > string.len(catMethod) then
		list = newMethod
		else
			list = catMethod
	end
	titleTable = mw.text.split(string.gsub(mw.text.trim(list),author .. "/",""),"\n")
	linkTable=mw.text.split(mw.text.trim(list),"\n")
	for i,v in ipairs(linkTable) do
		linkTable[i] = "Library:" .. v
	end
	table.sort(linkTable,compareStrings)
	table.sort(titleTable,compareStrings)
	return {links=linkTable,titles=titleTable}
end

function getDataFromTitle(title)
	local rawString = mw.getCurrentFrame():callParserFunction("#dpl","namespace=Library","title=" .. title,"mode=userformat","include={Library work}:title:author:published_date:source")
	local title,author,published_date,source = rawString:match("^(.-)%s|(.-)%s|(.-)%s|(.-)$")
	local year = published_date:match("%d%d%d%d")
	return title,author,year,source
end

function getDataFromLink(link)
	-- In case it's in URL format
	local str = link
    local result = str:match("https?://[^/]+/wiki/(.*)")
    if result then
        str = result  -- Use the extracted part after /wiki/
    end
    -- Remove "Library:" prefix, if present
    str = str:gsub("^Library:", "")

    -- Replace underscores with spaces
    str = str:gsub("_", " ")

    -- Return data using the other function
    return getDataFromTitle(str)
end

function wikilinkFromTitle(title)
	local pagename = mw.getCurrentFrame():callParserFunction("#dpl","namespace=Library","titleregexp=" .. title .. "$","format=,%TITLE%")
	if is_set(pagename) then
		return "[[Library:" .. pagename .. "|" .. title .. "]]"
	end
	return title
end

local function wikilinkFromAuthor(author)
	-- if page exists
	if mw.getCurrentFrame():callParserFunction('#ifexist',author,true) == "1" then
		return "[[" .. author .. "]]"
	end
	return author
end

function p.cite(frame)
	-- Parent frame to get parameters from template calls instead of from {{#invoke: ...
	local parentFrame = frame:getParent()
	-- get arguments from "args" table pre-defined by MediaWiki/Scribunto
	local link = checkset(parentFrame.args.link)
	local author = nil
	if is_set(link) then
		title,author,year,source = getDataFromLink(link)
	end
	
	local render = ""
	if is_set(author) then
		render = render .. wikilinkFromAuthor(author)
	end
	if is_set(year) then
		render = render .. " (" .. year .. ")."
	end
	if is_set(title) then
		render = render .. " ''" .. wikilinkFromTitle(title) .. "''."
	end
	if is_set(source) then
		render = render .. " " .. source .. "."
	end
	-- error("error message") to send error messages
	return render
end

return p