<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3ABar</id>
	<title>Module:Bar - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Module%3ABar"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:Bar&amp;action=history"/>
	<updated>2026-06-25T22:21:12Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Module:Bar&amp;diff=2131447&amp;oldid=prev</id>
		<title>imported&gt;SolidBlock：​对模块进行优化：在循环中不应该连接字符串；cellpadding属性不符合标准；需要添加role=&quot;presentation&quot;才符合语义避免辅助技术识别其为表格</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Module:Bar&amp;diff=2131447&amp;oldid=prev"/>
		<updated>2023-09-06T04:08:29Z</updated>

		<summary type="html">&lt;p&gt;对模块进行优化：在循环中不应该连接字符串；cellpadding属性不符合标准；需要添加role=&amp;quot;presentation&amp;quot;才符合语义避免辅助技术识别其为表格&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local inner = {}&lt;br /&gt;
&lt;br /&gt;
--##########&lt;br /&gt;
--## Public functions&lt;br /&gt;
--##########&lt;br /&gt;
--- Render a bar chart.&lt;br /&gt;
-- @param frame The arguments passed to the script. See docs on renderFromLua.&lt;br /&gt;
function p.format( frame )&lt;br /&gt;
    -- extract args&lt;br /&gt;
    local width = frame.args[&amp;#039;width&amp;#039;]&lt;br /&gt;
    local barCSS = frame.args[&amp;#039;barCSS&amp;#039;]&lt;br /&gt;
    local zeroWidth = frame.args[&amp;#039;zeroWidth&amp;#039;]&lt;br /&gt;
    local total = frame.args[&amp;#039;total&amp;#039;]&lt;br /&gt;
    &lt;br /&gt;
    -- extract bar series from arguments like &amp;#039;value,color,title&amp;#039;&lt;br /&gt;
    local series = {}&lt;br /&gt;
    for key, spec in ipairs(frame.args) do&lt;br /&gt;
        spec = mw.text.split(spec, &amp;#039;,&amp;#039;)&lt;br /&gt;
        local data = {value = tonumber(spec[1] or 0), color = spec[2] or &amp;#039;#CCC&amp;#039;, title = spec[3] or &amp;#039;&amp;#039;}&lt;br /&gt;
        if data[&amp;#039;value&amp;#039;] &amp;gt; 0 then&lt;br /&gt;
            table.insert(series, data)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return p.renderFromLua(series, total, width, barCSS, zeroWidth)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Render a bar chart from Lua.&lt;br /&gt;
-- @param series A table representing the bars to render, consisting of a sequence of tables like {value = 14, color = &amp;#039;#CCC&amp;#039;, title = &amp;#039;tooltip text&amp;#039;}.&lt;br /&gt;
-- @param total (optional) The total number of values represented by all bar series.&lt;br /&gt;
-- @param width (optional) The CSS width of the bar.&lt;br /&gt;
-- @param barCss (optional) Additional CSS to apply to the rendered bar table.&lt;br /&gt;
-- @param zeroWidth (optional) &lt;br /&gt;
function p.renderFromLua(series, total, width, barCSS, zeroWidth)&lt;br /&gt;
    -- parse arguments&lt;br /&gt;
    width = width or &amp;#039;100%&amp;#039;&lt;br /&gt;
    total = tonumber(total or 0)&lt;br /&gt;
    zeroWidth = zeroWidth or &amp;#039;1px&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
    -- calculate total&lt;br /&gt;
    local seriesTotal = 0&lt;br /&gt;
    for k,v in ipairs(series) do&lt;br /&gt;
       seriesTotal = seriesTotal + v[&amp;#039;value&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
    if total &amp;lt; seriesTotal then&lt;br /&gt;
       total = seriesTotal&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- inject empty series for uncharted values&lt;br /&gt;
    if(seriesTotal &amp;lt; total) then&lt;br /&gt;
        table.insert(series, {value = total - seriesTotal, color = &amp;#039;transparent&amp;#039;, title = &amp;#039;&amp;#039;})&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- inject ratios&lt;br /&gt;
    for k,v in ipairs(series) do&lt;br /&gt;
       v[&amp;#039;total&amp;#039;] = total&lt;br /&gt;
       v[&amp;#039;ratio&amp;#039;] = inner.getRatio(v[&amp;#039;value&amp;#039;], total)&lt;br /&gt;
       if v[&amp;#039;ratio&amp;#039;] == 0 then&lt;br /&gt;
           v[&amp;#039;width&amp;#039;] = zeroWidth&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- render&lt;br /&gt;
    result = mw.html.create &amp;#039;table&amp;#039;&lt;br /&gt;
    	:attr(&amp;#039;role&amp;#039;, &amp;#039;presentation&amp;#039;)&lt;br /&gt;
    	:css(&amp;#039;width&amp;#039;, width)&lt;br /&gt;
    	:cssText(barCSS)&lt;br /&gt;
    	:css(&amp;#039;border-spacing&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
    	:tag &amp;#039;tr&amp;#039;&lt;br /&gt;
    for k, v in pairs(series) do&lt;br /&gt;
        result:node(inner.renderSeries(v))&lt;br /&gt;
    end&lt;br /&gt;
    return result:allDone()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--##########&lt;br /&gt;
--## Private functions&lt;br /&gt;
--##########&lt;br /&gt;
--- Render an individual bar series.&lt;br /&gt;
-- @param series The bar series to render.&lt;br /&gt;
function inner.renderSeries(series)&lt;br /&gt;
    -- ignore empty series&lt;br /&gt;
    if not series.value or series.value == 0 then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- set width&lt;br /&gt;
    local width = series.width&lt;br /&gt;
    if not(width) then&lt;br /&gt;
        width = series.ratio .. &amp;#039;%&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- format&lt;br /&gt;
    return mw.html.create &amp;#039;td&amp;#039;&lt;br /&gt;
    	:attr(&amp;#039;title&amp;#039;, series.title)&lt;br /&gt;
    	:css(&amp;#039;width&amp;#039;, width)&lt;br /&gt;
    	:css(&amp;#039;background&amp;#039;, series.color)&lt;br /&gt;
    	:attr(&amp;#039;data-value&amp;#039;, series.value)&lt;br /&gt;
    	:css(&amp;#039;height&amp;#039;, &amp;#039;1em&amp;#039;)&lt;br /&gt;
    	:css(&amp;#039;padding&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Get the percentage ratio of two numbers as a decimal value.&lt;br /&gt;
-- @param value The number of items in the subset.&lt;br /&gt;
-- @param total The total number of items in the set.&lt;br /&gt;
function inner.getRatio(value, total)&lt;br /&gt;
    if(total == 0) then&lt;br /&gt;
       error(&amp;#039;the total for a series cannot be zero&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    return math.floor(value / total * 10000) / 100&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;SolidBlock</name></author>
	</entry>
</feed>