Module:Citation: Difference between revisions

From ProleWiki, the proletarian encyclopedia
mNo edit summary
(Adopting automatic usage of reference to library work based exclusively on title name, if library work is available. URL parameter is ignored in case there is a library work available.)
 
(104 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local p = {};
local p = {}
local function cite(frame) -- creates citation function
 
local pframe = frame:getParent() -- creating a way to access parameters from a template
local function is_set (var)
local styles;
return not (var == nil or var == '');
local args = {}; -- creating a table to store all arguments from the template
end
local config = {}; -- creating a table to store parameters from the module {{#invoke:}}
 
for k, v in pairs( frame.args ) do -- getting parameters from the module frame
function is_lib_work(s)
config[k] = v;
return mw.getCurrentFrame():callParserFunction('#ifexist',"Library:" .. s,true) == "1"
end
 
local function italics (var)
return "<i>" .. var .. "</i>"
end
 
local function parenthesis (var)
return "(" .. var .. ")"
end
 
function p.cite( frame )
local pframe = frame:getParent()
local Author = pframe.args.author
local Year = pframe.args.year or pframe.args['date']
local Chapter = pframe.args.chapter
local ChapterURL = pframe.args['chapter-url']
local Section = pframe.args.section
local Title = pframe.args.title
local TitleURL = pframe.args['title-url']
local LibraryTitle = pframe.args['library-title']
local Volume = pframe.args.volume
local Series = pframe.args.series or pframe.args.journal
local Trans = pframe.args['trans-title']
local TransLang = pframe.args['trans-lang']
local Page = pframe.args.page or pframe.args.pages
local PDF = pframe.args.pdf
local City = pframe.args.city
local Publisher = pframe.args.publisher or pframe.args.via
local ISBN = pframe.args.isbn or pframe.args.issn
local ISSN = false
if is_set(pframe.args.issn) then
ISSN = true
end
local DOI = pframe.args.doi
local LG = pframe.args.lg
local MIA = pframe.args.mia
local Quote = pframe.args.quote
local Image = pframe.args.image
local ImageCaption = pframe.args['image-caption']
local Dotless = pframe.args.dotless
 
 
if is_set (Author) then
if is_set (Year) then
first_part = Author .. " " .. parenthesis (Year) .. "."
else
first_part = Author .. "."
end
else
first_part = ''
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)
first_part = italics(tostring(div)) .. tostring(br) .. first_part
end
if is_set (Image) then
local span = mw.html.create ( 'span' )
span
:wikitext('[[File:' .. Image .. '|center|300px|frameless]]')
 
if is_set(ImageCaption) then
local caption = mw.html.create ('div')
caption
:attr("style", "text-align:center;font-size:85%;")
:wikitext(ImageCaption)
first_part = tostring(span) .. tostring(caption) .. first_part
else
first_part = tostring(span) .. first_part
end
end
-- second part: Title(URL), Series, Volume, Chapter(URL), Year, Page, Trans(Lang), PDF
local second_part = ''
 
if is_set (Title) then
if is_lib_work(Title) then
Title = "[[Library:" .. Title .. "|" .. Title .. "]]"
elseif is_set (TitleURL) then
Title = "[" .. TitleURL .. " " .. Title .. "]"
end
Title = italics(Title)
if not is_set (Series) then
if is_set (Volume) then
Title = Title .. ", vol. " .. Volume
end
end
second_part = Title
if is_set (Chapter) then
if is_set (ChapterURL) then
Chapter = "[" .. ChapterURL .. " " .. Chapter .. "]"
end
if is_set (Section) then
Chapter = Chapter .. "; " .. Section
end
second_part = second_part .. ": " .. "'" .. Chapter .. "'"
end
if not is_set (Author) then
if is_set (Year) then
second_part = second_part .. " " .. parenthesis (Year)
end
end
if is_set (Trans) then
if is_set (TransLang) then
second_part = second_part .. " " .. "(" .. TransLang .. ": " .. Trans .. ")"
else
second_part = second_part .. " " .. parenthesis (Trans)
end
end
if is_set (Page) and not is_set (Volume) then
if tonumber(Page) ~= nil then
Page = "p." .. " " .. Page
else
Page = "pp." .. " " .. Page
end
second_part = second_part .. " " .. parenthesis (Page) .. "."
else
second_part = second_part .. "."
end
end
if is_set (Series) then
if is_set (Volume) then
Series = Series .. ", vol." .. Volume
end
 
if is_set (Page) and is_set (Volume) and is_set (Series) then
if tonumber(Page) ~= nil then
Page = "p." .. " " .. Page
else
Page = "pp." .. " " .. Page
end
second_part = second_part .. " " .. Series  .. " " .. parenthesis (Page) .. "."
else
second_part = second_part .. " " .. Series .. "."
end
end
if is_set (PDF) then
local span = mw.html.create ( 'span' )
span
:attr( 'title', 'PDF download')
:addClass('plainlinks')
:tag( 'small' )
:wikitext('[' .. PDF .. " " .. mw.text.nowiki('[PDF]') .. ']')
second_part = second_part .. " " .. tostring(span)
end
-- third part: City, Publisher
if is_set (City) then
if is_set (Publisher) then
third_part = City .. ": " .. Publisher .. "."
else
third_part = City .. "."
end
end
 
if not is_set(City) then
if is_set (Publisher) then
third_part = Publisher .. "."
else
third_part = ''
end
end
-- fourth part: ISBN, DOI, Library Genesis, Marxists Internet Archive
 
fourth_part = ''
 
if is_set (ISBN) then
local span = mw.html.create ( 'span' )
span
:addClass('plainlinks')
if (ISSN) then
span
:tag( 'small' )
:attr( 'title', 'The ISSN Portal')
:wikitext('[' .. "https://portal.issn.org/resource/ISSN/" .. ISBN .. " " .. "ISSN " .. ISBN .. ']')
else
span
:tag( 'small' )
:attr( 'title', 'WorldCat')
:wikitext('[' .. "https://www.worldcat.org/search?qt=worldcat_org_all&q=" .. ISBN .. " " .. "ISBN " .. ISBN .. ']')
end
fourth_part = fourth_part .. tostring(span)
end
 
if is_set (DOI) then
local doispan = mw.html.create ( 'span' )
doispan
:tag('small')
:wikitext("doi: " .. DOI)
fourth_part = fourth_part .. " " .. tostring(doispan)
local span = mw.html.create ( 'span' )
span
:attr( 'title', 'Sci-Hub link')
:addClass('plainlinks')
:tag( 'small' )
:wikitext('[' .. "https://sci-hub.se/" .. DOI .. " " .. mw.text.nowiki('[HUB]') .. ']')
fourth_part = fourth_part .." " .. tostring(span)
end
if is_set (LG) then
local span = mw.html.create ( 'span' )
span
:attr( 'title', 'Library Genesis link')
:addClass('plainlinks')
:tag( 'small' )
:wikitext('[' .. LG .. " " .. mw.text.nowiki('[LG]') .. ']')
fourth_part = fourth_part .." " .. tostring(span)
end
if is_set (MIA) then
local span = mw.html.create ( 'span' )
span
:attr( 'title', 'Marxists Internet Archive link')
:addClass('plainlinks')
:tag( 'small' )
:wikitext('[' .. MIA .. " " .. mw.text.nowiki('[MIA]') .. ']')
fourth_part = fourth_part .." " .. tostring(span)
end
if is_set (second_part) then
second_part = " " .. second_part
end
if is_set (third_part) then
third_part = " " .. third_part
end
if is_set (fourth_part) then
fourth_part = " " .. fourth_part
end
end
for k, v in pairs( pframe.args ) do -- processing every key-value pair from the template arguments
v = mw.ustring.gsub (v, '^%s*(.-)%s*$', '%1'); -- trim leading/trailing whitespace; when v is only whitespace, becomes empty string
local render = first_part .. second_part .. third_part .. fourth_part
args[k] = v;
-- trim render
render = string.gsub(render,"^%s*(.-)%s*$","%1")
if Dotless then
render = render:sub(1,-2)
end
end
local author = frame.args.author
 
local title = frame.args.title
return render
return author .. ". " .. title
end
end
return p

Latest revision as of 03:08, 28 April 2024

local p = {}

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

function is_lib_work(s)
	return mw.getCurrentFrame():callParserFunction('#ifexist',"Library:" .. s,true) == "1"
end

local function italics (var)
	return "<i>" .. var .. "</i>"
end

local function parenthesis (var)
	return "(" .. var .. ")"
end

function p.cite( frame )
	local pframe = frame:getParent()
	local Author = pframe.args.author
	local Year = pframe.args.year or pframe.args['date']
	local Chapter = pframe.args.chapter
	local ChapterURL = pframe.args['chapter-url']
	local Section = pframe.args.section
	local Title = pframe.args.title
	local TitleURL = pframe.args['title-url']
	local LibraryTitle = pframe.args['library-title']
	local Volume = pframe.args.volume
	local Series = pframe.args.series or pframe.args.journal
	local Trans = pframe.args['trans-title']
	local TransLang = pframe.args['trans-lang']
	local Page = pframe.args.page or pframe.args.pages
	local PDF = pframe.args.pdf
	local City = pframe.args.city
	local Publisher = pframe.args.publisher or pframe.args.via
	local ISBN = pframe.args.isbn or pframe.args.issn
	local ISSN = false
	if is_set(pframe.args.issn) then
		ISSN = true
	end
	local DOI = pframe.args.doi
	local LG = pframe.args.lg
	local MIA = pframe.args.mia
	local Quote = pframe.args.quote
	local Image = pframe.args.image
	local ImageCaption = pframe.args['image-caption']
	local Dotless = pframe.args.dotless


	if is_set (Author) then
		if is_set (Year) then
			first_part = Author .. " " .. parenthesis (Year) .. "."
			else
				first_part = Author .. "."
		end
		else
			first_part = ''
	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)
		first_part = italics(tostring(div)) .. tostring(br) .. first_part
	end
	
	if is_set (Image) then
		local span = mw.html.create ( 'span' )
		span
		:wikitext('[[File:' .. Image .. '|center|300px|frameless]]')

		if is_set(ImageCaption) then 
			local caption = mw.html.create ('div')
			caption
			:attr("style", "text-align:center;font-size:85%;")
			:wikitext(ImageCaption)
			first_part = tostring(span) .. tostring(caption) .. first_part
			else
				first_part = tostring(span) .. first_part
		end
				
	end
	
	-- second part: Title(URL), Series, Volume, Chapter(URL), Year, Page, Trans(Lang), PDF
	local second_part = ''

	if is_set (Title) then
		if is_lib_work(Title) then
			Title = "[[Library:" .. Title .. "|" .. Title .. "]]"
			elseif is_set (TitleURL) then
			Title = "[" .. TitleURL .. " " .. Title .. "]"
		end
		Title = italics(Title)
		if not is_set (Series) then
			if is_set (Volume) then
				Title = Title .. ", vol. " .. Volume
			end
		end
		second_part = Title
		if is_set (Chapter) then
			if is_set (ChapterURL) then
				Chapter = "[" .. ChapterURL .. " " .. Chapter .. "]"
			end
			if is_set (Section) then
				Chapter = Chapter .. "; " .. Section
			end
			second_part = second_part .. ": " .. "'" .. Chapter .. "'"
		end
		
		if not is_set (Author) then
			if is_set (Year) then
				second_part = second_part .. " " .. parenthesis (Year)
			end
		end
		
		if is_set (Trans) then
			if is_set (TransLang) then
				second_part = second_part .. " " .. "(" .. TransLang .. ": " .. Trans .. ")"
				else
					second_part = second_part .. " " .. parenthesis (Trans)
			end
		end
		if is_set (Page) and not is_set (Volume) then
			if tonumber(Page) ~= nil then
				Page = "p." .. " " .. Page
				else
					Page = "pp." .. " " .. Page
			end
				second_part = second_part .. " " .. parenthesis (Page) .. "."
			else
				second_part = second_part .. "."
		end
	end
	
	if is_set (Series) then
		if is_set (Volume) then
			Series = Series .. ", vol." .. Volume
		end

		if is_set (Page) and is_set (Volume) and is_set (Series) then
			if tonumber(Page) ~= nil then
				Page = "p." .. " " .. Page
				else
					Page = "pp." .. " " .. Page
			end
				second_part = second_part .. " " .. Series  .. " " .. parenthesis (Page) .. "."
			else
				second_part = second_part .. " " .. Series .. "."
		end
	end
	
	if is_set (PDF) then
		local span = mw.html.create ( 'span' )
		span
		:attr( 'title', 'PDF download')
		:addClass('plainlinks')
		:tag( 'small' )
		:wikitext('[' .. PDF .. " " .. mw.text.nowiki('[PDF]') .. ']')
		second_part = second_part .. " " .. tostring(span)
	end
	
	-- third part: City, Publisher
	
	if is_set (City) then
		if is_set (Publisher) then
			third_part = City .. ": " .. Publisher .. "."
			else
				third_part = City .. "."
		end
	end

	if not is_set(City) then
		if is_set (Publisher) then
			third_part = Publisher .. "."
			else
				third_part = ''
		end
	end
	
	-- fourth part: ISBN, DOI, Library Genesis, Marxists Internet Archive

	fourth_part = ''

	if is_set (ISBN) then
		local span = mw.html.create ( 'span' )
		span
		:addClass('plainlinks')
		if (ISSN) then
			span
			:tag( 'small' )
			:attr( 'title', 'The ISSN Portal')
			:wikitext('[' .. "https://portal.issn.org/resource/ISSN/" .. ISBN .. " " .. "ISSN " .. ISBN .. ']')
			else
				span
				:tag( 'small' )
				:attr( 'title', 'WorldCat')
				:wikitext('[' .. "https://www.worldcat.org/search?qt=worldcat_org_all&q=" .. ISBN .. " " .. "ISBN " .. ISBN .. ']')
		end
		fourth_part = fourth_part .. tostring(span)
	end

	if is_set (DOI) then
		local doispan = mw.html.create ( 'span' )
		doispan
		:tag('small')
		:wikitext("doi: " .. DOI)
		fourth_part = fourth_part .. " " .. tostring(doispan)
		local span = mw.html.create ( 'span' )
		span
		:attr( 'title', 'Sci-Hub link')
		:addClass('plainlinks')
		:tag( 'small' )
		:wikitext('[' .. "https://sci-hub.se/" .. DOI .. " " .. mw.text.nowiki('[HUB]') .. ']')
		fourth_part = fourth_part .." " .. tostring(span)
	end
	
	if is_set (LG) then
		local span = mw.html.create ( 'span' )
		span
		:attr( 'title', 'Library Genesis link')
		:addClass('plainlinks')
		:tag( 'small' )
		:wikitext('[' .. LG .. " " .. mw.text.nowiki('[LG]') .. ']')
		fourth_part = fourth_part .." " .. tostring(span)
	end
	
	if is_set (MIA) then
		local span = mw.html.create ( 'span' )
		span
		:attr( 'title', 'Marxists Internet Archive link')
		:addClass('plainlinks')
		:tag( 'small' )
		:wikitext('[' .. MIA .. " " .. mw.text.nowiki('[MIA]') .. ']')
		fourth_part = fourth_part .." " .. tostring(span)
	end
		
	
	if is_set (second_part) then
		second_part = " " .. second_part
	end
	
	if is_set (third_part) then
		third_part = " " .. third_part
	end
	
	if is_set (fourth_part) then
		fourth_part = " " .. fourth_part
	end
	
	local render = first_part .. second_part .. third_part .. fourth_part
	
	-- trim render
	
	render = string.gsub(render,"^%s*(.-)%s*$","%1")
	
	if Dotless then
		render = render:sub(1,-2)
	end

	return render
end
return p