Module:Table

La bibliothèque libre.
Sauter à la navigation Sauter à la recherche
Documentation du module [voir] [modifier] [purger]
La documentation de ce module Scribunto écrit en Lua est incluse depuis sa sous-page de documentation.
Logo du langage Lua.
Ce modèle utilise le module Table, un script écrit dans le langage de programmation Lua. Toute expérimentation devrait être conduite d’abord via une sous-page bac à sable ou dans votre espace utilisateur. Voir le Projet:Scribunto (de la Wikipédia en français) si vous voulez en savoir plus.
Description
Ce modèle s’utilise pour créer une entrée de type table des matières, ou pour des tableaux simples.
Une entrée de table des matières comprend trois parties, de gauche à droite :
  • (optionnellement) le numéro de la section ;
  • un libellé ;
  • le numéro de page.
Syntaxe
{{Table|nodots| paramètre = valeur... }}
Paramètres

Paramètres généraux :

| espace= : marge avant et après l’entrée (par défaut : 0.125em).
| largeur= : largeur totale (par défaut : 100%).
| align= : alignement de la table (par défaut : center), valeurs possibles : left, right.
| couleur= : couleur du texte et des pointillés (par défaut la couleur courante non modifiée).
| couleur_fond= : couleur de l’arrière-plan (par défaut : #FFFFFF (blanc) si des pointillés sont présents, sinon transparent).

Paramètres concernant l'affichage du numéro de section :

| section= : numéro du chapitre, section (à séparer uniquement si ces numéros s’alignent à droite avant le titre).
| largeurs= : largeur de la cellule contenant la section, en pixels (par défaut : 45).
| aligns= : alignement de la section (par défaut : right), valeurs possibles : left, center.

Paramètres concernant l'affichage du libellé :

| titre= : libellé du chapitre ou de la section (en mettant le lien de la page, on pourra accéder directement à cette partie de texte).
| indentation= : alinéa de la première ligne, positive ou négative (par défaut en em : 0).
| indentation_unit = : unité d’indentation (par défaut : em).
| text_align= : alignement du texte (par défaut : justify), valeurs possibles : left, center, right.

Paramètres concernant l'affichage du numéro de page :

| nodots (ou 1 = nodots) : si présent, supprime les pointillés (utile surtout s’il n’y a pas de numéro de page aligné à droite).
| page= : numéro de la page (en mettant le lien de la page .djvu, on pourra accéder directement au mode page). Le modèle {{pli}} permet de construire un lien à partir du numéro de page et d'un décalage, sans inscrire à chaque fois le nom du fichier.
| largeurp= : largeur de la cellule contenant les pages en pixels (par défaut : 0).
}}
Exemples
71
175
281
I. Mémoire. Théorie générale des tremblemens de terre 
II. Mémoire. Relation chronologique des tremblemens de terre de la Suisse, depuis le VIe. Siècle jusqu’à nos jours. On a joint dans cette relation les tremblemens des autres Pays, qui coïncident avec ceux de la Suisse. On y fait en particulier observer ces secousses, qui semblent parcourir tout le globe de la terre. 
I. Mémoire. Théorie générale des tremblemens de terre 
II. Mémoire. Relation chronologique des tremblemens de terre de la Suisse, depuis le VIe. Siècle jusqu’à nos jours. On a joint dans cette relation les tremblemens des autres Pays, qui coïncident avec ceux de la Suisse. On y fait en particulier observer ces secousses, qui semblent parcourir tout le globe de la terre. 
Page
Mémoire. Théorie générale des tremblemens de terre 
 1
Mémoire. Relation chronologique des tremblemens de terre de la Suisse, depuis le VIe. Siècle jusqu’à nos jours. On a joint dans cette relation les tremblemens des autres Pays, qui coïncident avec ceux de la Suisse. On y fait en particulier observer ces secousses, qui semblent parcourir tout le globe de la terre. 
 22
Entrée de table éclatée sur deux pages
Lorsqu'une entrée de table commence au bas d'une page et se poursuit en haut de la page suivante, il est possible de concilier la mise en page originale tout en assurant une transclusion correcte. On utilise pour ce faire une habile combinaison de balises <noinclude> et <includeonly> d'une part, et des valeurs particulières de page=&nbsp; et section=&nbsp; pour les alignements.
Chapitre XVIQui met tour à tour en scène Mira la Voyante, Zéphyrine et le fatal Amédée, et qui illustre, par l’exemple terrible de M. Sariette, cette
 

