<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.vanguardgalaxy.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AShipCompare</id>
	<title>Module:ShipCompare - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.vanguardgalaxy.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AShipCompare"/>
	<link rel="alternate" type="text/html" href="https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;action=history"/>
	<updated>2026-08-23T12:56:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3908&amp;oldid=prev</id>
		<title>Dreadbyte: Add p.browse() - TabberNeue class browser organized by size, with sortable ship tables</title>
		<link rel="alternate" type="text/html" href="https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3908&amp;oldid=prev"/>
		<updated>2026-07-21T17:07:05Z</updated>

		<summary type="html">&lt;p&gt;Add p.browse() - TabberNeue class browser organized by size, with sortable ship tables&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:07, 21 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 406:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 406:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Public functions&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- Public functions&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- ============================================================&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;-- ============================================================&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--- TabberNeue class browser: all ships by size and class&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--- {{#invoke:ShipCompare|browse}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;function p.browse(frame)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local data = parseAllShips()&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if not data then&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		return &#039;&amp;lt;div class=&quot;error&quot;&amp;gt;Could not read [[Ship List]] page.&amp;lt;/div&amp;gt;&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local result = {}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	for si = 1, #sizeKeys do&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		local sizeKey = sizeKeys[si]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		table.insert(result, &#039;== &#039; .. sizeLabelsDisplay[si] .. &#039; ==&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		table.insert(result, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		table.insert(result, &#039;&amp;lt;tabber&amp;gt;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if data.bySize[sizeKey] then&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			for cn, ships in pairs(data.bySize[sizeKey]) do&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local ci = data.byClass[cn]&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local role = ci and ci.role or &#039;—&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;|-|&#039; .. cn .. &#039;=&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;{| class=&quot;wikitable sortable&quot; style=&quot;width:100%;&quot;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;|-&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Ship&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Manufacturer&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Hull&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Armor&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Shield&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Hardpoints&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Cargo&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Speed&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Accel&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Tonnage&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Aux&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Rep&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;! Level&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				for _, ship in ipairs(ships) do&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					local image = &#039;&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					if ship.image and ship.image ~= &#039;&#039; then&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;						image = &#039;&amp;lt;br&amp;gt;[[File:&#039; .. ship.image .. &#039;]]&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;|-&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| [[&#039; .. escapeName(ship.name) .. &#039;]]&#039; .. image)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.manufacturer)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.hull)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.armor)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.shield)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.hardpoints)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.cargo)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.speed)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.accel)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.tonnage)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.aux)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.shipyardRep)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(result, &#039;| &#039; .. ship.playerLevel)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(result, &#039;|}&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		table.insert(result, &#039;&amp;lt;/tabber&amp;gt;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		table.insert(result, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return table.concat(result, &#039;\n&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--- Compare 2+ ships side-by-side&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;--- Compare 2+ ships side-by-side&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dreadbyte</name></author>
	</entry>
	<entry>
		<id>https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3906&amp;oldid=prev</id>
		<title>Dreadbyte: Revert multi-line parser to line-by-line (the | split broke it); fix size section matching to use separate find() instead of alternation |</title>
		<link rel="alternate" type="text/html" href="https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3906&amp;oldid=prev"/>
		<updated>2026-07-21T17:02:14Z</updated>

		<summary type="html">&lt;p&gt;Revert multi-line parser to line-by-line (the | split broke it); fix size section matching to use separate find() instead of alternation |&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:02, 21 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 153:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 153:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			else&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			else&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Single&lt;/del&gt;-&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pipe&lt;/del&gt; format: &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cells&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;separated&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;by&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(space-pipe-space).&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Multi&lt;/ins&gt;-&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line&lt;/ins&gt; format: &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;each&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cell&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;on&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;its&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;own&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_7_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_2_0_rhs&quot;&gt;&lt;/a&gt;				for &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;each_line&lt;/ins&gt; in rowText:gmatch(&#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[^\n]+&lt;/ins&gt;&#039;) do&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- This handles multi-line cells where [[File:...]] and remaining&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					each_line = trim(each_line)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- pipe-separated values are on a different line from the ship name.&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					if each_line:find(&#039;^|&#039;) and not each_line:find(&#039;^|%+&#039;) and not each_line:find(&#039;^|}&#039;) then&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_2_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_7_0_lhs&quot;&gt;&lt;/a&gt;				for &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;part&lt;/del&gt; in &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(&lt;/del&gt;rowText&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; .. &#039; | &#039;)&lt;/del&gt;:gmatch(&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(.-) | &lt;/del&gt;&#039;) do&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;local part2&lt;/del&gt; = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;trim&lt;/del&gt;(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;part&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	each_line&lt;/ins&gt; = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;each_line:gsub&lt;/ins&gt;(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;^|&#039;, &#039;&#039;&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_12_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_9_0_rhs&quot;&gt;&lt;/a&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	&lt;/ins&gt;					table.insert(cells, trim(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;each_line&lt;/ins&gt;))&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					part2 = part2:gsub(&#039;^|&#039;, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_9_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_0_lhs&quot;&gt;&lt;/a&gt;					table.insert(cells, trim(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;part2&lt;/del&gt;))&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dreadbyte</name></author>
	</entry>
	<entry>
		<id>https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3905&amp;oldid=prev</id>
		<title>Dreadbyte: Fix: Lua 5.1 does not support alternation (|) in patterns — use separate find() calls for Small/Medium/Large Ships</title>
		<link rel="alternate" type="text/html" href="https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3905&amp;oldid=prev"/>
		<updated>2026-07-21T17:00:52Z</updated>

		<summary type="html">&lt;p&gt;Fix: Lua 5.1 does not support alternation (|) in patterns — use separate find() calls for Small/Medium/Large Ships&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:00, 21 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 221:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 221:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	for line in content:gmatch(&#039;[^\n]+&#039;) do&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	for line in content:gmatch(&#039;[^\n]+&#039;) do&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		line = trim(line)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		line = trim(line)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		local sizeMatch = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line:match(&#039;^==%s*(Small Ships|Medium Ships|Large Ships)%s*==$&#039;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		local sizeMatch = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;nil&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if line:find(&quot;^==%s*Small Ships%s*==$&quot;) then sizeMatch = &quot;Small Ships&quot;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		elseif line:find(&quot;^==%s*Medium Ships%s*==$&quot;) then sizeMatch = &quot;Medium Ships&quot;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		elseif line:find(&quot;^==%s*Large Ships%s*==$&quot;) then sizeMatch = &quot;Large Ships&quot;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if sizeMatch then&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if sizeMatch then&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if sizeMatch == &#039;Small Ships&#039; then currentSize = &#039;small&#039;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if sizeMatch == &#039;Small Ships&#039; then currentSize = &#039;small&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dreadbyte</name></author>
	</entry>
	<entry>
		<id>https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3904&amp;oldid=prev</id>
		<title>Dreadbyte: Fix multi-line parsing: split by &#039; | &#039; instead of line-by-line &#039;^|&#039; to handle File:... on separate lines</title>
		<link rel="alternate" type="text/html" href="https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3904&amp;oldid=prev"/>
		<updated>2026-07-21T16:58:33Z</updated>

		<summary type="html">&lt;p&gt;Fix multi-line parsing: split by &amp;#039; | &amp;#039; instead of line-by-line &amp;#039;^|&amp;#039; to handle &lt;a href=&quot;/index.php?title=File:...&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;File:... (page does not exist)&quot;&gt;File:...&lt;/a&gt; on separate lines&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:58, 21 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 69:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 69:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Remove {{beta}} templates&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Remove {{beta}} templates&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = cell:gsub(&#039;{{[^}]*}}&#039;, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = cell:gsub(&#039;{{[^}]*}}&#039;, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = cell:gsub(&#039;\n+&#039;, &#039; &#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = trim(cell)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = trim(cell)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return cell&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return cell&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 80:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 81:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = trim(cell)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = trim(cell)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Normalize newlines (from wikitext line breaks) to &amp;lt;br&amp;gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	cell = cell:gsub(&#039;\n+&#039;, &#039;&amp;lt;br&amp;gt;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local name = cell&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local name = cell&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local image = &#039;&#039;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local image = &#039;&#039;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 97:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 100:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	name = name:gsub(&#039;&amp;lt;br[^&amp;gt;]*&amp;gt;&#039;, &#039; &#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	name = trim(name)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	name = trim(name)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	name = name:gsub(&#039;&amp;lt;br[^&amp;gt;]*&amp;gt;$&#039;, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	name = name:gsub(&#039;&amp;lt;br[^&amp;gt;]*&amp;gt;$&#039;, &#039;&#039;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 149:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 153:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			else&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			else&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Multi&lt;/del&gt;-&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line&lt;/del&gt; format: &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;each&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cell&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;on&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;its&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;own&lt;/del&gt; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Single&lt;/ins&gt;-&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pipe&lt;/ins&gt; format: &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cells&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;separated&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;by&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&lt;/ins&gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(space-pipe-space).&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- This handles multi-line cells where [[File:...]] and remaining&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-left&quot; title=&quot;Paragraph was moved. Click to jump to new location.&quot; href=&quot;#movedpara_12_0_rhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_9_0_lhs&quot;&gt;&lt;/a&gt;				for &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line&lt;/del&gt; in rowText:gmatch(&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[^\n]+&lt;/del&gt;&#039;) do&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				-- pipe-separated values are on a different line from the ship name.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					line = trim(line)&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;a class=&quot;mw-diff-movedpara-right&quot; title=&quot;Paragraph was moved. Click to jump to old location.&quot; href=&quot;#movedpara_9_0_lhs&quot;&gt;&amp;#x26AB;&lt;/a&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;a name=&quot;movedpara_12_0_rhs&quot;&gt;&lt;/a&gt;				for &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;part&lt;/ins&gt; in &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(&lt;/ins&gt;rowText&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt; .. &#039; | &#039;)&lt;/ins&gt;:gmatch(&#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(.-) | &lt;/ins&gt;&#039;) do&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					if line:find(&#039;^|&#039;) and not line:find(&#039;^|%+&#039;) and not line:find(&#039;^|}&#039;) then&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	line&lt;/del&gt; = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;line:gsub&lt;/del&gt;(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;^|&#039;, &#039;&#039;&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;local part2&lt;/ins&gt; = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;trim&lt;/ins&gt;(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;part&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	table.insert&lt;/del&gt;(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;cells&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;trim(line)&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;part2 = part2:gsub&lt;/ins&gt;(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;^|&#039;&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;&#039;&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					table.insert(cells, trim(part2))&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;					end&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			end&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			&lt;/div&gt;&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-added&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if #cells &amp;gt;= 2 then&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if #cells &amp;gt;= 2 then&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local name, image = parseShipCell(cells[1])&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local name, image = parseShipCell(cells[1])&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Dreadbyte</name></author>
	</entry>
	<entry>
		<id>https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3901&amp;oldid=prev</id>
		<title>Dreadbyte: Created page with &quot;-- Module:ShipCompare -- Side-by-side ship comparison tool for Vanguard Galaxy Wiki -- -- Reads ship data directly from Ship List page — no separate data page needed. -- Ships added to the Ship List page automatically appear here. -- -- Usage: --   {{#invoke:ShipCompare|compare|Raptor|Zephyr}} --     Side-by-side comparison of 2+ ships -- --   {{#invoke:ShipCompare|class|Cutters}} --     Table of all ships in the &#039;Cutters&#039; class -- --   {{#invoke:ShipCompare|search...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.vanguardgalaxy.com/index.php?title=Module:ShipCompare&amp;diff=3901&amp;oldid=prev"/>
		<updated>2026-07-21T16:46:31Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- Module:ShipCompare -- Side-by-side ship comparison tool for Vanguard Galaxy Wiki -- -- Reads ship data directly from &lt;a href=&quot;/Ship_List&quot; title=&quot;Ship List&quot;&gt;Ship List&lt;/a&gt; page — no separate data page needed. -- Ships added to the Ship List page automatically appear here. -- -- Usage: --   {{#invoke:ShipCompare|compare|Raptor|Zephyr}} --     Side-by-side comparison of 2+ ships -- --   {{#invoke:ShipCompare|class|Cutters}} --     Table of all ships in the &amp;#039;Cutters&amp;#039; class -- --   {{#invoke:ShipCompare|search...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:ShipCompare&lt;br /&gt;
-- Side-by-side ship comparison tool for Vanguard Galaxy Wiki&lt;br /&gt;
--&lt;br /&gt;
-- Reads ship data directly from [[Ship List]] page — no separate data page needed.&lt;br /&gt;
-- Ships added to the Ship List page automatically appear here.&lt;br /&gt;
--&lt;br /&gt;
-- Usage:&lt;br /&gt;
--   {{#invoke:ShipCompare|compare|Raptor|Zephyr}}&lt;br /&gt;
--     Side-by-side comparison of 2+ ships&lt;br /&gt;
--&lt;br /&gt;
--   {{#invoke:ShipCompare|class|Cutters}}&lt;br /&gt;
--     Table of all ships in the &amp;#039;Cutters&amp;#039; class&lt;br /&gt;
--&lt;br /&gt;
--   {{#invoke:ShipCompare|search|Raptor}}&lt;br /&gt;
--     Search ships by partial name&lt;br /&gt;
--&lt;br /&gt;
--   {{#invoke:ShipCompare|stats}}&lt;br /&gt;
--     Database statistics&lt;br /&gt;
--&lt;br /&gt;
--   {{#invoke:ShipCompare|classes}}&lt;br /&gt;
--     List all classes with ship counts&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- Page reader — fetches and caches the Ship List page&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
local shipListPage = nil&lt;br /&gt;
&lt;br /&gt;
local function getShipListContent()&lt;br /&gt;
	if shipListPage then&lt;br /&gt;
		return shipListPage&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new(&amp;#039;Ship_List&amp;#039;)&lt;br /&gt;
	if not title then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local content = title:getContent()&lt;br /&gt;
	shipListPage = content&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- Wikitable parser — converts Ship List wikitext to Lua data&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
local sizeLabelsDisplay = { &amp;#039;Small Ships&amp;#039;, &amp;#039;Medium Ships&amp;#039;, &amp;#039;Large Ships&amp;#039; }&lt;br /&gt;
local sizeKeys = { &amp;#039;small&amp;#039;, &amp;#039;medium&amp;#039;, &amp;#039;large&amp;#039; }&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
	return mw.text.trim(s or &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Parse a wiki table cell value: strip links, HTML, whitespace&lt;br /&gt;
local function cleanCell(cell)&lt;br /&gt;
	cell = trim(cell)&lt;br /&gt;
	cell = cell:gsub(&amp;#039;^|&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	cell = trim(cell)&lt;br /&gt;
	-- Extract manufacturer name from [[Link]]&lt;br /&gt;
	cell = cell:gsub(&amp;#039;%[%[([^%[%]|]+)%|?[^%[%]]*%]%]&amp;#039;, function(name)&lt;br /&gt;
		return trim(name)&lt;br /&gt;
	end)&lt;br /&gt;
	-- Remove &amp;lt;span&amp;gt; tags but keep their text&lt;br /&gt;
	cell = cell:gsub(&amp;#039;&amp;lt;span[^&amp;gt;]*&amp;gt;&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	-- Remove &amp;lt;br&amp;gt; tags (replace with space)&lt;br /&gt;
	cell = cell:gsub(&amp;#039;&amp;lt;br[^&amp;gt;]*&amp;gt;&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
	-- Remove {{beta}} templates&lt;br /&gt;
	cell = cell:gsub(&amp;#039;{{[^}]*}}&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	cell = trim(cell)&lt;br /&gt;
	return cell&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Extract ship name and image filename from the first cell&lt;br /&gt;
--- Input: &amp;quot;| Raptor&amp;lt;br&amp;gt;[[File:Raptor.png|frameless|200px]]&amp;quot;&lt;br /&gt;
local function parseShipCell(cell)&lt;br /&gt;
	cell = trim(cell)&lt;br /&gt;
	cell = cell:gsub(&amp;#039;^|&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	cell = trim(cell)&lt;br /&gt;
	&lt;br /&gt;
	local name = cell&lt;br /&gt;
	local image = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Extract image [[File:...]]&lt;br /&gt;
	local imgStart, imgEnd = cell:find(&amp;#039;%[%[File:&amp;#039;)&lt;br /&gt;
	if imgStart then&lt;br /&gt;
		local afterFile = cell:sub(imgEnd + 1)&lt;br /&gt;
		local pipePos = afterFile:find(&amp;#039;|&amp;#039;)&lt;br /&gt;
		local closePos = afterFile:find(&amp;#039;]]&amp;#039;)&lt;br /&gt;
		if pipePos and (not closePos or pipePos &amp;lt; closePos) then&lt;br /&gt;
			image = afterFile:sub(1, pipePos - 1)&lt;br /&gt;
		elseif closePos then&lt;br /&gt;
			image = afterFile:sub(1, closePos - 1)&lt;br /&gt;
		end&lt;br /&gt;
		name = cell:sub(1, imgStart - 1)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	name = trim(name)&lt;br /&gt;
	name = name:gsub(&amp;#039;&amp;lt;br[^&amp;gt;]*&amp;gt;$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	name = name:gsub(&amp;#039;&amp;lt;span[^&amp;gt;]*&amp;gt;&amp;#039;, &amp;#039;&amp;#039;):gsub(&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	name = name:gsub(&amp;#039;{{[^}]*}}&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	name = trim(name)&lt;br /&gt;
	&lt;br /&gt;
	image = trim(image)&lt;br /&gt;
	if image ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		image = image .. &amp;#039;|frameless|200px&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return name, image&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Check if a row is a header row (contains ! cells)&lt;br /&gt;
local function isHeaderRow(rowText)&lt;br /&gt;
	for line in rowText:gmatch(&amp;#039;[^\n]+&amp;#039;) do&lt;br /&gt;
		line = trim(line)&lt;br /&gt;
		if line:find(&amp;#039;^!&amp;#039;) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Parse ship data rows from a sortable wikitable&lt;br /&gt;
--- @param tableText string — the content between {| and |} of a sortable table&lt;br /&gt;
--- @return table array of ship data records&lt;br /&gt;
local function parseShipTable(tableText)&lt;br /&gt;
	local ships = {}&lt;br /&gt;
	local rows = mw.text.split(tableText, &amp;#039;|%-&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	for ri = 1, #rows do&lt;br /&gt;
		local rowText = trim(rows[ri])&lt;br /&gt;
		if rowText == &amp;#039;&amp;#039; then&lt;br /&gt;
			-- skip&lt;br /&gt;
		elseif isHeaderRow(rowText) then&lt;br /&gt;
			-- skip header rows&lt;br /&gt;
		elseif rowText:find(&amp;#039;colspan&amp;#039;, 1, true) then&lt;br /&gt;
			-- skip colspan rows&lt;br /&gt;
		else&lt;br /&gt;
			local cells = {}&lt;br /&gt;
			&lt;br /&gt;
			if rowText:find(&amp;#039;||&amp;#039;) then&lt;br /&gt;
				-- Inline format: | cell1 || cell2 || cell3&lt;br /&gt;
				local parts = mw.text.split(rowText, &amp;#039;||&amp;#039;)&lt;br /&gt;
				for pi = 1, #parts do&lt;br /&gt;
					local part = trim(parts[pi])&lt;br /&gt;
					part = part:gsub(&amp;#039;^|&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
					table.insert(cells, trim(part))&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				-- Multi-line format: each | cell on its own line&lt;br /&gt;
				for line in rowText:gmatch(&amp;#039;[^\n]+&amp;#039;) do&lt;br /&gt;
					line = trim(line)&lt;br /&gt;
					if line:find(&amp;#039;^|&amp;#039;) and not line:find(&amp;#039;^|%+&amp;#039;) and not line:find(&amp;#039;^|}&amp;#039;) then&lt;br /&gt;
						line = line:gsub(&amp;#039;^|&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
						table.insert(cells, trim(line))&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if #cells &amp;gt;= 2 then&lt;br /&gt;
				local name, image = parseShipCell(cells[1])&lt;br /&gt;
				if name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					local ship = {&lt;br /&gt;
						name = name,&lt;br /&gt;
						image = image,&lt;br /&gt;
						manufacturer = cleanCell(cells[2] or &amp;#039;&amp;#039;),&lt;br /&gt;
						aux = cleanCell(cells[3] or &amp;#039;&amp;#039;),&lt;br /&gt;
						hull = cleanCell(cells[4] or &amp;#039;&amp;#039;),&lt;br /&gt;
						armor = cleanCell(cells[5] or &amp;#039;&amp;#039;),&lt;br /&gt;
						shield = cleanCell(cells[6] or &amp;#039;&amp;#039;),&lt;br /&gt;
						cargo = cleanCell(cells[7] or &amp;#039;&amp;#039;),&lt;br /&gt;
						speed = cleanCell(cells[8] or &amp;#039;&amp;#039;),&lt;br /&gt;
						accel = cleanCell(cells[9] or &amp;#039;&amp;#039;),&lt;br /&gt;
						hardpoints = cleanCell(cells[10] or &amp;#039;&amp;#039;),&lt;br /&gt;
						tonnage = cleanCell(cells[11] or &amp;#039;&amp;#039;),&lt;br /&gt;
						shipyardRep = cleanCell(cells[12] or &amp;#039;&amp;#039;),&lt;br /&gt;
						conquest = cleanCell(cells[13] or &amp;#039;&amp;#039;),&lt;br /&gt;
						playerLevel = cleanCell(cells[14] or &amp;#039;&amp;#039;),&lt;br /&gt;
						shipyardLevel = cleanCell(cells[15] or &amp;#039;&amp;#039;),&lt;br /&gt;
					}&lt;br /&gt;
					table.insert(ships, ship)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ships&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Determine role from class name&lt;br /&gt;
local function roleFromClass(className)&lt;br /&gt;
	if className:find(&amp;#039;Cutter&amp;#039;) or className:find(&amp;#039;Gunship&amp;#039;) or className:find(&amp;#039;Corvette&amp;#039;) or className:find(&amp;#039;Frigate&amp;#039;) or className:find(&amp;#039;Destroyer&amp;#039;) or className:find(&amp;#039;Battlecruiser&amp;#039;) then&lt;br /&gt;
		return &amp;#039;Combat&amp;#039;&lt;br /&gt;
	elseif className:find(&amp;#039;Mining&amp;#039;) or className:find(&amp;#039;Hewers&amp;#039;) or className:find(&amp;#039;Hewer&amp;#039;) or className:find(&amp;#039;Dredger&amp;#039;) or className:find(&amp;#039;Breaker&amp;#039;) or className:find(&amp;#039;Harvester&amp;#039;) or className:find(&amp;#039;Barge&amp;#039;) then&lt;br /&gt;
		return &amp;#039;Mining&amp;#039;&lt;br /&gt;
	elseif className:find(&amp;#039;Salvage&amp;#039;) or className:find(&amp;#039;Scow&amp;#039;) or className:find(&amp;#039;Scrapper&amp;#039;) or className:find(&amp;#039;Wrecker&amp;#039;) or className:find(&amp;#039;Reclaimer&amp;#039;) then&lt;br /&gt;
		return &amp;#039;Salvage&amp;#039;&lt;br /&gt;
	elseif className:find(&amp;#039;Courier&amp;#039;) or className:find(&amp;#039;Ferry&amp;#039;) or className:find(&amp;#039;Hauler&amp;#039;) or className:find(&amp;#039;Freighter&amp;#039;) or className:find(&amp;#039;Carrack&amp;#039;) or className:find(&amp;#039;Merchantman&amp;#039;) then&lt;br /&gt;
		return &amp;#039;Cargo&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;—&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Parse the entire Ship List page into ship data&lt;br /&gt;
--- TabberNeue uses |-|ClassName= syntax directly in wikitext (no &amp;lt;tabber&amp;gt; tags)&lt;br /&gt;
local function parseAllShips()&lt;br /&gt;
	local content = getShipListContent()&lt;br /&gt;
	if not content then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Split by size sections&lt;br /&gt;
	local bySize = {}&lt;br /&gt;
	local currentSize = nil&lt;br /&gt;
	&lt;br /&gt;
	for line in content:gmatch(&amp;#039;[^\n]+&amp;#039;) do&lt;br /&gt;
		line = trim(line)&lt;br /&gt;
		local sizeMatch = line:match(&amp;#039;^==%s*(Small Ships|Medium Ships|Large Ships)%s*==$&amp;#039;)&lt;br /&gt;
		if sizeMatch then&lt;br /&gt;
			if sizeMatch == &amp;#039;Small Ships&amp;#039; then currentSize = &amp;#039;small&amp;#039;&lt;br /&gt;
			elseif sizeMatch == &amp;#039;Medium Ships&amp;#039; then currentSize = &amp;#039;medium&amp;#039;&lt;br /&gt;
			elseif sizeMatch == &amp;#039;Large Ships&amp;#039; then currentSize = &amp;#039;large&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif currentSize then&lt;br /&gt;
			if not bySize[currentSize] then&lt;br /&gt;
				bySize[currentSize] = {}&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(bySize[currentSize], line)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {&lt;br /&gt;
		ships = {},&lt;br /&gt;
		byClass = {},&lt;br /&gt;
		classes = {},&lt;br /&gt;
		bySize = { small = {}, medium = {}, large = {} },&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for si = 1, #sizeKeys do&lt;br /&gt;
		local sizeKey = sizeKeys[si]&lt;br /&gt;
		if bySize[sizeKey] then&lt;br /&gt;
			local sectionText = table.concat(bySize[sizeKey], &amp;#039;\n&amp;#039;)&lt;br /&gt;
			&lt;br /&gt;
			-- TabberNeue uses |-|ClassName= for tabs&lt;br /&gt;
			-- Split by |-| to get individual tabs&lt;br /&gt;
			-- First part before any |-| is preamble (ignored)&lt;br /&gt;
			local tabs = mw.text.split(sectionText, &amp;#039;|%-|&amp;#039;)&lt;br /&gt;
			&lt;br /&gt;
			for ti = 1, #tabs do&lt;br /&gt;
				local tab = trim(tabs[ti])&lt;br /&gt;
				if tab ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					-- First line = ClassName= or ClassName=&amp;quot;description&amp;quot;&lt;br /&gt;
					local firstNewline = tab:find(&amp;#039;\n&amp;#039;)&lt;br /&gt;
					if firstNewline then&lt;br /&gt;
						local classNameLine = trim(tab:sub(1, firstNewline - 1))&lt;br /&gt;
						&lt;br /&gt;
						-- Remove trailing = and any description after it&lt;br /&gt;
						local eqPos = classNameLine:find(&amp;#039;=&amp;#039;)&lt;br /&gt;
						local className = &amp;#039;&amp;#039;&lt;br /&gt;
						if eqPos then&lt;br /&gt;
							className = trim(classNameLine:sub(1, eqPos - 1))&lt;br /&gt;
						else&lt;br /&gt;
							className = classNameLine&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						if className ~= &amp;#039;&amp;#039; then&lt;br /&gt;
							-- Find the sortable wikitable&lt;br /&gt;
							local tableStart = tab:find(&amp;#039;%{%| class=&amp;quot;wikitable sortable&amp;quot;&amp;#039;)&lt;br /&gt;
							if tableStart then&lt;br /&gt;
								local tableClose = tab:find(&amp;#039;\n%|}&amp;#039;, tableStart)&lt;br /&gt;
								if tableClose then&lt;br /&gt;
									local tableContent = tab:sub(tableStart, tableClose)&lt;br /&gt;
									local firstPipe = tableContent:find(&amp;#039;\n&amp;#039;)&lt;br /&gt;
									if firstPipe then&lt;br /&gt;
										tableContent = tableContent:sub(firstPipe + 1)&lt;br /&gt;
									end&lt;br /&gt;
									tableContent = tableContent:gsub(&amp;#039;\n%|}$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
									&lt;br /&gt;
									local ships = parseShipTable(tableContent)&lt;br /&gt;
									local role = roleFromClass(className)&lt;br /&gt;
									&lt;br /&gt;
									local classInfo = {&lt;br /&gt;
										name = className,&lt;br /&gt;
										sizeKey = sizeKey,&lt;br /&gt;
										sizeLabel = sizeLabelsDisplay[si],&lt;br /&gt;
										role = role,&lt;br /&gt;
										count = #ships,&lt;br /&gt;
									}&lt;br /&gt;
									table.insert(result.classes, classInfo)&lt;br /&gt;
									result.byClass[className] = classInfo&lt;br /&gt;
									&lt;br /&gt;
									if not result.bySize[sizeKey] then&lt;br /&gt;
										result.bySize[sizeKey] = {}&lt;br /&gt;
									end&lt;br /&gt;
									result.bySize[sizeKey][className] = ships&lt;br /&gt;
									&lt;br /&gt;
									for si2 = 1, #ships do&lt;br /&gt;
										local ship = ships[si2]&lt;br /&gt;
										ship.className = className&lt;br /&gt;
										ship.sizeKey = sizeKey&lt;br /&gt;
										table.insert(result.ships, ship)&lt;br /&gt;
									end&lt;br /&gt;
								end&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- Lookup helpers&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
local function findShip(name, data)&lt;br /&gt;
	local matches = {}&lt;br /&gt;
	for i = 1, #data.ships do&lt;br /&gt;
		local ship = data.ships[i]&lt;br /&gt;
		if ship.name:lower() == name:lower() then&lt;br /&gt;
			table.insert(matches, ship)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return matches&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function searchShips(partial, data)&lt;br /&gt;
	local seen = {}&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for i = 1, #data.ships do&lt;br /&gt;
		local ship = data.ships[i]&lt;br /&gt;
		if ship.name:lower():find(partial:lower(), 1, true) then&lt;br /&gt;
			if not seen[ship.name] then&lt;br /&gt;
				seen[ship.name] = true&lt;br /&gt;
				local ci = data.byClass[ship.className]&lt;br /&gt;
				table.insert(results, {&lt;br /&gt;
					name = ship.name,&lt;br /&gt;
					manufacturer = ship.manufacturer,&lt;br /&gt;
					class = ship.className,&lt;br /&gt;
					size = ci and ci.sizeLabel or &amp;#039;—&amp;#039;,&lt;br /&gt;
					role = ci and ci.role or &amp;#039;—&amp;#039;,&lt;br /&gt;
				})&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return results&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- Output helpers&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
local function escapeName(name)&lt;br /&gt;
	return name:gsub(&amp;#039;|&amp;#039;, &amp;#039;&amp;amp;#124;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function shipHeader(ship)&lt;br /&gt;
	local image = &amp;#039;&amp;#039;&lt;br /&gt;
	if ship.image and ship.image ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		image = &amp;#039;&amp;lt;br&amp;gt;[[File:&amp;#039; .. ship.image .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;! style=&amp;quot;min-width:180px; text-align:center;&amp;quot; | &amp;#039; .. escapeName(ship.name) .. image&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatVal(val)&lt;br /&gt;
	if val == &amp;#039;&amp;#039; or val == &amp;#039;—&amp;#039; or val == nil then&lt;br /&gt;
		return &amp;#039;—&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- Stat row definitions&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
local statRows = {&lt;br /&gt;
	{ key = &amp;#039;hull&amp;#039;,       label = &amp;#039;Hull HP&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;armor&amp;#039;,      label = &amp;#039;Armor HP&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;shield&amp;#039;,     label = &amp;#039;Shield HP&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;hardpoints&amp;#039;, label = &amp;#039;Hardpoints&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;cargo&amp;#039;,      label = &amp;#039;Cargo (m³)&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;speed&amp;#039;,      label = &amp;#039;Warp Speed (ls/s)&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;accel&amp;#039;,      label = &amp;#039;Warp Accel (ls/s²)&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;tonnage&amp;#039;,    label = &amp;#039;Tonnage&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;aux&amp;#039;,        label = &amp;#039;Auxiliary&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;manufacturer&amp;#039;, label = &amp;#039;Manufacturer&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;shipyardRep&amp;#039;,  label = &amp;#039;Shipyard Rep&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;conquest&amp;#039;,   label = &amp;#039;Conquest Rank&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;playerLevel&amp;#039;,  label = &amp;#039;Player Level&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;shipyardLevel&amp;#039;, label = &amp;#039;Shipyard Level&amp;#039; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- ============================================================&lt;br /&gt;
-- Public functions&lt;br /&gt;
-- ============================================================&lt;br /&gt;
&lt;br /&gt;
--- Compare 2+ ships side-by-side&lt;br /&gt;
--- {{#invoke:ShipCompare|compare|Ship1|Ship2|Ship3|...}}&lt;br /&gt;
function p.compare(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local shipNames = {}&lt;br /&gt;
	for i = 1, 20 do&lt;br /&gt;
		local arg = args[i]&lt;br /&gt;
		if arg and trim(arg) ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			table.insert(shipNames, trim(arg))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #shipNames &amp;lt; 2 then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;ShipCompare.compare needs at least 2 ship names.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = parseAllShips()&lt;br /&gt;
	if not data then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;Could not read [[Ship List]] page.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ships = {}&lt;br /&gt;
	local errors = {}&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #shipNames do&lt;br /&gt;
		local name = shipNames[i]&lt;br /&gt;
		local matches = findShip(name, data)&lt;br /&gt;
		if #matches == 0 then&lt;br /&gt;
			local suggestions = searchShips(name, data)&lt;br /&gt;
			local msg = &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. escapeName(name) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039; not found.&amp;quot;&lt;br /&gt;
			if #suggestions &amp;gt; 0 then&lt;br /&gt;
				local suggestList = {}&lt;br /&gt;
				for j = 1, #suggestions do&lt;br /&gt;
					table.insert(suggestList, &amp;quot;[[&amp;quot; .. suggestions[j].name .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				msg = msg .. &amp;quot; Did you mean: &amp;quot; .. table.concat(suggestList, &amp;quot;, &amp;quot;) .. &amp;quot;?&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(errors, msg)&lt;br /&gt;
		else&lt;br /&gt;
			local ship = matches[1]&lt;br /&gt;
			if #matches &amp;gt; 1 then&lt;br /&gt;
				ship._dupes = true&lt;br /&gt;
				ship._dupeCount = #matches&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(ships, ship)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #errors &amp;gt; 0 then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. table.concat(errors, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;) .. &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {}&lt;br /&gt;
	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable ship-compare&amp;quot; style=&amp;quot;margin:0; width:100%;&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #ships do&lt;br /&gt;
		table.insert(result, shipHeader(ships[i]))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for ri = 1, #statRows do&lt;br /&gt;
		local row = statRows[ri]&lt;br /&gt;
		table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
		table.insert(result, &amp;#039;! style=&amp;quot;text-align:left; min-width:140px;&amp;quot; | &amp;#039; .. row.label)&lt;br /&gt;
		for si = 1, #ships do&lt;br /&gt;
			table.insert(result, &amp;#039;| style=&amp;quot;text-align:center;&amp;quot; | &amp;#039; .. formatVal(ships[si][row.key]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! style=&amp;quot;text-align:left;&amp;quot; | Class&amp;#039;)&lt;br /&gt;
	for i = 1, #ships do&lt;br /&gt;
		table.insert(result, &amp;#039;| style=&amp;quot;text-align:center;&amp;quot; | [[&amp;#039; .. (ships[i].className or &amp;#039;—&amp;#039;) .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #ships do&lt;br /&gt;
		local ship = ships[i]&lt;br /&gt;
		if ship._dupes then&lt;br /&gt;
			table.insert(result, &amp;#039;&amp;lt;div style=&amp;quot;font-size:0.85em; color:#666; margin-top:4px;&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
			table.insert(result, &amp;quot;Note: &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. escapeName(ship.name) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039; has &amp;quot; .. ship._dupeCount .. &amp;quot; variants (different manufacturers). Showing the first match.&amp;quot;)&lt;br /&gt;
			table.insert(result, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Show all ships in a class&lt;br /&gt;
--- {{#invoke:ShipCompare|class|Cutters}}&lt;br /&gt;
function p.class(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local className = trim(args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if className == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;ShipCompare.class needs a class name.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = parseAllShips()&lt;br /&gt;
	if not data then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;Could not read [[Ship List]] page.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ships = {}&lt;br /&gt;
	for sizeKey, classes in pairs(data.bySize) do&lt;br /&gt;
		if classes[className] then&lt;br /&gt;
			ships = classes[className]&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #ships == 0 then&lt;br /&gt;
		for sizeKey, classes in pairs(data.bySize) do&lt;br /&gt;
			for cn, shipList in pairs(classes) do&lt;br /&gt;
				if cn:lower() == className:lower() then&lt;br /&gt;
					ships = shipList&lt;br /&gt;
					className = cn&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if #ships &amp;gt; 0 then break end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #ships == 0 then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;Class &amp;quot;&amp;#039; .. escapeName(className) .. &amp;#039;&amp;quot; not found.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {}&lt;br /&gt;
	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Ship&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Manufacturer&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Hull&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Armor&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Shield&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Hardpoints&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Cargo&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Speed&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Accel&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Tonnage&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Aux&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Rep&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Level&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #ships do&lt;br /&gt;
		local ship = ships[i]&lt;br /&gt;
		local image = &amp;#039;&amp;#039;&lt;br /&gt;
		if ship.image and ship.image ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			image = &amp;#039;&amp;lt;br&amp;gt;[[File:&amp;#039; .. ship.image .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. escapeName(ship.name) .. image)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.manufacturer)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.hull)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.armor)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.shield)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.hardpoints)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.cargo)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.speed)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.accel)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.tonnage)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.aux)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.shipyardRep)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. ship.playerLevel)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Search ships by name&lt;br /&gt;
--- {{#invoke:ShipCompare|search|Raptor}}&lt;br /&gt;
function p.search(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local partial = trim(args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if partial == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;ShipCompare.search needs a search term.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = parseAllShips()&lt;br /&gt;
	if not data then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;Could not read [[Ship List]] page.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local results = searchShips(partial, data)&lt;br /&gt;
	&lt;br /&gt;
	if #results == 0 then&lt;br /&gt;
		return &amp;quot;No ships matching &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. escapeName(partial) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039; found.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {}&lt;br /&gt;
	table.insert(result, &amp;quot;Ships matching &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. escapeName(partial) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Ship&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Manufacturer&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Class&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Size&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Role&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #results do&lt;br /&gt;
		local r = results[i]&lt;br /&gt;
		table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
		table.insert(result, &amp;#039;| [[&amp;#039; .. r.name .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. r.manufacturer)&lt;br /&gt;
		table.insert(result, &amp;#039;| [[&amp;#039; .. r.class .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. r.size)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. r.role)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Database statistics&lt;br /&gt;
--- {{#invoke:ShipCompare|stats}}&lt;br /&gt;
function p.stats(frame)&lt;br /&gt;
	local data = parseAllShips()&lt;br /&gt;
	if not data then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;Could not read [[Ship List]] page.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {}&lt;br /&gt;
	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:0;&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|+ Ship List Statistics&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Size Category&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Classes&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Ships&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local grandTotal = 0&lt;br /&gt;
	local grandClasses = 0&lt;br /&gt;
	&lt;br /&gt;
	for si = 1, #sizeKeys do&lt;br /&gt;
		local sizeKey = sizeKeys[si]&lt;br /&gt;
		local classCount = 0&lt;br /&gt;
		local shipCount = 0&lt;br /&gt;
		if data.bySize[sizeKey] then&lt;br /&gt;
			for cn, ships in pairs(data.bySize[sizeKey]) do&lt;br /&gt;
				classCount = classCount + 1&lt;br /&gt;
				shipCount = shipCount + #ships&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
		table.insert(result, &amp;#039;| &amp;#039; .. sizeLabelsDisplay[si])&lt;br /&gt;
		table.insert(result, &amp;#039;| style=&amp;quot;text-align:center;&amp;quot; | &amp;#039; .. classCount)&lt;br /&gt;
		table.insert(result, &amp;#039;| style=&amp;quot;text-align:center;&amp;quot; | &amp;#039; .. shipCount)&lt;br /&gt;
		&lt;br /&gt;
		grandTotal = grandTotal + shipCount&lt;br /&gt;
		grandClasses = grandClasses + classCount&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Total&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! &amp;#039; .. grandClasses)&lt;br /&gt;
	table.insert(result, &amp;#039;! &amp;#039; .. grandTotal)&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- List all classes&lt;br /&gt;
--- {{#invoke:ShipCompare|classes}}&lt;br /&gt;
function p.classes(frame)&lt;br /&gt;
	local data = parseAllShips()&lt;br /&gt;
	if not data then&lt;br /&gt;
		return &amp;#039;&amp;lt;div class=&amp;quot;error&amp;quot;&amp;gt;Could not read [[Ship List]] page.&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {}&lt;br /&gt;
	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Size&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Class&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Role&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! Ships&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	for si = 1, #sizeKeys do&lt;br /&gt;
		local sizeKey = sizeKeys[si]&lt;br /&gt;
		if data.bySize[sizeKey] then&lt;br /&gt;
			for cn, ships in pairs(data.bySize[sizeKey]) do&lt;br /&gt;
				local ci = data.byClass[cn]&lt;br /&gt;
				local role = ci and ci.role or &amp;#039;—&amp;#039;&lt;br /&gt;
				table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
				table.insert(result, &amp;#039;| &amp;#039; .. sizeLabelsDisplay[si])&lt;br /&gt;
				table.insert(result, &amp;#039;| [[&amp;#039; .. cn .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
				table.insert(result, &amp;#039;| &amp;#039; .. role)&lt;br /&gt;
				table.insert(result, &amp;#039;| style=&amp;quot;text-align:center;&amp;quot; | &amp;#039; .. #ships)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Dreadbyte</name></author>
	</entry>
</feed>