پودمان:نامک/بازخنان

از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[نمایش] [ویرایش] [تاریخچه] [پاکسازی]

کاربرد[ویرایش]

توابع این پودمان برای به‌کارگیری در پودمان‌های دیگر ساخته شده‌اند. بنابراین نمی‌توان آنها را مستقیم با دستور #درخواست به‌کار برد.

توابع کاربردی:

  • isbn(args) – retourne un lien vers ISBN suivi de la liste des ISBN contenu dans les paramètres isbn, isbn erroné, isbn2, isbn3... avec lien vers spécial:Ouvrages de référence ; affiche aussi un message d'erreur si ce n'est pas un ISBN ou EAN 13 valide (sauf paramètre isbn erroné) ;
  • issn(args) – retourne un lien vers ISSN suivi de la liste des paramètres issn, issn2... avec un lien vers le portail ISSN ;
  • enLigne(args) – retourne un lien externe (paramètre url, lien ou doi) sous le libellé « lire en ligne » (personnalisable avec texte), éventuellement précédé de langue et suivi par une date (date ou consulté le) ;
  • wikisource – retourne un lien interne vers la page wikisource correspondant, avec le texte « lire sur wikisource » ;
  • indicationDeFormat(format) – retourne format entre crochet, avec si possible une abréviation.
  • indicationIconeAcces(paywall) – retourne une icône indiquant si le contenu est soumis à une restriction d'accès.

Les fonctions suivantes retournent un lien interne pour une base de données suivi du code en paramètre avec un lien externe vers la page correspondante dans cette base.

دیگر کارکردها:

  • databaseExterne() – آسان‌سازی پیوند به شالودهٔ داده‌های بیرونی

دیگر پودمان‌هایی که در این پودمان به‌کار رفته‌اند:

-- Les fonctions de ce module sont destinées à être utilisées par un autre module.
-- Leur paramètre d'entrée est une table simple (args), voire une chaine (oclc, bnf...)

local References = { }


local Outils = require( 'پودمان:ابزارها' )
local validTextArg = Outils.validTextArg
local Commun = require 'پودمان:نامک/انبازین'
-- local Date = require( 'پودمان:تاریخ' ) -- chargé uniquement si nécessaire


--[[
ISBN-10 and ISSN validator code calculates checksum across all isbn/issn digits including the check digit. ISBN-13 is checked in checkisbn().
If the number is valid the result will be 0. Before calling this function, issbn/issn must be checked for length and stripped of dashes,
spaces and other non-isxn characters.
]]
function References.is_valid_isxn( isxn_str, len )
	local temp = 0
	isxn_str = isxn_str:gsub( 'x', 'X' )
	isxn_str = { isxn_str:byte(1, len) }	-- make a table of bytes
	len = len+1								-- adjust to be a loop counter
	for i, v in ipairs( isxn_str ) do		-- loop through all of the bytes and calculate the checksum
		if v == string.byte( 'X' ) then		-- if checkdigit is X
			temp = temp + 10 * ( len - i )	-- it represents 10 decimal
		else
			temp = temp + tonumber( string.char( v ) ) * ( len - i )
		end
	end
	return temp % 11 == 0					-- returns true if calculation result is zero
end

function References.isValidIsmn10( ismn )
	local temp = 9
	if ismn:match( 'M%d%d%d%d%d%d%d%d%d' ) then
		for i = 2, 10 do
			temp = temp + ( 1 + 2 * ( i % 2 ) ) * ismn:sub( i, i )
		end
	end
	return temp % 10 == 0
end

-- Teste si une chaine ISBN est valide
function References.checkisbn( isbn_str )
	if type( isbn_str ) == 'string' then
		isbn_str = isbn_str:gsub( '[-%s]', '' )	-- supprime les traits d’union et espaces

		if isbn_str:len() == 10 then
			if isbn_str:match( '^%d+[xX]?$' ) then
				return  References.is_valid_isxn( isbn_str, 10 )
			end
		elseif isbn_str:match( '^97[89]' ) then
			return References.checkean13( isbn_str )
		end
	end
	return false
end

