<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.americanmusicclub.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AWebarchive</id>
	<title>Module:Webarchive - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.americanmusicclub.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AWebarchive"/>
	<link rel="alternate" type="text/html" href="https://wiki.americanmusicclub.com/index.php?title=Module:Webarchive&amp;action=history"/>
	<updated>2026-04-04T13:50:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://wiki.americanmusicclub.com/index.php?title=Module:Webarchive&amp;diff=29334&amp;oldid=prev</id>
		<title>Amc-admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.americanmusicclub.com/index.php?title=Module:Webarchive&amp;diff=29334&amp;oldid=prev"/>
		<updated>2018-02-27T23:21:24Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[ ----------------------------------&lt;br /&gt;
&lt;br /&gt;
     Lua module implementing the {{webarchive}} template. &lt;br /&gt;
&lt;br /&gt;
       A merger of the functionality of three templates: {{wayback}}, {{webcite}} and {{cite archives}}&lt;br /&gt;
   &lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; inlineError &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Critical error. Render output completely in red. Add to tracking category.&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function inlineError(arg, msg)&lt;br /&gt;
&lt;br /&gt;
  track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1&lt;br /&gt;
  return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;Error in webarchive template: Check &amp;lt;code style=&amp;quot;color:inherit; border:inherit; padding:inherit;&amp;quot;&amp;gt;&amp;amp;#124;&amp;#039; .. arg .. &amp;#039;=&amp;lt;/code&amp;gt; value. &amp;#039; .. msg .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; inlineRed &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
      Render a text fragment in red, such as a warning as part of the final output.&lt;br /&gt;
      Add tracking category.&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function inlineRed(msg, trackmsg)&lt;br /&gt;
&lt;br /&gt;
  if trackmsg == &amp;quot;warning&amp;quot; then&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template warnings&amp;quot;] = 1 &lt;br /&gt;
  elseif trackmsg == &amp;quot;error&amp;quot; then&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;&amp;#039; .. msg .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; trimArg &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     trimArg returns nil if arg is &amp;quot;&amp;quot; while trimArg2 returns &amp;#039;true&amp;#039; if arg is &amp;quot;&amp;quot; &lt;br /&gt;
     trimArg2 is for args that might accept an empty value, as an on/off switch like nolink=&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function trimArg(arg)&lt;br /&gt;
  if arg == &amp;quot;&amp;quot; or arg == nil then&lt;br /&gt;
    return nil&lt;br /&gt;
  else&lt;br /&gt;
    return mw.text.trim(arg)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
local function trimArg2(arg)&lt;br /&gt;
  if arg == nil then&lt;br /&gt;
    return nil&lt;br /&gt;
  else&lt;br /&gt;
    return mw.text.trim(arg)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; base62 &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Convert base-62 to base-10&lt;br /&gt;
     Credit: https://de.wikipedia.org/wiki/Modul:Expr &lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function base62( value )&lt;br /&gt;
&lt;br /&gt;
    local r = 1&lt;br /&gt;
&lt;br /&gt;
    if value:match( &amp;quot;^%w+$&amp;quot; ) then&lt;br /&gt;
        local n = #value&lt;br /&gt;
        local k = 1&lt;br /&gt;
        local c&lt;br /&gt;
        r = 0&lt;br /&gt;
        for i = n, 1, -1 do&lt;br /&gt;
            c = value:byte( i, i )&lt;br /&gt;
            if c &amp;gt;= 48  and  c &amp;lt;= 57 then&lt;br /&gt;
                c = c - 48&lt;br /&gt;
            elseif c &amp;gt;= 65  and  c &amp;lt;= 90 then&lt;br /&gt;
                c = c - 55&lt;br /&gt;
            elseif c &amp;gt;= 97  and  c &amp;lt;= 122 then&lt;br /&gt;
                c = c - 61&lt;br /&gt;
            else    -- How comes?&lt;br /&gt;
                r = 1&lt;br /&gt;
                break    -- for i&lt;br /&gt;
            end&lt;br /&gt;
            r = r + c * k&lt;br /&gt;
            k = k * 62&lt;br /&gt;
        end -- for i&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; tableLength &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
      Given a 1-D table, return number of elements&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function tableLength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; dateFormat &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a date string, return its format: dmy, mdy, iso, ymd&lt;br /&gt;
       If unable to determine return nil&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function dateFormat(date)&lt;br /&gt;
&lt;br /&gt;
  local dt = {}&lt;br /&gt;
  dt.split = {}&lt;br /&gt;
&lt;br /&gt;
  dt.split = mw.text.split(date, &amp;quot;-&amp;quot;)&lt;br /&gt;
  if tableLength(dt.split) == 3 then&lt;br /&gt;
    if tonumber(dt.split[1]) &amp;gt; 1900 and tonumber(dt.split[1]) &amp;lt; 2200 and tonumber(dt.split[2]) and tonumber(dt.split[3]) then&lt;br /&gt;
      return &amp;quot;iso&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      return nil&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
  dt.split = mw.text.split(date, &amp;quot; &amp;quot;)&lt;br /&gt;
  if tableLength(dt.split) == 3 then&lt;br /&gt;
    if tonumber(dt.split[3]) then&lt;br /&gt;
      if tonumber(dt.split[3]) &amp;gt; 1900 and tonumber(dt.split[3]) &amp;lt; 2200 then&lt;br /&gt;
        if tonumber(dt.split[1]) then&lt;br /&gt;
          return &amp;quot;dmy&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
          return &amp;quot;mdy&amp;quot;&lt;br /&gt;
        end &lt;br /&gt;
      else&lt;br /&gt;
        if tonumber(dt.split[1]) then&lt;br /&gt;
          if tonumber(dt.split[1]) &amp;gt; 1900 and tonumber(dt.split[1]) &amp;lt; 2200 then&lt;br /&gt;
            return &amp;quot;ymd&amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return nil&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; makeDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a zero-padded 4-digit year, 2-digit month and 2-digit day, return a full date in df format&lt;br /&gt;
     df = mdy, dmy, iso, ymd&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function makeDate(year, month, day, df)&lt;br /&gt;
&lt;br /&gt;
  if not year or year == &amp;quot;&amp;quot; or not month or month == &amp;quot;&amp;quot; or not day or day == &amp;quot;&amp;quot; then&lt;br /&gt;
    return nil&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local zmonth = month                                                      -- month with leading 0&lt;br /&gt;
  month = month:match(&amp;quot;0*(%d+)&amp;quot;)                                            -- month without leading 0&lt;br /&gt;
  if tonumber(month) &amp;lt; 1 or tonumber(month) &amp;gt; 12 then&lt;br /&gt;
    return year&lt;br /&gt;
  end&lt;br /&gt;
  local nmonth = os.date(&amp;quot;%B&amp;quot;, os.time{year=2000, month=month, day=1} )     -- month in name form       &lt;br /&gt;
  if not nmonth then&lt;br /&gt;
    return year&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local zday = day&lt;br /&gt;
  day = zday:match(&amp;quot;0*(%d+)&amp;quot;)&lt;br /&gt;
  if tonumber(day) &amp;lt; 1 or tonumber(day) &amp;gt; 31 then&lt;br /&gt;
    if df == &amp;quot;mdy&amp;quot; or df == &amp;quot;dmy&amp;quot; then&lt;br /&gt;
      return nmonth .. &amp;quot; &amp;quot; .. year&lt;br /&gt;
    elseif df == &amp;quot;iso&amp;quot; then&lt;br /&gt;
      return year .. &amp;quot;-&amp;quot; .. zmonth &lt;br /&gt;
    elseif df == &amp;quot;ymd&amp;quot; then&lt;br /&gt;
      return year .. &amp;quot; &amp;quot; .. nmonth&lt;br /&gt;
    else&lt;br /&gt;
      return nmonth .. &amp;quot; &amp;quot; .. year&lt;br /&gt;
    end&lt;br /&gt;
  end                                       &lt;br /&gt;
&lt;br /&gt;
  if df == &amp;quot;mdy&amp;quot; then&lt;br /&gt;
    return nmonth .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year         -- September 1, 2016&lt;br /&gt;
  elseif df == &amp;quot;dmy&amp;quot; then&lt;br /&gt;
    return day .. &amp;quot; &amp;quot; .. nmonth .. &amp;quot; &amp;quot; .. year          -- 1 September 2016&lt;br /&gt;
  elseif df == &amp;quot;iso&amp;quot; then&lt;br /&gt;
    return year .. &amp;quot;-&amp;quot; .. zmonth .. &amp;quot;-&amp;quot; .. zday         -- 2016-09-01&lt;br /&gt;
  elseif df == &amp;quot;ymd&amp;quot; then&lt;br /&gt;
    return year .. &amp;quot; &amp;quot; .. nmonth .. &amp;quot; &amp;quot; .. cday          -- 2016 September 1&lt;br /&gt;
  else&lt;br /&gt;
    return nmonth .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year         -- September 1, 2016&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; decodeWebciteDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
      Given a URI-path to Webcite (eg. /67xHmVFWP) return the encoded date in df format&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
