Modulo:StatsArticoli

Da Wikivoyage.
Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:StatsArticoli/man (modifica · cronologia)
Sandbox: Modulo:StatsArticoli/sandbox (modifica · cronologia) · Test: Modulo:StatsArticoli/test (modifica · cronologia · Esegui)

Questo modulo è stato creato per semplificare ( o evitare del tutto) la gestione delle lunghe concatenazioni di {{PAGESINCATEGORY}}, {{#expr:}} e {{formatNum:}} nelle tabelle che riassumono gli articoli e i loro livelli su Wikivoyage. Un esempio lo trovate su questa pagina.

Funzioni

totalDestinations
Scopo: Calcola il numero totale di articoli relativi alle destinazioni (vedi Modelli articoli e gerarchia geografica) , considerando tutti i livelli.
Utilizzo: {{#invoke:StatsArticoli|totalDestinations}}: 8 392
Ritorna: Il numero totale di articoli sulle destinazioni, formattato come numero.
totalDestinationsByLevel
Scopo: Calcola il numero totale di articoli relativi alle destinazioni per un specifico livello.
Parametri:
livello (stringa): Il livello degli articoli da contare (es. "Abbozzi", "Articoli usabili").
Utilizzo: {{#invoke:StatsArticoli|totalDestinationsByLevel|livello=Guide}}: 405
Ritorna: Il numero totale di articoli sulle destinazioni per il livello specificato, formattato come numero.
totalThematicArticles
Scopo: Calcola il numero totale di articoli tematici, con trattamento speciale per "Frasari" e "Tematiche turistiche" a causa della nomenclatura delle categorie non consistente.
Utilizzo: {{#invoke:StatsArticoli|totalThematicArticles}}: 908
Ritorna: Il numero totale di articoli tematici, formattato come numero.
totalThematicArticlesByLevel
Scopo: Calcola il numero totale di articoli tematici per un specifico livello.
Parametri:
livello (stringa): Il livello degli articoli da contare.
Utilizzo: {{#invoke:StatsArticoli|totalThematicArticlesByLevel|livello=Guide}}: 32
Ritorna: Il numero totale di articoli tematici per il livello specificato, formattato come numero.
percentagePerArticleType
Scopo: Calcola la percentuale di articoli di un determinato tipo e livello all'interno della loro categoria principale. Può essere usato in combinazine con template come {{BarraMultiCol}}.
Parametri:
tipo (stringa): Il tipo degli articoli (es. "Città").
livello (stringa): Il livello degli articoli (es. "Abbozzi").
parent (stringa, opzionale): La categoria principale, se diversa dal tipo di articolo.
Utilizzo: {{#invoke:StatsArticoli|percentagePerArticleType|tipo=Città|livello=Abbozzi}}: 72.102
Ritorna: La percentuale di articoli del tipo e livello specificati all'interno della loro categoria principale, formattata come numero decimale.
percentageByTypeAndLevel
Scopo: Calcola la percentuale di articoli di un determinato tipo e livello rispetto al totale degli articoli, sia per le destinazioni che per gli articoli tematici.
Parametri:
tipo (stringa): Specifica il tipo di articoli per cui calcolare la percentuale. Deve essere "destinazioni" per gli articoli relativi a luoghi geografici o "tematiche" per gli articoli tematici.
livello (stringa): Il livello degli articoli per cui calcolare la percentuale (es. "Abbozzi", "Articoli usabili").
Utilizzo: {{#invoke:StatsArticoli|percentageByTypeAndLevel|tipo=destinazioni|livello=Abbozzi}} per calcolare la percentuale di articoli di tipo "destinazioni" al livello "Abbozzi" (75.977%).
Ritorna: La percentuale di articoli del tipo e livello specificati, formattata come numero decimale con tre cifre dopo il punto.
Note: È importante specificare correttamente i parametri 'tipo' e 'livello' per evitare errori. La funzione restituirà un messaggio di errore se i parametri non sono validi o se il tipo specificato non è tra quelli ammessi ("destinazioni" o "tematiche").
totalDisambiguation
Scopo: Calcola il numero totale di pagine di disambiguazione.
Utilizzo: {{#invoke:StatsArticoli|totalDisambiguation}} (2 501)
Ritorna: Il numero totale di pagine di disambiguazione, formattato come numero.
totalPortals
Scopo: Calcola il numero totale di portali.
Utilizzo: {{#invoke:StatsArticoli|totalPortals}} (22)
Ritorna: Il numero totale di portali, formattato come numero.
totalUNESCO
Scopo: Calcola il numero totale di pagine nella categoria "Liste dei patrimoni mondiali dell'umanità".
Utilizzo: {{#invoke:StatsArticoli|totalUNESCO}} (169)
Ritorna: Il numero totale di pagine nella categoria specificata, formattato come numero.
grandTotal
Scopo: Calcola il numero totale di articoli, includendo destinazioni, articoli tematici, pagine di disambiguazione, portali e liste UNESCO.
Utilizzo: {{#invoke:StatsArticoli|grandTotal}} (11 992)
Ritorna: Il numero totale di articoli calcolato, formattato come numero.
totalUncategorized
Scopo: Calcola il numero totale di articoli non categorizzati, sottraendo il totale calcolato da `grandTotal` dal numero totale di articoli nel sito.
Utilizzo: {{#invoke:StatsArticoli|totalUncategorized}} (5)
Ritorna: Il numero totale di articoli non categorizzati, formattato come numero.


Esempi per il Debug

Mentre si lavora ai Moduli Lua è possible fare dei test senza dover salvare o utilizzare il modulo su altre pagine del progetto. Lo strumento da usare in questi casi è l'estensione di debug. Qui alcuni esempi:

  • Articoli tematici totali per tipo: =p.totalThematicArticlesByLevel(mw.getCurrentFrame():newChild{title="Module:StatsArticoli",args={livello="Articoli usabili"}})
  • Percentuale per tipo di articolo: =p.percentagePerArticleType(mw.getCurrentFrame():newChild{title="Module:StatsArticoli",args={tipo="Città", livello="Abbozzi"}})
  • Percentuale per tipo e livello: =p.percentageByTypeAndLevel(mw.getCurrentFrame():newChild{title="Module:StatsArticoli",args={livello="Articoli usabili", tipo="tematiche"}})

Vedi anche


--[[
	Module to avoid too long concatentaions of {{PAGESINCATEGORY}}, #expr and formatnum in the
	table summarizing the articles and their levels in Wikivoyage.
	Maintainers:		User:Nastoshka
	Version:			1.0.0
	Last updated:		2024-02-17

-- Debugging examples:
		   =p.totalDestinations(mw.getCurrentFrame():newChild{title="Module:StatsArticoli",args={}})
--         ==p.totalDestinationsByLevel(mw.getCurrentFrame():newChild{title="Module:StatsArticoli",args={livello="Articoli usabili"}})
--         =p.percentagePerArticleType(mw.getCurrentFrame():newChild{title="Module:StatsArticoli",args={tipo="Città", livello="Abbozzi"}})
]]


local p = {}

-- --------------------------------  SETUP VARIABLES ------------------------------------

-- Setup variables
local destinations = {"Distretto", "Città", "Regione nazionale", "Regione continentale", "Stato", "Continente", "Parco", "Monte", "Sito archeologico", "Massa d'acqua"}
local thematicTypes = {"Aeroporto", "Frasario", "Itinerario", "Sentiero", "Tematica"}
local levels = {'Abbozzi', 'Articoli usabili', 'Guide', 'Articoli in vetrina', 'Articoli senza livello'}


-- --------------------------------  AUX FUNCTIONS ------------------------------------

local function _categoryExists(catName)
    local title = mw.title.new('Category:' .. catName)
    return title and title.exists or false
end

local function getCategoryCount(categoryName, flag)
    return mw.site.stats.pagesInCategory(categoryName, flag or 'pages')
end


-- --------------------------------  CALC SUM AND ARTICLE COUNTS ------------------------------------


-- ----------- TOTALS AND SUBTOTALS -------------------------

local function calcSummary(articleTypes, level)
    local sum = 0
    for _, articleType in ipairs(articleTypes) do
        local catName = articleType .. (level and " - " .. level or "")
        if _categoryExists(catName) then
            sum = sum + getCategoryCount(catName, "pages")
        end
    end
    return sum
end

function p.totalDestinations()
    local sum = calcSummary(destinations,nil) -- all levels
    return mw.language.getContentLanguage():formatNum(sum)
end

function p.totalDestinationsByLevel(frame)
    local level = frame.args["livello"]
	if not level or level == '' then
        error("Per il calcolo delle somme per livello è necessario inserire il parametro con il livello desiderato.")
    end

    local sum = calcSummary(destinations,level)
    return mw.language.getContentLanguage():formatNum(sum)
end


function p.totalThematicArticles()
    -- Handling Frasari e Tematiche (purtroppo il nome delle categorie non è consistente qui
    -- Per i livelli abbiamo come dapertutto "Tematica - Abbozzi",  "Tematica - Guide"...
    -- ma per la categoria generale i nomi sono "Frasari" e "Tematiche turistiche"
    local sum = calcSummary(thematicTypes,nil) +
                getCategoryCount("Frasari", "pages") +
                getCategoryCount("Tematiche turistiche", "pages")

    return mw.language.getContentLanguage():formatNum(sum)
end

function p.totalThematicArticlesByLevel(frame)

	local level = frame.args["livello"]
	if not level or level == '' then
        error("Per il calcolo delle somme per livello è necessario inserire il parametro con il livello desiderato.")
    end
    local sum = calcSummary(thematicTypes,level)
    return mw.language.getContentLanguage():formatNum(sum)
end

function p.totalDisambiguation()
    local pages = getCategoryCount("Disambigue", "pages")
    return mw.language.getContentLanguage():formatNum(pages)
end

function p.totalPortals()
    local portals = getCategoryCount("Portali", "pages")
    return mw.language.getContentLanguage():formatNum(portals)
end

function p.totalUNESCO()
    local unesco = getCategoryCount("Liste dei patrimoni mondiali dell'umanità", "pages")
    return mw.language.getContentLanguage():formatNum(unesco)
end

function p._grandTotal()
    local total_destinations = calcSummary(destinations,nil)
    local total_thematic = calcSummary(thematicTypes,nil) +
                getCategoryCount("Frasari", "pages") +
                getCategoryCount("Tematiche turistiche", "pages")

    local total_disambiguation = getCategoryCount("Disambigue", "pages")
    local total_portals = getCategoryCount("Portali", "pages")
    local total_unesco = getCategoryCount("Liste dei patrimoni mondiali dell'umanità", "pages")

    local sum = total_destinations + total_thematic + total_disambiguation + total_portals + total_unesco
    return sum
end

function p.grandTotal()
    local sum = p._grandTotal()
    return mw.language.getContentLanguage():formatNum(sum)
end

function p.totalUncategorized()
    local uncategorized = mw.site.stats.articles - p._grandTotal() 
    return mw.language.getContentLanguage():formatNum(uncategorized)
end


-- ----------- PERCENTAGES FOR THE COLORED BARS -------------------------

function p.percentagePerArticleType(frame)
	local articleType = frame.args["tipo"]
    local level = frame.args["livello"]
    local parentCat = frame.args["parent"] or articleType -- per i casi in cui la categoria senza livello differisca nel nome da quelle con i livelli
    local percentage = "0"

	if not level or not articleType or level == '' or articleType == '' then
        error("I parametri 'tipo' e 'livello' sono obbligatori.")
        return percentage
    end

    if not _categoryExists(parentCat) then
        error("La categoria " .. parentCat .. " non esiste.")
        return percentage
    end

	local total = getCategoryCount(parentCat, "pages")
    local catName = articleType .. " - " .. level
    if _categoryExists(catName) then
    	local count = getCategoryCount(catName,"pages")
        percentage = count/total*100
        percentage = string.format("%.3f", percentage)
    end

    return percentage
end

function p.percentageByTypeAndLevel(frame)
    local type = frame.args["tipo"] -- "destinazioni" o "tematiche"
    local level = frame.args["livello"]
    local total = 0
    local subtotal = 0
    local percentage = "0"

    if not level or not type or level == '' or type == '' then
        error("I parametri 'tipo' e 'livello' sono obbligatori.")
        return percentage
    end

    if type == "destinazioni" then
        total = calcSummary(destinations,nil)
        subtotal = calcSummary(destinations,level)
    elseif type == "tematiche" then
        total = calcSummary(thematicTypes,nil)
        subtotal = calcSummary(thematicTypes,level)
    else
        error("Il parametro 'tipo' deve essere 'destinazioni' o 'tematiche'.")
        return percentage
    end

    if total > 0 then
        percentage = string.format("%.3f",  subtotal/total*100)
    end

    return percentage
end

return p