-- Teste si une chaine EAN 13 est valide
function References.checkean13( ean_str )
	if type( ean_str ) == 'string' then
		ean_str = ean_str:gsub( '[-%s]', '' )	-- supprime les traits d’union et espaces
		if ean_str:len() == 13 and ean_str:match( '^%d+$' ) then
			local temp, strVal = 0
			ean_str = { ean_str:byte( 1, 13 ) }
			for i = 1, #ean_str do
				strVal = tonumber( string.char( ean_str[i] ) )
				temp = temp + ( 3 - 2 * ( i % 2 ) ) * strVal
			end
			return temp % 10 == 0
		end
	end
	return false
end

function References.checkissn( issn_str )
	if type( issn_str ) == 'string' then
		issn_str = issn_str:gsub( '[%s]', '' )
		if issn_str:match( '^%d%d%d%d%-%d%d%d[%dxX]$' ) then
			issn_str = issn_str:gsub( '-', '' )		-- supprime les traits d’union et espaces
			return References.is_valid_isxn( issn_str, 8 )
		end
	end
	return false
end

-- Teste si une chaine ISMN est valide
function References.checkismn( ismn_str )
	if type( ismn_str ) == 'string' then
		ismn_str = ismn_str:gsub( '[-%s]', '' )	-- supprime les traits d’union et espaces

		if ismn_str:len() == 10 then
			return  References.isValidIsmn10( ismn_str, 10 )
		elseif ismn_str:match( '^9790' ) then
			return References.checkean13( ismn_str )
		end
	end
	return false
end

local function isbn13to9( isbn_str )
	if type( isbn_str ) == 'string' then
		local isbn = isbn_str:gsub( '[-%s]', '' )
		if isbn:len() == 13 and isbn:sub( 1, 3 ) == '978' then
			isbn = isbn:sub( 4, 12 )
			return isbn
		elseif isbn:len() == 10 then
			return isbn:sub( 1, -2 )
		end
	end
	return isbn_str
end

local function isbn13to10( isbn_str )
	local isbn = isbn13to9( isbn_str )
	if isbn ~= isbn_str and isbn_str:len() ~= 10 then
		for i = 0, 9 do
			if References.checkisbn( isbn .. i ) then
				return isbn .. i
			end
		end
		return isbn .. 'X'
	end
	return isbn_str
end

function References.isbn13to10( frame )
	local args = Outils.extractArgs( frame )
	return isbn13to10( args[1] )
end

function References.same_isbn( isbn1, isbn2 )
	if type( isbn1 ) ~= 'string' or type( isbn2 ) ~= 'string' then
		return false
	end
	-- remove dash and spaces
	isbn1 = isbn1:gsub( '[-%s]', '' )
	isbn2 = isbn2:gsub( '[-%s]', '' )
    -- check if both isbn are valid
	if not ( References.checkisbn(isbn1) and References.checkisbn(isbn2) ) then
		return false
	end
	-- compare isbn
	return isbn13to9( isbn1 ) == isbn13to9( isbn2 )
end

local function doublonIsxn( isxn, liste2, xnCode)
	if type( References[ 'same_' .. xnCode ] ) == 'function' then
		for k, v in ipairs( liste2 ) do
			if References[ 'same_' .. xnCode ]( isxn, v ) then
				return true
			end
		end
	end
end

local function formatIsxn( args, validArg, xnCode, invalideCateg, checkFunction, formatLien, page )
	local validArg = validArg or function ( ... ) return validTextArg( args, ... ) end

	local liste = { }
	local liste2 = { }
	local i = 1
	local invalide = '<sup style="color:red">[نامعبتر: ' .. invalideCateg .. ']</sup>'

	local isxnErr = validArg( xnCode .. ' نادرست' )
	local XN = xnCode:upper()
	local isxn = validArg( xnCode, XN, xnCode .. '1', XN .. '1' )
	if isxnErr or isxn then
		local isxnErrSanitised = isxnErr and isxnErr:match( '%d[%d -]+[%dXx]' )
		if isxnErrSanitised then
			local lien = formatLien:format( isxnErrSanitised, isxnErr )
			table.insert( liste, lien .. ' (édité erroné)' )
		end

		-- boucle sur les isxn2, 3...
		while isxn do
			-- vérification de la validité de l'ISXN
			local isxnValid = checkFunction( isxn )

			-- préparation du texte à afficher
			if isxnValid then
				local lien = formatLien:format( isxn, isxn )
				table.insert( liste, lien )
				if type( args.categ ) == 'table' and doublonIsxn( isxn, liste2, xnCode) then
					args.categ[ xnCode .. 'دوتایی' ] = isxn
				end
				table.insert( liste2, isxn )
			else
				table.insert( liste, isxn .. invalide )
				if type( args.categ ) == 'table' then
					-- pour les propriétés isbnInvalid, issnInvalid et eanInvalid
					args.categ[ xnCode .. 'Invalid' ] = true
				end
			end

			i = i + 1
			isxn = validArg( xnCode .. i, XN .. i )
		end

		if args['بدون برچسب'] then
			page = ''
		else
			page = page .. '&nbsp;'
		end
		return page .. mw.text.listToText( liste )
	end
