Modulo:Software: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
recursion 4 perchè il caso peggiore si allunga con d:Q28920174 free software copyleft license < d:Q7603 GNU GPL
disattivo categorie al di fuori del NS0
 
(44 versioni intermedie di 7 utenti non mostrate)
Riga 11:
 
local MAX_RECURSION = 4 -- [[Modulo:Software/man#Considerazioni implementative]]
 
local UNKNOWN_WD_LANGUAGE = "[[Categoria:Linguaggio di programmazione da Wikidata non previsto]]"
local UNKNOWN_WD_LICENSE = ""
local UNKNOWN_WD_TOOLKIT = "[[Categoria:Toolkit o framework dell'interfaccia grafica non previsto]]"
local FREE_WITHOUT_LANGUAGE = '[[Categoria:Software libero senza linguaggio]]'
 
local TEMPLATE_UNKNOWN_ARG_WARN = "&nbsp;<span style=\"font-size:75%\">(non&nbsp;in&nbsp;[[Template:Software#Linguaggi|lista]])</span>"
local TEMPLATE_UNKNOWN_ARG_CAT = "[[Categoria:Software in linguaggio non riconosciuto]]"
 
local LICENSE_CAT = "Software con licenza %s"
-- "Software con licenza GNU GPL"
 
local LICENSE_CAT_SHORTER = "Software %s"
-- "Software freeware"
 
local YEAR_CAT = 'Software del %d'
 
-------------------------------- Sgabuzzino ------------------------------------
 
--[[
-- TODO Spostare in Modulo:Wikidata
* Get the ID from a statement (claim) of type wikibase-id
function p._subclassOf(args)
*
local statements = mWikidata._getProperty({'P279', from = args.from, formatting = 'raw'}, true)
* @param table Wikibase claim
if statements then
* @return string|nil
for _, statement in ipairs(statements) do
]]
for _, entityId in ipairs(args) do
local function statementQID( claim )
if statement == entityId then
return claim.mainsnak.datavalue and claim.mainsnak.datavalue.value.id
return true
end
 
end
--[[
end
* @param string Wikidata element
* @TODO ora prende il primo, a prescindere dalla lingua (credo).
* @return string
]]
local function shortWikidataLabel(from)
local s = ''
local label = mw.wikibase.label(from)
local sitelink = mw.wikibase.sitelink(from) or label
if string.len(label) > 10 then
label = mWikidata._getProperty( { 'P1813', n = 1, from = from } ) or label
end
return "[[" .. sitelink .. "|" .. label .. "]]"
return false
end
 
 
--[[
Line 51 ⟶ 78:
--[[
* Poi non ditemi che PHP fa schifo. asd.
* Sembra che l'operatore "#" ogni tanto non vada col Modulo:Wikidata.
* 00:28, 28 feb 2017‎ Valerio Bozzolan
* 00:28, 28 feb 2017 Valerio Bozzolan
]]
local function count(t)
local i = 0
for _,___ in pairs(t) do
i = i + 1
end
Line 69 ⟶ 97:
end
 
local function onlySoftwareArguments(frame)
------------------------------- Frontend ---------------------------------------
return getArgs(frame, {wrappers = 'Template:Software'} )
end
 
--[[
function p.isFreeSoftware(frame)
* Restituisce SOLO l'argomento `from` da dare in pasto a varie funzioni del Modulo:Wikidata
return yesNoNil( p._isFreeSoftware(frame) )
* @param frame table
* @return string|nil
]]
local function fromItem(frame)
return getArgs(frame).from
end
 
--[[
* Analogo a fromItem() ma viene recuperato da Property:P301 (category's main topic).
*
* @return string|nil
]]
local function fromItemMainTopic()
local from = mWikidata._getClaims('P301')
from = from and from[1]
if not from then
error("Questa non è una categoria, o è assente la proprietà Wikidata P301")
end
return statementQID(from)
end
 
--[[
* Formatta una categoria.
*
* @param category string Primo argomento per sprinf
* @param part string Placeholder per sprintf
* @param man boolean Mostrare solo la categoria invece che categorizzare?
* @return string
]]
local function formatCategory(category, part, man)
local colon = man and ':' or ''
return "[[" .. colon .. "Categoria:" .. string.format(category, part) .. "]]"
end
 
------------------------------- Frontend ---------------------------------------
 
function p.shouldHaveALanguage(frame)
return yesNo( p._shouldHaveALanguage( onlySoftwareArguments(frame) ) )
end
 
function p.specifiesALanguage(frame)
return yesNo( p._specifiesALanguage( onlySoftwareArguments(frame) ) )
end
 
function p.specifiesAToolkit(frame)
return yesNo( mWikidata._getClaims('P277') )
end
 
function p.isFreeSoftware(frame)
return yesNoNil( p._isFreeSoftware( onlySoftwareArguments(frame) ) )
end
 
function p.hasAFreeLicense(frame)
return yesNoNil( p._hasAFreeLicense( fromItem(frame) ) )
end
 
function p.hasAProprietaryLicense(frame)
return yesNoNil( p._hasAProprietaryLicense( fromItem(frame) ) )
end
 
function p.specifiesALanguagelanguageCategories( frame )
return yesNo( p._specifiesALanguage_languageCategories( fromItem( frame ) )
end
 
--[[
function p.licenses(frame)
* Categorizza una voce.
local s = ''
* @return string|nil
for i, l in pairs( p._licenses(frame) ) do
]]
local space = i == 1 and '' or '<br />'
function p.categories(frame)
s = s .. space .. mWikidata._formatStatement(l, {formatting = 'raw'})
if p._categorize( onlySoftwareArguments(frame) ) then
return p.licenseCategories(frame) .. p.toolkitCategories(frame) .. p.yearsCategories(frame)
end
return snil
end
 
function p.wikidataCategoriesFromMainTopic(frame)
local s = p._wikidataCategories( fromItemMainTopic() )
return s .. string.format('[[Categoria:P301 %s Wikidata]]', s and 'letta da' or 'assente su')
end
 
--[[
* Categorizza una pagina qualsiasi.
* @return string|nil
]]
function p.wikidataCategories(frame)
return p._wikidataCategories( fromItem(frame) ) or nil
end
 
--[[
* Tutte le categorie applicabili da Wikidata.
*
* Per ora ci sono solo le licenze, ma qui ci devono andare anche i linguaggi.
*
* @param from string|nil Wikidata Item
* @return string
]]
function p._wikidataCategories(from)
return p._licenseCategories(from) .. p._languageCategories(from) .. p._toolkitCategories(from) .. p._yearsCategories(from)
end
 
--[[
* Categorie legate alle licenze.
* @return string
]]
function p.licenseCategories(frame)
return p._licenseCategories( fromItem(frame) )
end
 
--[[
* Categorie legate al toolkit.
* @return string
]]
function p.toolkitCategories(frame)
return p._toolkitCategories( fromItem(frame) )
end
 
--[[
* Categoria legato all'anno di fondazione.
* @return string
]]
function p.yearsCategories(frame)
return p._yearsCategories( fromItem(frame), onlySoftwareArguments(frame).DataPrimaVersione )
end
 
--[[
* Linguaggi di programmazione.
*
* @return string
]]
function p.languages(frame)
local s = ''
 
local args = frame and onlySoftwareArguments(frame)
--[[
local categorize = p._categorize(args)
* Argomenti ereditati dal Template:Software e da Wikidata
local is_free = p._isFreeSoftware(args)
]]
local tl_has = p._templateHasLanguages(args) and true or false --exclude nil
local args = frame and getArgs(frame)
local categorizzatl_languages = p._getTemplateLanguages(args['Categorie'])
local libero = p.isFreeSoftware(frame)
 
--[[
* Linguaggi dal Template:Software e da Wikidata
]]
local tl_has = p._templateHasLanguages(frame) and true or false
local tl_languages = p._getTemplateLanguages(frame)
local wd_languages = mWikidata._getClaims('P277')
local altri = args['LinguaggioAltri']
 
-- È il namespace principale?
local nszero = mw.title.getCurrentTitle().namespace == 0
 
-- Tutti i linguaggi sono identificati?
local allFound = true
 
-- Il template si è arricchito grazie a Wikidata?
local improved = false
 
-- Tutti i linguaggi sono identificati da Wikidata e dal template?
local tl_allFound = true
local wd_allFound = true
 
-- Il template non mostra alcun linguaggio?
local noLanguages = not tl_has and not wd_languages
 
local outputLanguages = {} -- {key = {label1, category1}, key = {label2, category2}}
local outputLanguage = function(label, category, note)
return {label = label, category = category, note = note or '' }
end
 
if wd_languages then
for i, language in pairs(wd_languages) do
local wikidataIDlanguageId = mWikidata._formatStatementstatementQID(language, {formatting = 'raw'})
if languageId then
language = conf.wikidataToLanguageSlug[wikidataID]
if language then = conf.language[languageId]
outputLanguages[languageId] = outputLanguage(
if tl_languages[language] == nil then
shortWikidataLabel(languageId),
-- 'c' = 'nota linguaggio c'
tl_languages[language] =and ''p._languageCategory(language, is_free)
)
noLanguages = false
improved = true
end
else
allFound = false
end
end
Line 150 ⟶ 277:
if tl_has then
-- Wikidata ha migliorato il template e il template aveva già altri valori
s = s .. '[[Categoria:Linguaggio di programmazioneP277 differente dasu Wikidata]]'
else
-- Wikidata ha migliorato il template che era vuoto
s = s .. '[[Categoria:LinguaggioP277 di programmazione lettoletta da Wikidata]]'
end
else
if p._templateHasExtraInformations(args) or count(tl_languages) > count(wd_languages) then
-- No, `#var` non fa quello che uno si aspetterebbe
if p._templateHasExtraInformations(frame) or count(tl_languages) > count(wd_languages) then
-- Nel template c'è qualcosa in più rispetto a Wikidata
s = s .. '[[Categoria:Linguaggio di programmazioneP277 differente dasu Wikidata]]'
elseif count(wd_languages) ~= 0 then
else
-- Non ha migliorato niente perchè sono gli stessi valori
s = s .. '[[Categoria:Linguaggio di programmazioneP277 uguale asu Wikidata]]'
end
end
Line 169 ⟶ 295:
if tl_has and nszero then
-- solo se il template specifica linguaggi ma Wikidata no
s = s .. '[[Categoria:Linguaggio di programmazioneP277 assente su Wikidata]]'
end
end
 
if noLanguages and nszerotl_languages then
for languageSlug, note in pairs(tl_languages) do
if p._isFreeSoftware(frame) then
if languageSlug == 'sconosciuto' then
s = s .. '[[Categoria:Software libero senza linguaggio]]'
outputLanguages[languageSlug] = outputLanguage(
else
"Sconosciuto",
s = s .. '[[Categoria:Software senza linguaggio]]'
TEMPLATE_UNKNOWN_ARG_CAT,
note
)
else
local languageId = conf.languageSlugToWikidata[languageSlug]
local language = conf.language[languageId]
if language then
outputLanguages[languageId] = outputLanguage(
shortWikidataLabel(languageId),
p._languageCategory(language, is_free),
note
)
else
-- Mostrala comunque, a caso, così, tanto per
outputLanguages[languageSlug] = outputLanguage(
languageSlug,
p._languageCategory(languageSlug, is_free),
note
)
tl_allFound = false
end
end
end
end
 
if not allFound and nszero then
s = s .. '[[Categoria:Linguaggio di programmazione da Wikidata non previsto]]'
end
 
local i = 0
for languageid, notelanguage in pairs(tl_languagesoutputLanguages) do
local glue = i > 0 and '<br />' or ''
s = s .. glue .. frame:expandTemplate{language.label .. language.note .. (categorize and language.category or '')
title = 'Software/Linguaggio',
args = {language, categorizza, libero}
} .. note
i = i + 1
end
 
if altriargs['LinguaggioAltri'] then
local glue = i > 0 and '<br />' or ''
s = s .. altri
s = s .. glue .. args['LinguaggioAltri']
end
 
if nszero then
if not tl_allFound then
s = s .. TEMPLATE_UNKNOWN_ARG_WARN .. TEMPLATE_UNKNOWN_ARG_CAT
end
if not wd_allFound then
s = s .. UNKNOWN_WD_LANGUAGE
end
if noLanguages and is_free then
s = s .. FREE_WITHOUT_LANGUAGE
end
end
 
return s
end
 
function p.manLanguages(frame)
local s = '<table class="wikitable"><tr><th>Parametro</th><th>Risultato</th><th>Categoria automatica</th></tr>'
local TD = '<td>%s</td>'
for id, language in pairs( conf.language ) do
s = s .. '<tr>'
local slugs, i = '', 0
for slug, sub_id in pairs( conf.languageSlugToWikidata ) do
if sub_id == id then
local glue = i > 0 and '<br />' or ''
slug = "<code>" .. slug .. "</code>"
slugs = slugs .. glue .. slug
i = i + 1
end
end
s = s .. string.format(TD, slugs)
s = s .. string.format(TD, shortWikidataLabel(id) )
s = s .. string.format(TD, p._languageCategory(language, nil, true, '//') )
s = s .. '</tr>'
end
return s .. '</table>'
end
 
-------------------------------- Backend ---------------------------------------
 
--[[
* Categorizzare?
*
* @return true|false
]]
function p._categorize(args)
local ns = mw.title.getCurrentTitle().namespace
local v = args['Categorie']
return ns == 0 and (v == nil or mw.ustring.lower(v) ~= 'no')
end
 
--[[
Line 209 ⟶ 396:
* @return true|false|nil
]]
function p._isFreeSoftware(frameargs)
local is_wd = p._isFreeSoftwareByWikidata()
local isnt_wd = p._isProprietarySoftwareByWikidata()
local is_tp = p._isFreeSoftwareByTemplate(frameargs)
 
local is = nil
if is_wd then
Line 247 ⟶ 435:
* Per quanto riguarda Wikidata è ridondante col campo licenza P275.
*
* @param string from Wikidata item
* @return true|false
]]
function p._isFreeSoftwareByWikidata(from)
-- Q341 free software
-- Q1130645 open-source software
return mWikidata._instanceOf({'Q341', 'Q1130645', from = from}) or p._hasAFreeLicense(from)
end
 
Line 260 ⟶ 449:
* Per quanto riguarda Wikidata è ridondante col campo licenza P275.
*
* @param from string Wikidata item
* @return true|false
]]
function p._isProprietarySoftwareByWikidata(from)
-- Q218616 proprietary software
-- Q178285 freeware TODO: impropria, subclass of precedente
return mWikidata._instanceOf({'Q218616', 'Q178285', from = from}) or p._hasAProprietaryLicense(from)
end
 
Line 273 ⟶ 463:
* @return nil|true|false
--]]
function p._isFreeSoftwareByTemplate(frameargs)
local is = nil
local args = frame and getArgs(frame)
local v = args['SoftwareLibero']
if v then
Line 289 ⟶ 478:
* @return true|nil
]]
function p._shouldHaveALanguage(frameargs)
return p._isFreeSoftware(frameargs) or p._specifiesALanguage(frameargs)
end
 
