Aller au contenu

Module:Tekstilaro

La bibliothèque libre.
Documentation du module [voir] [modifier] [purger]
La documentation de ce module Scribunto écrit en Lua est incluse depuis sa sous-page de documentation.

Ce module est utilisé par :

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 '&#xAD;' --[[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é
}