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 9 octobre 2025 à 09:07 par Hiob (discussion | contributions) (Création)
(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