ഘടകം:Internet Archive
ഈ ഘടകത്തിന്റെ വിവരണം ഘടകം:Internet Archive/വിവരണം എന്ന താളിൽ നിർമ്മിക്കാവുന്നതാണ്
--[[
For functions related to Internet Archive
]]
local p = {}
--[[
For Template:Internet Archive author
]]
function p.author(frame)
local pframe = frame:getParent()
local args = pframe.args
local tname = "Internet Archive author" -- name of calling template. Change if template rename.
local name = nil -- article name (default: current page)
local dname = nil -- display name (default: current page name)
local sname = nil -- search name (default: current page name)
local byabout = "Works by or about"
local tagline = "at [[Internet Archive]]"
local urlhead = "//archive.org/search.php?query="
--- Determine name
if args.name == "" or args.name == nil then
name = mw.title.getCurrentTitle().text
dname = name
sname = dname
else
name = mw.text.trim(args.name)
dname = name
sname = dname
end
if args.sname ~= nil and args.sname ~= "" then
sname = mw.text.trim(args.sname)
end
if args.dname ~= nil and args.dname ~= "" then
dname = mw.text.trim(args.dname)
end
dname = mw.ustring.gsub(dname,"%s%(.*%)", "") -- remove disambiguation ()
sname = mw.ustring.gsub(sname,"%s%(.*%)", "")
--- Determine tagline
if args.coda ~= "" and args.coda ~= nil then
tagline = tagline .. " " .. mw.text.trim(args.coda)
end
--- Custom search. Do early to avoid unnecessary processing.
if args.search ~= "" and args.search ~= nil then
local search = p.ia_url_encode(mw.text.trim(args.search))
return "[" .. urlhead .. search .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
-- Determine media string
local media = p.mediaTypes(args.media)
-- Determine date of birth and death string
local temp = mw.text.split(p.bdDate(args.birth, args.death, name), " ")
local birth = temp[1]
local death = temp[2]
if birth == "Error" or death == "Error" then
return "Error in [[:Template:"..tname.."]]: [[" ..name.. "]] doesn't exist."
end
--- Split sname into words and count words
local N = mw.text.split(sname, " ")
local l, count = mw.ustring.gsub(sname, "%S+", "")
--[[
Format URL
]]
-- If no dob and dod, return a simple search
if birth == "none" or death == "none" then
if(count == 2) then
local FIRST = 1
local LAST = 2
local search = "(subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%22%20OR%20creator%3A%22"..N[FIRST].."%20"..N[LAST].."%22%20OR%20title%3A%22"..N[FIRST].."%20"..N[LAST].."%22%20OR%20description%3A%22"..N[FIRST].."%20"..N[LAST].."%22%20)"
return "[" .. urlhead .. media .. search .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
if(count == 3) then
local FIRST = 1
local MIDDLE = 2
local LAST = 3
local firstinitial = mw.ustring.sub(N[FIRST], 1, 1)
local middleinitial = mw.ustring.sub(N[MIDDLE], 1, 1)
local search1 = "(subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20subject%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20subject%3A%22"..N[FIRST].."%20S%2E%20"..N[LAST].."%22%20OR%20subject%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%2C%20Sir%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20creator%3A%22"..N[LAST].."%2C"
local search2 = "%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20creator%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20creator%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20creator%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20title%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20title%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20title%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20description%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20description%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20description%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20description%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20description%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20description%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22)"
return "[" .. urlhead .. media .. search1 .. search2 .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
local nameurl = p.ia_url_encode(sname)
local search = "(subject%3A%22"..nameurl.."%22%20OR%20creator%3A%22"..nameurl.."%22%20description%3A%22"..nameurl.."%22%20title%3A%22"..nameurl.."%22%20)"
return "[" .. urlhead .. media .. search .. " " .. byabout .. " " .. dname .. "] " .. tagline
else -- Optimized search based on number of words
-- One or Five+ words search string
if count == 1 or count > 4 then
local nameurl = p.ia_url_encode(sname)
local search = "(subject%3A%22"..nameurl.."%22%20OR%20creator%3A%22"..nameurl.."%22%20description%3A%22"..nameurl.."%22%20title%3A%22"..nameurl.."%22%20)"
return "[" .. urlhead .. media .. search .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
-- Two words search string
if count == 2 then
local FIRST = 1
local LAST = 2
local search = "(subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A%22"..N[FIRST].."%20"..N[LAST].."%22%20OR%20title%3A%22"..N[FIRST].."%20"..N[LAST].."%22%20OR%20description%3A%22"..N[FIRST].."%20"..N[LAST].."%22)"
return "[" .. urlhead .. media .. search .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
-- Three words search string. This is at its near-maximum length for Internet Archive to handle.
if count == 3 then
local FIRST = 1
local MIDDLE = 2
local LAST = 3
local firstinitial = mw.ustring.sub(N[FIRST], 1, 1)
local middleinitial = mw.ustring.sub(N[MIDDLE], 1, 1)
local search1 = "(subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%2C%20"..birth.."-"..death.."%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%2C%20"..birth.."-"..death.."%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%2C%20"..birth.."-"..death.."%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20subject%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20subject%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20subject%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%2C%20Sir%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%2C%20"..birth.."-"..death.."%22"
local search2 = "%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20creator%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20creator%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20creator%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20title%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20title%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20title%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20description%3A%22"..N[FIRST].."%20"..N[MIDDLE].."%20"..N[LAST].."%22%20OR%20description%3A%22"..N[FIRST].."%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20description%3A%22"..firstinitial.."%2E%20"..middleinitial.."%2E%20"..N[LAST].."%22%20OR%20description%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[MIDDLE].."%22%20OR%20description%3A%22"..N[LAST].."%2C%20"..firstinitial.."%2E%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22%20OR%20description%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..middleinitial.."%2E%20%28"..N[FIRST].."%20"..N[MIDDLE].."%29%22)"
return "[" .. urlhead .. media .. search1 .. search2 .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
-- Four words search string
if count == 4 then
local FIRST = 1
local SECOND = 2
local THIRD = 3
local LAST = 4
local search = "(subject%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[SECOND].."%20"..N[THIRD].."%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A%22"..N[LAST].."%2C%20"..N[FIRST].."%20"..N[SECOND].."%20"..N[THIRD].."%2C%20"..birth.."-"..death.."%22%20OR%20creator%3A"..N[FIRST].."%20"..N[SECOND].."%20"..N[THIRD].."%20"..N[LAST]..")"
return "[" .. urlhead .. media .. search .. " " .. byabout .. " " .. dname .. "] " .. tagline
end
end
return "Unknown error (1). Please check documentation for [[Template:"..tname.."]]"
end
function p.mediaTypes(argsmedia)
local media = ""
if argsmedia ~="" and argsmedia ~=nil then
local medialist = mw.text.split(mw.text.trim(argsmedia), " ")
local al, acount = mw.ustring.gsub(mw.text.trim(argsmedia), "%S+", "")
local i = 0
repeat -- the following could be condensed but repetitive for clarity
i = i + 1
if(mw.ustring.lower(medialist[i]) == "text" or mw.ustring.lower(medialist[i]) == "texts") then
if(i == 1) then
media = media .. p.ia_url_encode("(mediatype:texts")
else
media = media .. p.ia_url_encode(" OR mediatype:texts")
end
end
if(mw.ustring.lower(medialist[i]) == "audio") then
if(i == 1) then
media = media .. p.ia_url_encode("(mediatype:audio")
else
media = media .. p.ia_url_encode(" OR mediatype:audio")
end
end
if(mw.ustring.lower(medialist[i]) == "video") then
if(i == 1) then
media = media .. p.ia_url_encode("(mediatype:video")
else
media = media .. p.ia_url_encode(" OR mediatype:video")
end
end
until i == acount
if media ~= nil then
media = media .. ")%20AND%20"
else
media = ""
end
else
media = ""
end
return media
end
-- Alt way to get b/d dates via getContent()
function p.bdDateAlt(argsbirth, argsdeath, name)
local pagetext = nil
local birth = "none"
local death = "none"
-- Load the page
local t = mw.title.new(name)
if(t.exists) then
pagetext = t:getContent()
end
if pagetext == nil then
return "Error"
end
-- Remove false positives
pagetext = mw.ustring.gsub( mw.ustring.gsub(pagetext, "<!--.--->", ""), "<nowiki>.-</nowiki>", "")
-- "Category:1900 births"
if argsbirth == "" or argsbirth == nil then
local birthcheck = mw.ustring.match(pagetext, "%[%[%s-[Cc]ategory:%s-%d+%.?%d*%s-births%s-%]%]" )
if birthcheck ~= nil then
birth = mw.ustring.match(birthcheck, "%d+%.?%d*")
else
birth = "none"
end
else
birth = mw.text.trim(argsbirth)
end
-- "Category:2000 deaths"
if argsdeath == "" or argsdeath == nil then
local deathcheck = mw.ustring.match(pagetext, "%[%[%s-[Cc]ategory:%s-%d+%.?%d*%s-deaths%s-%]%]" )
if deathcheck ~= nil then
death = mw.ustring.match(deathcheck, "%d+%.?%d*")
else
death = "none"
end
else
death = mw.text.trim(argsdeath)
end
return birth .. " " .. death
end
-- Get b/d dates via Wikidata.
--
function p.bdDate(argsbirth, argsdeath, name)
local pagetext = nil
local birth = "none"
local death = "none"
entity = mw.wikibase.getEntityObject()
if not entity or not entity.claims then
-- Alternative if template not on a page in mainspace. This is needed since Wikidata can only be retrieved
-- for the article where the template is located.
return p.bdDateAlt(argsbirth, argsdeath, name)
end
-- Note: The below uses formatPropertyValues() to get and format the date from Wikidata.
-- For an alternative method, see sandbox revision dated 5:58 am, 15 October 2014
if argsbirth == "" or argsbirth == nil then
local birthtable = entity:formatPropertyValues( 'P569' )
local birthsplit = mw.text.split(birthtable["value"], " ")
local l, count = mw.ustring.gsub(birthtable["value"], "%S+", "")
if count > 0 then
if string.find(birthsplit[count], "^%d") then
birth = birthsplit[count]
elseif string.find(birthsplit[count], "BCE") then
birth = birthsplit[count - 1]
elseif string.find(birthsplit[count], "BC") then
birth = birthsplit[count - 1]
elseif string.find(birthsplit[count], "AD") then
birth = birthsplit[count - 1]
end
end
else
birth = mw.text.trim(argsbirth)
end
if argsdeath == "" or argsdeath == nil then
local deathtable = entity:formatPropertyValues( 'P570' )
local deathsplit = mw.text.split(deathtable["value"], " ")
local l, count = mw.ustring.gsub(deathtable["value"], "%S+", "")
if count > 0 then
if string.find(deathsplit[count], "^%d") then
death = deathsplit[count]
elseif string.find(deathsplit[count], "BCE") then
death = deathsplit[count - 1]
elseif string.find(deathsplit[count], "BC") then
death = deathsplit[count - 1]
elseif string.find(deathsplit[count], "AD") then
death = deathsplit[count - 1]
end
end
else
death = mw.text.trim(argsdeath)
end
if birth == "none" and death == "none" then
-- Alternative if Wikidata is missing data
-- return p.bdDateAlt(name)
return birth .. " " .. death
else
return birth .. " " .. death
end
end
--- URL-encode a string
--- http://lua-users.org/wiki/StringRecipes
---
function p.ia_url_encode(str)
if (str) then
str = mw.ustring.gsub (str, "\n", "\r\n")
str = mw.ustring.gsub (str, "([^%w %-%_%.%~])",
function (c) return mw.ustring.format ("%%%02X", string.byte(c)) end)
str = mw.ustring.gsub (str, " ", "+")
end
return str
end
return p