From WikiChip
Module:supercomputer

Documentation for this module may be created at Module:supercomputer/doc

local p = {}
local origArgs

function p.add_file_prefix(str)
  if string.match(string.lower(str), '^file:') then
    return str
  else
    return 'File:' .. str
  end
end

function p.add_separator(box, title)
  box:tag('tr')
           :tag('td')
           :attr('class', 'header')
           :attr('colspan', '2')
           :wikitext(title)
end

function p.add_entry(value, right)
  local e = mw.html.create('tr')
  e:tag('td')
    :attr('class', 'label')
    :wikitext(value)
  e:node(right)
  return e   
end

function has_arg(name)
	-- The argument can exist and be empty or not exist at all
	return string.len(origArgs[name] or '') > 0
end

function arg(name)
	if has_arg(name) then
		return origArgs[name]
	end
	return ''
end

function p.set_val(prop, val)
	p.frame:preprocess('{{#set: ' .. prop .. '=' .. val .. '}}')	
end

function p.supercomputer(frame)
	
	p.frame = frame
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
    else
        origArgs = frame.args
    end
    
    
    local infobox = mw.html.create('table')	
	p.set_val('instance of', 'supercomputer')
	
	-- same for category
    infobox:wikitext('[[Category:all supercomputers]]')
	

    infobox
        :attr('class', 'infobox')
        
    infobox
    	:tag('tr')
			:tag('td'):attr('colspan', '2')
			:tag('small'):attr('style', 'float: left; font-weight: bold;')
            :wikitext('[[Special:FormEdit/supercomputer/' .. frame:preprocess('{{FULLPAGENAME}}') .. '|<i class="fa fa-edit"></i>Edit Values]]')

    -- header
    if has_arg('name') then
		infobox
			:tag('tr')
			:tag('td')
			:attr('class', 'header-main')
			:attr('colspan', '2')
			:wikitext(arg('name'))
		p.set_val('name', arg('name'))
    end

    -- logo
	if has_arg('logo') then
		local logo = p.add_file_prefix(arg('logo'))
		local logo_size = has_arg('logo size') and arg('image size') or "200px" 
		infobox
		:tag('tr')
		  :tag('td')
		    :attr('style', 'text-align: center;')
		    :attr('colspan', '2')
		    -- make sure it's the ogimage
		    :wikitext('[[' .. logo .. '|link=|' .. logo_size .. ']]')
		
		p.set_val('logo', logo)
	end


    -- image
	if has_arg('image') then
		local image = p.add_file_prefix(arg('image'))
		local image_size = has_arg('image size') and arg('image size') or "200px" 
		infobox
		:tag('tr')
		  :tag('td')
		    :attr('style', 'text-align: center;')
		    :attr('colspan', '2')
		    -- make sure it's the ogimage
		    :wikitext('[[' .. image .. '|link=|class=wikichip_ogimage|' .. image_size .. ']]')
		
		p.set_val('main image', image)

      -- add a caption, if provided
      if has_arg('caption') then
		infobox
			:tag('tr')
			:tag('td')
			:attr('style', 'text-align: center;')
			:attr('colspan', '2')
			:wikitext(arg('caption'))
		p.set_val('main image caption', arg('caption'))
  	  end
  	end
  

    -- ####################################################################
    -- some general info first
    p.add_separator(infobox, 'General Info')
    
     -- Sponsors
    if has_arg('sponsor') then
		p.set_val('sponsor', arg('sponsor'))
		local sponsors = '[[' .. arg('sponsor') .. ']]'
		for i = 2, 10 do
			if not has_arg('sponsor ' .. i) then break end
			p.set_val('sponsor', arg('sponsor ' .. i))
			sponsors = sponsors .. ',<br> [[' .. arg('sponsor ' .. i) .. ']]'
		end
		infobox:node(p.add_entry('Sponsors', mw.html.create('td'):wikitext(sponsors)))
	end
	
     -- Designers
    if has_arg('designer') then
		p.set_val('designer', arg('designer'))
		local designers = '[[' .. arg('designer') .. ']]'
		for i = 2, 10 do
			if not has_arg('designer ' .. i) then break end
			p.set_val('designer', arg('designer ' .. i))
			designers = designers .. ',<br> [[' .. arg('designer ' .. i) .. ']]'
		end
		infobox:node(p.add_entry('Designers', mw.html.create('td'):wikitext(designers)))
	end
	
	
     -- Operator
    if has_arg('operator') then
		p.set_val('operator', arg('operator'))
		local operators = '[[' .. arg('operator') .. ']]'
		for i = 2, 10 do
			if not has_arg('operator ' .. i) then break end
			p.set_val('operator', arg('operator ' .. i))
			designers = operators .. ',<br> [[' .. arg('operator ' .. i) .. ']]'
		end
		infobox:node(p.add_entry('Operators', mw.html.create('td'):wikitext(operators)))
	end
	
	-- intro
	if has_arg('introduction') then
  		p.set_val('introductory date', arg('introduction'))
		infobox:node(p.add_entry('Introduction', mw.html.create('td'):wikitext(arg('introduction'))))
	end
	-- retire
	if has_arg('retired') then
  		p.set_val('discontinuation date', arg('retired'))
		infobox:node(p.add_entry('Retired', mw.html.create('td'):wikitext(arg('retired'))))
	end
    
     -- peak dpflops
    if has_arg('peak dpflops') then
		p.set_val('peak flops (double-precision)', arg('peak dpflops'))
		local flops = arg('peak dpflops')
		for i = 2, 10 do
			if not has_arg('peak dpflops ' .. i) then break end
			p.set_val('peak flops (double-precision)', arg('peak dpflops ' .. i))
			flops = flops .. ',<br> ' .. arg('peak dpflops ' .. i)
		end
		infobox:node(p.add_entry('Peak FLOPS', mw.html.create('td'):wikitext(flops)))
	end
	
	-- price
	if has_arg('price') then
			p.set_val('release price', arg('price'))
		infobox:node(p.add_entry('Price', mw.html.create('td'):wikitext(arg('price'))))
	end
	
    
    -- ####################################################################
    -- ####################################################################
    -- Successon
	if has_arg('successor') or has_arg('predecessor') then
        p.add_separator(infobox, 'Succession')
		
		local s = infobox:tag('tr')
		local td = s:tag('td'):attr('colspan', '2')
		local d1 = td:tag('div'):attr('style', 'display: inline-flex;')
		local d2 = td:tag('div'):attr('style', 'display: inline-flex; float: right;')
		if has_arg('predecessor') then
			
		    local list
		    if has_arg('predecessor link') then
				list = '[[' .. arg('predecessor link') .. '|' .. arg('predecessor') .. ']]'
			else
				list = '[[' .. arg('predecessor') .. ']]'
			end
		    for i = 2, 10 do
		    	if not has_arg('predecessor ' .. i) then break end
		    	if has_arg('predecessor ' .. i .. ' link') then
		    		list = list .. '<br>[[' .. arg('predecessor ' .. i .. ' link') .. '|' .. arg('predecessor ' .. i) .. ']]'
	    		else
		    		list = list .. '<br>[[' .. arg('predecessor ' .. i) .. ']]'
    			end
			end
			
			d1:tag('div')
				:attr('style', 'float: left; padding-right: 10px; margin: auto 5px;')
				:wikitext('<i class="fa fa-chevron-left"></i>')
			d1:tag('div')
				:attr('style', 'float: left;')
				:wikitext(list)
		end
		if has_arg('successor') then
			local list
		    if has_arg('successor link') then
				list = '[[' .. arg('successor link') .. '|' .. arg('successor') .. ']]'
			else
				list = '[[' .. arg('successor') .. ']]'
			end
		    for i = 2, 10 do
		    	if not has_arg('successor ' .. i) then break end
		    	if has_arg('successor ' .. i .. ' link') then
		    		list = list .. '<br>[[' .. arg('successor ' .. i .. ' link') .. '|' ..
		    			arg('successor ' .. i) .. ']]'
	    		else
		    		list = list .. '<br>[[' .. arg('successor ' .. i) .. ']]'
    			end
			end
			
			d2:tag('div')
				:attr('style', 'float: left;')
				:wikitext(list)
			d2:tag('div')
				:attr('style', 'float: right; padding-left: 10px; margin: auto 5px;')
				:wikitext('<i class="fa fa-chevron-right"></i>')
		end
	end
    -- Contemporary
	if has_arg('contemporary') then
        p.add_separator(infobox, 'Contemporary')
		
		local s = infobox:tag('tr')
		local td = s:tag('td'):attr('colspan', '2')
		
		td:attr('style', 'text-align: center;')

	    local list
	    if has_arg('contemporary link') then
			list = '[[' .. arg('contemporary link') .. '|' .. arg('contemporary') .. ']]'
		else
			list = '[[' .. arg('contemporary') .. ']]'
		end
	    for i = 2, 10 do
	    	if not has_arg('contemporary ' .. i) then break end
	    	if has_arg('contemporary ' .. i .. ' link') then
	    		list = list .. '<br>[[' .. arg('contemporary ' .. i .. ' link') .. '|' .. arg('contemporary ' .. i) .. ']]'
    		else
	    		list = list .. '<br>[[' .. arg('contemporary ' .. i) .. ']]'
			end
		end
		
		td:wikitext(list)
	end
 
	return infobox
end

return p