ഘടകം:Internet Archive

വിക്കിപീഡിയ, ഒരു സ്വതന്ത്ര വിജ്ഞാനകോശം.
Jump to navigation Jump to search

ഈ ഘടകത്തിന്റെ വിവരണം ഘടകം: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
"https://ml.wikipedia.org/w/index.php?title=ഘടകം:Internet_Archive&oldid=2114533" എന്ന താളിൽനിന്ന് ശേഖരിച്ചത്