Module:Tekstilaro
Apparence
La documentation de ce module Scribunto écrit en Lua est incluse depuis sa sous-page de documentation.
Ce module est utilisé par :
- Modèle:Métrifieur (similaire version simplifiée avec moins de paramètres)
Utiliser Utilisateur:Psychoslave/TestLua pour tester.
Voir aussi Module:String pour ses fonctions:
_escapePattern( string )
(utilisé par ce module)_getBoolean( string, byDefault, abbrevsDisallowed )
(utilisé par ce module)uncaesure( string )
local str = require('Module:String')
local _escapePattern = str._escapePattern
local _getBoolean = str._getBoolean
local function _compressWhitespaces(s)
-- Retire les blancs et sauts de ligne initiaux pour que la chaque ligne
-- soit indentée convenablement, ceux de fin de ligne pour traiter les
-- césures, et compresse tous les autres blancs en gardant seulement 1 ou 2
-- sauts de ligne.
-- Note: le motif '%s' correspond à n'importe quel blanc ou ou saut de ligne
-- ASCII '[ \t\n\v\f\r]' avec la bibliothèque Lua standard ; il n'inclut
-- pas les caractères non-ASCII, codés sur plusieurs octets en UTF-8.
return s
:gsub('^%s+', ''):gsub('%s+$', '') -- nettoyage en début et fin de chaine
:gsub('\r\n', '\n') -- canonicalisation des sauts de ligne intermédiaires
:gsub('[ \t\r\v\f]+', ' ') -- blancs intermédiaires sauf '\n'
-- il ne doit plus rester ici que des blancs ' ' ou '\n' intermédiaires
:gsub(' \n', '\n'):gsub('\n ', '\n') -- espace en début et fin de ligne
:gsub('\n\n\n+', '\n\n') -- '\n' en excès (pas plus de 2)
end
-- Retourne le texte avec un retour chariot après chaque fin de ligne contigüe
-- et nouveau paragraphe
local function _breaklines(text, separator, align, inline, indent, unindent, style)
separator = _compressWhitespaces(separator or '-')
separator = separator == '' and '-' or separator
if align ~= '' then
style = 'text-align:' .. align .. ';' .. style
end
if not inline then
if indent < 0 then -- indentation négative de la première ligne
if unindent then
style = 'text-indent:' .. indent .. 'px;' .. style
else
style = 'text-indent:0;' .. style
end
style = 'margin-left:' .. (-indent) .. 'px;' .. style
else
if unindent then
style = 'text-indent:0;' .. style
else
style = 'text-indent:' .. indent .. 'px;' .. style
end
style = 'margin-left:0;' .. style
end
end
local pStart = not inline and '<p style="' .. style .. '">' or ''
local pStart1 = not inline and '<p style="' ..
( unindent and 'margin-top:0;' or ''
) .. style .. '">' or ''
local pEnd = not inline and '</p>' or ''
local pBreak =
( align == 'justify' and
--[[
Insertion d'un block vide sans hauteur utilisant toute la largeur
pour forcer le respect de la composition notamment lorsque le
paragraphe doit être justifié, avant le saut de ligne.
Cf. https://codepen.io/aakilfernandes/pen/IEAhF
À cause d'un bogue actuel de MediaWiki, "width:100%" devient
"width:100" (CSS non valide !) dans un span (aucun moyen, même avec
min-width, max-width, padding-left ou margin-left : ce "%" est
supprimé à tord par MediaWiki, quelle que soit la valeur en
pourcentage ou la présence de blancs ou d'autres styles, ce qui
invalide le style CSS indiqué sans unité qui est alors, soit
ignoré par le navigateur soit traité à tord comme des pixels
Le remplacement de span par une autre balise en ligne (comme
b, i, u, s, em, var, tt, code) ne marche pas non plus.
L'utilisation de "%%" est acceptée par MediaWiki mais devient
"%"; un des deux width fonctionnera donc. Merci de garder le "%%""
en seconde place car il doit prendre le dessus sur le "%" simple
si un vieux navigateur considère la largeur rendue sans unité
comme des pixels.
Si MediaWiki est corrigé, le second "%%" non valide perçu par
le navigateur sera ignoré (ou bien MediaWiki éliminera lui-même
le style devenu non valide) mais le premier en "%" sera gardé.
]]
'<s style="display:inline-block;width:100%;width:100%%;height:0;max-height:0;line-height:0"><br/></s>'
or '<br/>'
)
text = _compressWhitespaces(text)
return pStart1
.. _compressWhitespaces(text)
-- Traite les sauts de paragraphes (plusieurs sauts de ligne)
:gsub('\n\n', pEnd .. pStart)
-- Traite les césures dans un paragraphe.
-- Cas particulier des traits d'union redoublés
:gsub('-' .. _escapePattern(separator) .. '\n',
inline and
(separator == '-' and '­' --[[U+00AD SOFT HYPHEN]]
or '-')
or '-' .. pBreak
)
:gsub('-\n', '-' .. pBreak)
-- Tout autre séparateur en fin de ligne est supprimé.
:gsub(_escapePattern(separator) .. '\n', pBreak)
-- Traite tous les autres sauts de ligne dans un paragraphe.
:gsub('\n', pBreak)
.. pEnd
end
local function breaklines(frame)
local text = frame.args.text
local separator = frame.args.separator
local align = frame.args.align or '' -- left, right ou justify
local inline = _getBoolean(frame.args.inline, align == '', true)
-- Les 3 paramètres suivants sont inutilisés si inline est vrai:
local indent = tonumber(frame.args.indent) or 25
local unindent = _getBoolean(frame.args.unindent, false)
local style = frame.args.style or ''
return _breaklines(
text, separator, align, inline,
-- Les 3 paramètres suivants sont inutilisés si inline est vrai:
indent, unindent, style)
end
-- export
return {
breaklines = breaklines,
alineau = breaklines, -- synonyme de compatibilité
}