<?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%3AMining</id>
	<title>Module:Mining - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://edfieldmanual.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AMining"/>
	<link rel="alternate" type="text/html" href="https://edfieldmanual.com/index.php?title=Module:Mining&amp;action=history"/>
	<updated>2026-08-25T12:27:23Z</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:Mining&amp;diff=1625&amp;oldid=prev</id>
		<title>Sythan: Build Mining data architecture and draft reference foundation</title>
		<link rel="alternate" type="text/html" href="https://edfieldmanual.com/index.php?title=Module:Mining&amp;diff=1625&amp;oldid=prev"/>
		<updated>2026-08-23T23:49:29Z</updated>

		<summary type="html">&lt;p&gt;Build Mining data architecture and draft reference foundation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:Mining&lt;br /&gt;
-- Generated reference helpers for the EDFM Mining section.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function loadData(title)&lt;br /&gt;
	local ok, data = pcall(mw.loadData, title)&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 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 esc(value)&lt;br /&gt;
	return mw.text.nowiki(tostring(value or &amp;#039;&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link(page, label)&lt;br /&gt;
	if not isNonEmpty(page) then return &amp;#039;&amp;#039; end&lt;br /&gt;
	label = label or page&lt;br /&gt;
	if page == label then return &amp;#039;[[&amp;#039; .. page .. &amp;#039;]]&amp;#039; end&lt;br /&gt;
	return &amp;#039;[[&amp;#039; .. page .. &amp;#039;|&amp;#039; .. label .. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function listLinks(values)&lt;br /&gt;
	if type(values) ~= &amp;#039;table&amp;#039; or #values == 0 then return &amp;#039;—&amp;#039; end&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, value in ipairs(values) do&lt;br /&gt;
		if isNonEmpty(value) then table.insert(out, link(value)) end&lt;br /&gt;
	end&lt;br /&gt;
	if #out == 0 then return &amp;#039;—&amp;#039; end&lt;br /&gt;
	return table.concat(out, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function plainList(values)&lt;br /&gt;
	if type(values) ~= &amp;#039;table&amp;#039; or #values == 0 then return &amp;#039;—&amp;#039; end&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, value in ipairs(values) do&lt;br /&gt;
		if isNonEmpty(value) then table.insert(out, esc(value)) end&lt;br /&gt;
	end&lt;br /&gt;
	if #out == 0 then return &amp;#039;—&amp;#039; end&lt;br /&gt;
	return table.concat(out, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function startTable(headers)&lt;br /&gt;
	local out = { &amp;#039;{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&amp;#039; }&lt;br /&gt;
	local row = {}&lt;br /&gt;
	for _, header in ipairs(headers) do&lt;br /&gt;
		table.insert(row, &amp;#039;! &amp;#039; .. header)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(out, table.concat(row, &amp;#039;\n&amp;#039;))&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.methodsTable()&lt;br /&gt;
	local records = loadData(&amp;#039;Module:Data/Mining/Methods&amp;#039;)&lt;br /&gt;
	local out = startTable({ &amp;#039;Method&amp;#039;, &amp;#039;What it does&amp;#039;, &amp;#039;Primary equipment&amp;#039;, &amp;#039;Location cue&amp;#039;, &amp;#039;Field Procedures&amp;#039; })&lt;br /&gt;
	for _, record in ipairs(records) do&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; .. esc(record.label or record.page) .. &amp;#039;&amp;quot; | &amp;#039; .. link(record.page, record.label))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.summary))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. listLinks(record.primary_equipment))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.location_notes or &amp;#039;&amp;#039;))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. listLinks(record.field_procedures))&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;
function p.equipmentTable()&lt;br /&gt;
	local records = loadData(&amp;#039;Module:Data/Mining/Equipment&amp;#039;)&lt;br /&gt;
	local out = startTable({ &amp;#039;Equipment&amp;#039;, &amp;#039;Group&amp;#039;, &amp;#039;Slot / mount&amp;#039;, &amp;#039;Mining role&amp;#039;, &amp;#039;Methods&amp;#039; })&lt;br /&gt;
	for _, record in ipairs(records) do&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; .. esc(record.page) .. &amp;#039;&amp;quot; | &amp;#039; .. link(record.page))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.group))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.slot or record.mounts or &amp;#039;&amp;#039;))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.role))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. listLinks(record.methods))&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;
function p.locationConcepts()&lt;br /&gt;
	local records = loadData(&amp;#039;Module:Data/Mining/Locations&amp;#039;)&lt;br /&gt;
	local out = startTable({ &amp;#039;Concept&amp;#039;, &amp;#039;Use in mining&amp;#039;, &amp;#039;Working notes&amp;#039; })&lt;br /&gt;
	for _, record in ipairs(records) do&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; .. esc(record.label or record.page) .. &amp;#039;&amp;quot; | &amp;#039; .. link(record.page, record.label))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.role))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.notes))&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;
function p.commodityConcepts()&lt;br /&gt;
	local records = loadData(&amp;#039;Module:Data/Mining/Commodities&amp;#039;)&lt;br /&gt;
	local out = startTable({ &amp;#039;Planning group&amp;#039;, &amp;#039;Examples&amp;#039;, &amp;#039;How it is used&amp;#039;, &amp;#039;Notes&amp;#039; })&lt;br /&gt;
	for _, record in ipairs(records) do&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; .. esc(record.label) .. &amp;#039;&amp;quot; | &amp;#039; .. esc(record.label))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. plainList(record.examples))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.source))&lt;br /&gt;
		table.insert(out, &amp;#039;| &amp;#039; .. esc(record.notes))&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;
function p.sourceNotes()&lt;br /&gt;
	local data = loadData(&amp;#039;Module:Data/Mining/Sources&amp;#039;)&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for _, source in ipairs(data.sources or {}) do&lt;br /&gt;
		local label = esc(source.label)&lt;br /&gt;
		if isNonEmpty(source.url) then&lt;br /&gt;
			label = &amp;#039;[&amp;#039; .. source.url .. &amp;#039; &amp;#039; .. label .. &amp;#039;]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(out, &amp;#039;* &amp;#039; .. label .. &amp;#039; — &amp;#039; .. esc(source.note))&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(out, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.equipmentNote(frame)&lt;br /&gt;
	local args = frame:getParent() and frame:getParent().args or frame.args&lt;br /&gt;
	local page = args.page or mw.title.getCurrentTitle().text&lt;br /&gt;
	for _, record in ipairs(loadData(&amp;#039;Module:Data/Mining/Equipment&amp;#039;)) do&lt;br /&gt;
		if record.page == page then&lt;br /&gt;
			local out = {}&lt;br /&gt;
			table.insert(out, &amp;#039;; Mining role&amp;#039;)&lt;br /&gt;
			table.insert(out, &amp;#039;: &amp;#039; .. esc(record.role))&lt;br /&gt;
			table.insert(out, &amp;#039;; Used by&amp;#039;)&lt;br /&gt;
			table.insert(out, &amp;#039;: &amp;#039; .. listLinks(record.methods))&lt;br /&gt;
			if isNonEmpty(record.notes) then&lt;br /&gt;
				table.insert(out, &amp;#039;; Notes&amp;#039;)&lt;br /&gt;
				table.insert(out, &amp;#039;: &amp;#039; .. esc(record.notes))&lt;br /&gt;
			end&lt;br /&gt;
			return table.concat(out, &amp;#039;\n&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;&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>