local function decodeWebciteDate(path, df)&lt;br /&gt;
&lt;br /&gt;
    local dt = {}&lt;br /&gt;
    dt.split = {}&lt;br /&gt;
&lt;br /&gt;
    dt.split = mw.text.split(path, &amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- valid URL formats that are not base62&lt;br /&gt;
&lt;br /&gt;
    -- http://www.webcitation.org/query?id=1138911916587475&lt;br /&gt;
    -- http://www.webcitation.org/query?url=http..&amp;amp;date=2012-06-01+21:40:03&lt;br /&gt;
    -- http://www.webcitation.org/1138911916587475&lt;br /&gt;
    -- http://www.webcitation.org/cache/73e53dd1f16cf8c5da298418d2a6e452870cf50e&lt;br /&gt;
    -- http://www.webcitation.org/getfile.php?fileid=1c46e791d68e89e12d0c2532cc3cf629b8bc8c8e&lt;br /&gt;
&lt;br /&gt;
    if mw.ustring.find( dt.split[2], &amp;quot;query&amp;quot;, 1, plain) or &lt;br /&gt;
       mw.ustring.find( dt.split[2], &amp;quot;cache&amp;quot;, 1, plain) or&lt;br /&gt;
       mw.ustring.find( dt.split[2], &amp;quot;getfile&amp;quot;, 1, plain) or&lt;br /&gt;
       tonumber(dt.split[2]) then&lt;br /&gt;
      return &amp;quot;query&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    dt.full = os.date(&amp;quot;%Y %m %d&amp;quot;, string.sub(string.format(&amp;quot;%d&amp;quot;, base62(dt.split[2])),1,10) )&lt;br /&gt;
    dt.split = mw.text.split(dt.full, &amp;quot; &amp;quot;)&lt;br /&gt;
    dt.year = dt.split[1]&lt;br /&gt;
    dt.month = dt.split[2]&lt;br /&gt;
    dt.day = dt.split[3]&lt;br /&gt;
&lt;br /&gt;
    if not tonumber(dt.year) or not tonumber(dt.month) or not tonumber(dt.day) then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if tonumber(dt.month) &amp;gt; 12 or tonumber(dt.day) &amp;gt; 31 or tonumber(dt.month) &amp;lt; 1 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (2)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(dt.year) &amp;gt; tonumber(os.date(&amp;quot;%Y&amp;quot;)) or tonumber(dt.year) &amp;lt; 1900 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (3)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fulldate = makeDate(dt.year, dt.month, dt.day, df)&lt;br /&gt;
    if not fulldate then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (4)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      return fulldate&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; decodeWaybackDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
Given a URI-path to Wayback (eg. /web/20160901010101/http://example.com )&lt;br /&gt;
  return the formatted date eg. &amp;quot;September 1, 2016&amp;quot; in df format &lt;br /&gt;
  Handle non-digits in snapshot ID such as &amp;quot;re_&amp;quot; and &amp;quot;-&amp;quot; and &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function decodeWaybackDate(path, df)&lt;br /&gt;
&lt;br /&gt;
    local snapdate, snapdatelong, currdate, fulldate&lt;br /&gt;
&lt;br /&gt;
    local safe = path&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;^/w?e?b?/?&amp;quot;, &amp;quot;&amp;quot;)                      -- Remove leading &amp;quot;/web/&amp;quot; or &amp;quot;/&amp;quot;&lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    local N = mw.text.split(safe, &amp;quot;/&amp;quot;)&lt;br /&gt;
    snapdate = N[1]&lt;br /&gt;
    if snapdate == &amp;quot;*&amp;quot; then                                             -- eg. /web/*/http..&lt;br /&gt;
      return &amp;quot;index&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[a-z][a-z]_[0-9]?$&amp;quot;, &amp;quot;&amp;quot;)              -- Remove any trailing &amp;quot;re_&amp;quot; from date &lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[-]&amp;quot;, &amp;quot;&amp;quot;)                             -- Remove dashes from date eg. 2015-01-01 &lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[*]$&amp;quot;, &amp;quot;&amp;quot;)                            -- Remove trailing &amp;quot;*&amp;quot; &lt;br /&gt;
&lt;br /&gt;
    if not tonumber(snapdate) then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (2)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    local dlen = string.len(snapdate)&lt;br /&gt;
    if dlen &amp;lt; 4 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (3)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if dlen &amp;lt; 14 then&lt;br /&gt;
      snapdatelong = snapdate .. string.rep(&amp;quot;0&amp;quot;, 14 - dlen)&lt;br /&gt;
    else&lt;br /&gt;
      snapdatelong = snapdate&lt;br /&gt;
    end&lt;br /&gt;
    local year = string.sub(snapdatelong, 1, 4)&lt;br /&gt;
    local month = string.sub(snapdatelong, 5, 6)&lt;br /&gt;
    local day = string.sub(snapdatelong, 7, 8)&lt;br /&gt;
    if not tonumber(year) or not tonumber(month) or not tonumber(day) then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (4)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(month) &amp;gt; 12 or tonumber(day) &amp;gt; 31 or tonumber(month) &amp;lt; 1 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (5)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    currdate = os.date(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
    if tonumber(year) &amp;gt; tonumber(currdate) or tonumber(year) &amp;lt; 1900 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (6)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fulldate = makeDate(year, month, day, df)&lt;br /&gt;
    if not fulldate then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (7)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      return fulldate&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; decodeArchiveisDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
  Given an Archive.is &amp;quot;long link&amp;quot; URI-path (e.g. /2016.08.28-144552/http://example.com)&lt;br /&gt;
  return the date in df format (e.g. if df = dmy, return 28 August 2016)&lt;br /&gt;
  Handles &amp;quot;.&amp;quot; and &amp;quot;-&amp;quot; in snapshot date, so 2016.08.28-144552 is same as 20160828144552&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function decodeArchiveisDate(path, df)&lt;br /&gt;
&lt;br /&gt;
    local snapdate, snapdatelong, currdate, fulldate&lt;br /&gt;
&lt;br /&gt;
    local safe = path&lt;br /&gt;
    local N = mw.text.split(safe, &amp;quot;/&amp;quot;)&lt;br /&gt;
    safe = N[2]                                                         -- get snapshot date, e.g. 2016.08.28-144552&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[%.%-]&amp;quot;, &amp;quot;&amp;quot;)                          -- remove periods and hyphens&lt;br /&gt;
&lt;br /&gt;
    if not tonumber(snapdate) then                                      -- if not numeric, it is &amp;quot;short link&amp;quot;, not date&lt;br /&gt;
        return &amp;quot;short link&amp;quot;                                             -- e.g. http://archive.is/hD1qz&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local dlen = string.len(snapdate)&lt;br /&gt;
    if dlen &amp;lt; 4 then&lt;br /&gt;
        return inlineRed(&amp;quot;[Date error] (3)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if dlen &amp;lt; 14 then&lt;br /&gt;
        snapdatelong = snapdate .. string.rep(&amp;quot;0&amp;quot;, 14 - dlen)&lt;br /&gt;
    else&lt;br /&gt;
        snapdatelong = snapdate&lt;br /&gt;
    end&lt;br /&gt;
    local year = string.sub(snapdatelong, 1, 4)&lt;br /&gt;
    local month = string.sub(snapdatelong, 5, 6)&lt;br /&gt;
    local day = string.sub(snapdatelong, 7, 8)&lt;br /&gt;
    if not tonumber(year) or not tonumber(month) or not tonumber(day) then&lt;br /&gt;
        return inlineRed(&amp;quot;[Date error] (4)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(month) &amp;gt; 12 or tonumber(day) &amp;gt; 31 or tonumber(month) &amp;lt; 1 then&lt;br /&gt;
        return inlineRed(&amp;quot;[Date error] (5)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    currdate = os.date(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
    if tonumber(year) &amp;gt; tonumber(currdate) or tonumber(year) &amp;lt; 1900 then&lt;br /&gt;
        return inlineRed(&amp;quot;[Date error] (6)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fulldate = makeDate(year, month, day, df)&lt;br /&gt;
    if not fulldate then&lt;br /&gt;
        return inlineRed(&amp;quot;[Date error] (7)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
        return fulldate&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; serviceName &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a domain extracted by mw.uri.new() (eg. web.archive.org) set tail string and service ID&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function serviceName(host, nolink)&lt;br /&gt;
&lt;br /&gt;
  local tracking = &amp;quot;Category:Webarchive template other archives&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local bracketopen = &amp;quot;[[&amp;quot;&lt;br /&gt;
  local bracketclose = &amp;quot;]]&amp;quot;&lt;br /&gt;
  if nolink then&lt;br /&gt;
    bracketopen = &amp;quot;&amp;quot;&lt;br /&gt;
    bracketclose = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  ulx.url1.service = &amp;quot;other&amp;quot;&lt;br /&gt;
  ulx.url1.tail = &amp;quot; at &amp;quot; .. ulx.url1.host .. &amp;quot; &amp;quot; .. inlineRed(&amp;quot;Error: unknown archive URL&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  host = string.lower(host)&lt;br /&gt;
&lt;br /&gt;
  if mw.ustring.find( host, &amp;quot;europarchive.org&amp;quot;, 1, plain ) then  -- any containing &amp;quot;archive.org&amp;quot; listed before Wayback to avoid disambiguation&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;National Library of Ireland&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webarchive.org.uk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;UK Web Archive&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;wayback&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;Wayback Machine&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template wayback links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webcitation.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;webcite&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;WebCite&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template webcite links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.is&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.fo&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.today&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.li&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.ec&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive[-]it.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveit&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive-It&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;arquivo.pt&amp;quot;, 1, plain) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Portuguese Web Archive&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;loc.gov&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;Library of Congress&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webharvest.gov&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;National Archives and Records Administration&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;bibalex.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;[[Bibliotheca_Alexandrina#Internet_Archive_partnership|Bibliotheca Alexandrina]]&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;collectionscanada&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Canadian Government Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;haw.nsk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Croatian Web Archive (HAW)&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;veebiarhiiv.digar.ee&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Estonian Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;vefsafn.is&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;[[National and University Library of Iceland]]&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;proni.gov&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;Public Record Office of Northern Ireland&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;uni[-]lj.si&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Slovenian Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;stanford.edu&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;[[Stanford University Libraries|Stanford Web Archive]]&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;nationalarchives.gov.uk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;UK Government Web Archive&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;parliament.uk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;UK Parliament&amp;#039;s Web Archive&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;nlb.gov.sg&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;Web Archive Singapore&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;pandora.nla.gov.au&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Pandora Archive&amp;quot; .. bracketclose &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;perma.cc&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Perma.cc&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;perma-archives.cc&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Perma.cc&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;screenshots.com&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at Screenshots&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;wikiwix.com&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at Wikiwix&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;freezepage.com&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at Freezepage&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webcache.googleusercontent.com&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at Google Cache&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;timetravel.mementoweb.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Memento Project&amp;quot; .. bracketclose&lt;br /&gt;
  else&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template unknown archives&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  track[tracking] = 1&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; parseExtraArgs &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Parse numbered arguments starting at 2, such as url2..url10, date2..date10, title2..title10&lt;br /&gt;
       For example: {{webarchive |url=.. |url4=.. |url7=..}}&lt;br /&gt;
         Three url arguments not in numeric sequence (1..4..7). &lt;br /&gt;
         Function only processes arguments numbered 2 or greater (in this case 4 and 7)&lt;br /&gt;
         It creates numeric sequenced table entries like:&lt;br /&gt;
           urlx.url2.url = &amp;lt;argument value for url4&amp;gt;&lt;br /&gt;
           urlx.url3.url = &amp;lt;argument value for url7&amp;gt;&lt;br /&gt;
       Returns the number of URL arguments found numbered 2 or greater (in this case returns &amp;quot;2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function parseExtraArgs()&lt;br /&gt;
&lt;br /&gt;
  local i, j, argurl, argurl2, argdate, argtitle&lt;br /&gt;
&lt;br /&gt;
  j = 2&lt;br /&gt;
  for i = 2, maxurls do&lt;br /&gt;
    argurl = &amp;quot;url&amp;quot; .. i&lt;br /&gt;
    if trimArg(args[argurl]) then&lt;br /&gt;
      argurl2 = &amp;quot;url&amp;quot; .. j&lt;br /&gt;
      ulx[argurl2] = {}&lt;br /&gt;
      ulx[argurl2][&amp;quot;url&amp;quot;] = args[argurl]&lt;br /&gt;
      argdate = &amp;quot;date&amp;quot; .. j&lt;br /&gt;
      if trimArg(args[argdate]) then&lt;br /&gt;
        ulx[argurl2][&amp;quot;date&amp;quot;] = args[argdate]&lt;br /&gt;
      else&lt;br /&gt;
        ulx[argurl2][&amp;quot;date&amp;quot;] = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
      argtitle = &amp;quot;title&amp;quot; .. j&lt;br /&gt;
      if trimArg(args[argtitle]) then&lt;br /&gt;
        ulx[argurl2][&amp;quot;title&amp;quot;] = args[argtitle]&lt;br /&gt;
      else&lt;br /&gt;
        ulx[argurl2][&amp;quot;title&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
      j = j + 1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if j == 2 then&lt;br /&gt;
    return 0&lt;br /&gt;
  else&lt;br /&gt;
    return j - 2&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; comma &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a date string, return &amp;quot;,&amp;quot; if it&amp;#039;s MDY &lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function comma(date)&lt;br /&gt;
  local N = mw.text.split(date, &amp;quot; &amp;quot;)&lt;br /&gt;
  local O = mw.text.split(N[1], &amp;quot;-&amp;quot;) -- for ISO&lt;br /&gt;
  if O[1] == &amp;quot;index&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
  if not tonumber(O[1]) then&lt;br /&gt;
    return &amp;quot;,&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; createTracking &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Return data in track[] ie. tracking categories&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function createTracking()&lt;br /&gt;
&lt;br /&gt;
  local sand = &amp;quot;&amp;quot;&lt;br /&gt;
  if tableLength(track) &amp;gt; 0 then                        &lt;br /&gt;
    for key,_ in pairs(track) do&lt;br /&gt;
      sand = sand .. &amp;quot;[[&amp;quot; .. key .. &amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return sand&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; createRendering &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Return a rendering of the data in ulx[][]&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function createRendering()&lt;br /&gt;
&lt;br /&gt;
    local sand, displayheader, displayfield&lt;br /&gt;
&lt;br /&gt;
    local period1 = &amp;quot;&amp;quot;   -- For backwards compat with {{wayback}}&lt;br /&gt;
    local period2 = &amp;quot;.&amp;quot;                                                            &lt;br /&gt;
  &lt;br /&gt;
    local indexstr = &amp;quot;archived&amp;quot;&lt;br /&gt;
    if ulx.url1.date == &amp;quot;index&amp;quot; then&lt;br /&gt;
      indexstr = &amp;quot;archive&amp;quot;&lt;br /&gt;
    end  &lt;br /&gt;
                                                                                          -- For {{wayback}}, {{webcite}}&lt;br /&gt;
&lt;br /&gt;
    if ulx.url1.format == &amp;quot;none&amp;quot; then                                                     &lt;br /&gt;
      if not ulx.url1.title and not ulx.url1.date then                                    -- No title. No date&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; Archived]&amp;quot; .. ulx.url1.tail&lt;br /&gt;
      elseif not ulx.url1.title and ulx.url1.date then                                    -- No title. Date.&lt;br /&gt;
        if ulx.url1.service == &amp;quot;wayback&amp;quot; then &lt;br /&gt;
          period1 = &amp;quot;.&amp;quot;&lt;br /&gt;
          period2 = &amp;quot;&amp;quot; &lt;br /&gt;
        end&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; Archived] &amp;quot; .. ulx.url1.date .. comma(ulx.url1.date) .. ulx.url1.tail .. period1&lt;br /&gt;
      elseif ulx.url1.title and not ulx.url1.date then                                    -- Title. No date.&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; &amp;quot; .. ulx.url1.title .. &amp;quot;]&amp;quot; .. ulx.url1.tail&lt;br /&gt;
      elseif ulx.url1.title and ulx.url1.date then                                        -- Title. Date.&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; &amp;quot; .. ulx.url1.title .. &amp;quot;]&amp;quot; .. ulx.url1.tail .. &amp;quot;&amp;amp;#32;(&amp;quot; .. indexstr .. &amp;quot; &amp;quot; .. ulx.url1.date .. &amp;quot;)&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        return nil&lt;br /&gt;
      end&lt;br /&gt;
      if ulx.url1.extraurls &amp;gt; 0 then                                                      -- For multiple archive URLs&lt;br /&gt;
        local tot = ulx.url1.extraurls + 1&lt;br /&gt;
        sand = sand .. period2 .. &amp;quot; Additional archives: &amp;quot;&lt;br /&gt;
        for i=2,tot do&lt;br /&gt;
          local indx = &amp;quot;url&amp;quot; .. i&lt;br /&gt;
          if ulx[indx][&amp;quot;title&amp;quot;] then &lt;br /&gt;
            displayfield = &amp;quot;title&amp;quot;&lt;br /&gt;
          else&lt;br /&gt;
            displayfield = &amp;quot;date&amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
          sand = sand .. &amp;quot;[&amp;quot; .. ulx[indx][&amp;quot;url&amp;quot;] .. &amp;quot; &amp;quot; .. ulx[indx][displayfield] .. &amp;quot;]&amp;quot;&lt;br /&gt;
          if i == tot then&lt;br /&gt;
            sand = sand .. &amp;quot;.&amp;quot;&lt;br /&gt;
          else&lt;br /&gt;
            sand = sand .. &amp;quot;, &amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      else&lt;br /&gt;
        return sand  &lt;br /&gt;
      end&lt;br /&gt;
      return sand&lt;br /&gt;
                                                                                          -- For {{cite archives}}&lt;br /&gt;
&lt;br /&gt;
    else                                                                  &lt;br /&gt;
      if ulx.url1.format == &amp;quot;addlarchives&amp;quot; then                           -- Multiple archive services &lt;br /&gt;
        displayheader = &amp;quot;Additional archives: &amp;quot;&lt;br /&gt;
      else                                                                -- Multiple pages from the same archive &lt;br /&gt;
        displayheader = &amp;quot;Additional pages archived&amp;amp;nbsp;on &amp;quot; .. ulx.url1.date .. &amp;quot;: &amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      local tot = 1 + ulx.url1.extraurls&lt;br /&gt;
      local sand = displayheader&lt;br /&gt;
      for i=1,tot do&lt;br /&gt;
        local indx = &amp;quot;url&amp;quot; .. i&lt;br /&gt;
        displayfield = ulx[indx][&amp;quot;title&amp;quot;]&lt;br /&gt;
        if ulx.url1.format == &amp;quot;addlarchives&amp;quot; then&lt;br /&gt;
          if not displayfield then &lt;br /&gt;
            displayfield = ulx[indx][&amp;quot;date&amp;quot;]&lt;br /&gt;
          end&lt;br /&gt;
        else&lt;br /&gt;
          if not displayfield then &lt;br /&gt;
            displayfield = &amp;quot;Page &amp;quot; .. i&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        sand = sand .. &amp;quot;[&amp;quot; .. ulx[indx][&amp;quot;url&amp;quot;] .. &amp;quot; &amp;quot; .. displayfield .. &amp;quot;]&amp;quot;&lt;br /&gt;
        if i == tot then&lt;br /&gt;
          sand = sand .. &amp;quot;.&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
          sand = sand .. &amp;quot;, &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return sand&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.webarchive(frame)&lt;br /&gt;
  args = frame.args&lt;br /&gt;
  if (args[1]==nil) and (args[&amp;quot;url&amp;quot;]==nil) then           -- if no argument provided than check parent template/module args&lt;br /&gt;
    args = frame:getParent().args &lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  local tname = &amp;quot;Webarchive&amp;quot;                              -- name of calling template. Change if template rename.&lt;br /&gt;
  ulx = {}                                                -- Associative array to hold template data &lt;br /&gt;
  track = {}                                              -- Associative array to hold tracking categories&lt;br /&gt;
  maxurls = 10                                            -- Max number of URLs allowed. &lt;br /&gt;
  local verifydates = &amp;quot;yes&amp;quot;                               -- See documentation. Set &amp;quot;no&amp;quot; to disable.&lt;br /&gt;
&lt;br /&gt;
                                                          -- URL argument (first)&lt;br /&gt;
&lt;br /&gt;
  local url1 = trimArg(args.url) or trimArg(args.url1)           &lt;br /&gt;
  if not url1 then&lt;br /&gt;
    return inlineError(&amp;quot;url&amp;quot;, &amp;quot;Empty.&amp;quot;) .. createTracking()&lt;br /&gt;
  end&lt;br /&gt;
  if mw.ustring.find( url1, &amp;quot;https://web.http&amp;quot;, 1, plain ) then    -- track bug &lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
    return inlineError(&amp;quot;url&amp;quot;, &amp;quot;https://web.http&amp;quot;) .. createTracking()&lt;br /&gt;
  end &lt;br /&gt;
  if url1 == &amp;quot;https://web.archive.org/http:/&amp;quot; then                 -- track bug&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
    return inlineError(&amp;quot;url&amp;quot;, &amp;quot;Invalid URL&amp;quot;) .. createTracking()&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  ulx.url1 = {}&lt;br /&gt;
  ulx.url1.url = url1&lt;br /&gt;
  local uri1 = mw.uri.new(ulx.url1.url)&lt;br /&gt;
  ulx.url1.host = uri1.host&lt;br /&gt;
  ulx.url1.extraurls = parseExtraArgs()&lt;br /&gt;
&lt;br /&gt;
                                                          -- Nolink argument &lt;br /&gt;
&lt;br /&gt;
  local nolink = trimArg2(args.nolink)&lt;br /&gt;
&lt;br /&gt;
  serviceName(uri1.host, nolink)&lt;br /&gt;
&lt;br /&gt;
                                                          -- Date argument&lt;br /&gt;
&lt;br /&gt;
  local date = trimArg(args.date) or trimArg(args.date1)&lt;br /&gt;
  if date == &amp;quot;*&amp;quot; and ulx.url1.service == &amp;quot;wayback&amp;quot; then&lt;br /&gt;
    date = &amp;quot;index&amp;quot;&lt;br /&gt;
  elseif date and ulx.url1.service == &amp;quot;wayback&amp;quot; and verifydates == &amp;quot;yes&amp;quot; then &lt;br /&gt;
    local ldf = dateFormat(date)&lt;br /&gt;
    if ldf then&lt;br /&gt;
      local udate = decodeWaybackDate( uri1.path, ldf )&lt;br /&gt;
      if udate ~= date then&lt;br /&gt;
        date = udate .. inlineRed(&amp;quot;&amp;lt;sup&amp;gt;[Date mismatch]&amp;lt;/sup&amp;gt;&amp;quot;, &amp;quot;warning&amp;quot;)       &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  elseif date and ulx.url1.service == &amp;quot;webcite&amp;quot; and verifydates == &amp;quot;yes&amp;quot; then &lt;br /&gt;
    local ldf = dateFormat(date)&lt;br /&gt;
    if ldf then&lt;br /&gt;
      local udate = decodeWebciteDate( uri1.path, ldf )&lt;br /&gt;
      if udate == &amp;quot;query&amp;quot; then -- skip&lt;br /&gt;
      elseif udate ~= date then&lt;br /&gt;
        date = udate .. inlineRed(&amp;quot;&amp;lt;sup&amp;gt;[Date mismatch]&amp;lt;/sup&amp;gt;&amp;quot;, &amp;quot;warning&amp;quot;)      &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  elseif date and ulx.url1.service == &amp;quot;archiveis&amp;quot; and verifydates == &amp;quot;yes&amp;quot; then &lt;br /&gt;
     local ldf = dateFormat(date)&lt;br /&gt;
     if ldf then&lt;br /&gt;
        local udate = decodeArchiveisDate( uri1.path, ldf )&lt;br /&gt;
        if udate == &amp;quot;short link&amp;quot; then -- skip&lt;br /&gt;
        elseif udate ~= date then&lt;br /&gt;
           date = udate .. inlineRed(&amp;quot;&amp;lt;sup&amp;gt;[Date mismatch]&amp;lt;/sup&amp;gt;&amp;quot;, &amp;quot;warning&amp;quot;)      &lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
  elseif not date and ulx.url1.service == &amp;quot;wayback&amp;quot; then&lt;br /&gt;
    date = decodeWaybackDate( uri1.path, &amp;quot;iso&amp;quot; )&lt;br /&gt;
    if not date then &lt;br /&gt;
      date = inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;) &lt;br /&gt;
    end&lt;br /&gt;
  elseif not date and ulx.url1.service == &amp;quot;webcite&amp;quot; then&lt;br /&gt;
    date = decodeWebciteDate( uri1.path, &amp;quot;iso&amp;quot; )&lt;br /&gt;
    if date == &amp;quot;query&amp;quot; then&lt;br /&gt;
      date = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
    elseif not date then &lt;br /&gt;
      date = inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
  elseif not date and ulx.url1.service == &amp;quot;archiveis&amp;quot; then&lt;br /&gt;
     date = decodeArchiveisDate( uri1.path, &amp;quot;iso&amp;quot; )&lt;br /&gt;
     if date == &amp;quot;short link&amp;quot; then&lt;br /&gt;
        date = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
     elseif not date then &lt;br /&gt;
        date = inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
     end&lt;br /&gt;
  elseif not date then&lt;br /&gt;
    date = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  ulx.url1.date = date&lt;br /&gt;
&lt;br /&gt;
                                                          -- Format argument &lt;br /&gt;
&lt;br /&gt;
  local format = trimArg(args.format)&lt;br /&gt;
  if not format then&lt;br /&gt;
    format = &amp;quot;none&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    if format == &amp;quot;addlpages&amp;quot; then&lt;br /&gt;
      if not ulx.url1.date then&lt;br /&gt;
        format = &amp;quot;none&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    elseif format == &amp;quot;addlarchives&amp;quot; then&lt;br /&gt;
      format = &amp;quot;addlarchives&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      format = &amp;quot;none&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  ulx.url1.format = format&lt;br /&gt;
&lt;br /&gt;
                                                          -- Title argument &lt;br /&gt;
&lt;br /&gt;
  local title = trimArg(args.title) or trimArg(args.title1)&lt;br /&gt;
  ulx.url1.title = title&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  local rend = createRendering()&lt;br /&gt;
  if not rend then&lt;br /&gt;
    rend = &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;Error in [[:Template:&amp;#039; .. tname .. &amp;#039;]]: Unknown problem. Please report on template talk page.&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return rend .. createTracking()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Amc-admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.americanmusicclub.com/index.php?title=Module:Webarchive&amp;diff=26470&amp;oldid=prev</id>
		<title>Amc-admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.americanmusicclub.com/index.php?title=Module:Webarchive&amp;diff=26470&amp;oldid=prev"/>
		<updated>2016-11-25T13:44:47Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[ ----------------------------------&lt;br /&gt;
&lt;br /&gt;
     Lua module implementing the {{webarchive}} template. &lt;br /&gt;
&lt;br /&gt;
       A merger of the functionality of three templates: {{wayback}}, {{webcite}} and {{cite archives}}&lt;br /&gt;
   &lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; inlineError &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Critical error. Render output completely in red. Add to tracking category.&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function inlineError(arg, msg)&lt;br /&gt;
&lt;br /&gt;
  track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1&lt;br /&gt;
  return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;Error in webarchive template: Check &amp;lt;code style=&amp;quot;color:inherit; border:inherit; padding:inherit;&amp;quot;&amp;gt;&amp;amp;#124;&amp;#039; .. arg .. &amp;#039;=&amp;lt;/code&amp;gt; value. &amp;#039; .. msg .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; inlineRed &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
      Render a text fragment in red, such as a warning as part of the final output.&lt;br /&gt;
      Add tracking category.&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function inlineRed(msg, trackmsg)&lt;br /&gt;
&lt;br /&gt;
  if trackmsg == &amp;quot;warning&amp;quot; then&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template warnings&amp;quot;] = 1 &lt;br /&gt;
  elseif trackmsg == &amp;quot;error&amp;quot; then&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;&amp;#039; .. msg .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; trimArg &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     trimArg returns nil if arg is &amp;quot;&amp;quot; while trimArg2 returns &amp;#039;true&amp;#039; if arg is &amp;quot;&amp;quot; &lt;br /&gt;
     trimArg2 is for args that might accept an empty value, as an on/off switch like nolink=&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function trimArg(arg)&lt;br /&gt;
  if arg == &amp;quot;&amp;quot; or arg == nil then&lt;br /&gt;
    return nil&lt;br /&gt;
  else&lt;br /&gt;
    return mw.text.trim(arg)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
local function trimArg2(arg)&lt;br /&gt;
  if arg == nil then&lt;br /&gt;
    return nil&lt;br /&gt;
  else&lt;br /&gt;
    return mw.text.trim(arg)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; base62 &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Convert base-62 to base-10&lt;br /&gt;
     Credit: https://de.wikipedia.org/wiki/Modul:Expr &lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function base62( value )&lt;br /&gt;
&lt;br /&gt;
    local r = 1&lt;br /&gt;
&lt;br /&gt;
    if value:match( &amp;quot;^%w+$&amp;quot; ) then&lt;br /&gt;
        local n = #value&lt;br /&gt;
        local k = 1&lt;br /&gt;
        local c&lt;br /&gt;
        r = 0&lt;br /&gt;
        for i = n, 1, -1 do&lt;br /&gt;
            c = value:byte( i, i )&lt;br /&gt;
            if c &amp;gt;= 48  and  c &amp;lt;= 57 then&lt;br /&gt;
                c = c - 48&lt;br /&gt;
            elseif c &amp;gt;= 65  and  c &amp;lt;= 90 then&lt;br /&gt;
                c = c - 55&lt;br /&gt;
            elseif c &amp;gt;= 97  and  c &amp;lt;= 122 then&lt;br /&gt;
                c = c - 61&lt;br /&gt;
            else    -- How comes?&lt;br /&gt;
                r = 1&lt;br /&gt;
                break    -- for i&lt;br /&gt;
            end&lt;br /&gt;
            r = r + c * k&lt;br /&gt;
            k = k * 62&lt;br /&gt;
        end -- for i&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; tableLength &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
      Given a 1-D table, return number of elements&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function tableLength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; dateFormat &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a date string, return its format: dmy, mdy, iso, ymd&lt;br /&gt;
       If unable to determine return nil&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function dateFormat(date)&lt;br /&gt;
&lt;br /&gt;
  local dt = {}&lt;br /&gt;
  dt.split = {}&lt;br /&gt;
&lt;br /&gt;
  dt.split = mw.text.split(date, &amp;quot;-&amp;quot;)&lt;br /&gt;
  if tableLength(dt.split) == 3 then&lt;br /&gt;
    if tonumber(dt.split[1]) &amp;gt; 1900 and tonumber(dt.split[1]) &amp;lt; 2200 and tonumber(dt.split[2]) and tonumber(dt.split[3]) then&lt;br /&gt;
      return &amp;quot;iso&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      return nil&lt;br /&gt;
    end&lt;br /&gt;
  end  &lt;br /&gt;
&lt;br /&gt;
  dt.split = mw.text.split(date, &amp;quot; &amp;quot;)&lt;br /&gt;
  if tableLength(dt.split) == 3 then&lt;br /&gt;
    if tonumber(dt.split[3]) then&lt;br /&gt;
      if tonumber(dt.split[3]) &amp;gt; 1900 and tonumber(dt.split[3]) &amp;lt; 2200 then&lt;br /&gt;
        if tonumber(dt.split[1]) then&lt;br /&gt;
          return &amp;quot;dmy&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
          return &amp;quot;mdy&amp;quot;&lt;br /&gt;
        end &lt;br /&gt;
      else&lt;br /&gt;
        if tonumber(dt.split[1]) then&lt;br /&gt;
          if tonumber(dt.split[1]) &amp;gt; 1900 and tonumber(dt.split[1]) &amp;lt; 2200 then&lt;br /&gt;
            return &amp;quot;ymd&amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return nil&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; makeDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a zero-padded 4-digit year, 2-digit month and 2-digit day, return a full date in df format&lt;br /&gt;
     df = mdy, dmy, iso, ymd&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function makeDate(year, month, day, df)&lt;br /&gt;
&lt;br /&gt;
  if not year or year == &amp;quot;&amp;quot; or not month or month == &amp;quot;&amp;quot; or not day or day == &amp;quot;&amp;quot; then&lt;br /&gt;
    return nil&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local zmonth = month                                                      -- month with leading 0&lt;br /&gt;
  month = month:match(&amp;quot;0*(%d+)&amp;quot;)                                            -- month without leading 0&lt;br /&gt;
  if tonumber(month) &amp;lt; 1 or tonumber(month) &amp;gt; 12 then&lt;br /&gt;
    return year&lt;br /&gt;
  end&lt;br /&gt;
  local nmonth = os.date(&amp;quot;%B&amp;quot;, os.time{year=2000, month=month, day=1} )     -- month in name form       &lt;br /&gt;
  if not nmonth then&lt;br /&gt;
    return year&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local zday = day&lt;br /&gt;
  day = zday:match(&amp;quot;0*(%d+)&amp;quot;)&lt;br /&gt;
  if tonumber(day) &amp;lt; 1 or tonumber(day) &amp;gt; 31 then&lt;br /&gt;
    if df == &amp;quot;mdy&amp;quot; or df == &amp;quot;dmy&amp;quot; then&lt;br /&gt;
      return nmonth .. &amp;quot; &amp;quot; .. year&lt;br /&gt;
    elseif df == &amp;quot;iso&amp;quot; then&lt;br /&gt;
      return year .. &amp;quot;-&amp;quot; .. zmonth &lt;br /&gt;
    elseif df == &amp;quot;ymd&amp;quot; then&lt;br /&gt;
      return year .. &amp;quot; &amp;quot; .. nmonth&lt;br /&gt;
    else&lt;br /&gt;
      return nmonth .. &amp;quot; &amp;quot; .. year&lt;br /&gt;
    end&lt;br /&gt;
  end                                       &lt;br /&gt;
&lt;br /&gt;
  if df == &amp;quot;mdy&amp;quot; then&lt;br /&gt;
    return nmonth .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year         -- September 1, 2016&lt;br /&gt;
  elseif df == &amp;quot;dmy&amp;quot; then&lt;br /&gt;
    return day .. &amp;quot; &amp;quot; .. nmonth .. &amp;quot; &amp;quot; .. year          -- 1 September 2016&lt;br /&gt;
  elseif df == &amp;quot;iso&amp;quot; then&lt;br /&gt;
    return year .. &amp;quot;-&amp;quot; .. zmonth .. &amp;quot;-&amp;quot; .. zday         -- 2016-09-01&lt;br /&gt;
  elseif df == &amp;quot;ymd&amp;quot; then&lt;br /&gt;
    return year .. &amp;quot; &amp;quot; .. nmonth .. &amp;quot; &amp;quot; .. cday          -- 2016 September 1&lt;br /&gt;
  else&lt;br /&gt;
    return nmonth .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year         -- September 1, 2016&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; decodeWebciteDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
      Given a URI-path to Webcite (eg. /67xHmVFWP) return the encoded date in df format&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
local function decodeWebciteDate(path, df)&lt;br /&gt;
&lt;br /&gt;
    local dt = {}&lt;br /&gt;
    dt.split = {}&lt;br /&gt;
&lt;br /&gt;
    dt.split = mw.text.split(path, &amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- valid URL formats that are not base62&lt;br /&gt;
    --  http://www.webcitation.org/query?id=1138911916587475&lt;br /&gt;
    --  http://www.webcitation.org/1138911916587475&lt;br /&gt;
    --  http://www.webcitation.org/cache/73e53dd1f16cf8c5da298418d2a6e452870cf50e&lt;br /&gt;
    if dt.split[2] == &amp;quot;query&amp;quot; or dt.split[2] == &amp;quot;cache&amp;quot; or tonumber(dt.split[2]) then&lt;br /&gt;
      return &amp;quot;query&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    dt.full = os.date(&amp;quot;%Y %m %d&amp;quot;, string.sub(string.format(&amp;quot;%d&amp;quot;, base62(dt.split[2])),1,10) )&lt;br /&gt;
    dt.split = mw.text.split(dt.full, &amp;quot; &amp;quot;)&lt;br /&gt;
    dt.year = dt.split[1]&lt;br /&gt;
    dt.month = dt.split[2]&lt;br /&gt;
    dt.day = dt.split[3]&lt;br /&gt;
&lt;br /&gt;
    if not tonumber(dt.year) or not tonumber(dt.month) or not tonumber(dt.day) then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if tonumber(dt.month) &amp;gt; 12 or tonumber(dt.day) &amp;gt; 31 or tonumber(dt.month) &amp;lt; 1 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (2)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(dt.year) &amp;gt; tonumber(os.date(&amp;quot;%Y&amp;quot;)) or tonumber(dt.year) &amp;lt; 1900 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (3)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fulldate = makeDate(dt.year, dt.month, dt.day, df)&lt;br /&gt;
    if not fulldate then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (4)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      return fulldate&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; snapDateToString &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
Given a URI-path to Wayback (eg. /web/20160901010101/http://example.com )&lt;br /&gt;
  return the formatted date eg. &amp;quot;September 1, 2016&amp;quot; in df format &lt;br /&gt;
  Handle non-digits in snapshot ID such as &amp;quot;re_&amp;quot; and &amp;quot;-&amp;quot; and &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function decodeWaybackDate(path, df)&lt;br /&gt;
&lt;br /&gt;
    local snapdate, snapdatelong, currdate, fulldate&lt;br /&gt;
&lt;br /&gt;
    local safe = path&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;^/w?e?b?/?&amp;quot;, &amp;quot;&amp;quot;)                      -- Remove leading &amp;quot;/web/&amp;quot; or &amp;quot;/&amp;quot;&lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    local N = mw.text.split(safe, &amp;quot;/&amp;quot;)&lt;br /&gt;
    snapdate = N[1]&lt;br /&gt;
    if snapdate == &amp;quot;*&amp;quot; then                                             -- eg. /web/*/http..&lt;br /&gt;
      return &amp;quot;index&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[a-z][a-z]_[0-9]?$&amp;quot;, &amp;quot;&amp;quot;)              -- Remove any trailing &amp;quot;re_&amp;quot; from date &lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[-]&amp;quot;, &amp;quot;&amp;quot;)                             -- Remove dashes from date eg. 2015-01-01 &lt;br /&gt;
    safe = snapdate&lt;br /&gt;
    snapdate = string.gsub(safe, &amp;quot;[*]$&amp;quot;, &amp;quot;&amp;quot;)                            -- Remove trailing &amp;quot;*&amp;quot; &lt;br /&gt;