end

-- voir Modèle:ISBN
-- renvoie une liste de chaines formant le résultat du modèle une fois concaténées
function References.isbn( args, validArg )
	return formatIsxn(
		args,
		validArg,
		'isbn',
		'[[:رده:خطاهای یادکرد: شابک|شابک نامعتبر]]',
		References.checkisbn,
		'[[:fr:Spécial:Ouvrages de référence/%s|<span class="nowrap">%s</span>]]',
		'[[شابک]]'
	)
end

-- voir Modèle:EAN
-- renvoie une liste de chaines formant le résultat du modèle une fois concaténées
function References.ean( args, validArg )
	return formatIsxn(
		args,
		validArg,
		'ean',
		'[[:رده:Page avec EAN invalide|EAN invalide]]',
		References.checkean13,
		'[[Spécial:Ouvrages de référence/%s|<span class="nowrap">%s</span>]]',
		'[[EAN 13|EAN]]'
	)
end

-- voir Modèle:ISSN
-- renvoie une liste de chaines formant le résultat du modèle une fois concaténées
function References.issn( args, validArg )
	return formatIsxn(
		args,
		validArg,
		'شاپا',
		'[[:رده:صفحات دارای خطای شاپا|شاپای نامعتبر]]',
		References.checkissn,
		'<span class="plainlinks noarchive">[https://portal.issn.org/resource/issn/%s %s]</span>',
		'[[شاپا]]'
	)
end

function References.eissn( args, validArg )
	return formatIsxn(
		args,
		validArg,
		'شاپای الکترونیکی',
		'[[:رده:صفحات دارای خطای شاپا|شاپای نامعتبر]]',
		References.checkissn,
		'<span class="plainlinks noarchive">[https://portal.issn.org/resource/issn/%s %s]</span>',
		'[[شاپا#انتشارات الکترونیکی و شاپا|شاپای الکترونیکی]]'
	)
end

-- voir Modèle:ISMN
-- renvoie une liste de chaines formant le résultat du modèle une fois concaténées
function References.ismn( args, validArg )
	return formatIsxn(
		args,
		validArg,
		'ismn',
		'[[:رده:Page avec ISMN invalide|ISMN invalide]]',
		References.checkismn,
		'<span class="nowrap">%s</span>',
		'[[International Standard Music Number|ISMN]]'
	)
end

-- fonctions liant des bases de données externes
local function databaseExterne( num, lienIinterne, lienExterne, complement, texteAffiche )
	if Outils.notEmpty( num ) then
		local numEncoded
		if num:find( '[^a-zA-Z0-9/_.~-]' ) then
			numEncoded = mw.uri.encode( num, 'PATH' ):gsub( '%%2F', '/' )
		else
			numEncoded = num
		end
		local adresse =
				lienIinterne
				.. '&nbsp;<span class="plainlinks noarchive nowrap">['
				.. 'https://' .. lienExterne .. numEncoded .. ( complement or '' )
				.. ' '
				.. mw.text.nowiki( texteAffiche or num )
				.. ']</span>'

		return adresse
	end
end

function References.arkId( base )
	--  Nice Opaque Identifiern utilisé par les formats Ark pour générer une clé
	base = tostring( base )
	if base then
		local xdigits = '0123456789bcdfghjkmnpqrstvwxz'
		local sum = 0
		local position
		for i = 1, base:len() do
			position = xdigits:find( base:sub( i, i ), 1, true ) or 1
			sum = sum + i * ( position - 1 )
		end
		local index = sum % 29 + 1
		return xdigits:sub( index, index )
	end
