Module:Family tree
Jump to navigation
Jump to search
Module documentation
This documentation is transcluded from Template:No documentation/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:Family tree/doc. [edit]
Module:Family tree's function main is invoked by Template:Family tree.
Module:Family tree loads data from Module:Family tree/data.
--[[
Implements {{Family tree}}
In this module and the template, top, right, bottom, left refer to the location of the line on a cross:
-T-
L#R
-B-
--]]
local p = {}
local borders = mw.loadData('Module:Family tree/data')
-- Main function
function p.main(frame)
local args = frame:getParent().args
local cells = {}
for i, v in ipairs(args) do
-- Every param is unnamed, so needs trimming
local v_x = mw.text.trim(v)
-- Assume all blank parameters (trimmed to 0 length) are empty block cells
if #v_x == 0 then
v_x = ' '
end
table.insert(cells,v_x)
end
return p._main(cells)
end
function p._main(cells)
local ret = mw.html.create('table')
:css({ ['border-spacing'] = '0',
['line-height'] = '100%',
['text-align'] = 'center' })
local current_row = mw.html.create('tr')
for i, v in ipairs(cells) do
-- '_' character means "start a new row"
-- Close current_row and add to the table
-- Then recycle the param
if v == '_' then
ret:node(current_row:done())
current_row = mw.html.create('tr')
-- If a meta character, add a node for a block cell
elseif borders[v] then
block_cell(current_row,borders[v])
-- Everything else, paste as is in a leaf
else
text_cell(current_row,v)
end
end
-- Close current row, add to main table, close everything, return
ret:node(current_row:done())
:done()
return ret
end
-- Meta characters used to draw lines
function block_cell(builder,cell)
--[[
-- We can use self closing <td /> to reduce expansion size, huehuehue
-- Cells are:
-- a1 a2
-- b2 b2
-- a1's borders create TOP and LEFT lines
-- a2's borders create RIGHT line
-- b1's borders create BOTTOM line
-- Each cell is 1em square
-- Whole table is 2em x 2em
--]]
builder:tag('td')
:addClass('famtreesub')
:tag('table')
:tag('tr')
:tag('td')
:css({ ['border-right'] = cell.top,
['border-bottom'] = cell.left })
:done()
:tag('td')
:css({ ['border-bottom'] = cell.right })
:done()
:done()
:tag('tr')
:tag('td')
:css({ ['border-right'] = cell.bottom })
:done()
:tag('td'):done()
:done()
:done()
:done()
end
-- All other text
function text_cell(builder,text)
builder:tag('td')
:addClass('famtreeleaf')
:attr('colspan','3')
:wikitext(text)
:done()
end
return p