Документацију овог модула можете да направите на страници Модул:Игралиште/Zenfiric/stablo/док

require('strict')
local p = {}
local wd = require('Module:Wd')

local function renderHeadings(tbl, count)
	-- First row
    local row1 = tbl:tag('tr')
    local sections = {"Mother", "Subject", "Father"}
    for i = 1, count do
        row1:tag('td')
            :attr('colspan', tostring(3))
            :css('text-align', 'center')
            :css('border', '1px solid #aaa')
            :css('background-color', '#f2f2f2')
            :wikitext(sections[i])
    end
end

function p.printTest(qid, n_root)
    local tbl = mw.html.create('table')
        :attr('cellpadding', '0')
        :css('border-style', 'none')
        :css('font-size', '90%')
        :css('border-collapse', 'separate')
        :css('border-spacing', '0')
        :css('margin', '1em 2em 1em 1em')
	
	renderHeadings(tbl, n_root)
	return tostring(tbl)
end

function p.printTree(qid)
	-- Source: https://en.wikipedia.org/wiki/Module:Team_bracket

    local tbl = mw.html.create('table')
        :attr('cellpadding', '0')
        :css('border-style', 'none')
        :css('font-size', '90%')
        :css('border-collapse', 'separate')
        :css('border-spacing', '0')
        :css('margin', '1em 2em 1em 1em')

    local row1 = tbl:tag('tr')
    row1:tag('td')
    row1:tag('td')
        :attr('colspan', '4')
        :css('text-align', 'center')
        :css('border', '1px solid #aaa')
        :css('background-color', '#f2f2f2')
        :wikitext('Mother')
    row1:tag('td')
    row1:tag('td')
    row1:tag('td')
        :attr('colspan', '4')
        :css('text-align', 'center')
        :css('border', '1px solid #aaa')
        :css('background-color', '#f2f2f2')
        :wikitext('Subject')
    row1:tag('td')
    row1:tag('td')
    row1:tag('td')
        :attr('colspan', '4')
        :css('text-align', 'center')
        :css('border', '1px solid #aaa')
        :css('background-color', '#f2f2f2')
        :wikitext('Father')
    row1:tag('td')

    local row2 = tbl:tag('tr')
    row2:tag('td')
        :css('width', '1px')
    row2:tag('td')
        :css('width', '25px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-right-width', '1px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-left-width', '1px')
        :css('border-bottom-width', '1px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
    row2:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
        :wikitext(' ')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
    row2:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
    row2:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-bottom-width', '1px')
        :css('border-right-width', '1px')
    row2:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-left-width', '1px')

    local row3 = tbl:tag('tr')
    row3:tag('td')
        :css('width', '1px')
    row3:tag('td')
        :css('width', '25px')
        :wikitext(' ')
    row3:tag('td')
        :css('width', '25px')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
        :wikitext(' ')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
        :wikitext(' ')
    row3:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
        :wikitext(' ')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
        :css('border-right-width', '1px')
        :wikitext(' ')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
        :css('border-left-width', '1px')
        :wikitext(' ')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '1px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '25px')
        :css('border-style', 'solid')
        :css('border-width', '0')
        :css('border-top-width', '1px')
    row3:tag('td')
        :css('width', '25px')    
    row3:tag('td')
        :css('width', '25px')
    row3:tag('td')
        :css('width', '1px')
    
    local row4 = tbl:tag('tr')
	row4:tag('td')
	    :attr('colspan', '6')
	row4:tag('td')
	    :attr('rowspan', '3')
	    :attr('colspan', '2')
	    :css('text-align', 'center')
	    :css('background-color', '#f2f2f2')
	    :css('border', '1px solid #aaa')
	    :css('border-top-width', '1px')
	    :wikitext('1')
	row4:tag('td')
	    :attr('rowspan', '2')
	    :attr('colspan', '4')
	    :css('background-color', '#f9f9f9')
	    :css('padding', '0 2px')
	    :css('border', '1px solid #aaa')
	    :css('border-top-width', '1px')
	    :wikitext(p.getLabel(qid))
	row4:tag('td')
	    :attr('colspan', '4')
	    :css('background-color', '#f9f9f9')
	    :css('padding', '0 2px')
	    :css('border', '1px solid #aaa')
	    :css('border-top-width', '1px')
	    :wikitext(wd._property({"Q211827", 'P569'}) .. " -- " .. wd._property({"Q211827", 'P570'}))
	row4:tag('td')
	    :attr('colspan', '6')

    return tostring(tbl)
end

function p.wrapper(frame)
	local func = frame.args[1]
	local qid = frame.args[2]
	
	if func == 'getLabel' then
		return p.getLabel(qid)
	elseif func == 'splitQIDs' then
		local qids = p.splitQIDs(qid)
		return p.outputTable(qids)
	elseif func == 'getAncestors' then
		local generations = frame.args[3]
 		return p.getAncestors(qid, generations)
	elseif func == 'getOffspring' then
 		local generations = frame.args[3]
 		local offspring = p.getOffspring(qid, generations)
 		return p.outputTable(offspring)
	elseif func == 'tree' then
 		return p.printTree(qid)
 	end
end

function p.getLabel(qid)
    return wd._label({"linked", qid}) .. " (" .. wd._label({"raw", "linked", qid}) .. ")"
end

function p.splitQIDs(qidString)
    local qids = {}

    for qid in qidString:gmatch("Q%d+") do
        table.insert(qids, qid)
    end

    return qids
end

function p.tree(frame)
    local qid = frame.args[1]
    local generations = 4

    return p.getAncestors(qid, generations)
end

function p.getAncestors(qid, generations)
    if generations == 0 then
        return ''
    end

    local qid_name = wd._label({qid})
    local qid_father = wd._properties({'raw', qid, 'P22'})
    local qid_mother = wd._properties({'raw', qid, 'P25'})
    
    local father_label = p.getLabel(qid_father)
    local mother_label = p.getLabel(qid_mother)

    local tree = p.getAncestors(qid_father, generations - 1) .. "\n"
    tree = tree .. string.rep("    ", 4 - generations) .. mother_label .. " --> " .. qid_name .. " <-- " .. father_label

    return tree
end

function p.getOffspring(qid)
	local offspring = wd._properties({'raw', qid, 'P40'})
	local offspring = p.splitQIDs(offspring)
	return offspring
end

function p.outputTable(qids)
	if type(qids)=='table' then
		local formattedQids = "table#1 {\n"
	    for _, qid in ipairs(qids) do
	        formattedQids = formattedQids .. string.format('    "%s",\n', qid)
	    end
	    formattedQids = formattedQids .. "}"
	    return formattedQids
	elseif type(qids)=='string' then
 		return 'string#1'..qids
	end
end

return p