end

function References.arxiv( arxiv )
	if Outils.trim( arxiv ) then
		return databaseExterne(
			arxiv,
			'[[arXiv]]',
			'arxiv.org/abs/'
		)
	end
end

function References.asin( asin )
	return databaseExterne(
		asin,
		'[[شماره شناسایی استاندارد آمازون|ASIN]]',
		'www.amazon.com/s/?url=search-alias&lang=en&field-keywords='
	)
end

function References.bibcode( bibcode )
	return databaseExterne( bibcode, '[[بیبکد]]', 'ui.adsabs.harvard.edu/abs/' )
end

function References.bnf( bnf )
	bnf = Outils.trim( bnf )
	if bnf then
		local texte = ''
		local category = ''
		local bnfId = bnf:upper():match( 'BNF(%d+%w)' ) or
			bnf:lower():match( 'cb(%d+%w)' ) or
			bnf:match( '^%d+%w' )

		if bnfId then
			-- bnf contient une suite de chiffres qui peut être un ark valide
			local base = bnfId:sub( 1, 8 )
			local arkId = References.arkId( 'cb' .. base )
			if bnfId:len() == 8 then
				-- il manque la clé, on l'ajoute
				bnf = base .. arkId
				texte = base
			elseif bnfId:len() > 8 and bnfId:sub( 9, 9 ) == arkId then
				-- ark valide
				bnf = bnfId:sub( 1, 9 )
				texte = base
			else
				-- ark qui semble non valide
				bnf = bnfId
				texte = bnfId
				category = '[[رده:Recension temporaire pour le modèle Ouvrage|bnf]]'
			end
		else
			-- le paramètre ne semble pas un ark valide
			texte = bnf
			category = '[[رده:Recension temporaire pour le modèle Ouvrage|bnf]]'
		end

		-- dans tous les cas on renvoie l'adresse, on catégorise juste pour vérifier ce qui ne va pas
		local lien = databaseExterne(
			bnf,
			'[[کتابخانه ملی فرانسه|BNF]]',
			'catalogue.bnf.fr/ark:/12148/cb',
			'.public',
			texte
		)

		return lien .. category
	end
end

function References.citeseerx( citeseerx )
	return databaseExterne(
		citeseerx,
		'[[سیتی سیر|CiteSeer<sup>x</sup>]]',
		'citeseerx.ist.psu.edu/viewdoc/summary?doi='
	)
end

function References.dnb( dnb )
	return databaseExterne(
		dnb,
		'[[کتابخانه ملی آلمان|DNB]]',
		'd-nb.info/'
	)
end

function References.doi( doi, paywall )
	local result = databaseExterne(
		doi,
		'[[شناساگر اشیاء دیجیتال|DOI]]',
		'dx.doi.org/'
	)
	if result and paywall then
		result = result .. ( References.indicationIconeAcces( paywall ) or '' )
	end
	return result
end

function References.jfm( jfm )
	return databaseExterne( jfm, '[[zbMATH|JFM]]', 'zbmath.org/?format=complete&q=an:' )
end

function References.jstor( jstor )
	return databaseExterne( jstor, '[[JSTOR]]', 'jstor.org/stable/' )
end

function References.hal( hal )
	if Outils.trim( hal ) then
		if not hal:match( '^%w+%-%d' ) then
			hal = 'hal-' .. hal
		end
		return databaseExterne(
			hal,
			'[[Hyper articles en ligne|HAL]]',
			'hal.archives-ouvertes.fr/'
		)
	end
end

function References.hdl( hdl, paywall )
	local result = databaseExterne( hdl, '[[هندل سیستم|hdl]]', 'hdl.handle.net/' )
	if result and paywall then
		result = result .. ( References.indicationIconeAcces( paywall ) or '' )
	end
	return result
end

function References.lccn( lccn )
	return databaseExterne(
		lccn,
		'[[شماره کنترل کتابخانه کنگره|LCCN]]',
		'lccn.loc.gov/'
	)
end

function References.libris( libris )
	return databaseExterne( libris, '[[سامانه اطلاعات کتابخانه‌ای سوئد|LIBRIS]]', 'libris.kb.se/bib/' )
end

