<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FPremeditated%2FWDTracklist</id>
	<title>Module:Sandbox/Premeditated/WDTracklist - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FPremeditated%2FWDTracklist"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Premeditated/WDTracklist&amp;action=history"/>
	<updated>2026-07-28T20:15:04Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Premeditated/WDTracklist&amp;diff=146007&amp;oldid=prev</id>
		<title>imported&gt;Premeditated at 09:16, 23 September 2020</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Premeditated/WDTracklist&amp;diff=146007&amp;oldid=prev"/>
		<updated>2020-09-23T09:16:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local hlist = require(&amp;#039;Module:List&amp;#039;)&lt;br /&gt;
local exception = mw.loadData(&amp;#039;Module:Sandbox/Premeditated/WDTracklist/exception&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local allCredits = {}&lt;br /&gt;
&lt;br /&gt;
local function parseDate(totalSeconds)&lt;br /&gt;
	local seconds =  math.fmod(tonumber(totalSeconds),60)&lt;br /&gt;
	local minutes =  math.floor(tonumber(totalSeconds) / 60)&lt;br /&gt;
	local hours   = math.floor(minutes / 60)&lt;br /&gt;
	return string.format(&amp;quot;%d:%02d&amp;quot;, minutes, seconds)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function TableConcat(t1,t2)&lt;br /&gt;
    for i=1,#t2 do&lt;br /&gt;
        t1[#t1+1] = t2[i]&lt;br /&gt;
    end&lt;br /&gt;
    return t1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getOrder(qualifiers)&lt;br /&gt;
	local out = nil&lt;br /&gt;
	if qualifiers then&lt;br /&gt;
		local qualifierID = &amp;quot;P1545&amp;quot; -- sorting order / rank / series ordinal&lt;br /&gt;
		if qualifiers[qualifierID] then&lt;br /&gt;
			for k, v in pairs(qualifiers[qualifierID]) do&lt;br /&gt;
				if v.snaktype == &amp;#039;value&amp;#039; then&lt;br /&gt;
					out = v.datavalue.value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function has_value (tab, val)&lt;br /&gt;
    for index, value in ipairs(tab) do&lt;br /&gt;
        if value == val then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWDName(id, pid)&lt;br /&gt;
	local num = 0&lt;br /&gt;
	local name = {}&lt;br /&gt;
	&lt;br /&gt;
	if id[&amp;quot;claims&amp;quot;][pid] and not id[&amp;quot;claims&amp;quot;][pid][2] then&lt;br /&gt;
		local famNameItem = mw.wikibase.getEntity(id[&amp;quot;claims&amp;quot;][pid][1][&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;#039;id&amp;#039;])&lt;br /&gt;
		table.insert(name, famNameItem:getLabel())&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for index, claims in pairs(id[&amp;quot;claims&amp;quot;][pid]) do&lt;br /&gt;
		local famNameItem = mw.wikibase.getEntity(claims[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;#039;id&amp;#039;])&lt;br /&gt;
		if claims.qualifiers then&lt;br /&gt;
			name[tonumber(getOrder(claims.qualifiers))] = famNameItem:getLabel()&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(name, famNameItem:getLabel())&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if name then&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getName(id)&lt;br /&gt;
	&lt;br /&gt;
	if id[&amp;quot;claims&amp;quot;] and id[&amp;quot;claims&amp;quot;][&amp;quot;P1477&amp;quot;] and id[&amp;quot;claims&amp;quot;][&amp;quot;P1477&amp;quot;][1] then&lt;br /&gt;
		for index, claims in pairs(id[&amp;quot;claims&amp;quot;][&amp;quot;P1477&amp;quot;]) do&lt;br /&gt;
			if claims[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;language&amp;quot;] == &amp;#039;en&amp;#039; then &lt;br /&gt;
				return claims[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;text&amp;quot;]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return id[&amp;quot;claims&amp;quot;][&amp;quot;P1477&amp;quot;][1][&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;text&amp;quot;]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if id[&amp;quot;claims&amp;quot;] and id[&amp;quot;claims&amp;quot;][&amp;quot;P734&amp;quot;] and id[&amp;quot;claims&amp;quot;][&amp;quot;P734&amp;quot;][1] and id[&amp;quot;claims&amp;quot;][&amp;quot;P735&amp;quot;] and id[&amp;quot;claims&amp;quot;][&amp;quot;P735&amp;quot;][1] then&lt;br /&gt;
		local fullName = TableConcat(getWDName(id, &amp;#039;P735&amp;#039;), getWDName(id, &amp;#039;P734&amp;#039;))&lt;br /&gt;
		return table.concat(fullName, &amp;quot; &amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return id:getLabel()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getFamilyName(label)&lt;br /&gt;
	local words = {}&lt;br /&gt;
	local suffix = {&amp;#039;jr&amp;#039;, &amp;#039;sr&amp;#039;, &amp;#039;jr.&amp;#039;, &amp;#039;sr.&amp;#039;}&lt;br /&gt;
	for word in label:gmatch(&amp;quot;[%w\128-\244]+&amp;quot;) do table.insert(words, word) end&lt;br /&gt;
	if has_value(suffix, words[#words]:lower()) then&lt;br /&gt;
		return words[#words - 1] .. &amp;#039; &amp;#039; .. words[#words] .. &amp;#039;.&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return words[#words]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function findLast(haystack, needle)&lt;br /&gt;
    local i = haystack:match(&amp;quot;.*&amp;quot;..needle..&amp;quot;()&amp;quot;)&lt;br /&gt;
    if i == nil then return nil else return i-1 end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function replace_char(pos, str, r)&lt;br /&gt;
    return str:sub(1, pos-1) .. r .. str:sub(pos+1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getFeature(performer, frame)&lt;br /&gt;
	local feat = {}&lt;br /&gt;
	&lt;br /&gt;
	for index22, table22 in pairs(performer) do&lt;br /&gt;
    	if table22[&amp;quot;qualifiers&amp;quot;] and table22[&amp;quot;qualifiers&amp;quot;][&amp;quot;P3831&amp;quot;] and table22[&amp;quot;qualifiers&amp;quot;][&amp;quot;P3831&amp;quot;][1][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;id&amp;quot;] then&lt;br /&gt;
    		for index23, table23 in pairs(table22[&amp;quot;qualifiers&amp;quot;][&amp;quot;P3831&amp;quot;]) do&lt;br /&gt;
        		if table23[&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;id&amp;quot;] == &amp;#039;Q1399352&amp;#039; then&lt;br /&gt;
        			local featureArtist = mw.wikibase.getEntity(table22[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;id&amp;quot;])&lt;br /&gt;
        			if featureArtist:getSitelink() ~= nil then&lt;br /&gt;
        				table.insert(feat, frame:preprocess(&amp;quot;[[&amp;quot; .. featureArtist:getSitelink() .. &amp;quot;|&amp;quot; .. featureArtist:getLabel() .. &amp;quot;]]&amp;quot;))&lt;br /&gt;
        			else&lt;br /&gt;
        				table.insert(feat, frame:preprocess(featureArtist:getLabel()))&lt;br /&gt;
        			end&lt;br /&gt;
        			break&lt;br /&gt;
        		end&lt;br /&gt;
    		end&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if next(feat) ~= nil then&lt;br /&gt;
		local text = &amp;quot;featuring &amp;quot; .. table.concat(feat,&amp;quot;, &amp;quot;)&lt;br /&gt;
		local last = findLast(text,&amp;quot;%,&amp;quot;)&lt;br /&gt;
		if last == nil then return text else return replace_char(last, text, &amp;#039; and&amp;#039;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getCredits(frame, credits)&lt;br /&gt;
	local credit = {}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	for index, we in pairs(credits) do&lt;br /&gt;
		if not we[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;] then&lt;br /&gt;
			return &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
    	local id = mw.wikibase.getEntity(we[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;id&amp;quot;])&lt;br /&gt;
    	&lt;br /&gt;
    	if has_value(allCredits, id:getLabel()) then&lt;br /&gt;
    		local name = getName(id)&lt;br /&gt;
    		if has_value(exception[&amp;#039;name_exception_qid&amp;#039;], id:getId()) or has_value(exception[&amp;#039;name_exception&amp;#039;], id:getLabel()) then&lt;br /&gt;
    			table.insert(credit, id:getLabel())&lt;br /&gt;
    		else&lt;br /&gt;
    			table.insert(credit, getFamilyName(name))&lt;br /&gt;
    		end&lt;br /&gt;
    	else&lt;br /&gt;
    		if id:getSitelink() ~= nil then&lt;br /&gt;
    			table.insert(credit, frame:preprocess( &amp;quot;[[&amp;quot; .. id:getSitelink() .. &amp;quot;|&amp;quot; .. getName(id) .. &amp;quot;]]&amp;quot;))&lt;br /&gt;
    		else&lt;br /&gt;
    			table.insert(credit, getName(id))&lt;br /&gt;
    		end&lt;br /&gt;
    		table.insert(allCredits, id:getLabel())&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
	&lt;br /&gt;
	return hlist.makeList(&amp;#039;horizontal&amp;#039;, credit)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parseNames(frame)&lt;br /&gt;
	&lt;br /&gt;
	if mw.wikibase.getEntity() == nil and frame.args[1] == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local wikiEntity = mw.wikibase.getEntity(frame.args[1]) or mw.wikibase.getEntity()&lt;br /&gt;
		&lt;br /&gt;
	if wikiEntity == nil or wikiEntity == &amp;#039;&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local funcArgs = {}&lt;br /&gt;
	&lt;br /&gt;
	for index, table in pairs(wikiEntity:getAllStatements( &amp;#039;tracklist&amp;#039; )) do&lt;br /&gt;
		local trackEntity = mw.wikibase.getEntity( table[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;id&amp;quot;] )&lt;br /&gt;
		&lt;br /&gt;
		local order = tonumber(getOrder(table.qualifiers)) or index&lt;br /&gt;
			&lt;br /&gt;
		if trackEntity:getSitelink() == nil then&lt;br /&gt;
			local success = false&lt;br /&gt;
			if trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P2550&amp;quot;] ~= nil then&lt;br /&gt;
				for index, recOrPerf in pairs(trackEntity:getAllStatements( &amp;#039;P2550&amp;#039; )) do&lt;br /&gt;
					local trackEntityRec = mw.wikibase.getEntity( recOrPerf[&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;id&amp;quot;] )&lt;br /&gt;
					if trackEntityRec:getSitelink() ~= nil then&lt;br /&gt;
						funcArgs[&amp;quot;title&amp;quot; .. order] = frame:preprocess( &amp;quot;[[&amp;quot; .. trackEntityRec:getSitelink() .. &amp;quot;|&amp;quot; .. trackEntity:getLabel() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
						success = true&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if success == false then&lt;br /&gt;
				funcArgs[&amp;quot;title&amp;quot; .. order] = trackEntity:getLabel()&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			funcArgs[&amp;quot;title&amp;quot; .. order] = frame:preprocess( &amp;quot;[[&amp;quot; .. trackEntity:getSitelink() .. &amp;quot;|&amp;quot; .. trackEntity:getLabel() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P2047&amp;quot;] ~= nil then&lt;br /&gt;
			funcArgs[&amp;quot;length&amp;quot; .. order] = parseDate(tonumber(trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P2047&amp;quot;][1][&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;amount&amp;quot;]))&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P676&amp;quot;] ~= nil then&lt;br /&gt;
			funcArgs[&amp;quot;writer&amp;quot; .. order] = getCredits(frame, trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P676&amp;quot;])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P175&amp;quot;] ~= nil then&lt;br /&gt;
			funcArgs[&amp;quot;note&amp;quot; .. order] =  getFeature(trackEntity:getAllStatements( &amp;#039;performer&amp;#039; ), frame)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P162&amp;quot;] ~= nil then&lt;br /&gt;
			funcArgs[&amp;quot;extra_column&amp;quot;] = &amp;#039;Producer(s)&amp;#039;&lt;br /&gt;
			funcArgs[&amp;quot;extra&amp;quot; .. order] = getCredits(frame, trackEntity[&amp;quot;claims&amp;quot;][&amp;quot;P162&amp;quot;])&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if table[&amp;quot;qualifiers&amp;quot;] ~= nil then&lt;br /&gt;
			if table[&amp;quot;qualifiers&amp;quot;][&amp;quot;P2047&amp;quot;] ~= nil then&lt;br /&gt;
				local timeInSeconds = table[&amp;quot;qualifiers&amp;quot;][&amp;quot;P2047&amp;quot;][1][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;amount&amp;quot;]&lt;br /&gt;
				funcArgs[&amp;quot;length&amp;quot; .. order] = parseDate(timeInSeconds)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if wikiEntity[&amp;#039;claims&amp;#039;][&amp;#039;P2047&amp;#039;] ~= nil then&lt;br /&gt;
		local totalTime = tonumber(wikiEntity:getAllStatements( &amp;#039;duration&amp;#039; )[1][&amp;quot;mainsnak&amp;quot;][&amp;quot;datavalue&amp;quot;][&amp;quot;value&amp;quot;][&amp;quot;amount&amp;quot;])&lt;br /&gt;
		funcArgs[&amp;quot;total_length&amp;quot;] = parseDate(totalTime)&lt;br /&gt;
	end&lt;br /&gt;
	return frame:expandTemplate{ title = &amp;#039;tracklist&amp;#039;, args = funcArgs }&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Premeditated</name></author>
	</entry>
</feed>