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
CriticalResist (talk | contribs)
test fix 2
CriticalResist (talk | contribs)
reverting, will need to look at this differently
Tag: Manual revert
Line 4: Line 4:


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


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


local function removeApostrophes(str)
local function removeApostrophes(str)
Line 20: Line 20:


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


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


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


function getDataFromLink(link)
function getDataFromLink(link)
    local str = link
-- In case it's in URL format
local str = link
     local result = str:match("https?://[^/]+/wiki/(.*)")
     local result = str:match("https?://[^/]+/wiki/(.*)")
     if result then
     if result then
         str = result
         str = result -- Use the extracted part after /wiki/
     end
     end
    -- Remove "Library:" prefix, if present
     str = str:gsub("^Library:", "")
     str = str:gsub("^Library:", "")
   
 
     -- Extract chapter from fragment identifier
     -- Replace underscores with spaces
     local base, chapter = str:match("^([^#]*)#?(.*)$")
     str = str:gsub("_", " ")
    base = base:gsub("_", " ") -- Convert underscores to spaces for display
 
   
    -- Return data using the other function
     return getDataFromTitle(str), base, chapter
     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
end


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


function p.cite(frame)
function p.cite(frame)
    local parentFrame = frame:getParent()
-- Parent frame to get parameters from template calls instead of from {{#invoke: ...
    local link = checkset(parentFrame.args.link)
local parentFrame = frame:getParent()
    local author = nil
-- get arguments from "args" table pre-defined by MediaWiki/Scribunto
    local title = nil
local link = checkset(parentFrame.args.link)
    local year = nil
local author = nil
    local source = nil
local quote = checkset(parentFrame.args.quote)
    local pageName = nil
if is_set(link) then
    local chapter = nil
title,author,year,source = getDataFromLink(link)
    local quote = checkset(parentFrame.args.quote)
end
   
    if is_set(link) then
local render = ""
        title, author, year, source, base, chapter = getDataFromLink(link)
    end
if is_set(author) then
   
render = render .. wikilinkFromAuthor(author)
    local render = ""
end
   
if is_set(year) then
    -- Format author
render = render .. " (" .. year .. ")."
    if is_set(author) then
end
        render = render .. wikilinkFromAuthor(author)
if is_set(title) then
    end
render = render .. " ''" .. wikilinkFromTitle(title) .. "''."
   
end
    -- Format year in parentheses if available
if is_set(source) then
    if is_set(year) then
render = render .. " " .. source .. "."
        render = render .. " (" .. year .. ")"
end
    end
if is_set (quote) then
   
quote = string.gsub(quote,"\n","<br>")
    -- Format title with chapter
quote = "“" .. quote .. "”"
    if is_set(title) and is_set(pageName) then
local div = mw.html.create ('div')
        -- Add period after author/year section
div
        if render ~= "" then
:attr("style", "width:80%; margin-left:10%;")
            render = render .. ". "
:wikitext(quote)
        end
local br = mw.html.create ('br', selfClosing)
       
render = italics(tostring(div)) .. tostring(br) .. render
        -- Create Library link
end
        local displayTitle = pageName
-- error("error message") to send error messages
        local linkTarget = "Library:" .. pageName:gsub(" ", "_")
return render
       
        -- Add chapter if present
        if is_set(chapter) then
            -- Replace underscores with spaces in chapter name
            chapter = chapter:gsub("_", " ")
            displayTitle = displayTitle .. ", " .. chapter
            linkTarget = linkTarget .. "#" .. chapter:gsub(" ", "_")
        end
       
        render = render .. "[[" .. linkTarget .. "|" .. displayTitle .. "]]"
    end
   
    -- Handle quotes
    if is_set(quote) then
        quote = string.gsub(quote, "\n", "<br>")
        quote = "“" .. quote .. "”"
        local div = mw.html.create('div')
        div:attr("style", "width:80%; margin-left:10%;")
            :wikitext(quote)
        render = italics(tostring(div)) .. "<br>" .. render
    end
   
    -- Preserve source in hidden element
    if is_set(source) then
        render = render .. '<span style="display:none">Source: ' .. source .. '</span>'
    end
   
    return render
end
end


return p
return p

Revision as of 15:16, 13 July 2025

local p = {}

require("Module:Auxiliary functions")

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 = ""
	if is_set(published_date) then
		year = published_date:match("%d%d%d%d")
	end
	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
	local quote = checkset(parentFrame.args.quote)
	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
	if is_set (quote) then
		quote = string.gsub(quote,"\n","<br>")
		quote = "“" .. quote .. "”"
		local div = mw.html.create ('div')
		div
		:attr("style", "width:80%; margin-left:10%;")
		:wikitext(quote)
		local br = mw.html.create ('br', selfClosing)
		render = italics(tostring(div)) .. tostring(br) .. render
	end
	-- error("error message") to send error messages
	return render
end

return p