function References.mathreviews( mathreviews )
	return databaseExterne(
		mathreviews,
		'[[بررسی‌های ریاضی|MR]]',
		'www.ams.org/mathscinet-getitem?mr='
	)
end

function References.oclc( oclc )
	return databaseExterne(
		oclc,
		'[[مرکز کتابخانه رایانه‌ای پیوسته|OCLC]]',
		'worldcat.org/fr/title/'
	)
end

function References.pmcid( pmcid )
	return databaseExterne(
		pmcid,
		'[[پاب‌مد سنترال|PMCID]]',
		'www.ncbi.nlm.nih.gov/pmc/articles/'
	)
end

function References.pmid( pmid )
	return databaseExterne(
		pmid,
		'[[پاب‌مد|PMID]]',
		'www.ncbi.nlm.nih.gov/pubmed/'
	)
end

function References.s2cid( s2cid )
	return databaseExterne( s2cid, '[[سمانتیک اسکالر|S2CID]]', 'api.semanticscholar.org/CorpusID:' )
end

function References.sbn( sbn )
	local id = ( sbn or '' ):upper():gsub( '\\', '' ):gsub( '^ITICCU', '' )
	return databaseExterne(
		id,
		'[[Service bibliothécaire national]]',
		'opac.sbn.it/bid/'
	)
end

function References.sudoc( sudoc )
	return databaseExterne(
		sudoc,
		'[[سامانه مستندات دانشگاهی فرانسه|SUDOC]]',
		'www.sudoc.fr/'
	)
end

function References.wikisource( wikisource )
	if Outils.notEmpty( wikisource ) then
		return '[[s:' .. wikisource .. '|خواندن در ویکی‌نبشته]]'
	end
end

function References.zbl( zbl )
	return databaseExterne( zbl, '[[Zentralblatt MATH|zbMATH]]', 'zbmath.org/?q=an:' )
end


-- enLigne est destiné à remplacer "lire en ligne", "écouter en ligne", "présentation en ligne"
function References.enLigne( args, validArg )
	local validArg = validArg or function ( ... ) return validTextArg( args, ... ) end
	local lang, esp = '', ''
	if args.langue then
		local Langue = require( 'پودمان:زبان' )
		lang = Langue.indicationMultilingue{ args.langue, args.langue2, args.langue3 }
		esp = '&nbsp;'
	end

	local url = validArg( 'پیوند', 'نشانی' )
	local urlSimple = true

	if url then
		if url:match( '^https?://' ) or url:match( '^ftp://' ) or url:match( '^//' ) then
			url = url:gsub( '%[', '%%5B' ):gsub( '%]', '%%5D' ):gsub( ' ', '%%20' )
		else
			urlSimple = false
		end
	elseif validArg( 'doi' ) then
		url = 'https://dx.doi.org/' .. mw.uri.encode( args.doi )
	else
		return
	end

	local lien
	if urlSimple then
		local texte = validArg( 'متن' ) or 'برخط'
		lien = '[' .. url .. ' ' .. texte .. ']'
	else
		lien = url
	end

	local date = validArg( 'تاریخ', 'تاریخ بازدید' )

	if date then
		return lang .. esp .. lien .. '&nbsp;(بازدیدشده در' .. date .. ')'
	else
		return lang .. esp .. lien
	end
end

