<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://chunghwamc.com/wiki/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E7%B5%84%3A%E6%BB%BF%E6%84%8FDocsUtils</id>
	<title>模組:滿意DocsUtils - 修訂紀錄</title>
	<link rel="self" type="application/atom+xml" href="https://chunghwamc.com/wiki/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E7%B5%84%3A%E6%BB%BF%E6%84%8FDocsUtils"/>
	<link rel="alternate" type="text/html" href="https://chunghwamc.com/wiki/index.php?title=%E6%A8%A1%E7%B5%84:%E6%BB%BF%E6%84%8FDocsUtils&amp;action=history"/>
	<updated>2026-04-05T19:37:32Z</updated>
	<subtitle>本 wiki 上此頁面的修訂紀錄</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://chunghwamc.com/wiki/index.php?title=%E6%A8%A1%E7%B5%84:%E6%BB%BF%E6%84%8FDocsUtils&amp;diff=894&amp;oldid=prev</id>
		<title>Chunghwamc：​建立內容為「itemsJSON = mw.loadJsonData(&#039;滿意工廠模板:DocsItems.json&#039;) buildingsJSON = mw.loadJsonData(&#039;滿意工廠模板:DocsBuildings.json&#039;) recipesJSON = mw.loadJsonData(&#039;滿意工廠模板:DocsRecipes.json&#039;)  -- Used for localization, used in infoboxes, recipe tables, and other templates if needed. loc = {     units = {         sec = &quot;&amp;nbsp;sec&quot;,         m = &quot;&amp;nbsp;m&quot;,         m2 = &quot;&amp;nbsp;m&lt;sup&gt;2&lt;/sup&gt;&quot;,         m3 = &quot;&amp;nbsp;m&lt;sup&gt;3&lt;/sup&gt;&quot;,         pmin = &quot; /&amp;…」的新頁面</title>
		<link rel="alternate" type="text/html" href="https://chunghwamc.com/wiki/index.php?title=%E6%A8%A1%E7%B5%84:%E6%BB%BF%E6%84%8FDocsUtils&amp;diff=894&amp;oldid=prev"/>
		<updated>2024-10-18T12:31:33Z</updated>

		<summary type="html">&lt;p&gt;建立內容為「itemsJSON = mw.loadJsonData(&amp;#039;滿意工廠模板:DocsItems.json&amp;#039;) buildingsJSON = mw.loadJsonData(&amp;#039;滿意工廠模板:DocsBuildings.json&amp;#039;) recipesJSON = mw.loadJsonData(&amp;#039;滿意工廠模板:DocsRecipes.json&amp;#039;)  -- Used for localization, used in infoboxes, recipe tables, and other templates if needed. loc = {     units = {         sec = &amp;quot; sec&amp;quot;,         m = &amp;quot; m&amp;quot;,         m2 = &amp;quot; m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;quot;,         m3 = &amp;quot; m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;quot;,         pmin = &amp;quot; /&amp;amp;…」的新頁面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新頁面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;itemsJSON = mw.loadJsonData(&amp;#039;滿意工廠模板:DocsItems.json&amp;#039;)&lt;br /&gt;
buildingsJSON = mw.loadJsonData(&amp;#039;滿意工廠模板:DocsBuildings.json&amp;#039;)&lt;br /&gt;
recipesJSON = mw.loadJsonData(&amp;#039;滿意工廠模板:DocsRecipes.json&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Used for localization, used in infoboxes, recipe tables, and other templates if needed.&lt;br /&gt;
loc = {&lt;br /&gt;
    units = {&lt;br /&gt;
        sec = &amp;quot;&amp;amp;nbsp;sec&amp;quot;,&lt;br /&gt;
        m = &amp;quot;&amp;amp;nbsp;m&amp;quot;,&lt;br /&gt;
        m2 = &amp;quot;&amp;amp;nbsp;m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&amp;quot;,&lt;br /&gt;
        m3 = &amp;quot;&amp;amp;nbsp;m&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt;&amp;quot;,&lt;br /&gt;
        pmin = &amp;quot; /&amp;amp;nbsp;min&amp;quot;,&lt;br /&gt;
        mj = &amp;quot;&amp;amp;nbsp;MJ&amp;quot;,&lt;br /&gt;
        mw = &amp;quot;&amp;amp;nbsp;MW&amp;quot;,&lt;br /&gt;
        kmh = &amp;quot;&amp;amp;nbsp;km/h&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    numbers = {&lt;br /&gt;
        decimalsep = &amp;quot;.&amp;quot;,&lt;br /&gt;
        thousandsep = &amp;quot;,&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    branches = {&lt;br /&gt;
        stable = &amp;quot;Stable&amp;quot;,&lt;br /&gt;
        experimental = &amp;quot;Experimental&amp;quot;,&lt;br /&gt;
        ficsmas = &amp;quot;FICSMAS&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    filePage = &amp;quot;File:&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Get the length of an array, because Lua&amp;#039;s built-in length function does not work for JSON data.&lt;br /&gt;
-- - T - table&lt;br /&gt;
function arrayLength(T)&lt;br /&gt;
	local l = 0&lt;br /&gt;
	for _ in pairs(T) do l = l+1 end&lt;br /&gt;
	return l&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format a number (thousands separator, decimal separator)&lt;br /&gt;
-- - n - number - number to format&lt;br /&gt;
function formatNumber(n)&lt;br /&gt;
    local integerPart, decimalPart = string.format(&amp;quot;%.5f&amp;quot;, n):match(&amp;quot;([^%.]+)%.?(.*)&amp;quot;)&lt;br /&gt;
    decimalPart = decimalPart:gsub(&amp;quot;0*$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    local returnValue = ((string.reverse(integerPart):gsub(&amp;quot;(%d%d%d)&amp;quot;, &amp;quot;%1&amp;quot; .. loc.numbers.thousandsep):reverse():gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)) .. (#decimalPart &amp;gt; 0 and loc.numbers.decimalsep .. decimalPart or &amp;quot;&amp;quot;)):gsub(&amp;quot;^,*(.-),*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
    return returnValue&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Retrieve the same parameter from provided stable and experimental items, returns a table with both values&lt;br /&gt;
-- - parameter - string - parameter name to retrieve&lt;br /&gt;
-- - stableItem - table - stable item to retrieve the parameter from&lt;br /&gt;
-- - experimentalItem - table - experimental item to retrieve the parameter from&lt;br /&gt;
function getBranchValues(parameter, stableItem, experimentalItem)&lt;br /&gt;
    return {stable = stableItem ~= nil and stableItem[parameter] or nil, experimental = experimentalItem ~= nil and experimentalItem[parameter] or nil}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format the differences between both branches using {{EA}}/{{EX}} templates&lt;br /&gt;
-- - values - table - table with both values&lt;br /&gt;
-- - singleBranch - boolean - if true and the value is only in one branch, it will be formatted with {{EA}}/{{EX}}, otherwise it will not&lt;br /&gt;
-- - nowiki - boolean - if true, each value is wrapped in &amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
function formatBranchDiff(values, singleBranch, nowiki)&lt;br /&gt;
    local branchValues = {}&lt;br /&gt;
    branchValues.stable = values.stable&lt;br /&gt;
    branchValues.experimental = values.experimental&lt;br /&gt;
    if (not branchValues.stable or branchValues.stable == 0) and (not branchValues.experimental or branchValues.experimental == 0) then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if type(branchValues.stable) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        branchValues.stable = formatNumber(branchValues.stable)&lt;br /&gt;
    end&lt;br /&gt;
    if type(branchValues.experimental) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        branchValues.experimental = formatNumber(branchValues.experimental)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if nowiki then&lt;br /&gt;
        if branchValues.stable then&lt;br /&gt;
            branchValues.stable = &amp;quot;&amp;lt;nowiki&amp;gt;&amp;quot; .. branchValues.stable .. &amp;quot;&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if branchValues.experimental then&lt;br /&gt;
            branchValues.experimental = &amp;quot;&amp;lt;nowiki&amp;gt;&amp;quot; .. branchValues.experimental .. &amp;quot;&amp;lt;/nowiki&amp;gt;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if branchValues.stable == branchValues.experimental then&lt;br /&gt;
        return branchValues.stable&lt;br /&gt;
    elseif branchValues.stable ~= nil and branchValues.experimental == nil then&lt;br /&gt;
        return singleBranch and (&amp;quot;{{EA|&amp;quot; .. branchValues.stable .. &amp;quot;}}&amp;quot;) or branchValues.stable&lt;br /&gt;
    elseif branchValues.stable == nil and branchValues.experimental ~= nil then&lt;br /&gt;
        return singleBranch and (&amp;quot;{{EX|&amp;quot; .. branchValues.experimental .. &amp;quot;}}&amp;quot;) or branchValues.experimental&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;quot;{{EA|&amp;quot; .. branchValues.stable .. &amp;quot;}} ({{EX|&amp;quot; .. branchValues.experimental .. &amp;quot;}})&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Resolve a className to a name for both branches&lt;br /&gt;
-- - className - string - className to resolve&lt;br /&gt;
-- - fileJSON - table - JSON file to search in&lt;br /&gt;
function getNameFromClassName(className, fileJSON)&lt;br /&gt;
    local result = {}&lt;br /&gt;
    if fileJSON[className] ~= nil then&lt;br /&gt;
        for _, it in pairs(fileJSON[className]) do&lt;br /&gt;
            if it.stable then&lt;br /&gt;
                result.stable = it.name&lt;br /&gt;
            end&lt;br /&gt;
            if it.experimental then&lt;br /&gt;
                result.experimental = it.name&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get object data from a file from the classname for both branches&lt;br /&gt;
-- - className - string - className to resolve&lt;br /&gt;
-- - fileJSON - table - JSON file to search in&lt;br /&gt;
function getObjectFromClassName(className, fileJSON)&lt;br /&gt;
    local result = {}&lt;br /&gt;
    if fileJSON[className] ~= nil then&lt;br /&gt;
        for _, it in pairs(fileJSON[className]) do&lt;br /&gt;
            if it.stable then&lt;br /&gt;
                result.stable = it&lt;br /&gt;
            end&lt;br /&gt;
            if it.experimental then&lt;br /&gt;
                result.experimental = it&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get a link (EA&amp;gt;EX) and name (branchDiff formatted) for a target&lt;br /&gt;
-- - target - string - className to resolve&lt;br /&gt;
-- - stable - boolean - whether to use stable branch name&lt;br /&gt;
-- - experimental - boolean - whether to use experimental branch name&lt;br /&gt;
-- - singleBranch - boolean - whether to format the name with {{EA}}/{{EX}} if available only on one branch&lt;br /&gt;
function getLinkAndName(target, stable, experimental, singleBranch)&lt;br /&gt;
    local targetNames&lt;br /&gt;
    local targetLink&lt;br /&gt;
    local targetName&lt;br /&gt;
    -- resolve item or building name&lt;br /&gt;
    targetNames = getNameFromClassName(target, itemsJSON)&lt;br /&gt;
    if targetNames.stable == nil and targetNames.stable == nil then&lt;br /&gt;
        targetNames = getNameFromClassName(target, buildingsJSON)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if stable and experimental then&lt;br /&gt;
        targetName = formatBranchDiff(targetNames, singleBranch)&lt;br /&gt;
    else&lt;br /&gt;
        targetName = experimental and targetNames.experimental or targetNames.stable&lt;br /&gt;
        targetName = singleBranch and (&amp;quot;{{&amp;quot; .. (experimental and &amp;quot;EX&amp;quot; or &amp;quot;EA&amp;quot;) .. &amp;quot;|&amp;quot; .. targetName .. &amp;quot;}}&amp;quot;) or targetName&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    targetLink = targetNames.stable ~= nil and targetNames.stable or targetNames.experimental&lt;br /&gt;
    -- should never occur&lt;br /&gt;
    if targetName == nil or targetLink == nil then&lt;br /&gt;
        targetName = target&lt;br /&gt;
        targetLink = target&lt;br /&gt;
    end&lt;br /&gt;
    return targetLink, targetName&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Generate an ItemLink for a target&lt;br /&gt;
-- - target - string - className to resolve&lt;br /&gt;
-- - stable - boolean - whether to use stable branch name&lt;br /&gt;
-- - experimental - boolean - whether to use experimental branch name&lt;br /&gt;
-- - singleBranch - boolean - whether to format the name with {{EA}}/{{EX}} if available only on one branch&lt;br /&gt;
function generateItemLink(className, stable, experimental, singleBranch)&lt;br /&gt;
	local itemLink, itemName = getLinkAndName(className, stable, experimental, singleBranch)&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{title=&amp;quot;ItemLink&amp;quot;, args={itemLink, itemName}}&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Chunghwamc</name></author>
	</entry>
</feed>