Modulo:DTSem: differenze tra le versioni

Da Wikitrek.
Vai alla navigazione Vai alla ricerca
(Query results limit increased to 500)
mNessun oggetto della modifica
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 58: Riga 58:
function p.SeasonsQty(ShortName)
function p.SeasonsQty(ShortName)
local QueryResult
local QueryResult
local Max
local Max = 0
local PrefixText
local PrefixText
Riga 72: Riga 72:
-- See https://github.com/SemanticMediaWiki/SemanticScribunto/blob/master/docs/mw.smw.ask.md#result
-- See https://github.com/SemanticMediaWiki/SemanticScribunto/blob/master/docs/mw.smw.ask.md#result
-- for return value example
-- for return value example
Max = QueryResult[1]["Stagione"]
     if QueryResult == nil or Max < 0 then
     if QueryResult == nil or Max < 0 then
         return 0
         return 0
     else
     else
    Max = QueryResult[1]["Stagione"]
     return Max
     return Max
     end
     end
Riga 233: Riga 233:
         --Count = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|format=count')
         --Count = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|format=count')
         --Episodes = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|sort=Numero di produzione|order=asc')
         --Episodes = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|sort=Numero di produzione|order=asc')
         Episodes = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page .. ']]|sort=Numero di produzione|order=asc')
         Episodes = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page .. ']]|limit=100|sort=Numero di produzione|order=asc')
        
        
         if (Episodes ~= nil) and (#Episodes > MinOccurr - 1) then
         if (Episodes ~= nil) and (#Episodes > MinOccurr - 1) then

Versione delle 21:22, 31 mar 2023

La documentazione per questo modulo può essere creata in Modulo:DTSem/man

-- Keyword: wikitrek
local p = {}

local QFromP = require('Modulo:DTGenerico').QFromP

function p.TypeFromDT(frame)
	local Item
	local Type
	
	Item = mw.wikibase.getEntity()
	
	if not Item then
		Item = mw.wikibase.getEntity(frame.args['Item'])
	end
	if not Item then
		Item = mw.wikibase.getEntity('Q1')
	end
	
	if (not Item['claims']) or (not Item['claims']['P49']) then
		return "ERROR"
	else
		Type = Item['claims']['P49'][1].mainsnak.datavalue.value
		return "[[Has type::" .. Type .. "|''" .. Type .. "'']]"
	end
end
function p.DescrFromDT(frame)
	-- ** [[Has property description::DataTrek ID@en]]
	-- ** [[Has property description::Identificativo DataTrek@it]]
	local Item
	local Value
	local AllLabels
	
	Item = mw.wikibase.getEntity()
	
	if not Item then
		Item = mw.wikibase.getEntity(frame.args['Item'])
	end
	if not Item then
		Item = mw.wikibase.getEntity('Q1')
	end
	
	local Labels = Item.labels
	for _, Label in pairs(Labels) do
		Value = "** " .. "[[Has property description::" .. Label.value .. "@" .. Label.language .. "]]"
		if not AllLabels then
			AllLabels = Value
		else
			AllLabels = AllLabels .. string.char(10) .. Value
		end
	end
	
	return string.char(10) .. AllLabels
end
--- Function to calculate the number of seasons of a series
-- 
-- @param ShortName The short name of the series as in P24
-- @return Integer Number of seasons
function p.SeasonsQty(ShortName)
	local QueryResult
	local Max = 0
	local PrefixText
	
	if ShortName == "Serie Classica" or ShortName == "Serie Animata" then
		PrefixText = '[[Istanza::Episodio della '
	else
		PrefixText = '[[Istanza::Episodio di '
	end
	
	-- {{#ask: [[Istanza::Episodio di Discovery]]|?Stagione|format=max}}
	--QueryResult = mw.smw.ask('[[Istanza::Episodio di ' .. ShortName .. ']]|?Stagione|format=max')
	QueryResult = mw.smw.ask(PrefixText .. ShortName .. ']]|?Stagione|sort=Stagione|order=desc|format=max')
	-- See https://github.com/SemanticMediaWiki/SemanticScribunto/blob/master/docs/mw.smw.ask.md#result
	-- for return value example
    if QueryResult == nil or Max < 0 then
        return 0
    else
    	Max = QueryResult[1]["Stagione"]
    	return Max
    end
end
--- Function to extract recurring characters and list them
-- 
-- @param frame Context from MediaWiki
-- @return String Bullet list of characters and episodes
function p.RecurringListFromCategory(frame)
	local Results = {}
	local Item
	local CategoryText
	local Pages
	local PagesList = {}
	local Series
	local SeriesShort
	
	if not Item then
		Item = mw.wikibase.getEntity(frame.args['Item'])
	end
	if not Item then
		Item = mw.wikibase.getEntity('Q1')
	end
	
	SeriesShort = mw.wikibase.getEntity(Item.claims['P16'][1].mainsnak.datavalue.value.id).claims['P24'][1].mainsnak.datavalue.value
	Series = mw.wikibase.getLabel(Item.claims['P16'][1].mainsnak.datavalue.value.id)
	
	if SeriesShort == "Serie Classica" or SeriesShort == "Serie Animata" then
		CategoryText = '[[Category:Personaggi della ' .. SeriesShort .. "]]"
	else
		CategoryText = '[[Category:Personaggi di ' .. SeriesShort .. "]]"
	end
	
	Pages = mw.smw.getQueryResult(CategoryText) --PrefixText .. ShortName .. ']]|?Stagione|sort=Stagione|order=desc|format=max')
	-- See https://github.com/SemanticMediaWiki/SemanticScribunto/blob/master/docs/mw.smw.ask.md#result
	-- for return value example
	
	if Pages == nil then
        return "''Nessun risultato''"
    else
    	for _, Page in ipairs(Pages.results) do
    		table.insert(PagesList, Page.fulltext)
    	end
		
    	return p.RecurringList(PagesList, Series)    	
	end
	
	--return table.concat(Results, string.char(10))
end
--- Function to extract recurring characters from all pages and list them
-- 
-- @param frame Context from MediaWiki
-- @return String Bullet list of characters and episodes
function p.RecurringListFull(frame)
	local Results = {}
	local Item
	local InstanceText
	local Pages
	local Series
	local SeriesShort
	local Characters = {}
	local PagesList = {}
	
	if not Item then
		Item = mw.wikibase.getEntity(frame.args['Item'])
	end
	if not Item then
		Item = mw.wikibase.getEntity('Q1')
	end
	
	SeriesShort = mw.wikibase.getEntity(Item.claims['P16'][1].mainsnak.datavalue.value.id).claims['P24'][1].mainsnak.datavalue.value
	Series = mw.wikibase.getLabel(Item.claims['P16'][1].mainsnak.datavalue.value.id)
	
	if SeriesShort == "Serie Classica" or SeriesShort == "Serie Originale" or SeriesShort == "Serie Animata" then
		InstanceText = '[[Istanza::Episodio della ' .. SeriesShort .. "]]"
	else
		InstanceText = '[[Istanza::Episodio di ' .. SeriesShort .. "]]"
	end
	--[==[
	Pages = mw.smw.ask(InstanceText .. "|?Personaggio|order=asc|sort=Numero di produzione")
	
	if Pages == nil then
        return "''Nessun risultato'' (<code>" .. mw.text.nowiki(InstanceText) .. "</code>, )" 
    else
    	--local myResult = ""
        for num, row in pairs(Pages) do
            --myResult = myResult .. '* This is result #' .. num .. '\n'
            mw.smw.set("Test=" .. num)
            for property, data in pairs( row ) do
            	if property == "Personaggio"  then
            		if type(data) == 'table' then
            			for _, Character in pairs(data) do
            				if Characters[Character] == nil then
            					--table.insert(Characters, Character)
            				end
            			end
            		else
            			-- This should never happens
            			table.insert(Characters, "NEXT ONE ->")
            			if Characters[data] == nil then
            				table.insert(Characters, data)
            			end
            		end
            	end
            end
        end
	end
	]==]
	NewPages = mw.smw.getQueryResult(InstanceText .. "|?Personaggio|limit=500|order=asc|sort=Numero di produzione")
	
	for _, Episode in ipairs(NewPages.results) do
		for _, Character in ipairs(Episode.printouts.Personaggio) do
			local CharText = Character.fulltext
			if not Characters[CharText] then
				table.insert(Characters, CharText)
				Characters[CharText] = true
			end
		end
	end

	table.sort(Characters)
	
	if type(Characters) == 'table' and Characters ~= nil then
		for _, Page in ipairs(Characters) do
    		table.insert(PagesList, Page)
    	end
		
		
		return p.RecurringList(PagesList, Series, 3)
		--return #Characters .. " - " .. #Characters .. " - " .. table.concat(PagesList, ", ")
	else
		return "No table"
	end
		
	--return table.concat(Results, string.char(10))
end
--- Helper to extract recurring characters and list them
-- 
-- @param Pages Table containing characters' pages names
-- @param Series String with name of the Series
-- @param[opt=1] MinOccurr Integer with minimum value of occurencies
-- @return String Bullet list of characters and episodes
function p.RecurringList(Pages, Series, MinOccurr)
	local Results = {}
	if not MinOccurr or MinOccurr < 1 then
		MinOccurr = 1
	end
	
    if type(Pages) == "table" then
    	--for _, Page in ipairs(Pages.results) do
    	for _, Page in ipairs(Pages) do	
    		local Count
    		local Episodes = {}
        	local List = {}
        	-- Page.fulltext						represents Page name
        	
        	--Count = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|format=count')
        	--Episodes = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|sort=Numero di produzione|order=asc')
        	Episodes = mw.smw.ask('[[Serie::' .. Series .. ']][[Personaggio::' .. Page .. ']]|limit=100|sort=Numero di produzione|order=asc')
        	
        	if (Episodes ~= nil) and (#Episodes > MinOccurr - 1) then
        		--[=[
        		Episodes = mw.smw.getQueryResult('[[Serie::' .. Series .. ']][[Personaggio::' .. Page.fulltext .. ']]|sort=Numero di produzione|order=asc')
        		
        		for _, Episode in ipairs(Episodes.results) do
        			table.insert(List, "[[" .. Episode.fulltext .. "]]")
        		end
        		]=]
        		
        		for num, Episode in pairs(Episodes) do
        			--myResult = myResult .. '* This is result #' .. num .. '\n'
            		for _, Data in pairs(Episode) do
            			if type(Data) == 'table' then
            				table.insert(List, table.concat(Data))
            			else
            				table.insert(List, Data)
            			end
        					
            		end
        		end
        		table.insert(Results, "* '''[[" .. Page .. "]]''' (" .. #Episodes .. "): " .. table.concat(List, ", "))
        	else
        		-- Episode is NULL or number of episodes is LESS the set value
        		--table.insert(Results, "* NULL or ZERO Episodes - " .. mw.text.nowiki('[[Serie::' .. Series .. ']][[Personaggio::' .. Page .. ']]|sort=Numero di produzione|order=asc'))
        	end
    	end
    else
    	return "''Il risultato non è una TABLE''"
    end
	
	return table.concat(Results, string.char(10))
end

-- Return results
function p.Ask(frame)

    if not mw.smw then
        return "mw.smw module not found"
    end
	
    --if frame.args[1] == nil then
    --    return "no parameter found"
    --end
	
	--local queryResult = mw.smw.ask( frame.args )
	--local queryResult = mw.smw.ask("[[Serie::Star Trek: Strange New Worlds]][[Personaggio::T'Pring]]|sort=Numero di produzione|order=asc")
	local queryResult = mw.smw.ask("[[Istanza::Episodio di Picard]]|?Personaggio|order=asc|sort=Numero di produzione")
    
    if queryResult == nil then
        return "(no values)"
    end

    if type( queryResult ) == "table" then
        local myResult = ""
        for num, row in pairs( queryResult ) do
            myResult = myResult .. '* This is result #' .. num .. '\n'
            for property, data in pairs( row ) do
                local dataOutput = data
                if type( data ) == 'table' then
                    dataOutput = mw.text.listToText( data, ', ', ' and ')
                end
                myResult = myResult .. '** ' .. property .. ': ' .. dataOutput .. '\n'
            end
        end
        return myResult
    end

    return queryResult
end
return p