Basculer le menu
Changer de menu des préférences
Basculer le menu personnel
Non connecté(e)
Votre adresse IP sera visible au public si vous faites des modifications.
Version datée du 10 octobre 2025 à 07:34 par Hiob (discussion | contributions) (A protégé « Module:Licence » ([Modifier=Autoriser uniquement les administrateurs] (infini) [Renommer=Autoriser uniquement les administrateurs] (infini)) [protection en cascade])
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

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