Line 298 ⟶ 487:
* @return truly|nil
]]
function p._specifiesALanguage(frameargs)
return p._templateHasLanguages(args) or mWikidata._N({ 'P277' }) > 0
local args = frame and getArgs(frame)
return p._templateHasLanguages(frame) or mWikidata._getClaims('P277')
end
 
Line 308 ⟶ 496:
* @return truly|nil
]]
function p._templateHasLanguages(frameargs)
local args = frame and getArgs(frame)
return args['Linguaggio'] or args['NotaLinguaggio'] or args['LinguaggioAltri']
end
Line 318 ⟶ 505:
* @return truly|nil
]]
function p._templateHasExtraInformations(frameargs)
local args = frame and getArgs(frame)
return args['LinguaggioAltri'] or args['NotaLinguaggio'] or args['NotaLinguaggio2'] or args['NotaLinguaggio3']
end
Line 330 ⟶ 516:
* 'c++' → 'c++'
*
* @param string
* @see Template:Software/Linguaggio
* @return string
Line 345 ⟶ 532:
* @return string[] = 'c' => 'nota linguaggio c', 'c++' = '', ..
]]
function p._getTemplateLanguages(frameargs)
local languages = {}
for i=0,3 do
local args = frame and getArgs(frame)
local vj = args[i == 0 and 'Linguaggio'] or i
local v = args['Linguaggio' .. j]
if v then
languages[ p._preferredLanguageSlug(v) ] = args['NotaLinguaggio'] or ''
end
for i=1,3 do
v = args['Linguaggio' .. i]
if v then
languages[v = p._preferredLanguageSlug(v)
languages[ v ] = args['NotaLinguaggio' .. ij] or ''
end
end
Line 362 ⟶ 546:
 
--[[
* Questa licenza è una classe radicedirettamente identificabile?
*
* @TODO: Rewrite in qualche modo più umano.
* @param license string
*
* @param license string Wikidata item
* @return FREE|PROPRIETARY|UNKNOWN
* ]]
function p._singleLicenseType(license)
-- Q3943414Q1156659 free softwareOSI-approved license
-- Q14624820Q5975031 non-free software copyleft license
-- Q3943414 free software license
-- Q31202214 proprietary software license
-- Q218616 proprietary software
-- Q3238057 proprietary license!
 
--[[
Line 376 ⟶ 565:
* le prossime tre righe riassumino l'*unica* parte piacevole del Lua.
]]
return (license == 'Q3943414' or license == 'Q5975031' or license == 'Q1156659') and FREE
or (license == 'Q14624820Q31202214' or license == 'Q218616') or license == 'Q3238057') and PROPRIETARY
or UNKNOWN
end
 
