<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://en.battlestarwiki.org/Module:ArchiveLink/history?feed=atom</id>
	<title>Module:ArchiveLink - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://en.battlestarwiki.org/Module:ArchiveLink/history?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://en.battlestarwiki.org/Module:ArchiveLink/history"/>
	<updated>2026-04-11T23:09:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://en.battlestarwiki.org/w/index.php?title=Module:ArchiveLink&amp;diff=262102&amp;oldid=prev</id>
		<title>Joe Beaudoin Jr.: Created page with &quot;--[[ ================================================================================  Module:ArchiveLink  —  BattlestarWiki ArchiveLink extension ================================================================================   Public entry points  ({{#invoke:ArchiveLink|functionName|...}}):     linkStatus     inline status badge for a single URL    statusIcon     just the emoji icon, no label    sourcesLink    wikilink to the Sources: archive page    captureStatus...&quot;</title>
		<link rel="alternate" type="text/html" href="https://en.battlestarwiki.org/w/index.php?title=Module:ArchiveLink&amp;diff=262102&amp;oldid=prev"/>
		<updated>2026-04-10T19:15:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[[ ================================================================================  Module:ArchiveLink  —  BattlestarWiki ArchiveLink extension ================================================================================   Public entry points  ({{#invoke:ArchiveLink|functionName|...}}):     linkStatus     inline status badge for a single URL    statusIcon     just the emoji icon, no label    sourcesLink    wikilink to the Sources: archive page    captureStatus...&amp;quot;&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;
 Module:ArchiveLink  —  BattlestarWiki ArchiveLink extension&lt;br /&gt;
================================================================================&lt;br /&gt;
&lt;br /&gt;
 Public entry points  ({{#invoke:ArchiveLink|functionName|...}}):&lt;br /&gt;
&lt;br /&gt;
   linkStatus     inline status badge for a single URL&lt;br /&gt;
   statusIcon     just the emoji icon, no label&lt;br /&gt;
   sourcesLink    wikilink to the Sources: archive page&lt;br /&gt;
   captureStatus  &amp;quot;✅ Archived&amp;quot; / &amp;quot;❌ Not archived&amp;quot; indicator&lt;br /&gt;
   urlHealth      compact one-liner: icon + status + archive note&lt;br /&gt;
   linkTable      wikitable of all tracked URLs on a page&lt;br /&gt;
&lt;br /&gt;
 All reads go through the DB cache (mw.ext.ArchiveLink PHP bridge).&lt;br /&gt;
 No live HTTP checks happen at render time.&lt;br /&gt;
================================================================================&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local ArchiveLink = {}&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Bridge accessor&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
local function bridge()&lt;br /&gt;
	return mw.ext and mw.ext.ArchiveLink or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Constants&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
local ICON  = { live=&amp;#039;🟢&amp;#039;, dead=&amp;#039;🔴&amp;#039;, redirected=&amp;#039;🟡&amp;#039;, unknown=&amp;#039;⚪&amp;#039; }&lt;br /&gt;
local CLS   = { live=&amp;#039;archivelink-status--live&amp;#039;, dead=&amp;#039;archivelink-status--dead&amp;#039;,&lt;br /&gt;
                redirected=&amp;#039;archivelink-status--redirect&amp;#039;, unknown=&amp;#039;archivelink-status--unknown&amp;#039; }&lt;br /&gt;
local LABEL = { live=&amp;#039;Live&amp;#039;, dead=&amp;#039;Dead&amp;#039;, redirected=&amp;#039;Redirect&amp;#039;, unknown=&amp;#039;Unknown&amp;#039; }&lt;br /&gt;
local CICON = { live=&amp;#039;📦&amp;#039;, wayback=&amp;#039;📅&amp;#039; }&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- Helpers&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
local function trim(s)   return s and s:match(&amp;#039;^%s*(.-)%s*$&amp;#039;) or &amp;#039;&amp;#039; end&lt;br /&gt;
local function esc(s)&lt;br /&gt;
	s = tostring(s or &amp;#039;&amp;#039;)&lt;br /&gt;
	return s:gsub(&amp;#039;&amp;amp;&amp;#039;,&amp;#039;&amp;amp;amp;&amp;#039;):gsub(&amp;#039;&amp;lt;&amp;#039;,&amp;#039;&amp;amp;lt;&amp;#039;):gsub(&amp;#039;&amp;gt;&amp;#039;,&amp;#039;&amp;amp;gt;&amp;#039;)&lt;br /&gt;
		     :gsub(&amp;#039;%[%[&amp;#039;,&amp;#039;&amp;amp;#91;&amp;amp;#91;&amp;#039;):gsub(&amp;#039;{{&amp;#039;,&amp;#039;&amp;amp;#123;&amp;amp;#123;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function param(args, ...)&lt;br /&gt;
	for _,k in ipairs{...} do&lt;br /&gt;
		local v = trim(args[k] or &amp;#039;&amp;#039;)&lt;br /&gt;
		if v ~= &amp;#039;&amp;#039; then return v end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local MONTHS = {&amp;#039;January&amp;#039;,&amp;#039;February&amp;#039;,&amp;#039;March&amp;#039;,&amp;#039;April&amp;#039;,&amp;#039;May&amp;#039;,&amp;#039;June&amp;#039;,&lt;br /&gt;
                &amp;#039;July&amp;#039;,&amp;#039;August&amp;#039;,&amp;#039;September&amp;#039;,&amp;#039;October&amp;#039;,&amp;#039;November&amp;#039;,&amp;#039;December&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
local function fmtDate(ts)&lt;br /&gt;
	if not ts or ts == &amp;#039;&amp;#039; or ts == false then return &amp;#039;&amp;#039; end&lt;br /&gt;
	local y,m,d = tostring(ts):match(&amp;#039;^(%d%d%d%d)-(%d%d)-(%d%d)&amp;#039;)&lt;br /&gt;
	if not y then y,m,d = tostring(ts):match(&amp;#039;^(%d%d%d%d)(%d%d)(%d%d)&amp;#039;) end&lt;br /&gt;
	if not y then return tostring(ts) end&lt;br /&gt;
	return tostring(tonumber(d))..&amp;#039; &amp;#039;..(MONTHS[tonumber(m)] or m)..&amp;#039; &amp;#039;..y&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function srcLink(slug, label)&lt;br /&gt;
	if not slug or slug == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
	return &amp;#039;[[Sources:&amp;#039;..slug..&amp;#039;|&amp;#039;..(label or (&amp;#039;Sources:&amp;#039;..slug))..&amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getStatus(url)&lt;br /&gt;
	local b = bridge()&lt;br /&gt;
	if not b then return {status=&amp;#039;unknown&amp;#039;} end&lt;br /&gt;
	return b.getStatus(url) or {status=&amp;#039;unknown&amp;#039;}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getCapture(url)&lt;br /&gt;
	local b = bridge()&lt;br /&gt;
	if not b then return nil end&lt;br /&gt;
	return b.getCapture(url)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- 1. linkStatus&lt;br /&gt;
-- {{#invoke:ArchiveLink|linkStatus|url=...|label=...|noicon=1|nolink=1}}&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
function ArchiveLink.linkStatus(frame)&lt;br /&gt;
	local args    = (frame:getParent() and frame:getParent().args) or frame.args&lt;br /&gt;
	local url     = trim(args.url or args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	if url == &amp;#039;&amp;#039; then return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;ArchiveLink: no URL&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	local showIcon = not param(args,&amp;#039;noicon&amp;#039;)&lt;br /&gt;
	local showLink = not param(args,&amp;#039;nolink&amp;#039;)&lt;br /&gt;
	local custLbl  = param(args,&amp;#039;label&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local row    = getStatus(url)&lt;br /&gt;
	local status = row.status or &amp;#039;unknown&amp;#039;&lt;br /&gt;
	local icon   = ICON[status]  or &amp;#039;⚪&amp;#039;&lt;br /&gt;
	local cls    = CLS[status]   or CLS.unknown&lt;br /&gt;
	local lbl    = custLbl or LABEL[status] or status&lt;br /&gt;
&lt;br /&gt;
	local codeSfx = &amp;#039;&amp;#039;&lt;br /&gt;
	if row.http_code and row.http_code ~= false and row.http_code ~= 0 then&lt;br /&gt;
		codeSfx = &amp;#039;&amp;amp;#8201;&amp;lt;small&amp;gt;(&amp;#039;..tostring(row.http_code)..&amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local badge = &amp;#039;&amp;lt;span class=&amp;quot;archivelink-status-badge &amp;#039;..cls..&amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		..(showIcon and (icon..&amp;#039;&amp;amp;#8201;&amp;#039;) or &amp;#039;&amp;#039;)&lt;br /&gt;
		..esc(lbl)..codeSfx..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local note = &amp;#039;&amp;#039;&lt;br /&gt;
	if showLink then&lt;br /&gt;
		local cap = getCapture(url)&lt;br /&gt;
		if cap and cap.sources_page then&lt;br /&gt;
			local ci   = CICON[cap.capture_type] or &amp;#039;📦&amp;#039;&lt;br /&gt;
			local dt   = fmtDate(cap.captured_at or &amp;#039;&amp;#039;)&lt;br /&gt;
			local link = srcLink(cap.sources_page)&lt;br /&gt;
			note = &amp;#039; &amp;lt;span class=&amp;quot;archivelink-archived-note&amp;quot;&amp;gt;&amp;#039;..ci..&amp;#039;&amp;amp;#160;&amp;#039;..link&lt;br /&gt;
				..(dt~=&amp;#039;&amp;#039; and (&amp;#039; &amp;lt;small&amp;gt;(&amp;#039;..dt..&amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;) or &amp;#039;&amp;#039;)..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		elseif status == &amp;#039;dead&amp;#039; then&lt;br /&gt;
			if row.wayback_available then&lt;br /&gt;
				note = &amp;#039; &amp;lt;span class=&amp;quot;archivelink-wayback-note&amp;quot;&amp;gt;📅&amp;amp;#160;&amp;lt;small&amp;gt;available on Wayback&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				note = &amp;#039; &amp;lt;span class=&amp;quot;archivelink-unarchived-note&amp;quot;&amp;gt;&amp;lt;small&amp;gt;(not archived)&amp;lt;/small&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return frame:preprocess(badge..note)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- 2. statusIcon  — just the emoji&lt;br /&gt;
-- {{#invoke:ArchiveLink|statusIcon|url=...}}&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
function ArchiveLink.statusIcon(frame)&lt;br /&gt;
	local args = (frame:getParent() and frame:getParent().args) or frame.args&lt;br /&gt;
	local url  = trim(args.url or args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	if url == &amp;#039;&amp;#039; then return &amp;#039;⚪&amp;#039; end&lt;br /&gt;
	return ICON[getStatus(url).status] or &amp;#039;⚪&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- 3. sourcesLink  — wikilink to Sources: page&lt;br /&gt;
-- {{#invoke:ArchiveLink|sourcesLink|url=...|label=...}}&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
function ArchiveLink.sourcesLink(frame)&lt;br /&gt;
	local args  = (frame:getParent() and frame:getParent().args) or frame.args&lt;br /&gt;
	local url   = trim(args.url or args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	local label = param(args,&amp;#039;label&amp;#039;)&lt;br /&gt;
	if url == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
	local cap = getCapture(url)&lt;br /&gt;
	if not cap or not cap.sources_page then return &amp;#039;&amp;#039; end&lt;br /&gt;
	return frame:preprocess(srcLink(cap.sources_page, label))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- 4. captureStatus  — archived / not archived&lt;br /&gt;
-- {{#invoke:ArchiveLink|captureStatus|url=...}}&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
function ArchiveLink.captureStatus(frame)&lt;br /&gt;
	local args = (frame:getParent() and frame:getParent().args) or frame.args&lt;br /&gt;
	local url  = trim(args.url or args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	if url == &amp;#039;&amp;#039; then return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;ArchiveLink: no URL&amp;lt;/span&amp;gt;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	local cap = getCapture(url)&lt;br /&gt;
	if cap and cap.sources_page then&lt;br /&gt;
		local ci   = CICON[cap.capture_type] or &amp;#039;📦&amp;#039;&lt;br /&gt;
		local dt   = fmtDate(cap.captured_at or &amp;#039;&amp;#039;)&lt;br /&gt;
		local link = srcLink(cap.sources_page,&amp;#039;view&amp;#039;)&lt;br /&gt;
		local when = dt~=&amp;#039;&amp;#039; and (&amp;#039; &amp;#039;..dt) or &amp;#039;&amp;#039;&lt;br /&gt;
		return frame:preprocess(&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;archivelink-capture-status archivelink-capture-status--yes&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
			..&amp;#039;✅&amp;amp;#160;Archived&amp;#039;..when..&amp;#039;&amp;amp;#160;&amp;#039;..ci..&amp;#039;&amp;amp;#160;(&amp;#039;..link..&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		local row = getStatus(url)&lt;br /&gt;
		local wb  = row.wayback_available&lt;br /&gt;
			and &amp;#039;&amp;amp;#160;&amp;lt;small&amp;gt;(Wayback available)&amp;lt;/small&amp;gt;&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;archivelink-capture-status archivelink-capture-status--no&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
			..&amp;#039;❌&amp;amp;#160;Not archived&amp;#039;..wb..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- 5. urlHealth  — compact one-liner&lt;br /&gt;
-- {{#invoke:ArchiveLink|urlHealth|url=...}}&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
function ArchiveLink.urlHealth(frame)&lt;br /&gt;
	local args   = (frame:getParent() and frame:getParent().args) or frame.args&lt;br /&gt;
	local url    = trim(args.url or args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	if url == &amp;#039;&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	local row    = getStatus(url)&lt;br /&gt;
	local status = row.status or &amp;#039;unknown&amp;#039;&lt;br /&gt;
	local parts  = { (ICON[status] or &amp;#039;⚪&amp;#039;)..&amp;#039;&amp;amp;#160;&amp;#039;..(LABEL[status] or status) }&lt;br /&gt;
&lt;br /&gt;
	local cap = getCapture(url)&lt;br /&gt;
	if cap and cap.sources_page then&lt;br /&gt;
		local ci = CICON[cap.capture_type] or &amp;#039;📦&amp;#039;&lt;br /&gt;
		table.insert(parts, ci..&amp;#039;&amp;amp;#160;&amp;#039;..srcLink(cap.sources_page,&amp;#039;archived&amp;#039;))&lt;br /&gt;
	elseif status == &amp;#039;dead&amp;#039; or status == &amp;#039;unknown&amp;#039; then&lt;br /&gt;
		if row.wayback_available then&lt;br /&gt;
			table.insert(parts, &amp;#039;📅&amp;amp;#160;&amp;lt;small&amp;gt;Wayback available&amp;lt;/small&amp;gt;&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(parts, &amp;#039;&amp;lt;small&amp;gt;not archived&amp;lt;/small&amp;gt;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return frame:preprocess(&lt;br /&gt;
		&amp;#039;&amp;lt;span class=&amp;quot;archivelink-url-health&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		..table.concat(parts,&amp;#039;&amp;amp;#160;·&amp;amp;#160;&amp;#039;)..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
-- 6. linkTable  — full wikitable of all URLs on a page&lt;br /&gt;
-- {{#invoke:ArchiveLink|linkTable|page=...|compact=1|caption=...}}&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
function ArchiveLink.linkTable(frame)&lt;br /&gt;
	local args      = (frame:getParent() and frame:getParent().args) or frame.args&lt;br /&gt;
	local pageTitle = param(args,&amp;#039;page&amp;#039;) or mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
	local compact   = param(args,&amp;#039;compact&amp;#039;) ~= nil&lt;br /&gt;
	local caption   = param(args,&amp;#039;caption&amp;#039;) or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local b = bridge()&lt;br /&gt;
	if not b then&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;ArchiveLink extension not loaded&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local urls = b.getPageLinks(pageTitle)&lt;br /&gt;
	if not urls or #urls == 0 then&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;archivelink-table-empty&amp;quot;&amp;gt;No tracked external links on this page.&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Header&lt;br /&gt;
	local hdrs = compact&lt;br /&gt;
		and {&amp;#039;URL&amp;#039;,&amp;#039;Status&amp;#039;,&amp;#039;Archived&amp;#039;}&lt;br /&gt;
		or  {&amp;#039;URL&amp;#039;,&amp;#039;Status&amp;#039;,&amp;#039;Last checked&amp;#039;,&amp;#039;Archived&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
	local lines = {&lt;br /&gt;
		&amp;#039;{| class=&amp;quot;wikitable archivelink-link-table&amp;quot; style=&amp;quot;width:100%&amp;quot;&amp;#039;,&lt;br /&gt;
		caption~=&amp;#039;&amp;#039; and (&amp;#039;|+ &amp;#039;..esc(caption)) or nil,&lt;br /&gt;
		&amp;#039;|-&amp;#039;,&lt;br /&gt;
		&amp;#039;! &amp;#039;..table.concat(hdrs,&amp;#039; !! &amp;#039;),&lt;br /&gt;
	}&lt;br /&gt;
	-- remove nil&lt;br /&gt;
	local clean = {}&lt;br /&gt;
	for _,v in ipairs(lines) do if v then table.insert(clean,v) end end&lt;br /&gt;
	lines = clean&lt;br /&gt;
&lt;br /&gt;
	for _, url in ipairs(urls) do&lt;br /&gt;
		local row    = getStatus(url)&lt;br /&gt;
		local cap    = getCapture(url)&lt;br /&gt;
		local status = (row and row.status) or &amp;#039;unknown&amp;#039;&lt;br /&gt;
		local icon   = ICON[status]  or &amp;#039;⚪&amp;#039;&lt;br /&gt;
		local cls    = CLS[status]   or CLS.unknown&lt;br /&gt;
&lt;br /&gt;
		-- URL cell&lt;br /&gt;
		local disp = url&lt;br /&gt;
		if #disp &amp;gt; 70 then disp = disp:sub(1,67)..&amp;#039;…&amp;#039; end&lt;br /&gt;
		local urlCell = &amp;#039;[&amp;#039;..url..&amp;#039; &amp;lt;code&amp;gt;&amp;#039;..esc(disp)..&amp;#039;&amp;lt;/code&amp;gt;]&amp;#039;&lt;br /&gt;
&lt;br /&gt;
		-- Status cell&lt;br /&gt;
		local stCell = &amp;#039;&amp;lt;span class=&amp;quot;archivelink-status-badge &amp;#039;..cls..&amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
			..icon..&amp;#039;&amp;amp;#160;&amp;#039;..(LABEL[status] or status)..&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		if row and row.http_code and row.http_code ~= false then&lt;br /&gt;
			stCell = stCell..&amp;#039; &amp;lt;small&amp;gt;(&amp;#039;..tostring(row.http_code)..&amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Archived cell&lt;br /&gt;
		local archCell&lt;br /&gt;
		if cap and cap.sources_page then&lt;br /&gt;
			local ci = CICON[cap.capture_type] or &amp;#039;📦&amp;#039;&lt;br /&gt;
			local dt = fmtDate(cap.captured_at or &amp;#039;&amp;#039;)&lt;br /&gt;
			archCell = &amp;#039;✅&amp;amp;#160;&amp;#039;..ci..&amp;#039;&amp;amp;#160;&amp;#039;..srcLink(cap.sources_page)&lt;br /&gt;
				..(dt~=&amp;#039;&amp;#039; and (&amp;#039;&amp;lt;br&amp;gt;&amp;lt;small&amp;gt;&amp;#039;..dt..&amp;#039;&amp;lt;/small&amp;gt;&amp;#039;) or &amp;#039;&amp;#039;)&lt;br /&gt;
		elseif row and row.wayback_available then&lt;br /&gt;
			archCell = &amp;#039;📅&amp;amp;#160;&amp;lt;small&amp;gt;Wayback only&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			archCell = &amp;#039;❌&amp;amp;#160;&amp;lt;small&amp;gt;—&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Checked cell&lt;br /&gt;
		local chkCell = &amp;#039;&amp;#039;&lt;br /&gt;
		if not compact then&lt;br /&gt;
			if row and row.status_checked and row.status_checked ~= false then&lt;br /&gt;
				chkCell = &amp;#039;&amp;lt;small&amp;gt;&amp;#039;..fmtDate(row.status_checked)..&amp;#039;&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				chkCell = &amp;#039;&amp;lt;small&amp;gt;never&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local cells = compact&lt;br /&gt;
			and {urlCell, stCell, archCell}&lt;br /&gt;
			or  {urlCell, stCell, chkCell, archCell}&lt;br /&gt;
&lt;br /&gt;
		table.insert(lines, &amp;#039;|-&amp;#039;)&lt;br /&gt;
		table.insert(lines, &amp;#039;| &amp;#039;..table.concat(cells,&amp;#039; || &amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(lines, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	return frame:preprocess(table.concat(lines,&amp;#039;\n&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------------&lt;br /&gt;
return ArchiveLink&lt;/div&gt;</summary>
		<author><name>Joe Beaudoin Jr.</name></author>
	</entry>
</feed>