...

  
pensée d’Euripide, que Jupiter prive de sagesse ceux qu’il veut perdre. 
 161
Cas des epubs
Dans le cas de constitution d’une table des matières lisible en exportation ePub, il faudra :
  1. Constituer chaque entrée de la table par le modèle table en veillant à bien utiliser les Titrex ({{t2}}, {{t3}}, ({{t4}}).
  2. Constituer les chapitres/sections sur une page d’appel (comme ici).
  3. Exporter sur Export tool of Wikisource books (expérimental mais fonctionnel).
Remarque : le fichier ePub ou la page web constituée aura deux liens hypertexts : le libellé de l’entrée permettra d’accéder au texte, quant au folio (numéro de page), il donne l’accès de la page source en mode page.
Voir aussi
  • {{Page link}} (ou {{Pli}}) : pour faciliter l'établissement de liens vers les pages
  • {{t2}} : titre de 2e niveau mais de 1er niveau d’un livre
  • {{t3}} : titre de 3e niveau mais de 2e niveau d’un livre
  • {{t4}} : titre de 4e niveau mais de 3e niveau d’un livre
  • {{Ebook-Tn}} : crée une ligne de sommaire pour un ebook
-- Code dérivé des modèles table et table2 par Verdy_p et Faager, toute divergence dans le code ou le comportement est un bug.
function table( frame )

    local args = frame.args

    local not_nodots = args[1] == nil or mw.text.trim( args[1] ) ~= 'nodots'

     -- Conteneur général (relatif, et à fond non transparent) de positionnement de la table 
    local text = string.format( '<div class="tableItem" style="position:relative;margin:%s auto;',
                                 out_arg( args.espace, ".125em" ) )
    if args.align == 'left' or args.align == 'right' then
        text = text .. string.format('margin-%s:0;', args.align)
    end

    if args.largeur and args.largeur ~= '' then
        text = text .. string.format('width:%s;', args.largeur)
    end

    if args.couleur_fond and args.couleur_fond ~= '' then
        text = text .. string.format('background:%s;', args.couleur_fond)
    elseif not_nodots then
        text = text .. 'background:#FFF;'
    end

    if args.couleur and args.couleur ~= '' then
        text = text .. string.format('color:%s;', args.couleur)
    elseif not_nodots then
    	-- La couleur par défaut est celle héritée
        -- text = text .. 'color:#000;'
    end

    text = text .. 'line-height:normal">' -- Fin de l'ouverture du div externe

    -- TDM : Conteneur avec section+titre+page (seulement nécessaire si numéro de page)
    if args.page and args.page ~= '' then
        text = text .. string.format( '<div style="margin-right:%spx">', out_arg( args.largeurp, "0" ) )
        -- GAUCHE+CENTRE: Conteneur flottant à gauche avec section+titre (seulement nécessaire si numéro de page)
        text = text .. '<div style="float:left;width:100%">'
    end

    -- GAUCHE: Conteneur flottant à gauche du numéro de section (non transparent si pointillés)
    if args.section and args.section ~= '' then
        text = text .. string.format( '<div style="float:left;z-index:2;min-width:%spx;text-indent:0;text-align:%s;white-space:nowrap">',
                                      out_arg( args.largeurs, 45), out_arg( args.aligns, 'right') )

        if not_nodots then
            text = text .. string.format('<span style="background:%s">', out_arg( args.couleur_fond, '#FFF' ) )
        end
        text = text .. args.section .. '&nbsp;'
        if not_nodots then
            text = text .. '</span>'
        end
        text = text .. '</div>'

        -- CENTRE: Conteneur du titre et des pointillés 
        text = text .. string.format( '<div style="position:relative;margin-left:%spx">', out_arg(args.largeurs, 45) )
    end

    -- Conteneur interne optionnel pour gérer la marge d’indentation négative
    if tonumber( out_arg(args.indentation, 0 ) ) < 0 then
        text = text .. string.format( '<div style="margin-left:%s%s;text-indent:%s%s">',
                                      -args.indentation, out_arg(args.indentation_unit, "em"), args.indentation, out_arg(args.indentation_unit, "em" ) )
    end

    -- Le titre lui-même (justifiable, indentable), en haut du conteneur CENTRE (non transparent si pointillés)
    text = text .. '<div style="position:relative;z-index:2;'
    if args.text_align and args.text_align ~= 'justify' then
        text = text .. string.format( 'text-align:%s;', args.text_align )
    end
    if tonumber( out_arg(args.indentation, 0 ) ) > 0 then
        text = text .. string.format( 'text-indent:%s%s', args.indentation, out_arg(args.indentation_unit, "em" ) )
    end
    text = text .. '">'
    if not_nodots then
         text = text .. string.format('<span style="background:%s">', out_arg( args.couleur_fond, '#FFF' ) )
    end
    text = text .. out_arg(args.titre, '' )
    if not_nodots then
        text = text .. '&nbsp;</span>'
    end
    text = text .. '</div>'

    -- Fin du conteneur interne optionnel pour gérer la marge d’indentation négative
    if tonumber( out_arg(args.indentation, 0 ) ) < 0 then
        text = text  .. '</div>'
    end

    -- Les pointillés éventuels (superposés en bas, nécessite un positionnement absolu dans le conteneur CENTRE)
    if not_nodots then
        text = text .. '<div class="ws-noexport" style="position:relative;'
        text = text .. string.format( 'margin-left:%d%s">', math.abs( tonumber( out_arg( args.indentation, "0" ) ) ) + 1, out_arg( args.indentation_unit, "em" ) )
        text = text .. '<div style="position:absolute;z-index:1;bottom:.3em;width:100%;border-bottom:0.135em dotted'
        -- La couleur par défaut pour les pointillés est celle héritée
        text = text .. out_arg( args.couleur, '' ) .. '"></div>'
        --text = text .. out_arg( args.couleur, ' #000' ) .. '"></div>'
        text = text .. '</div>'
    end

    -- CENTRE: Fin du conteneur du titre et des pointillés
    if args.section and args.section ~= '' then
        text = text .. '</div>'
        -- Étend le flottant à gauche verticalement (le numéro de section)
        text = text .. '<div style="clear:both"></div>'
    end

    if args.page and args.page ~= '' then
        -- GAUCHE+CENTRE: Fin du conteneur avec section+titre (seulement nécessaire si numéro de page)
        text = text .. '</div>'
        -- DROITE: Conteneur flottant à droite du numéro de page (seulement nécessaire si numéro de page)
        text = text .. '<div class="ws-noexport" style="float:right">'
        -- Le numéro, insécable, est positionné verticalement en bas dans le flottant (non transparent si pointillés)
        text = text .. '<div style="position:absolute;z-index:2;bottom:0;right:0;text-indent:0;text-align:right;white-space:nowrap">'
        if not_nodots then
            text = text .. string.format('<span style="background:%s">', out_arg( args.couleur_fond, '#FFF' ) )
            -- seulement pour éviter de coller aux pointillés
            text = text .. '&nbsp;'
        end
        text = text .. args.page
        if not_nodots then
            text = text .. '</span>'
        end
        text = text .. '</div>'
        -- DROITE: Fin du conteneur du flottant du numéro de page (seulement nécessaire si numéro de page)
        text = text .. '</div>'

        -- Étend le flottant à droite verticalement (pour descendre le numéro de page)
        text = text .. '<div style="clear:both"></div>'

        -- TDM :Fin du conteneur avec section+titre+page (seulement nécessaire si numéro de page)
        text = text .. '</div>'
    end

    -- EXTERNE: Fin du conteneur
    text = text .. '</div>'

    return text
end

function out_arg( arg, default )
    if arg and arg ~= '' then
        return arg
    end
    return default
end

local p = {}

-- Aide au debuggage, retourne le code généré sous forme d'une chaîne de caractères encodé
-- et sous forme de html.
function p.table_as_string( frame )
    return mw.text.encode( table( frame ) ) .. '<div style="clear:both"></div>' .. table( frame )
end
 
function p.table( frame )
    return table( frame:getParent() )
end
 
return p