Line 384 ⟶ 573:
* Fra queste licenze c'è una classe radice identificabile?
*
* @param license string Wikidata item
* @return FREE|PROPRIETARY|UNKNOWN
* ]]
Line 411 ⟶ 600:
* per casi peggiori.
*
* @param license string Wikidata item
* @param i int|nil Livello di
* @see Modulo:Software/man#Considerazioni implementative
* @param string license
* @param int i Livello di
* @return UNKNOWN|FREE|PROPRIETARY
]]
Line 482 ⟶ 671:
* Licenze da Wikidata.
*
* @param from string|nil Wikidata item
* @return table|nil
]]
local _licenses_cache = false
function p._licenses(from)
if _licenses_cache == false then
_licenses_cache = mWikidata._getClaims('P275', {from = from}) or {}
end
return _licenses_cache
Line 493 ⟶ 683:
 
--[[
* Ha una licenza di un certo tipo di licenza?
*
* Per motivi di performance dal 29 luglio 2017 si cerca solo fino alla prima licenza identificabile.
*
* @param type FREE|PROPRIETARY|UNKNOWN
* @param from string|nil Wikidata item
* @return true|false
]]
function p._hasALicenseOfType(type, from)
for _, l in pairs( p._licenses(from) ) do
l = statementQID(l)
l = mWikidata._formatStatement(l, {formatting = 'raw'})
if p._licenseType(l) == type then
local retrievedType = p._licenseType(l)
return true
if type ~= UNKNOWN then
return type == retrievedType
end
end
end
Line 509 ⟶ 705:
 
