More languages
More actions
m (adding parser function example for later testing) |
m (Soft-coding "year" variable in case of trouble) |
||
(17 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function | require("Module:Auxiliary functions") | ||
return mw.getCurrentFrame():callParserFunction( | |||
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 | end | ||
Line 9: | Line 92: | ||
local parentFrame = frame:getParent() | local parentFrame = frame:getParent() | ||
-- get arguments from "args" table pre-defined by MediaWiki/Scribunto | -- get arguments from "args" table pre-defined by MediaWiki/Scribunto | ||
local link = parentFrame.args.link | local link = checkset(parentFrame.args.link) | ||
local author = parentFrame.args.author | 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 | -- error("error message") to send error messages | ||
return render | |||
end | end | ||
return p | return p |
Latest revision as of 11:43, 8 October 2024
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