<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://edfieldmanual.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AShipModules</id>
	<title>Module:ShipModules - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://edfieldmanual.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AShipModules"/>
	<link rel="alternate" type="text/html" href="https://edfieldmanual.com/index.php?title=Module:ShipModules&amp;action=history"/>
	<updated>2026-08-25T09:56:28Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://edfieldmanual.com/index.php?title=Module:ShipModules&amp;diff=2126&amp;oldid=prev</id>
		<title>Sythan: Fix Ship Modules directory row expansion</title>
		<link rel="alternate" type="text/html" href="https://edfieldmanual.com/index.php?title=Module:ShipModules&amp;diff=2126&amp;oldid=prev"/>
		<updated>2026-08-24T22:20:31Z</updated>

		<summary type="html">&lt;p&gt;Fix Ship Modules directory row expansion&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&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 22:20, 24 August 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l90&quot;&gt;Line 90:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 90:&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 record = loadRecord(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;		local record = loadRecord(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;		table.insert(out, &amp;#039;|-&amp;#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;		table.insert(out, &amp;#039;|-&amp;#039;)&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;		table.insert(out, &#039;| data-sort-value=&quot;&#039; .. name:gsub(&#039;&quot;&#039;, &#039;&amp;amp;quot;&#039;) .. &#039;&quot; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;| {{Ship module table entry&lt;/del&gt;|&#039; .. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;name .. &#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 entry = frame:expandTemplate {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			title = &#039;Ship module table entry&#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-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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			args = { [1] = name }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;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;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;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(out, &#039;| data-sort-value=&quot;&#039; .. name:gsub(&#039;&quot;&#039;, &#039;&amp;amp;quot;&#039;) .. &#039;&quot; | &#039; .. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;entry&lt;/ins&gt;)&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;		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.module_class))&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;		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.module_class))&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;		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.slot_type))&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;		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.slot_type))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sythan</name></author>
	</entry>
	<entry>
		<id>https://edfieldmanual.com/index.php?title=Module:ShipModules&amp;diff=1218&amp;oldid=prev</id>
		<title>Sythan: Create ship module structured stub framework</title>
		<link rel="alternate" type="text/html" href="https://edfieldmanual.com/index.php?title=Module:ShipModules&amp;diff=1218&amp;oldid=prev"/>
		<updated>2026-08-20T23:58:45Z</updated>

		<summary type="html">&lt;p&gt;Create ship module structured stub framework&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:ShipModules&lt;br /&gt;
-- Structured ship module helpers.&lt;br /&gt;
-- Canonical ship module stub data lives in Module:Data/ShipModules/&amp;lt;Name&amp;gt;.&lt;br /&gt;
-- These pages are intentionally skeletal until module facts are filled.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local FIELD_ORDER = {&lt;br /&gt;
	{ key = &amp;#039;module_class&amp;#039;, label = &amp;#039;Module class&amp;#039;, group = &amp;#039;MODULE&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;slot_type&amp;#039;, label = &amp;#039;Slot type&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;mount&amp;#039;, label = &amp;#039;Mount&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;manufacturer&amp;#039;, label = &amp;#039;Manufacturer&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;availability&amp;#039;, label = &amp;#039;Availability&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;engineering&amp;#039;, label = &amp;#039;Engineering&amp;#039; },&lt;br /&gt;
	{ key = &amp;#039;related_modules&amp;#039;, label = &amp;#039;Related modules&amp;#039; },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function isNonEmpty(value)&lt;br /&gt;
	return value ~= nil and value ~= &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dataTitleFor(name)&lt;br /&gt;
	return &amp;#039;Module:Data/ShipModules/&amp;#039; .. name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function loadRecord(name)&lt;br /&gt;
	local ok, data = pcall(mw.loadData, dataTitleFor(name))&lt;br /&gt;
	if ok and type(data) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		return data&lt;br /&gt;
	end&lt;br /&gt;
	return { name = name }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function loadIndex()&lt;br /&gt;
	local ok, data = pcall(mw.loadData, &amp;#039;Module:Data/ShipModules/index&amp;#039;)&lt;br /&gt;
	if ok and type(data) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		return data&lt;br /&gt;
	end&lt;br /&gt;
	return {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function fmt(value)&lt;br /&gt;
	if not isNonEmpty(value) then&lt;br /&gt;
		return &amp;#039;—&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if type(value) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		if #value == 0 then return &amp;#039;—&amp;#039; end&lt;br /&gt;
		return table.concat(value, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.infobox(frame)&lt;br /&gt;
	local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	local name = args.name or title.text&lt;br /&gt;
	local record = loadRecord(name)&lt;br /&gt;
	local fields = {}&lt;br /&gt;
	for _, f in ipairs(FIELD_ORDER) do&lt;br /&gt;
		fields[f.key] = record[f.key]&lt;br /&gt;
		if isNonEmpty(args[f.key]) then&lt;br /&gt;
			fields[f.key] = args[f.key]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local params = {&lt;br /&gt;
		name = name,&lt;br /&gt;
		image = args.image or record.image or &amp;#039;&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
	local row = 1&lt;br /&gt;
	for _, f in ipairs(FIELD_ORDER) do&lt;br /&gt;
		if isNonEmpty(fields[f.key]) then&lt;br /&gt;
			if f.group then params[&amp;#039;group&amp;#039; .. row] = f.group end&lt;br /&gt;
			params[&amp;#039;label&amp;#039; .. row] = f.label&lt;br /&gt;
			params[&amp;#039;row&amp;#039; .. row] = fmt(fields[f.key])&lt;br /&gt;
			row = row + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:expandTemplate{ title = &amp;#039;Infobox&amp;#039;, args = params }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.directory(frame)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	table.insert(out, &amp;#039;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(out, &amp;#039;! style=&amp;quot;width:28%;&amp;quot; | Module&amp;#039;)&lt;br /&gt;
	table.insert(out, &amp;#039;! style=&amp;quot;width:18%;&amp;quot; | Module class&amp;#039;)&lt;br /&gt;
	table.insert(out, &amp;#039;! style=&amp;quot;width:18%;&amp;quot; | Slot type&amp;#039;)&lt;br /&gt;
	table.insert(out, &amp;#039;! style=&amp;quot;width:18%;&amp;quot; | Mount&amp;#039;)&lt;br /&gt;
	table.insert(out, &amp;#039;! style=&amp;quot;width:18%;&amp;quot; | Status&amp;#039;)&lt;br /&gt;
	for _, name in ipairs(loadIndex()) do&lt;br /&gt;
		local record = loadRecord(name)&lt;br /&gt;
		table.insert(out, &amp;#039;|-&amp;#039;)&lt;br /&gt;
		table.insert(out, &amp;#039;| data-sort-value=&amp;quot;&amp;#039; .. name:gsub(&amp;#039;&amp;quot;&amp;#039;, &amp;#039;&amp;amp;quot;&amp;#039;) .. &amp;#039;&amp;quot; | {{Ship module table entry|&amp;#039; .. name .. &amp;#039;}}&amp;#039;)&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.module_class))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.slot_type))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. fmt(record.mount))&lt;br /&gt;
		table.insert(out, &amp;#039;| Structured stub&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(out, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	return table.concat(out, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sythan</name></author>
	</entry>
</feed>