--[[
* La voce haè almeno unasotto licenza di software libero in Wikidata?
*
* @param from string|nil Wikidata item
* @return true|false
]]
function p._hasAFreeLicense(from)
return p._hasALicenseOfType(FREE, from)
end
 
--[[
* La voce haè almeno unasotto licenza di software proprietario in Wikidata?
*
* @param from string|nil Wikidata item
* @return true|false
]]
function p._hasAProprietaryLicense(from)
return p._hasALicenseOfType(PROPRIETARY, from)
end
 
--[[
--------------------------- Non usate. Perchè? Boh. ----------------------------
* Categorie legate alle licenze da Wikidata.
*
* @param from string|nil Wikidata Item
* @return string
]]
function p._licenseCategories(from)
local s = ''
for i, l in pairs( p._licenses( from ) ) do
local id = statementQID( l ) -- can be nil but don't care
local name = conf.licenseCategory[ id ]
if name then
local cat = conf.licenseCategoryShorter[id] and LICENSE_CAT_SHORTER or LICENSE_CAT
s = s .. formatCategory(cat, name)
else
s = s .. UNKNOWN_WD_LICENSE
end
end
return s
end
 
--[[
* Categorie legate ai linguaggi da Wikidata.
* Albero inverso di Modulo:Software/Configurazione
*
* @param from string|nil Wikidata Item
* 'cpp' → 'Q2407'
* @return string|nil
]]
function p._languageCategories(from)
local _languageSlugToWikidata = {}
local s = ''
function p._languageSlugToWikidata(slug)
local languages = mWikidata._getClaims('P277', {from = from} ) -- Property:programming language
if next(_languageSlugToWikidata) == nil then
local free = p._isFreeSoftwareByWikidata(from)
for q,l in pairs(conf.wikidataToLanguageSlug) do
local missing = false
_languageSlugToWikidata[l] = q
if languages then
for _, l in pairs( languages ) do
l = conf.language[ statementQID(l) ]
if l then
s = s .. p._languageCategory(l, free)
else
missing = true
end
end
elseif free then
s = FREE_WITHOUT_LANGUAGE
end
if missing then
return _languageSlugToWikidata[ p._preferredLanguageSlug(slug) ]
s = s .. UNKNOWN_WD_LANGUAGE
end
return s
end
 