&lt;br /&gt;
    if not tonumber(snapdate) then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (2)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    local dlen = string.len(snapdate)&lt;br /&gt;
    if dlen &amp;lt; 4 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (3)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if dlen &amp;lt; 14 then&lt;br /&gt;
      snapdatelong = snapdate .. string.rep(&amp;quot;0&amp;quot;, 14 - dlen)&lt;br /&gt;
    else&lt;br /&gt;
      snapdatelong = snapdate&lt;br /&gt;
    end&lt;br /&gt;
    local year = string.sub(snapdatelong, 1, 4)&lt;br /&gt;
    local month = string.sub(snapdatelong, 5, 6)&lt;br /&gt;
    local day = string.sub(snapdatelong, 7, 8)&lt;br /&gt;
    if not tonumber(year) or not tonumber(month) or not tonumber(day) then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (4)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    if tonumber(month) &amp;gt; 12 or tonumber(day) &amp;gt; 31 or tonumber(month) &amp;lt; 1 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (5)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    currdate = os.date(&amp;quot;%Y&amp;quot;)&lt;br /&gt;
    if tonumber(year) &amp;gt; tonumber(currdate) or tonumber(year) &amp;lt; 1900 then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (6)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    fulldate = makeDate(year, month, day, df)&lt;br /&gt;
    if not fulldate then&lt;br /&gt;
      return inlineRed(&amp;quot;[Date error] (7)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
      return fulldate&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; serviceName &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a domain extracted by mw.uri.new() (eg. web.archive.org) set tail string and service ID&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function serviceName(host, nolink)&lt;br /&gt;
&lt;br /&gt;
  local tracking = &amp;quot;Category:Webarchive template other archives&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local bracketopen = &amp;quot;[[&amp;quot;&lt;br /&gt;
  local bracketclose = &amp;quot;]]&amp;quot;&lt;br /&gt;
  if nolink then&lt;br /&gt;
    bracketopen = &amp;quot;&amp;quot;&lt;br /&gt;
    bracketclose = &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  ulx.url1.service = &amp;quot;other&amp;quot;&lt;br /&gt;
  ulx.url1.tail = &amp;quot; at &amp;quot; .. ulx.url1.host&lt;br /&gt;
&lt;br /&gt;
  if mw.ustring.find( host, &amp;quot;archive.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;wayback&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;Wayback Machine&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template wayback links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webcitation.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;webcite&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;WebCite&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template webcite links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.is&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive.today&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveis&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive.is&amp;quot; .. bracketclose&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template archiveis links&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;archive-it&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.service = &amp;quot;archiveit&amp;quot;&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Archive-It&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;arquivo.pt&amp;quot;, 1, plain) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Portugese Web Archive&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;loc.gov&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;Library of Congress&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webharvest.gov&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;National Archives and Records Administration&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;bibalex.org&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;[[Bibliotheca_Alexandrina#Internet_Archive_partnership|Bibliotheca Alexandrina]]&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;collectionscanada&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Canadian Government Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;haw.nsk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Croatian Web Archive (HAW)&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;nlib.ee&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Estonian Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;vefsafn.is&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Icelandic Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;proni.gov&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;Public Record Office of Northern Ireland&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;uni-lj.si&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;Slovenian Web Archive&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;stanford.edu&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. &amp;quot;[[Stanford University Libraries|Stanford Web Archive]]&amp;quot;&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;nationalarchives.gov.uk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;UK Government Web Archive&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;parliament.uk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;UK Parliament&amp;#039;s Web Archive&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;webarchive.org.uk&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at the &amp;quot; .. bracketopen .. &amp;quot;UK Web Archive&amp;quot; .. bracketclose&lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;nlb.gov.sg&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;Web Archive Singapore&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;nlb.gov.sg&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;Web Archive Singapore&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;screenshots.com&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;Screenshots&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;wikiwix.com&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. &amp;quot;Wikiwix&amp;quot; &lt;br /&gt;
  elseif mw.ustring.find( host, &amp;quot;perma.cc&amp;quot;, 1, plain ) then&lt;br /&gt;
    ulx.url1.tail = &amp;quot; at &amp;quot; .. bracketopen .. &amp;quot;Perma.cc&amp;quot; .. bracketclose&lt;br /&gt;
  else&lt;br /&gt;
    tracking = &amp;quot;Category:Webarchive template unknown archives&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  track[tracking] = 1&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; parseExtraArgs &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Parse numbered arguments starting at 2, such as url2..url10, date2..date10, title2..title10&lt;br /&gt;
       For example: {{webarchive |url=.. |url4=.. |url7=..}}&lt;br /&gt;
         Three url arguments not in numeric sequence (1..4..7). &lt;br /&gt;
         Function only processes arguments numbered 2 or greater (in this case 4 and 7)&lt;br /&gt;
         It creates numeric sequenced table entries like:&lt;br /&gt;
           urlx.url2.url = &amp;lt;argument value for url4&amp;gt;&lt;br /&gt;
           urlx.url3.url = &amp;lt;argument value for url7&amp;gt;&lt;br /&gt;
       Returns the number of URL arguments found numbered 2 or greater (in this case returns &amp;quot;2&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function parseExtraArgs()&lt;br /&gt;
&lt;br /&gt;
  local i, j, argurl, argurl2, argdate, argtitle&lt;br /&gt;
&lt;br /&gt;
  j = 2&lt;br /&gt;
  for i = 2, maxurls do&lt;br /&gt;
    argurl = &amp;quot;url&amp;quot; .. i&lt;br /&gt;
    if trimArg(args[argurl]) then&lt;br /&gt;
      argurl2 = &amp;quot;url&amp;quot; .. j&lt;br /&gt;
      ulx[argurl2] = {}&lt;br /&gt;
      ulx[argurl2][&amp;quot;url&amp;quot;] = args[argurl]&lt;br /&gt;
      argdate = &amp;quot;date&amp;quot; .. j&lt;br /&gt;
      if trimArg(args[argdate]) then&lt;br /&gt;
        ulx[argurl2][&amp;quot;date&amp;quot;] = args[argdate]&lt;br /&gt;
      else&lt;br /&gt;
        ulx[argurl2][&amp;quot;date&amp;quot;] = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
      end&lt;br /&gt;
      argtitle = &amp;quot;title&amp;quot; .. j&lt;br /&gt;
      if trimArg(args[argtitle]) then&lt;br /&gt;
        ulx[argurl2][&amp;quot;title&amp;quot;] = args[argtitle]&lt;br /&gt;
      else&lt;br /&gt;
        ulx[argurl2][&amp;quot;title&amp;quot;] = nil&lt;br /&gt;
      end&lt;br /&gt;
      j = j + 1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  if j == 2 then&lt;br /&gt;
    return 0&lt;br /&gt;
  else&lt;br /&gt;
    return j - 2&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; comma &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Given a date string, return &amp;quot;,&amp;quot; if it&amp;#039;s MDY &lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function comma(date)&lt;br /&gt;
  local N = mw.text.split(date, &amp;quot; &amp;quot;)&lt;br /&gt;
  local O = mw.text.split(N[1], &amp;quot;-&amp;quot;) -- for ISO&lt;br /&gt;
  if O[1] == &amp;quot;index&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
  if not tonumber(O[1]) then&lt;br /&gt;
    return &amp;quot;,&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return &amp;quot;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; createTracking &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Return data in track[] ie. tracking categories&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function createTracking()&lt;br /&gt;
&lt;br /&gt;
  local sand = &amp;quot;&amp;quot;&lt;br /&gt;
  if tableLength(track) &amp;gt; 0 then                        &lt;br /&gt;
    for key,_ in pairs(track) do&lt;br /&gt;
      sand = sand .. &amp;quot;[[&amp;quot; .. key .. &amp;quot;]]&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return sand&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; createRendering &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Return a rendering of the data in ulx[][]&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function createRendering()&lt;br /&gt;
&lt;br /&gt;
    local sand, displayheader, displayfield&lt;br /&gt;
&lt;br /&gt;
    local period1 = &amp;quot;&amp;quot;   -- For backwards compat with {{wayback}}&lt;br /&gt;
    local period2 = &amp;quot;.&amp;quot;                                                            &lt;br /&gt;
  &lt;br /&gt;
    local indexstr = &amp;quot;archived&amp;quot;&lt;br /&gt;
    if ulx.url1.date == &amp;quot;index&amp;quot; then&lt;br /&gt;
      indexstr = &amp;quot;archive&amp;quot;&lt;br /&gt;
    end  &lt;br /&gt;
                                                                                          -- For {{wayback}}, {{webcite}}&lt;br /&gt;
&lt;br /&gt;
    if ulx.url1.format == &amp;quot;none&amp;quot; then                                                     &lt;br /&gt;
      if not ulx.url1.title and not ulx.url1.date then                                    -- No title. No date&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; Archived]&amp;quot; .. ulx.url1.tail&lt;br /&gt;
      elseif not ulx.url1.title and ulx.url1.date then                                    -- No title. Date.&lt;br /&gt;
        if ulx.url1.service == &amp;quot;wayback&amp;quot; then &lt;br /&gt;
          period1 = &amp;quot;.&amp;quot;&lt;br /&gt;
          period2 = &amp;quot;&amp;quot; &lt;br /&gt;
        end&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; Archived] &amp;quot; .. ulx.url1.date .. comma(ulx.url1.date) .. ulx.url1.tail .. period1&lt;br /&gt;
      elseif ulx.url1.title and not ulx.url1.date then                                    -- Title. No date.&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; &amp;quot; .. ulx.url1.title .. &amp;quot;]&amp;quot; .. ulx.url1.tail&lt;br /&gt;
      elseif ulx.url1.title and ulx.url1.date then                                        -- Title. Date.&lt;br /&gt;
        sand = &amp;quot;[&amp;quot; .. ulx.url1.url .. &amp;quot; &amp;quot; .. ulx.url1.title .. &amp;quot;]&amp;quot; .. ulx.url1.tail .. &amp;quot;&amp;amp;#32;(&amp;quot; .. indexstr .. &amp;quot; &amp;quot; .. ulx.url1.date .. &amp;quot;)&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        return nil&lt;br /&gt;
      end&lt;br /&gt;
      if ulx.url1.extraurls &amp;gt; 0 then                                                      -- For multiple archive URLs&lt;br /&gt;
        local tot = ulx.url1.extraurls + 1&lt;br /&gt;
        sand = sand .. period2 .. &amp;quot; Additional archives: &amp;quot;&lt;br /&gt;
        for i=2,tot do&lt;br /&gt;
          local indx = &amp;quot;url&amp;quot; .. i&lt;br /&gt;
          if ulx[indx][&amp;quot;title&amp;quot;] then &lt;br /&gt;
            displayfield = &amp;quot;title&amp;quot;&lt;br /&gt;
          else&lt;br /&gt;
            displayfield = &amp;quot;date&amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
          sand = sand .. &amp;quot;[&amp;quot; .. ulx[indx][&amp;quot;url&amp;quot;] .. &amp;quot; &amp;quot; .. ulx[indx][displayfield] .. &amp;quot;]&amp;quot;&lt;br /&gt;
          if i == tot then&lt;br /&gt;
            sand = sand .. &amp;quot;.&amp;quot;&lt;br /&gt;
          else&lt;br /&gt;
            sand = sand .. &amp;quot;, &amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
      else&lt;br /&gt;
        return sand  &lt;br /&gt;
      end&lt;br /&gt;
      return sand&lt;br /&gt;
                                                                                          -- For {{cite archives}}&lt;br /&gt;
&lt;br /&gt;
    else                                                                  &lt;br /&gt;
      if ulx.url1.format == &amp;quot;addlarchives&amp;quot; then                           -- Multiple archive services &lt;br /&gt;
        displayheader = &amp;quot;Additional archives: &amp;quot;&lt;br /&gt;
      else                                                                -- Multiple pages from the same archive &lt;br /&gt;
        displayheader = &amp;quot;Additional pages archived&amp;amp;nbsp;on &amp;quot; .. ulx.url1.date .. &amp;quot;: &amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
      local tot = 1 + ulx.url1.extraurls&lt;br /&gt;
      local sand = displayheader&lt;br /&gt;
      for i=1,tot do&lt;br /&gt;
        local indx = &amp;quot;url&amp;quot; .. i&lt;br /&gt;
        displayfield = ulx[indx][&amp;quot;title&amp;quot;]&lt;br /&gt;
        if ulx.url1.format == &amp;quot;addlarchives&amp;quot; then&lt;br /&gt;
          if not displayfield then &lt;br /&gt;
            displayfield = ulx[indx][&amp;quot;date&amp;quot;]&lt;br /&gt;
          end&lt;br /&gt;
        else&lt;br /&gt;
          if not displayfield then &lt;br /&gt;
            displayfield = &amp;quot;Page &amp;quot; .. i&lt;br /&gt;
          end&lt;br /&gt;
        end&lt;br /&gt;
        sand = sand .. &amp;quot;[&amp;quot; .. ulx[indx][&amp;quot;url&amp;quot;] .. &amp;quot; &amp;quot; .. displayfield .. &amp;quot;]&amp;quot;&lt;br /&gt;
        if i == tot then&lt;br /&gt;
          sand = sand .. &amp;quot;.&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
          sand = sand .. &amp;quot;, &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      return sand&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.webarchive(frame)&lt;br /&gt;
  args = frame.args&lt;br /&gt;
  if (args[1]==nil) and (args[&amp;quot;url&amp;quot;]==nil) then           -- if no argument provided than check parent template/module args&lt;br /&gt;
    args = frame:getParent().args &lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  local tname = &amp;quot;Webarchive&amp;quot;                              -- name of calling template. Change if template rename.&lt;br /&gt;
  ulx = {}                                                -- Associative array to hold template data &lt;br /&gt;
  track = {}                                              -- Associative array to hold tracking categories&lt;br /&gt;
  maxurls = 10                                            -- Max number of URLs allowed. &lt;br /&gt;
  local verifydates = &amp;quot;yes&amp;quot;                               -- See documentation. Set &amp;quot;no&amp;quot; to disable.&lt;br /&gt;
&lt;br /&gt;
                                                          -- URL argument (first)&lt;br /&gt;
&lt;br /&gt;
  local url1 = trimArg(args.url) or trimArg(args.url1)           &lt;br /&gt;
  if not url1 then&lt;br /&gt;
    return inlineError(&amp;quot;url&amp;quot;, &amp;quot;Empty.&amp;quot;) .. createTracking()&lt;br /&gt;
  end&lt;br /&gt;
  if mw.ustring.find( url1, &amp;quot;https://web.http&amp;quot;, 1, plain ) then    -- track bug &lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
    return inlineError(&amp;quot;url&amp;quot;, &amp;quot;https://web.http&amp;quot;) .. createTracking()&lt;br /&gt;
  end &lt;br /&gt;
&lt;br /&gt;
  ulx.url1 = {}&lt;br /&gt;
  ulx.url1.url = url1&lt;br /&gt;
  local uri1 = mw.uri.new(ulx.url1.url)&lt;br /&gt;
  ulx.url1.host = uri1.host&lt;br /&gt;
  ulx.url1.extraurls = parseExtraArgs()&lt;br /&gt;
&lt;br /&gt;
                                                          -- Nolink argument &lt;br /&gt;
&lt;br /&gt;
  local nolink = trimArg2(args.nolink)&lt;br /&gt;
&lt;br /&gt;
  serviceName(uri1.host, nolink)&lt;br /&gt;
&lt;br /&gt;
                                                          -- Date argument&lt;br /&gt;
&lt;br /&gt;
  local date = trimArg(args.date) or trimArg(args.date1)&lt;br /&gt;
  if date == &amp;quot;*&amp;quot; and ulx.url1.service == &amp;quot;wayback&amp;quot; then&lt;br /&gt;
    date = &amp;quot;index&amp;quot;&lt;br /&gt;
  elseif date and ulx.url1.service == &amp;quot;wayback&amp;quot; and verifydates == &amp;quot;yes&amp;quot; then &lt;br /&gt;
    local ldf = dateFormat(date)&lt;br /&gt;
    if ldf then&lt;br /&gt;
      local udate = decodeWaybackDate( uri1.path, ldf )&lt;br /&gt;
      if udate ~= date then&lt;br /&gt;
        date = udate .. inlineRed(&amp;quot;&amp;lt;sup&amp;gt;[Date mismatch]&amp;lt;/sup&amp;gt;&amp;quot;, &amp;quot;warning&amp;quot;)       &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  elseif date and ulx.url1.service == &amp;quot;webcite&amp;quot; and verifydates == &amp;quot;yes&amp;quot; then &lt;br /&gt;
    local ldf = dateFormat(date)&lt;br /&gt;
    if ldf then&lt;br /&gt;
      local udate = decodeWebciteDate( uri1.path, ldf )&lt;br /&gt;
      if udate == &amp;quot;query&amp;quot; then -- skip&lt;br /&gt;
      elseif udate ~= date then&lt;br /&gt;
        date = udate .. inlineRed(&amp;quot;&amp;lt;sup&amp;gt;[Date mismatch]&amp;lt;/sup&amp;gt;&amp;quot;, &amp;quot;warning&amp;quot;)      &lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  elseif not date and ulx.url1.service == &amp;quot;wayback&amp;quot; then&lt;br /&gt;
    date = decodeWaybackDate( uri1.path, &amp;quot;iso&amp;quot; )&lt;br /&gt;
    if not date then &lt;br /&gt;
      date = inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;) &lt;br /&gt;
    end&lt;br /&gt;
  elseif not date and ulx.url1.service == &amp;quot;webcite&amp;quot; then&lt;br /&gt;
    date = decodeWebciteDate( uri1.path, &amp;quot;iso&amp;quot; )&lt;br /&gt;
    if date == &amp;quot;query&amp;quot; then&lt;br /&gt;
      date = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
    elseif not date then &lt;br /&gt;
      date = inlineRed(&amp;quot;[Date error] (1)&amp;quot;, &amp;quot;error&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
  elseif not date then&lt;br /&gt;
    date = inlineRed(&amp;quot;[Date missing]&amp;quot;, &amp;quot;warning&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  ulx.url1.date = date&lt;br /&gt;
&lt;br /&gt;
                                                          -- Format argument &lt;br /&gt;
&lt;br /&gt;
  local format = trimArg(args.format)&lt;br /&gt;
  if not format then&lt;br /&gt;
    format = &amp;quot;none&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    if format == &amp;quot;addlpages&amp;quot; then&lt;br /&gt;
      if not ulx.url1.date then&lt;br /&gt;
        format = &amp;quot;none&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    elseif format == &amp;quot;addlarchives&amp;quot; then&lt;br /&gt;
      format = &amp;quot;addlarchives&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      format = &amp;quot;none&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  ulx.url1.format = format&lt;br /&gt;
&lt;br /&gt;
                                                          -- Title argument &lt;br /&gt;
&lt;br /&gt;
  local title = trimArg(args.title) or trimArg(args.title1)&lt;br /&gt;
  ulx.url1.title = title&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  local rend = createRendering()&lt;br /&gt;
  if not rend then&lt;br /&gt;
    rend = &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;Error in [[:Template:&amp;#039; .. tname .. &amp;#039;]]: Unknown problem. Please report on template talk page.&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return rend .. createTracking()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Amc-admin</name></author>
	</entry>
</feed>