function References.affichageLiensExternes( args, validArg, lireEnLigne, consulteLe )
	local validArg = validArg or function ( ... ) return validTextArg( args, ... ) end

		local liensExternes = {}
		local function minsert( ... )
			for i = 1, select( '#', ... ) do
				local sel = select( i, ... )
				if sel then
					liensExternes[#liensExternes+1] = sel
				end
			end
		end

		-- isbn et issn
		minsert(
			References.isbn( args, validArg ),
			References.ean( args, validArg ),
			References.issn( args, validArg ),
			References.eissn( args, validArg ),
			References.ismn( args, validArg )
		)

		minsert(
			References.oclc( args.oclc ),
			References.bnf ( args.bnf ),
			References.sbn ( args.sbn ),
			References.lccn( args.lccn ),
			References.dnb ( args.dnb ),
			References.pmid( validArg( 'pmid', 'PMID' ) ),
			References.pmcid ( validArg( 'pmcid', 'pmc'  ) ),
			References.doi( validArg( 'doi', 'DOI' ), validArg( 'دسترسی به doi' ) ),
			References.jstor( args.jstor ),
			References.bibcode( args.bibcode ),
			References.mathreviews( validArg( 'math reviews', 'mathreviews', 'mr' ) ),
			References.zbl( validArg( 'zbl', 'zbmath' ) ),
			References.arxiv( args.arxiv ),
			References.hal( args.hal ),
			References.hdl( args.hdl, validArg( 'دسترسی به hdl') ),
			References.s2cid( args.s2cid ),
			References.libris( args.libris ),
			References.citeseerx( args.citeseerx ),
			References.jfm( args.jfm ),
			References.asin( args.asin ),
			References.sudoc( args.sudoc ),
			References.wikisource( args.wikisource )
		)

		minsert(
			References.enLigne{ url = args['چکیده'], texte = 'چکیده' },
			References.enLigne{ url = args['نمود برخط'], texte = 'نمود برخط' },
			References.enLigne{ url = args['شنیدن برخط'], texte = 'شنیدن برخط' }
		)

		local url = validArg( 'خواندن برخط', 'متن نشانی', 'نشانی', 'متن' )
		local paywall = validArg( 'دسترسی به نشانی' )
		if url and lireEnLigne then
			local archiveUrl = validArg( 'نشانی بایگانی' )
			if archiveUrl then
				if not ( string.match( archiveUrl, '^http' ) or string.match( archiveUrl, '^//' ) ) then
					archiveUrl = 'http://' .. archiveUrl
				end
				local textArchive = 'بایگانی'
				local dateArchive = validArg( 'تاریخ بایگانی' )
				if dateArchive then
					textArchive = 'بایگانی از ' .. Commun.inscriptionDate{ date = dateArchive }
				end

				minsert(
					'<span class="noarchive">'
					.. References.enLigne{	url = url,	texte = 'خواندن برخط' }
					.. ' <small class="plainlinks cachelinks">&#91;['
					.. archiveUrl .. ' ' .. textArchive
					.. ']&#93;</small>'
					.. ( paywall and References.indicationIconeAcces( paywall ) or '' )
					.. '</span>'
					.. ( References.indicationDeFormat( args['فرمت الکترونیک'] ) or '' )
				)
			else
				minsert(
					References.enLigne{	url = url,	texte = 'خواندن برخط' }
					.. ( paywall and References.indicationIconeAcces( paywall ) or '' )
					.. ( References.indicationDeFormat( args['فرمت الکترونیک'] ) or '' )
				)
			end
		end

		-- consulté le
		if consulteLe then
			local consult = validArg( 'تاریخ بازدید', 'بازدید' )
			if consult then
				local prefixe = 'بازدید در '

				if consult:sub( -1, -1 ) == '.' then
					consult = consult:sub( 1, -2 )
				end
				consult = consult:lower()

				local Date = require( 'پودمان:تاریخ' )
				local dateWikifiee = Date.modeleDate{
					consult,
					nolinks = true,
					afficherErreurs = true,
					categoriserErreurs = 'صفحات دارای پارامتر «تاریخ بازدید» با تاریخ نامعتبر'
				}

				if not dateWikifiee:match( 'datetime="%d%d%d%d%-%d%d%-%d%d"' ) and not dateWikifiee:find( 'class="error"', nil, true ) then
					prefixe = 'بازدید در '
				end

				minsert( prefixe .. dateWikifiee )
			end
		end

		if #liensExternes > 0 then
			return ' <small style="line-height:1em;">(' .. table.concat( liensExternes, ', ' ) .. ')</small>'
		end
end

function References.indicationDeFormat( format )
	if not Outils.trim( format ) then
		return
	end
	local listeFormat = {
		audio = { "audio", "پرونده صوتی با فرمت MP3, Ogg..." },
		bat   = { "bat",   "کد پردازش سری (batch)" },
		djvu  = { "DjVu",  "پرونده با فرمت DjVu" },
		doc   = { "doc",   "پرونده مایکروسافت ورد" },
		epub  = { "EPUB",  "پرونده با فرمت Epub" },
		flash = { "flash", "پویانمایی برداری با فرمت Macromedia Flash" },
		hlp   = { "hlp",   "پرونده منقضی HeLP (کمک) از مایکروسافت ویندوز 3.1" },
		html  = { "html",  "پرونده با فرمت زنگام (HTML)" },
		image = { "image", "نگاره با فرمت JPEG, PNG, GIF..." },
		java  = { "java",  "برنامک جاوا" },
		mov   = { "mov",   "ویدیو با فرمت Apple QuickTime" },
		mp3   = { "MP3",   "پرونده صوتی با فرمت MP3" },
		odt   = { "odt",   "Document au format OpenDocument" },
		ogg   = { "ogg",   "Fichier au format conteneur Ogg" },
		pdf   = { "PDF",   "پرونده با فرمت پی.دی.اف (PDF) ادوبی" },
		php   = { "php",   "کد PHP" },
		pl    = { "pl",    "کد پرل (Perl)" },
		ppt   = { "ppt",   "نمود مایکروسافت پاورپوینت" },
		ps    = { "ps",    "پرونده توضیح برداری با فرمت PostScript" },
		radio = { "radio", "رادیو با فرمت MPEG, AVI..." },
		rar   = { "rar",   "پرونده فشرده با فرمت RAR" },
		rm    = { "rm",    "ویدیو با فرمت RealMedia, RealAudio..." },
		rtf   = { "RTF",   "پرونده با فرمت ار.تی.اف (RTF)" },
		svg   = { "SVG",   "تصویر برداری با فرمت اس.وی.جی (SVG)" },
		sxi   = { "sxi",   "نمود OpenOffice.org Impress" },
		sxw   = { "sxw",   "پرونده OpenOffice.org Writer" },
		tex   = { "TeX",   "پرونده TeX" },
		txt   = { "txt",   "پرونده با فرمت نوشتاری خام" },
		video = { "vidéo", "ویدیو با فرمت MPEG, AVI..." },
		xls   = { "xls",   "پوشه مایکروسافت اکسل" },
		xml   = { "XML",   "پرونده با فرمت ایکس.ام.ال (XML)" },
		zip   = { "zip",   "بایگانی با فرمت Zip" },
	}
	listeFormat['ویدیو'] = listeFormat.video
	listeFormat.vid = listeFormat.video
	listeFormat.htm = listeFormat.html
	listeFormat.excel = listeFormat.xls
	listeFormat.powerpoint = listeFormat.ppt
	listeFormat.word = listeFormat.doc
	listeFormat.aud = listeFormat.audio

	local tabFormat = listeFormat[ string.lower( format ) ]
	if tabFormat then
		return (
			' <abbr class="abbr indicateur-format format-' .. tabFormat[1]:lower() .. '" '
			.. 'title="' .. tabFormat[2] .. '">'
			.. mw.text.nowiki( '[' .. tabFormat[1] .. ']' ) .. '</abbr>'
		)
	else
		-- teste si le suffixe est suivi d'une précision (ex : pdf 6 Mo)
		local ext, texte = string.match( format, "^([%S]+) (.+)$")
		if ext and listeFormat[ string.lower( ext ) ] then
			return References.indicationDeFormat( ext ) .. ' ' .. texte
		else
			return ' &#91;' .. format .. '&#93;'  -- '&#91;' = '<nowiki>[</nowiki>',  '&#93;' = '<nowiki>]</nowiki>',
		end
	end

end

function References.indicationIconeAcces( paywall )
	local val = string.lower( paywall ) -- nettoyage qui devrait être suffisant

	if val == 'پولی' then
		return ' [[پرونده:Lock-red-alt-2.svg|9px|پیوند=|جایگزین=دسترسی پولی|دسترسی پولی به پرونده]]'
	elseif val == 'آزاد' then
		return ' [[پرونده:Lock-green.svg|9px|پیوند=|جایگزین=دسترسی آزاد|دسترسی آزاد به پرونده]]'
	elseif val == 'کرانمند' then
		return ' [[پرونده:Lock-gray-alt-2.svg|9px|پیوند=|جایگزین=دسترسی کرانمند|دسترسی کرانمند به پرونده]]'
	elseif val == 'عضویت' then
		return ' [[پرونده:Lock-gray-alt-2.svg|9px|پیوند=|جایگزین=نیازمند عضویت|نیازمند عضویت برای دسترسی به پرونده]]'
	else
		return ''
	end
end

return References