--[[
* Categorie legate ai toolkit o framework dell'interfaccia grafica da Wikidata.
* Usata solo per debug.
*
* @param from string|nil Wikidata Item
* @return string
]]
function p.languageSlugToWikidata_toolkitCategories(framefrom)
local s = ''
return p._languageSlugToWikidata( getArgs(frame)[1] )
local toolkits = mWikidata._getClaims('P1414', {from = from} ) -- Property:GUI toolkit or framework
local free = p._isFreeSoftwareByWikidata(from)
local missing = false
if toolkits then
for _, t in pairs( toolkits ) do
t = conf.language[ statementQID( t ) ] -- the ID can be nil but don't care
if t then
s = s .. p._languageCategory(t, free)
else
missing = true
end
end
end
if missing then
s = s .. UNKNOWN_WD_TOOLKIT
end
return s
end
 
--[[
* La categoria di uno specifico linguaggio di programmazione.
* In realtà questa categorizzazione è analoga anche per i toolkit.
*
* @param language table
* @param free boolean|nil È software libero?
* @param man boolean|nil È a fini di documentazione?
* @param deefault string|nil Valore di default nel caso mancasse
* @see Modulo:Software/Configurazione
* @return string
]]
function p._languageCategory(lang, free, man, default)
local s
if lang.cat then
s = free and lang.free and "Software libero in %s" --free = true
or free == false and lang.nonfree and "Software proprietario in %s" --free = false
or "Software in %s" --free = nil
s = formatCategory(s, lang.cat, man)
end
return s or default or ''
end
 
--[[
* Categoria legata alla data di fondazione.
* @todo Capire quale deve prevalere fra data di pubblicazione e data di creazione
* @param from string|nil Wikidata Item
* @param value string|nil Local value
* @return string
]]
function p._yearsCategories(from, value)
local mCategoryByYear = require('Modulo:Categoria per anno')._main
local creation = mCategoryByYear( { YEAR_CAT, from = from, value = value, raw = true } )
if '' == creation then
return mCategoryByYear( { YEAR_CAT, from = from, value = value, prop = 'P577', checkCat = 'Data di pubblicazione', checkGenre = 'fs' } )
end
return mCategoryByYear( { YEAR_CAT, from = from, value = value } )
end