Module:Licence
De Nefald
Autres actions
La documentation pour ce module peut être créée à Module:Licence/doc
-- Module:Licence
-- Boîte de licence pilotée par 'type' + surcharge des paramètres.
-- Auteur: Nefald (exemple)
local p = {}
local u = {}
-- Sécurité namespace
function u.isFileNs()
local title = mw.title.getCurrentTitle()
return title.nsText == 'Fichier'
end
-- Split "a;b,c" -> { "a", "b", "c" }
function u.splitList(s)
if not s or s == '' then return {} end
s = mw.ustring.gsub(s, '\n', ';')
local t = {}
for item in mw.text.gsplit(s, '[;,]+', false) do
item = mw.text.trim(item)
if item ~= '' then table.insert(t, item) end
end
return t
end
-- Fusion table superficielle (args > defaults)
function u.merge(defaults, args)
local out = {}
for k,v in pairs(defaults or {}) do out[k] = v end
for k,v in pairs(args or {}) do
if v ~= '' and v ~= nil then out[k] = v end
end
return out
end
-- Registre des licences: complète/ajuste icônes, cat, liens selon tes assets/pages locales
local REG = {
['mojang'] = {
titre = 'Licence Mojang',
icone = 'Minecraft icons crafting table.svg',
texte = "Ce fichier (capture d’écran, texture ou élément visuel) provient de Minecraft et est la propriété de Mojang Studios / Microsoft. Son utilisation est autorisée selon les conditions de Mojang (fansites/médias communautaires), sous réserve de respecter la marque et de ne pas suggérer une affiliation officielle.",
conditions = 'Pas d’usage commercial sans autorisation expresse;Conserver les mentions de marque et copyright;Respecter les directives de marque Mojang/Minecraft',
lien_licence = 'https://www.minecraft.net/',
categorie = 'Fichiers sous licence Mojang',
attribution = 'Capture d’écran Minecraft – © Mojang Studios/Microsoft'
},
['gfdl'] = {
titre = 'GNU Free Documentation License (GFDL)',
icone = 'GFDL-Logo.svg',
texte = 'Ce fichier est sous licence GNU Free Documentation License.',
conditions = 'Attribution requise;Copyleft;Fournir le texte intégral de la licence lors de la réutilisation',
lien_licence = 'https://www.gnu.org/licenses/fdl-1.3.html',
categorie = 'Fichiers sous GFDL',
attribution = 'Auteur — Titre, GFDL 1.3'
},
['artlibre'] = {
titre = 'Licence Art Libre',
icone = 'Copyleft.svg',
texte = 'Ce fichier est diffusé sous Licence Art Libre.',
conditions = 'Attribution;Partage à l’identique',
lien_licence = 'https://artlibre.org/licence/lal/',
categorie = 'Fichiers sous Licence Art Libre',
attribution = 'Auteur — Titre, Licence Art Libre'
},
['cc-by'] = {
titre = 'Creative Commons Attribution (CC BY)',
icone = 'CC BY icon.svg',
texte = 'Ce fichier est sous Creative Commons Attribution.',
conditions = 'Attribution requise;Usage commercial autorisé;Œuvres dérivées autorisées',
lien_licence = 'https://creativecommons.org/licenses/by/4.0/',
categorie = 'Fichiers sous CC BY',
attribution = 'Auteur — Titre, CC BY 4.0'
},
['cc-by-nc'] = {
titre = 'Creative Commons BY-NC',
icone = 'CC BY-NC icon.svg',
texte = 'Ce fichier est sous Creative Commons Attribution – Pas d’utilisation commerciale.',
conditions = 'Attribution;Pas d’usage commercial;Œuvres dérivées autorisées',
lien_licence = 'https://creativecommons.org/licenses/by-nc/4.0/',
categorie = 'Fichiers sous CC BY-NC',
attribution = 'Auteur — Titre, CC BY-NC 4.0'
},
['cc-by-nd'] = {
titre = 'Creative Commons BY-ND',
icone = 'CC BY-ND icon.svg',
texte = 'Ce fichier est sous Creative Commons Attribution – Pas de travaux dérivés.',
conditions = 'Attribution;Pas de modifications;Usage commercial autorisé',
lien_licence = 'https://creativecommons.org/licenses/by-nd/4.0/',
categorie = 'Fichiers sous CC BY-ND',
attribution = 'Auteur — Titre, CC BY-ND 4.0'
},
['cc-by-sa'] = {
titre = 'Creative Commons BY-SA',
icone = 'CC BY-SA icon.svg',
texte = 'Ce fichier est sous Creative Commons Attribution – Partage dans les mêmes conditions.',
conditions = 'Attribution;Partage à l’identique',
lien_licence = 'https://creativecommons.org/licenses/by-sa/4.0/',
categorie = 'Fichiers sous CC BY-SA',
attribution = 'Auteur — Titre, CC BY-SA 4.0'
},
['cc-by-nc-sa'] = {
titre = 'Creative Commons BY-NC-SA',
icone = 'CC BY-NC-SA icon.svg',
texte = 'Ce fichier est sous Creative Commons Attribution – Pas d’usage commercial – Partage dans les mêmes conditions.',
conditions = 'Attribution;Pas d’usage commercial;Partage à l’identique',
lien_licence = 'https://creativecommons.org/licenses/by-nc-sa/4.0/',
categorie = 'Fichiers sous CC BY-NC-SA',
attribution = 'Auteur — Titre, CC BY-NC-SA 4.0'
},
['cc-pd'] = {
titre = 'Creative Commons CC0 (domaine public)',
icone = 'CC-zero.svg',
texte = 'Ce fichier est placé sous CC0 (aucun droit réservé) — domaine public.',
conditions = 'Aucune obligation légale;Attribution appréciée mais non requise',
lien_licence = 'https://creativecommons.org/publicdomain/zero/1.0/',
categorie = 'Fichiers dans le domaine public',
attribution = 'Facultative'
},
['non-specifie'] = {
titre = 'Licence non spécifiée',
icone = 'OOjs_UI_icon_alert-warning.svg',
texte = 'Ce fichier n’indique aucune licence. Merci d’ajouter une licence valide ou de fournir les informations nécessaires.',
categorie = 'Fichiers à licence non spécifiée'
},
['incertaine'] = {
titre = 'Licence incertaine',
icone = 'OOjs_UI_icon_helpNotice-ltr.svg',
texte = 'L’uploadeur n’est pas certain de la licence applicable à ce fichier.',
categorie = 'Fichiers à licence incertaine'
},
['domaine-public'] = {
titre = 'Domaine public',
icone = 'Public domain mark.svg',
texte = 'Ce fichier est dans le domaine public (droits expirés ou renoncés).',
conditions = 'Réutilisation libre;Attribution appréciée mais non obligatoire',
lien_licence = 'https://creativecommons.org/publicdomain/mark/1.0/',
categorie = 'Fichiers dans le domaine public'
},
['copyright-permission'] = {
titre = 'Copyright avec permission',
icone = 'OOjs_UI_icon_articleRedirect-ltr.svg',
texte = 'Ce fichier est protégé par le droit d’auteur, mais son utilisation sur ce wiki est autorisée par le détenteur des droits.',
categorie = 'Fichiers sous copyright avec permission'
},
['marque'] = {
titre = 'Marque déposée',
icone = 'Registered TM symbol.svg',
texte = 'Ce fichier (logo ou marque) est protégé en tant que marque déposée.',
conditions = 'Usage nominatif;Pas d’aval ou d’affiliation implicite;Respect des guides de marque',
categorie = 'Logos et marques déposées'
},
['image-personnelle'] = {
titre = 'Image personnelle',
icone = 'OOjs_UI_icon_userAvatar.svg',
texte = "Image personnelle téléversée par l’utilisateur.",
conditions = "Usage strictement limité à la page utilisateur;Interdite dans les articles",
categorie = 'Images personnelles'
},
['exception'] = {
titre = 'Exception au droit d’auteur',
icone = 'OOjs_UI_icon_lock.svg',
texte = "Ce fichier est utilisé au titre d’une exception au droit d’auteur (ex. courte citation, droit à l’information), strictement dans le cadre légal applicable.",
conditions = 'Résolution minimale suffisante;Usage contextuel et nécessaire;Pas d’alternative libre raisonnable',
categorie = "Fichiers sous exception au droit d’auteur"
}
}
-- Rendu principal
function p.boite(frame)
local args = frame:getParent() and frame:getParent().args or frame.args
local t = (args.type or args[1] or ''):lower()
local def = REG[t] or {}
-- Fusion defaults (du type) avec args
local data = u.merge(def, args)
-- Avertissements par défaut pour certains types
if t == 'non-specifie' then
data.avertissement = data.avertissement or 'Sans régularisation, ce fichier pourra être supprimé.'
elseif t == 'copyright-permission' then
data.permission = data.permission or 'Joindre ou mentionner l’e-mail/permission explicite (ticket) sur la page de discussion.'
data.avertissement = data.avertissement or 'Toute réutilisation hors de ce wiki nécessite l’accord du titulaire des droits.'
elseif t == 'mojang' then
data.avertissement = data.avertissement or "Les assets restent protégés par le droit d’auteur et la marque. Une réutilisation hors du wiki peut être restreinte."
elseif t == 'image-personnelle' then
-- Intègre paramètre Utilisateur pour l’affichage
if args.Utilisateur and args.Utilisateur ~= '' then
data.texte = string.format("Image personnelle téléversée par l’utilisateur '''%s'''.", args.Utilisateur)
data.conditions = data.conditions or "Usage strictement limité à la page utilisateur;Interdite dans les articles"
end
end
-- Construction HTML
local root = mw.html.create()
if not u.isFileNs() then
root:tag('div')
:addClass('mw-warning plainlinks')
:wikitext('⚠️ Ce modèle est destiné au namespace Fichier:. Actuellement : « '..mw.title.getCurrentTitle().prefixedText..' ».')
end
local box = root:tag('div')
:addClass('licencebox')
:cssText('border:1px solid #ccc;background:#f8f9fa;padding:1em;margin:1em 0;')
local flex = box:tag('div')
:css('display','flex')
:css('gap','12px')
:css('align-items','flex-start')
local iconDiv = flex:tag('div'):css('flex','0 0 auto')
local icone = data.icone or 'OOjs_UI_icon_lock-ltr.svg'
iconDiv:wikitext(string.format('[[Fichier:%s|48x48px|class=licencebox-icon]]', icone))
local content = flex:tag('div'):css('flex','1 1 auto')
content:tag('div')
:css('font-weight','bold')
:css('font-size','120%')
:wikitext(data.titre or 'Licence')
-- Texte + conditions
local texte = data.texte or '<span style="color:#777;">Déclarez ici les conditions d’utilisation de ce fichier.</span>'
content:tag('div'):addClass('licence-texte'):wikitext(texte)
local conds = u.splitList(data.conditions)
if #conds > 0 then
local ul = content:tag('ul'):css('margin','0.5em 0')
for _, v in ipairs(conds) do
ul:tag('li'):wikitext(v)
end
end
-- Méta
local meta = content:tag('div'):css('margin-top','0.6em'):css('font-size','95%')
local function addMeta(label, value, isCode)
if value and value ~= '' then
local div = meta:tag('div')
div:tag('b'):wikitext(label .. ' : ')
if isCode then
div:tag('code'):wikitext(value)
else
div:wikitext(value)
end
end
end
addMeta('Auteur', data.auteur)
addMeta('Source', data.source)
addMeta('Date', data.date)
addMeta('Formule d’attribution conseillée', data.attribution, true)
addMeta('Permission', data.permission)
if data.lien_licence and data.lien_licence ~= '' then
meta:tag('div'):wikitext(string.format("'''Texte de la licence''' : [%s lire la licence]", data.lien_licence))
end
-- Avertissement
if data.avertissement and data.avertissement ~= '' then
content:tag('div')
:css('margin-top','0.6em')
:css('background','#fff3cd')
:css('border','1px solid #ffeeba')
:css('padding','0.6em')
:wikitext(data.avertissement)
end
-- Catégories automatiques (sauf nocat)
if not data.nocat or data.nocat == '' or data.nocat == '0' then
-- Catégorie par défaut du type
if data.categorie and data.categorie ~= '' then
root:wikitext(string.format('[[Catégorie:%s]]', data.categorie))
end
-- Catégories additionnelles
for _, cat in ipairs(u.splitList(data.categories)) do
root:wikitext(string.format('[[Catégorie:%s]]', cat))
end
end
return tostring(root)
end
return p