模块:Infobox

来自滚动的天空Wiki
跳到导航 跳到搜索
文档图示 模块文档[查看] [编辑] [历史] [清除缓存]

本模块用于执行{{Infobox}}模板,请到模板页阅读具体用法。

上述文档内容嵌入自模块:Infobox/doc编辑 | 历史
编者可以在本模块的沙盒创建 | 镜像和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
local p = {}

-- local navbar = require('Module:Navbar')._navbar
-- 本模板'''暂时'''不使用navbar

local function union(t1, t2)
    -- Returns the union of the values of two tables, as a sequence.
    -- 返回两个表的交集,作为序列。
    local vals = {}
    for k, v in pairs(t1) do
        vals[v] = true
    end
    for k, v in pairs(t2) do
        vals[v] = true
    end
    local ret = {}
    for k, v in pairs(vals) do
        table.insert(ret, k)
    end
    return ret
end

local function getArgNums(args, prefix)
    -- Returns a table containing the numbers of the arguments that exist
    -- for the specified prefix. For example, if the prefix was 'data', and
    -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
    -- 返回带有一定前缀的参数序列。
    local nums = {}
    for k, v in pairs(args) do
        local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
        if num then table.insert(nums, tonumber(num)) end
    end
    table.sort(nums)
    return nums
end

local function renderImages(args, root)
    
end

local function renderRows(args, root)
    -- Gets the union of the header and data argument numbers,
    -- and renders them all in order using addRow.
    -- 获得header和data变量数字的交集,然后使用addRow渲染它们。
    
end

function p._infobox(args)
    -- Specify the overall layout of the infobox, with special settings
    -- if the infobox is used as a 'child' inside another infobox.
    
    local introduction_content = args['content']
    local isEmpty = introduction_content==nil or introduction_content==''
    local root = mw.html.create(isEmpty and '' or 'div')
    
        :addClass('newstyle-infobox')
        :addClass(args.bodyclass)
        
        if args.subbox == 'yes' then
            root
            	:addClass 'infobox-subbox'
        else
            root
            	:addClass 'infobox-non-subbox'
        end
    root
        :cssText(args.bodystyle)
    
    -- renderImages(args, root) 
    if args.image then
        args.image1 = args.image
    end
    if args.caption then
        args.caption1 = args.caption
    end
    local cell = root
    	:tag 'div'
    	:addClass 'newstyle-infobox-image-cell'
    local imagenums = getArgNums(args, 'image')
    for k, num in ipairs(imagenums) do
        local caption = args['caption' .. tostring(num)]
        local data = cell
        	:tag'div'
        	:addClass'newstyle-infobox-image'
        	:wikitext(args['image' .. tostring(num)])
        if caption then
            data
                :tag('div')
                	:addClass 'newstyle-infobox-caption'
                    :cssText(args.captionstyle)
                    :wikitext(caption)
        end
    end
    root:done()
    
    -- renderRows(args, root)
    local rownums = union(getArgNums(args, 'header'), getArgNums(args, 'data'))
    table.sort(rownums)
    local content = root -- 图片侧边的内容栏,包含信息和介绍
    	:tag 'div'
    		:addClass 'newstyle-infobox-content'
    		
    if args.title then
    	local title_cell = content
    		:tag 'div'
    			:addClass 'newstyle-infobox-title'
    			:wikitext (args.title)
    end
    		
    if #rownums > 0 then
	    local rows = content
	    	:tag 'div'
	    		:addClass 'newstyle-infobox-rows'
				:css('column-width',args['column-width'])
		
	    for k, num in ipairs(rownums) do
	        local header = args['header' .. tostring(num)]
	        local headerstyle = (args.headerstyle or '') .. (args.headerstyle and ';' or '') .. (args['header' .. tostring(num) .. 'style'] or '')
	        local label = args['label' .. tostring(num)]
	        local labelstyle = (args.labelstyle or '') .. (args.labelstyle and ';' or '') .. (args['label' .. tostring(num) .. 'style'] or '')
	        local data = args['data' .. tostring(num)]
	        local datastyle = (args.datastyle or '') .. (args.datastyle and ';' or '') .. (args['data' .. tostring(num) .. 'style'] or '')
	        local class = args['class' .. tostring(num)]
	        local rowclass = args['rowclass' .. tostring(num)]
	        local dataid = args['dataid' .. tostring(num)]
	        local labelid = args['labelid' .. tostring(num)]
	        local headerid = args['headerid' .. tostring(num)]
	        local rowid = args['rowid' .. tostring(num)]
	        local row = rows:tag 'div'
	        	:addClass 'newstyle-infobox-row'
	        if header then
		        row
	            	:addClass 'newstyle-infobox-header-row'
	                :attr('id', headerid or rowid)
	                :addClass(class):addClass(rowclass)
	                :addClass(args.headerclass)
	                :cssText(headerstyle)
	                :wikitext(header)
	                :done()
		    elseif data then
		        row
		        	:addClass 'newstyle-infobox-data-row'
		        	:addClass(rowclass)
		        	:cssText(rowstyle)
		        	:attr('id', rowid)
		        if label then
		            row
		                :tag('div')
		                	:addClass 'newstyle-infobox-label'
		                    :attr('scope', 'row')
		                    :attr('id', labelid)
		                    :cssText(labelstyle)
		                    :wikitext(label)
		                    :done()
		        end
		        
		        local dataCell = row:tag 'div'
		        	:addClass 'newstyle-infobox-data'
		        if not label then 
		            dataCell
		                :addClass 'data-without-label'
		        end
		        dataCell
		            :attr('id', dataid)
		            :addClass(class)
		            :cssText(datastyle)
		            :newline()
		            :wikitext(data)
		    end
	    end
    
    end
    
    -- 渲染主体介绍
    -- local introduction_content = args['content'] -- 这句话放到前面去写。
    if introduction_content then
    	if not introduction_content:match'^\n' then
    		introduction_content = '\n' .. introduction_content
    	end
    	if not introduction_content:match'\n$' then
    		introduction_content = introduction_content .. '\n'
    	end
	    local introduction = content
	    	:tag 'div'
	    		:addClass 'newstyle-infobox-introduction hantsect'
    			:wikitext(introduction_content)
    			
    end
    
    return tostring(root)
end
 
function p.infobox(frame)
    -- 为了方便,假设这里的都是从#invoke传递过来的参数。
    -- if frame == mw.getCurrentFrame() then
    origArgs = frame:getParent().args
    -- else
    --    origArgs = frame
    -- end
    
    local args = {}
    
    for k,v in pairs(origArgs) do
    	local v = mw.text.trim(v)
    	if v and v~= '' then args[k] = v end
    end
    
    return p._infobox(args)
end
 
return p